ramanujan_sum.sf 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/ruby
  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. define tau_i = Num.tau.i
  13. func ramanujan_sum(n, k) {
  14. sum(1..k, {|m|
  15. gcd(m, k) == 1 ? exp(tau_i * m * n / k)
  16. : 0
  17. }).round(-40)
  18. }
  19. each(1..30, {|n|
  20. var r = ramanujan_sum(n, n**2)
  21. say "R(#{n}, #{n**2}) = #{r}"
  22. })
  23. __END__
  24. R(1, 1) = 1
  25. R(2, 4) = -2
  26. R(3, 9) = -3
  27. R(4, 16) = 0
  28. R(5, 25) = -5
  29. R(6, 36) = 6
  30. R(7, 49) = -7
  31. R(8, 64) = 0
  32. R(9, 81) = 0
  33. R(10, 100) = 10
  34. R(11, 121) = -11
  35. R(12, 144) = 0
  36. R(13, 169) = -13
  37. R(14, 196) = 14
  38. R(15, 225) = 15
  39. R(16, 256) = 0
  40. R(17, 289) = -17
  41. R(18, 324) = 0
  42. R(19, 361) = -19
  43. R(20, 400) = 0
  44. R(21, 441) = 21
  45. R(22, 484) = 22
  46. R(23, 529) = -23
  47. R(24, 576) = 0
  48. R(25, 625) = 0
  49. R(26, 676) = 26
  50. R(27, 729) = 0
  51. R(28, 784) = 0
  52. R(29, 841) = -29
  53. R(30, 900) = -30