381 prime-k factorial.sf 639 B

123456789101112131415161718192021222324252627
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 21 August 2016
  4. # Translated: 16 November 2023
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=381
  7. # Runtime: 2 minutes, 43 seconds.
  8. # Based on the following relations:
  9. #
  10. # (p-1)! mod p = p-1
  11. # (p-2)! mod p = 1
  12. # (p-3)! mod p = (p-1)/2
  13. # (p-5)! mod p = (p^2 -1)/24
  14. #
  15. # (p-4)! mod p has two paths:
  16. #
  17. # If (p+1) is divisible by 6, then: (p-4)! mod p = (p+1)/6
  18. # If (p+1) is not divisible by 6, then: (p-4)! mod p = p-floor(p/6)
  19. say (5..1e8 -> primes.sum {|p|
  20. (1 + (p-1) + idiv(p-1, 2) + (6.divides(p+1) ? idiv(p+1, 6) : (p - idiv(p,6))) + idiv(p*p - 1, 24)) % p
  21. })