prog.pl 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. #!/usr/bin/perl
  2. #~ Consider the following sequences:
  3. #~ Let a(n) be the smallest prime p such that n^p == n (mod q), for n = 0,1,2,...
  4. #~ (*) where q is the smallest prime > p such that p-1 | q-1.
  5. #~ (**) where q is the next prime after p.
  6. #~ (*) 2, 2, 11, 2, 2, 3, 2, 2, 5, 2, ... Is this sequence periodic?
  7. #~ (**) 2, 2, 113, 2, 2, 3, 2, 2, 5, 2, ... Is this sequence bounded?
  8. #~ Have a nice day!
  9. #~ Corrected set: A = {9, 15, 21, 25, 33, 39, 49, 51, 57, 65, 69, 85, 87, 91, 93, 111, 121, 123, 129, 133, 141, 145, 159, 169, 177, 183, 185, 201, 205, 213, 217, 219, 237, 249, 259, 265, 267, 289, 291, 301, 303, 305, 309, 321, 327, 339, 341, 361, 365, 381, 393, 411, 417, 427, 445, 447, 451, 453, 469, 471, 481, 485, 489, 501, 505, 511, 519, 529, 537, 543, 545, 553, 561, 565, 573, 579, 591, 597, 633, 645, 669, 671, 679, 681, 685, 687, 699, 703, 717, 721, 723, 745, 753, 763, 771, 781, 785, 789, 793, 807, 813, 831, 841, 843, 849, 865, 879, 889, 905, 921, 933, 939, 949, 951, 961, 965, 973, 985, 993, 1011, 1041, 1047, 1057, 1059, 1065, 1077, 1099, 1101, 1111, 1119, 1137, 1141, 1145, 1149, 1165, 1167, 1191, 1203, 1205, 1227, 1247, 1257, 1261, 1263, 1267, 1285, 1293, 1299, 1317, 1329, 1345, 1347, 1351, 1369, 1371, 1383, 1385, 1387, 1389, 1393, 1401, 1405, 1417, 1437, 1441, 1461, 1465, 1473, 1477, 1497, 1509, 1527, 1541, 1561, 1563, 1565, 1569, 1585, 1603, 1623, 1641, 1649, 1661, 1671, 1681, 1685, 1687, 1689, 1707, 1713, 1729}
  10. #~ LCM(A) = 19974189529267233805048246587648609684002517045072696325440852333740211305925469232124401559514495489578549049794060699217424449904662437604539103637539339468499990506897971814716522960950895471907013503223284820116877757184319629345000591535688675
  11. use 5.014;
  12. use ntheory qw(:all);
  13. sub find_q {
  14. my ($p) = @_;
  15. foreach my $k(2..1e10) {
  16. if (is_prime(($p-1)*$k + 1)) {
  17. return (($p-1)*$k + 1);
  18. }
  19. }
  20. }
  21. sub a { # p-1 | q-1
  22. my ($n) = @_;
  23. my $iter = prime_iterator();
  24. for (my $p = $iter->(); ; $p = $iter->()) {
  25. my $q = find_q($p);
  26. if (powmod($n, $p, $q) == ($n % $q)) {
  27. return $p; #($p, $q);
  28. }
  29. }
  30. }
  31. sub b { # nextprime (**)
  32. my ($n) = @_;
  33. my $iter = prime_iterator();
  34. for (my $p = $iter->(); ; $p = $iter->()) {
  35. my $q = next_prime($p);
  36. if (powmod($n, $p, $q) == ($n % $q)) {
  37. return $p;
  38. }
  39. }
  40. }
  41. sub c {
  42. my ($n) = @_;
  43. for(my $k = 3; $k <= 1729; $k += 2) {
  44. next if is_prime($k);
  45. my $t = powmod($n, ($k+1)>>1, $k);
  46. if($t == ($n%$k) or $t == (-$n)%$k) {
  47. return $k;
  48. }
  49. }
  50. }
  51. use Math::GMPz;
  52. my $period = Math::GMPz->new("19974189529267233805048246587648609684002517045072696325440852333740211305925469232124401559514495489578549049794060699217424449904662437604539103637539339468499990506897971814716522960950895471907013503223284820116877757184319629345000591535688675");
  53. foreach my $k(1..1e6) {
  54. my $x = c($k);
  55. my $y = c($k + $period);
  56. if ($x != $y) {
  57. die "non period: $x != $y for k = $k";
  58. }
  59. }
  60. __END__
  61. #~ foreach my $k(1..1e8) {
  62. #~ if (c($k) == 1247) {
  63. #~ say "c($k) = 1247";
  64. #~ last;
  65. #~ }
  66. #~ }
  67. #~ __END__
  68. #say c(2153846);
  69. #~ use Math::GMPz;
  70. #~ say c(Math::GMPz->new("560500033"));
  71. #~ say c(Math::GMPz->new("13668555257082559489"));
  72. #~ say c(Math::GMPz->new("9498733884118309169"));
  73. #~ say c(Math::GMPz->new("9621022700125202321"));
  74. #~ __END__
  75. my %seen;
  76. use Math::GMPz;
  77. my %known;
  78. @known{
  79. 9, 15, 21, 25, 33, 39, 49, 51, 57, 65, 69, 85, 87, 91, 93, 111, 121, 123, 129, 133, 141, 145, 159, 169, 177, 183, 185, 201, 205, 213, 217, 219, 237, 249, 259, 265, 267, 289, 291, 301, 303, 305, 309, 321, 327, 339, 341, 361, 365, 381, 393, 411, 417, 427, 445, 447, 451, 453, 469, 471, 481, 485, 489, 501, 505, 511, 519, 529, 537, 543, 545, 553, 561, 565, 573, 579, 591, 597, 633, 645, 669, 671, 679, 681, 685, 687, 699, 703, 717, 721, 723, 745, 753, 763, 771, 781, 785, 789, 793, 807, 831, 841, 849, 865, 879, 889, 905, 921, 933, 939, 949, 951, 961, 965, 973, 985, 1041, 1057, 1059, 1065, 1099, 1101, 1111, 1137, 1141, 1145, 1149, 1203, 1247, 1261, 1263, 1267, 1299, 1317, 1329, 1345, 1369, 1385, 1387, 1393, 1417, 1441, 1461, 1477, 1541, 1561, 1565, 1585, 1661, 1685, 1687, 1713, 1729,
  80. 1681,
  81. 1689,
  82. 1383,
  83. 1119,
  84. 1437,
  85. 1191,
  86. 1649,
  87. 1011,
  88. 1371,
  89. 1671,
  90. 1167,
  91. 1285,
  92. 1293,
  93. 843,
  94. 1077,
  95. 993,
  96. 1473,
  97. 813,
  98. 1047,
  99. 1509,
  100. 1257,
  101. 1389,
  102. 1165,
  103. 1351,
  104. 1227,
  105. 1465,
  106. 1347,
  107. 1405,
  108. 1527,
  109. 1569,
  110. 1707,
  111. 1497,
  112. 1563,
  113. 1401,
  114. 1603,
  115. 1641,
  116. 1205,
  117. 1623,
  118. } = ();
  119. foreach my $k(1..1e8) {
  120. if (not exists $known{c($k)}) {
  121. say "Found: a($k) = ", c($k);
  122. $known{c($k)} = $k;
  123. }
  124. }
  125. __END__
  126. use Math::AnyNum;
  127. say c(Math::AnyNum->new("13668555257082559489"));
  128. exit;
  129. #~ say join ', ', keys %known;
  130. #~ exit;
  131. #~ foreach my $n(1..1e8) {
  132. #~ if (not exists $known{c($n)}) {
  133. #~ say "Found: $n -- ", c($n);
  134. #~ $known{c($n)} = $n;
  135. #~ }
  136. #~ }
  137. #~ __END__
  138. #say scalar keys %known;
  139. # %known = ();
  140. #~ foreach my $n(1e8..1e9) {
  141. #~ if (not exists $known{c($n)}) {
  142. #~ say "Found: $n -- ", c($n);
  143. #~ $known{c($n)} = $n;
  144. #~ }
  145. #~ }
  146. #~ __END__
  147. @seen{keys %known} = ();
  148. #foreach my $k(1..2e6) {
  149. # $seen{c($k)} = $k;
  150. #}
  151. while (<>) {
  152. next if /^#/;
  153. next if !/\S/;
  154. my $n = (split(' '))[-1];
  155. $n || next;
  156. #if ($n > ~0) {
  157. $n = Math::GMPz->new("$n");
  158. # }
  159. #say "Testing: $n";
  160. my $t = c($n);
  161. if (not exists $seen{$t}) {
  162. say "New: a($n) = $t";
  163. $seen{$t} = $n;
  164. }
  165. }
  166. #foreach my $k(sort {$a <=> $b }keys %seen) {
  167. # say "a($seen{$k}) = $k";
  168. #}
  169. say "There are ", scalar(keys %seen), " unique values";
  170. foreach my $k(keys %seen) {
  171. if (not exists $known{$k}) {
  172. say "New: $k (for $seen{$k})";
  173. }
  174. }
  175. say join ', ', sort {$a <=> $b} keys %seen;
  176. __END__
  177. New: 119 (for 13668555257082559489)
  178. New: 1267 (for 560500033)
  179. New: 35 (for 9498733884118309169)
  180. New: 27 (for 9621022700125202321)
  181. #my $max = 0;
  182. #~ say c(0);
  183. #~ __END__
  184. my %seen;
  185. foreach my $k(1..2e6) {
  186. undef $seen{c($k)};
  187. #my $t = c($k);
  188. #if ($t > $max) {
  189. # $max = $t;
  190. # say "a($k) = $t";
  191. #}
  192. }
  193. say join ', ', sort {$a <=> $b} keys %seen;
  194. say scalar keys %seen;
  195. # A = {9, 15, 21, 25, 33, 39, 49, 51, 57, 65, 69, 85, 87, 91, 93, 111, 121, 123, 129, 133, 141, 145, 159, 169, 177, 183, 185, 201, 205, 213, 217, 219, 237, 249, 259, 265, 267, 289, 291, 301, 303, 305, 309, 321, 327, 339, 341, 361, 365, 381, 393, 411, 417, 427, 445, 447, 451, 453, 469, 471, 481, 485, 489, 501, 505, 511, 519, 529, 537, 543, 545, 553, 561, 565, 573, 579, 591, 597, 633, 645, 671, 679, 681, 685, 687, 699, 703, 717, 721, 723, 745, 753, 763, 771, 781, 785, 789, 793, 831, 841, 843, 849, 865, 879, 889, 905, 921, 933, 939, 949, 951, 961, 965, 973, 985, 993, 1011, 1041, 1057, 1059, 1065, 1077, 1099, 1101, 1111, 1119, 1137, 1141, 1145, 1167, 1191, 1247, 1261, 1263, 1285, 1293, 1329, 1369, 1371, 1383, 1387, 1417, 1437, 1441, 1461, 1477, 1541, 1561, 1585, 1649, 1661, 1671, 1681, 1689, 1729}
  196. __END__
  197. use Math::GMPz;
  198. my $period = lcm(map{find_q($_)}(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 139, 149, 163, 167));
  199. $period = Math::GMPz->new("$period");
  200. foreach my $p(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 139, 149, 163, 167) {
  201. say "Q($p) = ", find_q($p);
  202. }
  203. __END__
  204. $period/=499;
  205. $period/=739;
  206. $period/=743;
  207. say $period;
  208. #~ exit;
  209. #~ use Math::AnyNum qw(irand);
  210. foreach my $n(1..100000) {
  211. #my $n = irand(factorial($k));
  212. my $x = a($n);
  213. my $y = a($n+$period);
  214. say "Testing: $n ($x == $y)";
  215. if ($x != $y) {
  216. die "Not a period: $x != $y for n = $n";
  217. }
  218. }
  219. __END__
  220. use Math::GMPz;
  221. my $max = 0;
  222. while (<>) {
  223. next if /^#/;
  224. next if !/\S/;
  225. my $n = (split(' '))[-1];
  226. $n || next;
  227. if ($n > ~0) {
  228. $n = Math::GMPz->new("$n");
  229. }
  230. #my ($p, $q) = a($n);
  231. my $x = a($n);
  232. my $y = a($n+$period);
  233. say "$x $y";
  234. if ($x != $y) {
  235. die "Period fail: $x != $y for n = $n";
  236. }
  237. #if ($p > $max) {
  238. # $max = $p;
  239. # say "a($n) = $p (with q = $q)";
  240. #}
  241. }
  242. __END__
  243. foreach my $n(0..1e4) {
  244. say a($n);
  245. }
  246. __END__
  247. #~ my %seen;
  248. #~ foreach my $k(1..1e7) {
  249. #~ undef $seen{a($k)};
  250. #~ }
  251. #~ say join ', ', sort {$a <=> $b} keys %seen;
  252. #~ __END__
  253. #say join ', ', map{a($_)} 0..10;
  254. #say join ', ', map{b($_)} 0..10;
  255. #OUTER: foreach my $k(1..1e6) {
  256. use Math::GMPz;
  257. my $k = Math::GMPz->new("59135093664847200");
  258. say "Testing: $k";
  259. foreach my $n(1..1e6) {
  260. my $x = a($n);
  261. my $y = a($n+$k);
  262. if ($x != $y) {
  263. die "Not a period $x != $y for n = $n";
  264. }
  265. }
  266. say "Period seems to be $k";
  267. # last;
  268. #}
  269. __END__
  270. my $max = 163;
  271. foreach my $k(1e7..1e8) {
  272. my ($t, $q) = a($k);
  273. if ($t > $max) {
  274. $max = $t;
  275. say "a($k) = $t (with q = $q)";
  276. }
  277. }
  278. __END__
  279. my %seen;
  280. foreach my $k(0..1e4) {
  281. undef $seen{b($k)};
  282. }
  283. say join ', ', sort {$a <=> $b} keys %seen;