Files
haskell-math/SolaveyStrassen.hs
2026-01-06 15:47:38 +01:00

29 lines
634 B
Haskell

module SolaveyStrassen (solaveyStrassen) where
import ModularArithmeticUtils (modExp, jacobi)
import System.Random (randomRIO)
solaveyStrassen :: Integer -> Integer -> IO Bool
solaveyStrassen n k
| n < 2 = return False
| n == 2 = return True
| even n = return False
| otherwise = go k
where
expHalf = (n - 1) `div` 2
go 0 = return True
go i = do
a <- randomRIO (2, n - 2)
if gcd a n /= 1
then return False
else do
let x = modExp a expHalf n
j = jacobi a n `mod` n
if x /= j
then return False
else go (i - 1)