x.pl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #!/usr/bin/perl
  2. # S(23382529) = 23001598
  3. use 5.014;
  4. use ntheory qw(:all);
  5. use Math::AnyNum qw(is_smooth);
  6. sub S {
  7. my ($n) = @_;
  8. my $sum = 0;
  9. my $t = ($n-1);
  10. # my %table;
  11. foreach my $k(1..$n-1) {
  12. $sum = addmod($sum, powmod($k, $t, $n), $n);
  13. # and powmod($k, $t, $n) == 154) {
  14. #say "$k -> ", powmod($k, $t, $n), ' -> ', join(', ' ,factor($k));
  15. #}
  16. }
  17. if ($sum == 1){
  18. die "Counter-example: $n";
  19. }
  20. $sum
  21. #(vecall {($n/$_-1) % ($_-1) == 0 }factor($n))
  22. }
  23. sub optimizedS {
  24. my ($n) = @_;
  25. my @d = divisors($n);
  26. my $sum = 0;
  27. my $t = ($n-1);
  28. my $count = 0;
  29. foreach my $d(divisors($n)) {
  30. # if ($d > 1) {
  31. $sum = addmod($sum, mulmod(powmod($d, $t, $n), euler_phi($n/$d), $n), $n);
  32. # }
  33. }
  34. if ($n > ~0) {
  35. say ref $sum;
  36. }
  37. ($sum ) %$n;
  38. }
  39. #~ foreach my $n(3..1e3) {
  40. #~ next if is_prime($n);
  41. #~ next if $n%2 == 0;
  42. #~ next if is_power($n);
  43. #~ if (S($n) == optimizedS($n)) {
  44. #~ #say "$n";
  45. #~ print($n, ", ");
  46. #~ }
  47. #~ }
  48. #~ __END__
  49. use Math::GMPz;
  50. while (<>) {
  51. next if /^#/;
  52. my $n = (split(' '))[-1];
  53. #my $n = next_prime int rand 1e6;
  54. $n || next;
  55. #is_smooth($n, 1e7) || next;
  56. #next if ($n < 1e9);
  57. # $n < 1e10 || next;
  58. #next if $n > 1e9;
  59. #~ next if $n < ~0;
  60. #~ next if length($n) > 30;
  61. #~ is_carmichael($n) || next;
  62. #~ $n = Math::GMPz->new("$n");
  63. my $x = optimizedS($n);
  64. #~ my $y = S($n);
  65. #~ if ($x != $y){
  66. #~ die "$n -- error $x != $y";
  67. #~ }
  68. #~ say "Error for $n: $x != $y -> ", join(', ', factor($n));
  69. #~ if (is_carmichael($n)) {
  70. #~ die "Fatal error!!!";
  71. #~ }
  72. #~ }
  73. say "S($n) = $x";
  74. if ($x == $n-1 or $x == 1) {
  75. #if (S($n) == $n-1) {
  76. die "Counter-example: $n with x = $x";
  77. #}
  78. }
  79. #my $x = S($n);
  80. #my $y = optimizedS($n);
  81. #say "S($n) = $x -- $y";
  82. #if ($x != $y) {
  83. # die "Counter-example: $n";
  84. #}
  85. }
  86. __END__
  87. say S(43);
  88. say S(541);
  89. say S(561);
  90. #say S(1024651);
  91. say 961792;
  92. say S(362879);
  93. say '';
  94. say optimizedS(43);
  95. say optimizedS(541);
  96. say '';
  97. say optimizedS(561), ' == ', 290, ' -> ', optimizedS(561) == 290;
  98. say optimizedS(1024651), ' == ', 961792, ' -> ', optimizedS(1024651) == 961792;
  99. say '';
  100. say optimizedS(16046641), ' == ', 14123661, ' -> ', optimizedS(16046641) == 14123661;
  101. say optimizedS(16778881), ' == ', 12009864, ' -> ', optimizedS(16778881) == 12009864;
  102. say optimizedS(23382529);
  103. #S(16046641) = 14123661
  104. __END__
  105. foreach my $n(3..1e6) {
  106. say "S($n) = ", S($n);
  107. }
  108. __END__
  109. S(16046641) = 14123661
  110. S(16778881) = 12009864
  111. S(17098369) = 16858238
  112. S(17236801) = 17009098
  113. S(17316001) = 16870670
  114. S(17586361) = 15629649
  115. S(17812081) = 14481769
  116. S(18162001) = 13384248
  117. S(18307381) = 17004481
  118. S(18900973) = 14643537
  119. S(19384289) = 19080158
  120. S(19683001) = 17433969
  121. S(20964961) = 18167065
  122. S(21584305) = 15871469
  123. S(22665505) = 16557229
  124. S(23382529) = 23001598
  125. while (<>) {
  126. my (undef, $n) = split(' ');
  127. say "S($n) = ", S($n);
  128. }
  129. __END__
  130. __END__
  131. # and ($n/$_-1) % $_ == 0
  132. foroddcomposites {
  133. say $_ if isok($_);
  134. } 1e3;
  135. __END__
  136. sub S {
  137. my ($n) = @_;
  138. my $sum = 0;
  139. my $t = ($n-1);
  140. foreach my $k(1..$n-1) {
  141. $sum = addmod($sum, powmod($k, $t, $n), $n);
  142. }
  143. #if ($sum == 1 or $sum == $n-1) {
  144. # die "Counter-example: $n";
  145. #}
  146. $sum;
  147. }
  148. foreach my $n(1..10) {
  149. my $p = nth_prime($n);
  150. say "S($p) = ", S($p);
  151. }
  152. while (<>) {
  153. my (undef, $n) = split(' ', $_);
  154. $n || next;
  155. ($n+0) || next;
  156. #next if $n < 4903921;
  157. say "S($n) = ", S($n);
  158. }
  159. __END__
  160. #~ #say S(976873);
  161. #~ #__END__
  162. #~ S(976873) = 0
  163. #~ S(983401) = 980430
  164. #~ S(997633) = 724137
  165. foroddcomposites {
  166. my $k = $_;
  167. if (is_euler_pseudoprime($k,2)) {
  168. say "S($k) = ", S($k);
  169. }
  170. } 1e6;