754 Product of Gauss Factorials -- v2.sf 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/ruby
  2. # Product of Gauss Factorials
  3. # https://projecteuler.net/problem=754
  4. # See also:
  5. # https://oeis.org/A001783
  6. func g(n) {
  7. 1..n -> grep {|k| gcd(k,n) == 1 }.prod
  8. }
  9. func G(n) {
  10. 1..n -> prod(g)
  11. }
  12. func F(n) {
  13. var t = 1
  14. for k in (1..n) {
  15. if (k.is_prime) {
  16. t *= (k-1)!
  17. }
  18. else {
  19. t *= (k**phi(k) * k.squarefree_divisors.prod {|d|
  20. ((k/d)! / (k/d)**(k/d))**mu(d)
  21. })
  22. }
  23. }
  24. return t
  25. }
  26. func F(n, m) {
  27. var prod = 1
  28. for k in (1..n) {
  29. if (k.is_prime) {
  30. prod = mulmod(prod, factorialmod(k-1, m), m)
  31. }
  32. else {
  33. prod = mulmod(
  34. mulmod(prod, powmod(k, phi(k), m), m),
  35. k.squarefree_divisors.map {|d|
  36. powmod(divmod(factorialmod(k/d, m), powmod(k/d, k/d, m), m), mu(d), m)
  37. }.reduce {|a,b| mulmod(a,b,m) },
  38. m)
  39. }
  40. }
  41. return prod
  42. }
  43. assert_eq(G(10), F(10))
  44. assert_eq(G(10), F(10, 1e20.next_prime))
  45. #say F(1e3, 1000000007) # takes 0.4s
  46. #say F(1e4, 1000000007) # takes 3.8s
  47. #say F(1e5, 1000000007) # takes 1 min
  48. say F(1e8, 1000000007)