packages feed

hMPC-0.1.0.0: app/Hgmp.hs

-- | This module collects all hGMP functions used by hMPC.
module Hgmp (isPrime, prevPrime, invert) where

import Numeric.GMP.Utils (withInInteger, withOutInteger_)
import Numeric.GMP.Raw.Safe
import System.IO.Unsafe (unsafePerformIO)


-- | Return True if x is probably prime, else False if x is
-- definitely composite
isPrime :: Integer -> Bool
isPrime x = unsafePerformIO (withInInteger x (flip mpz_probab_prime_p 25)) > 0


-- | Return the greatest probable prime number < x, if any.
prevPrime :: Integer -> Integer
prevPrime x
    | x <= 2 = 0
    | x == 3 = 2
    | otherwise = _prevPrime (x - (1 + (x `mod` 2)))
    where
        _prevPrime x
            | isPrime x = x
            | otherwise = _prevPrime (x-2)

-- | Return y such that @x*y == 1 modulo m@.
invert :: Integer -> Integer -> Integer
invert x m = unsafePerformIO $
                withOutInteger_ $ \rop ->
                    withInInteger x $ \op1 ->
                        withInInteger m $ \op2 ->
                            mpz_invert rop op1 op2