gold_mine_2.sf 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #!/usr/bin/ruby
  2. func F(x) {
  3. #faulhaber_sum(n, 1)
  4. sum(1..x, {|n|
  5. euler_phi(n) / n
  6. })
  7. # faulhaber_sum(x, 1)
  8. #(bernoulli(2, x+1) - bernoulli(2, 0)) / 2
  9. }
  10. func F2(n) {
  11. faulhaber_sum(n, 1)
  12. #(bernoulli(2, n+1) - bernoulli(2)) / 2
  13. }
  14. func g(n) {
  15. n * n.divisors.sum {|d| euler_phi(d)/d }
  16. }
  17. func G_1(x) {
  18. var t1 = sum(1..x.isqrt, {|n| euler_phi(n)/n * floor(x/n) })
  19. var t2 = sum(1..x.isqrt, {|n| F(x/n) })
  20. var t3 = (F(x.sqrt) * x.isqrt)
  21. t1 + t2 - t3
  22. }
  23. func G_0(x) {
  24. var t1 = sum(1..x.sqrt, {|n|
  25. g(n)/n * F2(x/n)
  26. })
  27. var t2 = sum(1..x.sqrt, {|n|
  28. n * G_1(x/n)
  29. })
  30. var t3 = (F2(x.sqrt) * G_1(x.sqrt))
  31. t1 + t2 - t3
  32. }
  33. func G_0_2(n) {
  34. sum(1..n, {|k|
  35. euler_phi(k) * floor(n/k) * (floor(n/k) + 1) / 2 #F2(x/n)
  36. })
  37. }
  38. func T1(n) {
  39. sum(1..n, {|k|
  40. k.sigma * floor(n/k) #F2(x/n)
  41. })
  42. }
  43. func T2(n) {
  44. var z = n.isqrt
  45. sum(1..z, {|k|
  46. k * (k + floor(n/k)) * (floor(n/k) - k + 1)
  47. }) - z*(z+1)*(2*z + 1)/6
  48. #Sum_{m=1..floor(sqrt(n))} m*(m+floor(n/m))*(floor(n/m)+1-m)
  49. }
  50. # a(1) = 1, a(n+1) = Sum_{k=1..n} mu(k) * floor(n/k) * floor(1 + n/k), where mu(k) is the Mobius function.
  51. #say T1(0)
  52. #say T1(1)
  53. #say T1(2)
  54. #say T1(3)
  55. #say T1(49)
  56. say ''
  57. func project_euler(n) {
  58. sum(1..n, {|x| sum(1..x, {|y| gcd(x, y) })})
  59. }
  60. func project_euler2(n) {
  61. sum(1..n, {|k|
  62. k * k.divisors.sum {|d| euler_phi(d)/d }
  63. })
  64. }
  65. func project_euler3(n) {
  66. map(1..n, {|k|
  67. k.divisors.map {|d| k * euler_phi(d) / d }...
  68. })
  69. }
  70. func sum_totient(n) is cached {
  71. sum(1..n, {|k| k.euler_phi })
  72. }
  73. #say project_euler(100)
  74. #say project_euler2(100)
  75. #say ''
  76. #say T1(100)
  77. #say T2(100)
  78. #say ''
  79. #say G_1(100)
  80. #say G_0(100)
  81. #say G_0_2(100)
  82. #say 100.of { G_0_2(_) }
  83. #say G_0_2(100)
  84. say 30.of { T1(_) }
  85. #say ''
  86. #say 30.of { T2(_) }
  87. #say ''
  88. #say (30.of { T1(_) } ~Z- 30.of { T2(_) } -> map{.abs})
  89. #say (zeta(3# - 1)**2 / zeta(3))
  90. #say project_euler3(100).sort.map{.as_rat}.freq.sort_by {|a,b| b }.map{[Num(_[0]),_[1]]}.sort
  91. #for n in (1..10) {
  92. # say project_euler(n)
  93. #}
  94. #say sum(1..100, {|k| sum_totient(100//k) })
  95. #say sum_totient(1000)
  96. #say sum_totient(10000)
  97. #say sum_totient(100000)
  98. #say sum_totient(1000000)
  99. __END__
  100. #~ func sum_totient2(n) is cached {
  101. #~ sum(1..n, {|k|
  102. #~ k.rad.factor.each { |p| k -= k//p }
  103. #~ k
  104. #~ })
  105. #~ }
  106. var N = 1000
  107. var k = smallest_k(N)
  108. say k
  109. say sum(1 .. k, {|i| totient_iter(i, N) })
  110. say sum_totient(N)
  111. say sum_totient2(N)
  112. say ''
  113. say sum_totient2(N)/sum_totient(N)
  114. say sum_totient(N)/sum_totient2(N)
  115. __END__
  116. #~ func ramanujan_sum(k, n) {
  117. #~ sum(1..k -> grep {|a| is_coprime(a,k) }, {|a| exp(Num.tau.i * (a / k) * n) })
  118. #~ }
  119. #~ for N in (1..30) {
  120. #~ var sum = 0
  121. #~ for k in (1..N) {
  122. #~ for n in (k .. N) {
  123. #~ sum += ramanujan_sum(k, n)
  124. #~ }
  125. #~ }
  126. #~ say sum.round+1
  127. #~ }
  128. #~ __END__
  129. #~ use 5.014;
  130. #~ use ntheory qw(ramanujan_sum);
  131. #~ foreach my $N(1..10) {
  132. #~ my $sum = 0;
  133. #~ foreach my $k(1..$N) {
  134. #~ foreach my $n($k..$N) {
  135. #~ $sum += ramanujan_sum($k, $n);
  136. #~ }
  137. #~ }
  138. #~ #print "$sum, ";
  139. #~ say $sum;
  140. #~ }
  141. #~ __END__
  142. #~ for n in (1..10) {
  143. #~ say (sum(1..n, {|k| mobius(k)*floor(n/k)*floor(1 + n/k) }) / 2)
  144. #~ }
  145. #~ __END__
  146. var sum = 0
  147. for N in (1..100) {
  148. var table = []
  149. for n in (1 .. N/3) {
  150. for j in (1 .. n) {
  151. table << gcd(n, j)
  152. }
  153. }
  154. sum += (table.freq(){1} || 0)
  155. print (table.freq(){1}, ", ")
  156. #say table.freq(){2}
  157. }
  158. say ''
  159. say sum
  160. #say ''
  161. # 2, 4, 6, 10, 12, 18, 22, 28, 32