Advertisement
Guest User

Untitled

a guest
May 29th, 2015
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. module Main where
  2. main :: IO ()
  3. main = let
  4. k = fromIntegral . fst $ multiplesOfN !! pred 10
  5. p = funcF k
  6. q = funcG p
  7. r = funcH q
  8. in putStrLn . show $ (p, q, r)
  9.  
  10. multiplesOfN :: [(Integer, Integer)]
  11. multiplesOfN = filter p . zip [1..] . map funcF $ [1..]
  12. where
  13. p (n, f)
  14. | f == 0 = False
  15. | otherwise = f `mod` n == 0
  16.  
  17. funcF = (!!) fibl
  18. where fibl = 3:0:2:zipWith (+) fibl (tail fibl)
  19.  
  20. funcG = maximum . primeFactors
  21. funcH n = sum . map snd $ takeWhile (\(_, p) -> p <= n) pthPrimes
  22.  
  23. factors :: [Integer] -> Integer -> [Integer]
  24. factors qs@(p:ps) n
  25. | n <= 1 = []
  26. | m == 0 = p : factors qs d
  27. | otherwise = factors ps n
  28. where (d,m) = n `divMod` p
  29.  
  30. primeFactors :: Integer -> [Integer]
  31. primeFactors = factors primes
  32.  
  33. isPrime :: Integer -> Bool
  34. isPrime n | n > 1 = primeFactors n == [n]
  35. | otherwise = False
  36.  
  37. pthPrimes = filter (isPrime . fst) $ zip [1..] primes
  38.  
  39. primes :: [Integer]
  40. primes = 2 : sieve [3..] primes
  41. where
  42. sieve xs (p:ps)
  43. | q <- p*p,
  44. (h,t) <- span (< q) xs =
  45. h ++ sieve (t `minus` [q, q+p..]) ps
  46.  
  47. minus (x:xs) (y:ys) = case (compare x y) of
  48. LT -> x : minus xs (y:ys)
  49. EQ -> minus xs ys
  50. GT -> minus (x:xs) ys
  51. minus xs _ = xs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement