49 lines
1.3 KiB
Haskell
49 lines
1.3 KiB
Haskell
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:"
|
|
let (p, q) = dixon n b x
|
|
putStrLn ("n = " ++ show n)
|
|
putStrLn ("p = " ++ show p)
|
|
putStrLn ("q = " ++ show q)
|