Files
haskell-math/fermat-factorization.hs
2025-10-17 15:50:59 +02:00

25 lines
728 B
Haskell

import Text.Read (readMaybe)
import System.Exit (exitSuccess)
import Utils (askNumber)
main :: IO ()
main = do
n <- askNumber "Enter an integer:"
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)
-- Find the smallest integer d >= 0 such that sqrt(n + d^2) is an integer
findIntegerSqrt :: Integer -> (Integer, Integer)
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)