module FactorizationUI (run) where import Utils (askChoice, askNumber) import Factorization (fermatFactorization, pollardPminus1, dixon) run :: IO () run = do putStrLn "Factorization" putStrLn "1) Fermat factorization" putStrLn "2) Pollard p-1" putStrLn "3) Dixon" choice <- askChoice 3 case choice of 1 -> fermatUI 2 -> pollardUI 3 -> dixonUI _ -> error "Impossible" fermatUI :: IO () fermatUI = do n <- askNumber "Enter an integer n > 1:" let (p, q) = fermatFactorization n putStrLn ("n = " ++ show n) putStrLn ("p = " ++ show p) putStrLn ("q = " ++ show q) pollardUI :: IO () pollardUI = do n <- askNumber "Enter an integer n > 1:" b <- askNumber "Enter the bound B:" case pollardPminus1 n b of Just factor -> do putStrLn ("Found factor: " ++ show factor) putStrLn ("Other factor: " ++ show (n `div` factor)) Nothing -> putStrLn "Failed to find a factor (try a different B or method)." dixonUI :: IO () dixonUI = do n <- askNumber "Enter an integer n > 1:" b <- askNumber "Enter the bound B:" x <- askNumber "Enter the max random integer x:" case dixon n b x of Left err -> do putStrLn ("Error: " ++ err) Right (p, q) -> do putStrLn ("n = " ++ show n) putStrLn ("p = " ++ show p) putStrLn ("q = " ++ show q)