754 Product of Gauss Factorials.sf 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #!/usr/bin/ruby
  2. # Product of Gauss Factorials
  3. # https://projecteuler.net/problem=754
  4. func g(n) {
  5. 1..n -> grep { .is_coprime(n) }.prod
  6. }
  7. func G(n) {
  8. 1..n -> prod(g)
  9. }
  10. func g2(n) {
  11. #n^phi(n)*Product_{d|n} (d!/d^d)^mu(n/d)
  12. n.divisors.prod {|d|
  13. (d!)**mu(n/d)
  14. }
  15. }
  16. func g3(n) {
  17. n.factor_map {|p|
  18. p**(phi(n) / (p-1))
  19. }.prod
  20. }
  21. func G2(n) {
  22. var A = (1..n -> prod { |k|
  23. g2(k)
  24. })
  25. var B = (1..n -> prod {|k|
  26. g3(k)
  27. })
  28. A / B
  29. }
  30. say G(10)
  31. say G2(10)
  32. say 11.of(G2)
  33. say 11.of(g)
  34. say 11.of(g2)
  35. say 11.of(g3)
  36. say '';
  37. say 20.of(g2).map{.valuation(2) }
  38. #say 20.of(g3).map{.valuation(2) }
  39. #say 20.of(g2).map{.valuation(3) }
  40. #product(p^(phi(n)/(p-1)),p prime dividing n)
  41. func G3(n) {
  42. 2..(n-1) -> map {|k|
  43. [k, floor((n - k + 1)*phi(k) / k)]
  44. }
  45. }
  46. func G4(n) {
  47. 2..(n-1) -> prod {|k|
  48. k**floor((n - k + 1)*phi(k) / k)
  49. }
  50. }
  51. for n in (1..30) {
  52. if (G(n) != G4(n)) {
  53. print(n, ", ")
  54. }
  55. }
  56. func G13(n) {
  57. 2..n -> prod {|k|
  58. var t = 1
  59. var seen = Set()
  60. for p in (k.factor.uniq) {
  61. for(var j = p; j <= k; j += p) {
  62. t *= j if !seen.has(j)
  63. seen << j
  64. }
  65. }
  66. t
  67. }
  68. }
  69. func G4(n) {
  70. superfactorial(n) / G3(n)
  71. }
  72. var MOD = next_prime(1e9)
  73. func G5(n) {
  74. var prod1 = 1
  75. var prod2 = 1
  76. for k in (2..n) {
  77. prod1 = mulmod(prod1, powmod(k, n - k + 1, MOD), MOD)
  78. }
  79. for k in (2..n) {
  80. var prod_t = 1
  81. var seen = Set()
  82. for p in (k.factor.uniq) {
  83. for(var j = p; j <= k; j += p) {
  84. prod_t = mulmod(prod_t, j, MOD) if !seen.has(j)
  85. seen << j
  86. }
  87. }
  88. say [seen.len, k]
  89. prod2 = mulmod(prod2, prod_t, MOD)
  90. }
  91. divmod(prod1, prod2, MOD)
  92. }