fermat factorization
This commit is contained in:
35
fermat-factorization.hs
Normal file
35
fermat-factorization.hs
Normal file
@@ -0,0 +1,35 @@
|
||||
import Text.Read (readMaybe)
|
||||
import System.Exit (exitSuccess)
|
||||
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
n <- askNumber
|
||||
let (d, root) = findIntegerSqrt n
|
||||
q = (root - d)
|
||||
p = (root + d)
|
||||
putStrLn ("n = " ++ show n)
|
||||
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 n = go 0
|
||||
where
|
||||
go d =
|
||||
let val = n + d*d
|
||||
root = floor (sqrt (fromIntegral val))
|
||||
in if root * root == val
|
||||
then (d, root)
|
||||
else go (d + 1)
|
||||
Reference in New Issue
Block a user