partial_sums_of_inverse_moebius_transform_of_dedekind_function.pl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 08 March 2019
  4. # https://github.com/trizen
  5. # Partial sums of the inverse Möbius transform of the Dedekind psi function.
  6. # Definition, for m >= 0:
  7. #
  8. # a(n) = Sum_{k=1..n} Sum_{d|k} ψ_m(d)
  9. # = Sum_{k=1..n} Sum_{d|k} 2^omega(k/d) * d^m
  10. # = Sum_{k=1..n} 2^omega(k) * F_m(floor(n/k))
  11. #
  12. # where `F_n(x)` are the Faulhaber polynomials.
  13. # Asymptotic formula:
  14. # Sum_{k=1..n} Sum_{d|k} ψ_m(d) ~ F_m(n) * (zeta(m+1)^2 / zeta(2*(m+1)))
  15. # ~ (n^(m+1) * zeta(m+1)^2) / ((m+1) * zeta(2*(m+1)))
  16. # For m=1, we have:
  17. # a(n) ~ (5/4) * n^2.
  18. # a(n) = Sum_{k=1..n} A060648(k).
  19. # a(n) = Sum_{k=1..n} Sum_{d|k} 2^omega(k/d) * d.
  20. # a(n) = Sum_{k=1..n} Sum_{d|k} A001615(d).
  21. # a(n) = (1/2)*Sum_{k=1..n} 2^omega(k) * floor(n/k) * floor(1 + n/k).
  22. # Related OEIS sequences:
  23. # https://oeis.org/A064608 -- Partial sums of A034444: sum of number of unitary divisors from 1 to n.
  24. # https://oeis.org/A061503 -- Sum_{k<=n} (tau(k^2)), where tau is the number of divisors function.
  25. # See also:
  26. # https://en.wikipedia.org/wiki/Dedekind_psi_function
  27. # https://trizenx.blogspot.com/2018/11/partial-sums-of-arithmetical-functions.html
  28. use 5.020;
  29. use strict;
  30. use warnings;
  31. use experimental qw(signatures);
  32. use Math::AnyNum qw(faulhaber_sum);
  33. use ntheory qw(sqrtint rootint factor_exp moebius);
  34. sub inverse_moebius_of_dedekind_partial_sum ($n, $m) {
  35. my $lookup_size = 2 + 2 * rootint($n, 3)**2;
  36. my @omega_lookup = (0);
  37. my @omega_sum_lookup = (0);
  38. for my $k (1 .. $lookup_size) {
  39. $omega_lookup[$k] = 2**factor_exp($k);
  40. $omega_sum_lookup[$k] = $omega_sum_lookup[$k - 1] + $omega_lookup[$k];
  41. }
  42. my $s = sqrtint($n);
  43. my @mu = moebius(0, $s);
  44. my sub R($n) { # A064608(n) = Sum_{k=1..n} 2^omega(k)
  45. if ($n <= $lookup_size) {
  46. return $omega_sum_lookup[$n];
  47. }
  48. my $total = 0;
  49. foreach my $k (1 .. sqrtint($n)) {
  50. $mu[$k] || next;
  51. my $tmp = 0;
  52. foreach my $j (1 .. sqrtint(int($n / $k / $k))) {
  53. $tmp += int($n / $j / $k / $k);
  54. }
  55. $total += $mu[$k] * (2 * $tmp - sqrtint(int($n / $k / $k))**2);
  56. }
  57. return $total;
  58. }
  59. my $total = 0;
  60. for my $k (1 .. $s) {
  61. $total += $omega_lookup[$k] * faulhaber_sum(int($n / $k), $m);
  62. $total += $k**$m * R(int($n / $k));
  63. }
  64. $total -= R($s) * faulhaber_sum($s, $m);
  65. return $total;
  66. }
  67. sub inverse_moebius_of_dedekind_partial_sum_test ($n, $m) { # just for testing
  68. my $total = 0;
  69. foreach my $k (1 .. $n) {
  70. $total += 2**factor_exp($k) * faulhaber_sum(int($n / $k), $m);
  71. }
  72. return $total;
  73. }
  74. for my $m (0 .. 10) {
  75. my $n = int(rand(1000));
  76. my $t1 = inverse_moebius_of_dedekind_partial_sum($n, $m);
  77. my $t2 = inverse_moebius_of_dedekind_partial_sum_test($n, $m);
  78. die "error: $t1 != $t2" if $t1 != $t2;
  79. say "Sum_{k=1..$n} Sum_{d|k} ψ_$m(d) = $t1";
  80. }
  81. __END__
  82. Sum_{k=1..399} Sum_{d|k} ψ_0(d) = 7125
  83. Sum_{k=1..898} Sum_{d|k} ψ_1(d) = 1005565
  84. Sum_{k=1..284} Sum_{d|k} ψ_2(d) = 10904384
  85. Sum_{k=1..363} Sum_{d|k} ψ_3(d) = 5089543732
  86. Sum_{k=1..676} Sum_{d|k} ψ_4(d) = 30446345621064
  87. Sum_{k=1..719} Sum_{d|k} ψ_5(d) = 23921678049099402
  88. Sum_{k=1..273} Sum_{d|k} ψ_6(d) = 16623157368659789
  89. Sum_{k=1..291} Sum_{d|k} ψ_7(d) = 6568878240105603914
  90. Sum_{k=1..668} Sum_{d|k} ψ_8(d) = 2974535697414122138503228
  91. Sum_{k=1..772} Sum_{d|k} ψ_9(d) = 7583168029177266313981257004
  92. Sum_{k=1..967} Sum_{d|k} ψ_10(d) = 63269226338847691226388054366024