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)