fermat_numbers_find_small_factor.sf 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 11 May 2019
  4. # https://github.com/trizen
  5. # Find small factors of Fermat numbers: F(k) = 2^(2^k) + 1.
  6. # This takes advantage of the fact that the prime factors of Fermat numbers have the form:
  7. #
  8. # 2^(k+2) * u + 1
  9. #
  10. # for some integer `u`.
  11. # See also:
  12. # https://en.wikipedia.org/wiki/Fermat_number
  13. func fermat_small_factor(k) {
  14. var F = (2**(2**k) + 1)
  15. var t = 2**(k+2)
  16. for u in (2..1e4) {
  17. if (is_prime(t*u + 1)) {
  18. var z = (t*u + 1)
  19. if (z `divides` F) {
  20. return z
  21. }
  22. }
  23. }
  24. return nil
  25. }
  26. for k in (3..18) {
  27. var d = fermat_small_factor(k)
  28. say "2^(2^#{k}) + 1 is divisible by #{d}" if d
  29. }
  30. __END__
  31. 2^(2^3) + 1 is divisible by 257
  32. 2^(2^4) + 1 is divisible by 65537
  33. 2^(2^5) + 1 is divisible by 641
  34. 2^(2^6) + 1 is divisible by 274177
  35. 2^(2^9) + 1 is divisible by 2424833
  36. 2^(2^11) + 1 is divisible by 319489
  37. 2^(2^12) + 1 is divisible by 114689
  38. 2^(2^15) + 1 is divisible by 1214251009
  39. 2^(2^16) + 1 is divisible by 825753601
  40. 2^(2^18) + 1 is divisible by 13631489