Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ### Project Euler, problem 347 ### --
- import Data.List (nub)
- firstPrimes n = takeWhile (<=n) primes
- primes = 2 : filter isPrime [3,5..]
- where
- isPrime n = all (/=0) . map (n `mod`) $ [2..squareRoot n]
- squareRoot = truncate . sqrt . fromIntegral
- factors n = f n (reverse $ firstPrimes n)
- where
- f _ [] = []
- f 1 _ = []
- f m l@(x:xs) | m `mod` x == 0 = x : f (m `div` x) l
- | otherwise = f m xs
- fn_m a b lim = myHead . map fst . filter (λ(x, xs) -> (b `elem` xs) && (a `elem` xs)) . filter ((== 2) . length . snd) . zip [lim, lim-1..2] $ map (nub . factors) [lim, lim-1..2]
- where
- myHead [] = 0
- myHead xs = head xs
- fn_s n = sum $ map (λ(x,y) -> fn_m x y n) l
- where
- l = myZip (firstPrimes $ n-1) (tail $ firstPrimes n)
- myZip _ [] = []
- myZip [] _ = []
- myZip a@(x:xs) b@(y:ys) = map (λn -> (x, n)) b ++ myZip xs ys
- main = do
- putStrLn . show $ fn_m 2 3 100 -- control of "fn_m" (function M(p,q,N))
- putStrLn . show $ fn_s 100 -- control of "fn_s" (function S(N))
- putStrLn . show $ fn_s 10000000 -- problem
Advertisement
Add Comment
Please, Sign In to add comment