\begin{code} module RunTests (main,sqrtTest) where import IO import System (exitFailure) import List (sort) import Brianweb.Math.NumberTheory import Brianweb.List (sortedElem) shanks' :: Integer -> Integer -> [Integer] shanks' p a = case shanksTonelli p a of Nothing -> [] Just x -> [x,negateMod p x] sqrtTest :: [Integer] -> Int -> Int -> IO() sqrtTest [] _ _ = return () sqrtTest (p:ps) n t = do putStrLn $ "Doing (mod " ++ show p ++ ") (" ++ show n ++ "/" ++ show t ++ ")..." iter [1..p-1] sqrtTest ps (n+1) t where isPrime x = x `sortedElem` lazyPrimes squares = map (\x -> (x,powMod p x 2)) [1..p-1] iter [] = return () iter (s:ss) = do if ((not $ isPrime p) || correctAns == shanksAns) && correctAns == sqrtModAns then iter ss else do putStrLn $ show s ++ " FAILED!" putStrLn $ "Correct: " ++ show correctAns putStrLn $ "sqrtMod: " ++ show sqrtModAns putStrLn $ "shanks: " ++ show shanksAns exitFailure where correctAns = map fst $ filter ((==s).snd) squares shanksAns = if isPrime p then sort $ shanks' p s else [] sqrtModAns = sort $ sqrtMod p s main :: IO() main = do return () {-let totest = take 90 (tail primes) ++ (take 10 $ takeEvery 40 $ tail primes) ++ takeEvery 1 [10,20..1000] ++ [3,6..666] ++ [21,28..200] sqrtTest totest 1 (length totest) -} \end{code}