solovay-strassen_primality_test.sf 479 B

123456789101112131415161718192021222324
  1. #!/usr/bin/ruby
  2. # Implementation of the Solovay-Strassen primality test.
  3. func solovay_strassen(n, k=10) {
  4. n == 2 && return true
  5. n %% 2 && return false
  6. n < 0 && return false
  7. k.times {
  8. var a = irand(2, n-1)
  9. var z = kronecker(a, n)
  10. var p = powmod(a, (n-1) >> 1, n)
  11. if ((z == 0) || ((z == -1) ? (p != n-1) : (p != 1))) {
  12. return false
  13. }
  14. }
  15. return true
  16. }
  17. say (1..100 -> grep { solovay_strassen(_, 5) })