Legendre prime counting function: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: added solution) |
(→{{header|Haskell}}: simplified memoization) |
||
Line 360:
Memoization utilities:
<lang haskell>
deriving Functor
Line 370 ⟶ 368:
| odd n = memo l (n `div` 2)
| otherwise = memo r (n `div` 2 - 1)
nats :: Integral a => Memo a
nats = Node 0 ((+1).(*2) <$> nats) ((*2).(+1) <$> nats)
memoize :: Integral a => (a -> b) ->
memoize f = memo (f <$> nats)
memoize2 :: (Integral a, Integral b) => (a -> b -> c) ->
memoize2 f = memoize (memoize . f)
memoList :: [b] ->
memoList
where
mkList (x:xs) = Node
where (l,r) = split
split [x] = ([x],[])
split (x:y:xs) = let (l,r) = split xs in (x:l, y:r)</lang>
Computation of Legendre function:
Line 401 ⟶ 398:
else go z (r `shiftR` 1) (q `shiftR` 2)
where
p = memoList (undefined : primes)▼
phiM x 0 = x
▲ p = memoList (undefined : primes)
▲phi x a = memo2 phiM x (a-1) - memo2 phiM (x `div` memo p a) (a - 1)
▲phiM = memoize2 phi
legendrePi :: Integer -> Integer
legendrePi n
| n < 2 = 0
| otherwise =
where a = legendrePi (floor (sqrt (fromInteger n)))
main = mapM_ (\n -> putStrLn $ show n ++ "\t" ++ show (legendrePi (10^n))) [1..
<pre>λ> main
|