diff --git a/fermat-prime-test.hs b/fermat-prime-test.hs new file mode 100644 index 0000000..ec99576 --- /dev/null +++ b/fermat-prime-test.hs @@ -0,0 +1,15 @@ +import System.Random (randomRIO) +import ModularArithmeticUtils (modExp) + +fermatPrimeTest :: Integer -> Integer -> IO Bool +fermatPrimeTest n k + | n <= 3 = return (n == 2 || n == 3) + | even n = return False + | otherwise = go k + where + go 0 = return True + go i = do + a <- randomRIO (2, n - 2) + if modExp a (n - 1) n /= 1 + then return False + else go (i - 1)