From 4fc1af5c88635423eed557335e0d71f1370fa83c Mon Sep 17 00:00:00 2001 From: Sam HADOW Date: Fri, 17 Oct 2025 15:50:59 +0200 Subject: [PATCH] move askNumber to utils --- PollardPminus1.hs | 11 +---------- Utils.hs | 15 +++++++++++++++ fermat-factorization.hs | 17 +++-------------- 3 files changed, 19 insertions(+), 24 deletions(-) create mode 100644 Utils.hs diff --git a/PollardPminus1.hs b/PollardPminus1.hs index d00a6a8..90fd92b 100644 --- a/PollardPminus1.hs +++ b/PollardPminus1.hs @@ -1,6 +1,7 @@ import Text.Read (readMaybe) import System.Exit (exitSuccess) import Data.Bits +import Utils (askNumber) main :: IO () main = do @@ -16,16 +17,6 @@ main = do Nothing -> do putStrLn "Failed to find a factor using Pollard p-1 method. n could be prime or different parameters needed." -askNumber :: String -> IO Integer -askNumber s = do - putStrLn s - input <- getLine - case readMaybe input of - Just n | n > 1 -> return n - _ -> do - putStrLn "Not a valid integer" - exitSuccess - -- Pollard p-1 factorization algorithm pollardP1 :: Integer -> Integer -> Maybe Integer pollardP1 n b = tryBases [2..5] diff --git a/Utils.hs b/Utils.hs new file mode 100644 index 0000000..dd8feb5 --- /dev/null +++ b/Utils.hs @@ -0,0 +1,15 @@ +module Utils (askNumber) where + +import Text.Read (readMaybe) +import System.Exit (exitSuccess) + +-- Ask user for an integer > 1, or exit on invalid input +askNumber :: String -> IO Integer +askNumber s = do + putStrLn s + input <- getLine + case readMaybe input of + Just n | n > 1 -> return n + _ -> do + putStrLn "Not a valid integer" + exitSuccess diff --git a/fermat-factorization.hs b/fermat-factorization.hs index 80214d9..3028e8e 100644 --- a/fermat-factorization.hs +++ b/fermat-factorization.hs @@ -1,10 +1,10 @@ import Text.Read (readMaybe) import System.Exit (exitSuccess) - +import Utils (askNumber) main :: IO () main = do - n <- askNumber + n <- askNumber "Enter an integer:" let (d, root) = findIntegerSqrt n q = (root - d) p = (root + d) @@ -12,19 +12,8 @@ main = do putStrLn ("Found d = " ++ show d ++ ", sqrt(n + d^2) = " ++ show root) putStrLn ("q = " ++ show q ++ ", p = " ++ show p) - -askNumber :: IO Int -askNumber = do - putStrLn "Enter an integer:" - input <- getLine - case readMaybe input :: Maybe Int of - Just n -> return n - Nothing -> do - putStrLn "Not a valid integer!" - exitSuccess - -- Find the smallest integer d >= 0 such that sqrt(n + d^2) is an integer -findIntegerSqrt :: Int -> (Int, Int) +findIntegerSqrt :: Integer -> (Integer, Integer) findIntegerSqrt n = go 0 where go d =