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
9,655

edits