Integer roots: Difference between revisions
→{{header|Haskell}}: Added an applicative variant
(→{{header|Julia}}: fixed bug, made it more Julian) |
(→{{header|Haskell}}: Added an applicative variant) |
||
Line 393:
print $ root 3 9
print $ root 2 (2 * 100 ^ 2000) -- first 2001 digits of the square root of 2</lang>
Or equivalently, in terms of an applicative expression:
<lang haskell>integerRoot :: Integer -> Integer -> Integer
integerRoot n x =
go $ iterate ((`div` n) . ((+) <$> (pn *) <*> (x `div`) . (^ pn))) 1
where
pn = pred n
go (x:xs@(y:z:_))
| x == y || x == z = min y z
| otherwise = go xs
main :: IO ()
main = mapM_ (print . uncurry integerRoot) [(3, 8), (3, 9), (2, 2 * 100 ^ 2000)]</lang>
{{out}}
<pre>2
|