Guest User

Untitled

a guest
Jul 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. primes = 2:takePrimes [3, 5 ..]
  2. where takePrimes (x:xs) = let smallPrimes = untilRoot x primes
  3. in if 0 `notElem` (map (mod x) smallPrimes)
  4. then x:takePrimes xs
  5. else takePrimes xs
  6.  
  7. untilRoot n = takeWhile (x -> x*x < n)
  8.  
  9. firstPrimeDivisor :: Integer -> Integer
  10. firstPrimeDivisor x = head [p | p <- primes, x `mod` p == 0]
  11.  
  12. primeFactor 1 = []
  13. primeFactor x = let p = firstPrimeDivisor x
  14. in p:primeFactor (x `div` p)
  15.  
  16. factorize :: Integer -> Integer -> [Integer]
  17. factorize _ 1 = []
  18. factorize d n
  19. | d * d > n = [n]
  20. | n `mod` d == 0 = d : factorize d (n `div` d)
  21. | otherwise = factorize (d + 1) n
  22.  
  23. primeFactors :: Integer -> [Integer]
  24. primeFactors = factorize 2
  25.  
  26. factors' :: Integral t => t -> [t]
  27. factors' n
  28. | n < 0 = factors' (-n)
  29. | n > 0 = if 1 == n
  30. then []
  31. else let fac = mfac n 2 in fac : factors' (n `div` fac)
  32. where mfac m x
  33. | rem m x == 0 = x
  34. | x * x > m = m
  35. | otherwise = mfac m (if odd x then x + 2 else x + 1)
  36.  
  37. primes :: [Integer]
  38. primes = [2, 3, 5] ++ (diff [7, 9 ..] nonprimes)
  39. where
  40. nonprimes :: [Integer]
  41. nonprimes = foldr1 f $ map g $ tail primes
  42. where
  43. f (x:xt) ys = x : (merge xt ys)
  44. g p = [ n * p | n <- [p, p + 2 ..]]
  45.  
  46. merge :: (Ord a) => [a] -> [a] -> [a]
  47. merge xs@(x:xt) ys@(y:yt) =
  48. case compare x y of
  49. LT -> x : (merge xt ys)
  50. EQ -> x : (merge xt yt)
  51. GT -> y : (merge xs yt)
  52.  
  53. diff :: (Ord a) => [a] -> [a] -> [a]
  54. diff xs@(x:xt) ys@(y:yt) =
  55. case compare x y of
  56. LT -> x : (diff xt ys)
  57. EQ -> diff xt yt
  58. GT -> diff xs yt
Add Comment
Please, Sign In to add comment