Carmichael 3 strong pseudoprimes: Difference between revisions

m (tidy up task description)
Line 140:
 
import Data.Numbers.Primes
import DataControl.MaybeMonad (guard)
 
carmichaels = do
concatEach = flip concatMap
p <- takeWhile (<= 61) primes `concatEach` (\p ->
eachMaybe = flip mapMaybe
h3 <- [2..(p-1)]
 
let g = h3 + p
carmichaels =
d <- [1..(g-1)]
takeWhile (<= 61) primes `concatEach` (\p ->
guard $ (g * (p - 1)) `mod` d == 0 && (-1 * p * p) `mod` h3 == d `mod` h3
[2..(p-1)] `concatEach` (\h3 ->
let gq = h31 + (((p - 1) * g) `div` d)
guard $ isPrime q
in [1..(g-1)] `eachMaybe` (\d ->
let r = 1 if+ (g * (p - 1)) `mod` d == 0 && (-1 * p * pq) `moddiv` h3 == d `mod` h3 then)
guard $ isPrime r && let (q =* 1r) +`mod` (((p - 1) *== g) `div` d)1
return (p, q, r)
in if isPrime q then
let r = 1 + ((p * q) `div` h3)
in if isPrime r && (q * r) `mod` (p - 1) == 1 then
Just (p, q, r)
else
Nothing
else
Nothing
else
Nothing)))
 
main = putStr $ unlines $ map show carmichaels</lang>
Anonymous user