Files
haskell-math/SoloveyStrassen.hs
2026-01-06 15:49:48 +01:00

29 lines
634 B
Haskell

module SoloveyStrassen (soloveyStrassen) where
import ModularArithmeticUtils (modExp, jacobi)
import System.Random (randomRIO)
soloveyStrassen :: Integer -> Integer -> IO Bool
soloveyStrassen 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)