Advertisement
Guest User

Untitled

a guest
Apr 30th, 2012
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import System.Random
  2.  
  3. factors :: Int -> [Int]
  4. factors n = factor [x | x <- [2..n], odd x, millerRabin x 1] n
  5.  
  6. factor :: [Int] -> Int -> [Int]
  7. factor [] _ = []
  8. factor (x:xs) n
  9.     | mod n x == 0  = x:factor' (div n x) x
  10.    | mod n x /= 0  = factor xs n
  11.  
  12. factor' :: Int -> Int -> [Int]
  13. factor' n p
  14.    | mod n p == 0          = p:factor' (div n p) p
  15.     | mod n p /= 0 && n > 1 = [n]
  16.     | otherwise             = []
  17.  
  18. millerRabin :: Int -> Int -> Bool
  19. millerRabin n k
  20.     | n < 1          = error "Invalid integer."
  21.     | n > 3 && k > 0 = let a  = (\mi ma -> head $! take ma
  22.                                 (randomRs (mi, ma) (mkStdGen 100))) 2 (n - 2)
  23.                            ds = findDS $! (n-1)
  24.                            ad = (fromIntegral a) ^ fst ds
  25.                            x :: Integer
  26.                            x  = mod ad (fromIntegral n)
  27.                         in if x == 1 || x == (fromIntegral $! (n - 1)) then
  28.                                 millerRabin n $! (k - 1)
  29.                            else mrLoop (fromIntegral x) n k (snd ds) 1
  30.     | otherwise = True
  31.  
  32. mrLoop :: Int -> Int -> Int -> Int -> Int -> Bool
  33. mrLoop x n k s r
  34.     | r < s     = let xx = mod (x * x) n in if xx == 1 then False
  35.                      else if xx == (n - 1) then millerRabin n $! (k - 1)
  36.                      else mrLoop xx n k s $! (r + 1)
  37.     | otherwise = False
  38.  
  39. findDS :: Int -> (Int, Int)
  40. findDS d
  41.     | mod d 2 == 0 = let ds = findDS $! (div d 2) in (fst ds, (snd ds) + 1)
  42.     | otherwise    = (d, 0)
  43.  
  44. concatPrimes :: [Int] -> Int
  45. concatPrimes []        = 0
  46. concatPrimes (x:xs)
  47.     | millerRabin x 1  = let ys = concatPrimes xs in if ys == 0 then x
  48.                             else read ((show x) ++ (show ys))
  49.     | otherwise        = concatPrimes xs
  50.  
  51. homePrime :: Int -> Int
  52. homePrime n = let xs = factors n in if length xs > 1 then
  53.                     homePrime $ concatPrimes xs else n
  54.  
  55. euclidMullin :: Int -> [Int]
  56. euclidMullin 1 = [2]
  57. euclidMullin n = let xs = euclidMullin (n-1)
  58.                  in xs ++ [((\p -> head $ factors p) (product xs + 1))]
  59.  
  60. main=do
  61.     let x = 9
  62.     let y = 7
  63.     putStrLn $ "Home Prime of " ++ (show x) ++ ": " ++ (show $ homePrime x)
  64.     putStrLn $ "Euclid-Mullin sequence of " ++ (show y) ++ " " ++
  65.         (show $ euclidMullin y)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement