u.sf 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/ruby
  2. # When p is a prime S(p) == -1 (mod p).
  3. # When p*q is a squarefree semiprime S(p*q) == (mod p*q).
  4. # ((p-1) * (q-1) + p^(p*q-1) * (q-1) + q^(p*q - 1) * (p-1)) (mod p*q)
  5. func S(n) {
  6. map(1..^n, {|k|
  7. powmod(k, (n-1), n)
  8. }).freq
  9. }
  10. func fastS(n) {
  11. Hash(n.divisors.map {|d|
  12. [powmod(d, (n-1), n), euler_phi(n/d)]
  13. }.flat...)
  14. }
  15. func Snum(n) {
  16. sum(1..^n, {|k|
  17. powmod(k, (n-1), n)
  18. }) % n
  19. }
  20. func fastSnum(n) {
  21. n.divisors.sum {|d|
  22. powmod(d, (n-1), n) * euler_phi(n/d)
  23. } % n
  24. }
  25. say Snum(561)
  26. say fastSnum(561)
  27. say Snum(1105)
  28. say fastSnum(1105)
  29. __END__
  30. (n) = Sum_{k=1..n} gcd(n, k) * phi(n / gcd(n, k)), where phi(k) is the Euler totient function. - Daniel Suteu, Jun 15 2018
  31. a(n) = Sum_{d|n} d * phi(n/d)^2, where phi(k) is the Euler totient function. - Daniel Suteu, Jun 17 2018
  32. p^(k-1) * ((p-1) * p^k + 1).
  33. #~ say fastSnum(16046641)
  34. __END__
  35. S(561) = 290
  36. S(1105) = 734
  37. S(1729) = 1258
  38. S(2465) = 1742
  39. S(2821) = 2110
  40. S(6601) = 5210
  41. S(8911) = 7036
  42. #~ say S(561)
  43. #~ say fastS(561)
  44. var str = "
  45. S(16046641) = 14123661
  46. S(16778881) = 12009864
  47. S(17098369) = 16858238
  48. S(17236801) = 17009098
  49. S(17316001) = 16870670
  50. S(17586361) = 15629649
  51. S(17812081) = 14481769
  52. S(18162001) = 13384248
  53. S(18307381) = 17004481
  54. S(18900973) = 14643537
  55. S(19384289) = 19080158
  56. S(19683001) = 17433969
  57. S(20964961) = 18167065
  58. S(21584305) = 15871469
  59. S(22665505) = 16557229
  60. S(23382529) = 23001598
  61. ".findall(/(\d+)/).flat.map{Num(_)}
  62. str.each_slice(2, {|a,b|
  63. #say [a,b]
  64. say "S(#{a}) == #{b}"
  65. assert_eq(fastS(a), b)
  66. })