ramanujan_sum.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 26 July 2017
  4. # https://github.com/trizen
  5. # Ramanujan's sum:
  6. # c_k(n) = Sum_{m mod k; gcd(m, k) = 1} exp(2*pi*i*m*n/k)
  7. # For n = 1, c_k(1) is equivalent to moebius(k).
  8. # For integer real values of `n` and `k`, Ramanujan's sum is equivalent to:
  9. # c_k(n) = Sum_{m mod k; gcd(m, k) = 1} cos(2*pi*m*n/k)
  10. # Alternatively, when n = k, `c_n(n)` is equivalent with `euler_phi(n)`.
  11. # The record values, `c_n(n) + 1`, are the prime numbers.
  12. use 5.010;
  13. use strict;
  14. use warnings;
  15. use Math::AnyNum qw(:overload tau gcd round);
  16. sub ramanujan_sum {
  17. my ($n, $k) = @_;
  18. my $sum = 0;
  19. foreach my $m (1 .. $k) {
  20. if (gcd($m, $k) == 1) {
  21. $sum += exp(tau * i * $m * $n / $k);
  22. }
  23. }
  24. round($sum, -20);
  25. }
  26. my $sum = 0;
  27. my @partial_sums;
  28. foreach my $n (1 .. 30) {
  29. my $r = ramanujan_sum($n, $n**2);
  30. say "R($n, $n^2) = $r";
  31. push @partial_sums, $sum += $r;
  32. }
  33. say "\n=> Partial sums:";
  34. say join(' ', @partial_sums);
  35. __END__
  36. R(1, 1^2) = 1
  37. R(2, 2^2) = -2
  38. R(3, 3^2) = -3
  39. R(4, 4^2) = 0
  40. R(5, 5^2) = -5
  41. R(6, 6^2) = 6
  42. R(7, 7^2) = -7
  43. R(8, 8^2) = 0
  44. R(9, 9^2) = 0
  45. R(10, 10^2) = 10
  46. R(11, 11^2) = -11
  47. R(12, 12^2) = 0
  48. R(13, 13^2) = -13
  49. R(14, 14^2) = 14
  50. R(15, 15^2) = 15
  51. R(16, 16^2) = 0
  52. R(17, 17^2) = -17
  53. R(18, 18^2) = 0
  54. R(19, 19^2) = -19
  55. R(20, 20^2) = 0
  56. R(21, 21^2) = 21
  57. R(22, 22^2) = 22
  58. R(23, 23^2) = -23
  59. R(24, 24^2) = 0
  60. R(25, 25^2) = 0
  61. R(26, 26^2) = 26
  62. R(27, 27^2) = 0
  63. R(28, 28^2) = 0
  64. R(29, 29^2) = -29
  65. R(30, 30^2) = -30
  66. => Partial sums:
  67. 1 -1 -4 -4 -9 -3 -10 -10 -10 0 -11 -11 -24 -10 5 5 -12 -12 -31 -31 -10 12 -11 -11 -11 15 15 15 -14 -44