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