Miller–Rabin primality test: Difference between revisions
Content added Content deleted
Line 1,191: | Line 1,191: | ||
| n < 100 = return (n `elem` primesTo100) |
| n < 100 = return (n `elem` primesTo100) |
||
| otherwise = do ws <- witnesses k n |
| otherwise = do ws <- witnesses k n |
||
return $ and [test n (pred n) evens |
return $ and [test n (pred n) evens (head odds) a | a <- ws] |
||
where |
where |
||
(evens,odds) = span even (iterate (`div` 2) (pred n)) |
(evens,odds) = span even (iterate (`div` 2) (pred n)) |
||
d = head odds |
|||
test :: Integral nat => nat -> nat -> [nat] -> nat -> nat -> Bool |
test :: Integral nat => nat -> nat -> [nat] -> nat -> nat -> Bool |
||
Line 1,223: | Line 1,221: | ||
g i b y | even i = g (i `quot` 2) (b*b `rem` m) y |
g i b y | even i = g (i `quot` 2) (b*b `rem` m) y |
||
| otherwise = f (i-1) b (b*y `rem` m) |
| otherwise = f (i-1) b (b*y `rem` m) |
||
-------------------------------------- |
-------------------------------------- |
||
Testing in GHCi: |
Testing in GHCi: |
||
~> isPrime 4547337172376300111955330758342147474062293202868155909489 |
|||
True |
True |
||
*~> |
*~> isPrime 4547337172376300111955330758342147474062293202868155909393 |
||
False |
False |
||
*~> dropWhile (<900) $ filter isPrime [2..1000] |
*~> dropWhile (<900) $ filter isPrime [2..1000] |
||
[907,911,919,929,937,941,947,953,967,971,977,983,991,997] |
[907,911,919,929,937,941,947,953,967,971,977,983,991,997] |
||
</lang> |
</lang> |
||