least_nonresidue.pl 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/perl
  2. # Find the least nonresidue of n.
  3. # See also:
  4. # https://oeis.org/A020649 -- Least nonresidue of n.
  5. # https://oeis.org/A307809 -- Smallest "non-residue" pseudoprime to base prime(n).
  6. # https://mathworld.wolfram.com/QuadraticNonresidue.html
  7. use 5.020;
  8. use ntheory qw(:all);
  9. use experimental qw(signatures);
  10. sub least_nonresidue_odd ($n) { # for odd n
  11. my @factors = map { $_->[0] } factor_exp($n);
  12. for (my $p = 2 ; ; $p = next_prime($p)) {
  13. (vecall { kronecker($p, $_) == 1 } @factors) || return $p;
  14. }
  15. }
  16. sub least_nonresidue_sqrtmod ($n) { # for any n
  17. for (my $p = 2 ; ; $p = next_prime($p)) {
  18. sqrtmod($p, $n) // return $p;
  19. }
  20. }
  21. my @tests = (
  22. 3277, 3281, 121463, 491209,
  23. 11530801, 512330281, 15656266201, 139309114031,
  24. 7947339136801, 72054898434289, 334152420730129, 17676352761153241,
  25. 172138573277896681
  26. );
  27. say join ', ', map { least_nonresidue_odd($_) } @tests; #=> 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41
  28. say join ', ', map { least_nonresidue_sqrtmod($_) } @tests; #=> 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41