File: primes.hs

package info (click to toggle)
haskell-hgmp 0.1.2.1-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 184 kB
  • sloc: haskell: 913; ansic: 16; makefile: 6
file content (27 lines) | stat: -rwxr-xr-x 693 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{-# LANGUAGE ForeignFunctionInterface #-}
module Main (main) where

import Foreign.Ptr (Ptr(..))
import Numeric.GMP.Types (MPZ)
import Numeric.GMP.Utils (withInInteger, withOutInteger_)
import Numeric.GMP.Raw.Safe (mpz_nextprime)
import System.Environment (getArgs)
import System.IO.Unsafe (unsafePerformIO)

nextPrimeIO :: Integer -> IO Integer
nextPrimeIO n = do
  withOutInteger_ $ \rop ->
    withInInteger n $ \op ->
      mpz_nextprime rop op

nextPrime :: Integer -> Integer
nextPrime n = unsafePerformIO $ nextPrimeIO n

primes :: Integer -> [Integer]
primes = drop 1 . iterate nextPrime

main :: IO ()
main = do
  [sn] <- getArgs
  n <- readIO sn
  mapM_ print . take 10 . primes $ n