25 lines
728 B
Haskell
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)
|