find_terms.sf 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/ruby
  2. # a(11) >= 85879
  3. for n in (5) {
  4. for k in (2 .. Inf) {
  5. say "Testing #{k}"
  6. k.is_prime && next
  7. powmod(n, k, (n-1)*k) == n || next
  8. (n**k - 1)/(n-1) % k == 1 || next
  9. k.factor.all {|p|
  10. (n**p - 1)/(n-1) % k == 1
  11. } || next
  12. #, so n^k == n (mod (n-1)k)
  13. var ok = true
  14. var t = (n**k - 1)/(n-1)
  15. var orig = t
  16. var trial = true
  17. while (t > 1) {
  18. if (t.len < 60) {
  19. ok = t.divisors.all { |d| (d%k == 1) && ((orig/d) % k == 1) }
  20. break
  21. }
  22. say "Factoring...";
  23. var f = (trial ? t.pminus1_factor : t.ecm_factor)
  24. if ((f.len == 1) && (!trial) && (f[-1].is_prob_prime)) {
  25. ok = ((t%k == 1) && ((orig/t)%k == 1))
  26. break
  27. }
  28. if (trial && (f.len == 1)) {
  29. say "Factoring again..."
  30. trial = false;
  31. f = t.ecm_factor
  32. }
  33. say f.slice(0,-1)
  34. (f[-1]%k == 1) && ((orig/f[-1])%k == 1) || do {
  35. say "Last factor counter-example";
  36. ok = false;
  37. break;
  38. };
  39. # say f
  40. assert(f.len > 1)
  41. f.slice(0,-1).all {|d|
  42. (d%k == 1) &&
  43. ((orig/d)%k == 1) && d.divisors.all {|d|
  44. (d%k == 1) && ((orig/d)%k == 1)
  45. }
  46. } || do {
  47. #say "Counter-example for k=#{k} with #{f.slice(-1)}"
  48. ok = false
  49. break
  50. }
  51. t = f.pop
  52. }
  53. ok || next
  54. say "Found: a(#{n}) = #{k}"
  55. break
  56. #if ( -> divisors.all { _%k == 1}) {
  57. # say "a(#{n}) = #{k}"
  58. # break
  59. #}
  60. }
  61. }