move askNumber to utils
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import Text.Read (readMaybe)
|
import Text.Read (readMaybe)
|
||||||
import System.Exit (exitSuccess)
|
import System.Exit (exitSuccess)
|
||||||
import Data.Bits
|
import Data.Bits
|
||||||
|
import Utils (askNumber)
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
@@ -16,16 +17,6 @@ main = do
|
|||||||
Nothing -> do
|
Nothing -> do
|
||||||
putStrLn "Failed to find a factor using Pollard p-1 method. n could be prime or different parameters needed."
|
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
|
-- Pollard p-1 factorization algorithm
|
||||||
pollardP1 :: Integer -> Integer -> Maybe Integer
|
pollardP1 :: Integer -> Integer -> Maybe Integer
|
||||||
pollardP1 n b = tryBases [2..5]
|
pollardP1 n b = tryBases [2..5]
|
||||||
|
|||||||
15
Utils.hs
Normal file
15
Utils.hs
Normal file
@@ -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
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import Text.Read (readMaybe)
|
import Text.Read (readMaybe)
|
||||||
import System.Exit (exitSuccess)
|
import System.Exit (exitSuccess)
|
||||||
|
import Utils (askNumber)
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
n <- askNumber
|
n <- askNumber "Enter an integer:"
|
||||||
let (d, root) = findIntegerSqrt n
|
let (d, root) = findIntegerSqrt n
|
||||||
q = (root - d)
|
q = (root - d)
|
||||||
p = (root + d)
|
p = (root + d)
|
||||||
@@ -12,19 +12,8 @@ main = do
|
|||||||
putStrLn ("Found d = " ++ show d ++ ", sqrt(n + d^2) = " ++ show root)
|
putStrLn ("Found d = " ++ show d ++ ", sqrt(n + d^2) = " ++ show root)
|
||||||
putStrLn ("q = " ++ show q ++ ", p = " ++ show p)
|
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
|
-- 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
|
findIntegerSqrt n = go 0
|
||||||
where
|
where
|
||||||
go d =
|
go d =
|
||||||
|
|||||||
Reference in New Issue
Block a user