factorial_dsc_algorithm.sf 715 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/ruby
  2. # The DSC-Factorial algorithm (divide, swing and conquer), by Peter Luschny.
  3. # See also:
  4. # https://oeis.org/A000142/a000142.pdf
  5. func Product(s, n, m) {
  6. n > m && return 1
  7. n == m && return s[n]
  8. var k = ((n + m) >> 1)
  9. Product(s, n, k) * Product(s, k + 1, m)
  10. }
  11. func PrimeSwing(n) {
  12. var factors = []
  13. for prime in (primes(n)) {
  14. var (q, p) = (n, 1)
  15. while (q > 0) {
  16. q //= prime
  17. p *= prime if q.is_odd
  18. }
  19. factors << p if (p > 1)
  20. }
  21. Product(factors, 0, factors.end)
  22. }
  23. func Factorial(n) {
  24. return 1 if (n < 2)
  25. Factorial(n >> 1)**2 * PrimeSwing(n)
  26. }
  27. for n in (0..30) {
  28. say "#{n}! = #{Factorial(n)}"
  29. }