inverse_of_factorial.sf 824 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 29 April 2018
  4. # https://github.com/trizen
  5. # Compute the inverse of n-factorial.
  6. # Returns correct values only for factorial numbers.
  7. func p_adic_inverse (p, k) {
  8. var n = (k * (p - 1))
  9. while (factorial_power(n, p) < k) {
  10. n -= (n % p)
  11. n += p
  12. }
  13. return n
  14. }
  15. func inverse_of_factorial (f) {
  16. return 1 if (f == 1)
  17. var t = valuation(f, 2) # largest power of 2 in f
  18. var z = p_adic_inverse(2, t) # smallest number z such that 2^t divides z!
  19. var d = factor(z + 1)[-1] # largest prime factor of z+1
  20. if (valuation(f, d) == factorial_power(z+1, d)) {
  21. return z+1
  22. }
  23. return z
  24. }
  25. for n in (1..30) {
  26. var f = n!
  27. var i = inverse_of_factorial(f)
  28. say "#{i}! = #{f}"
  29. assert_eq(i, n)
  30. }