{-# LINE 1 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
module Data.Number.Flint.Fmpz.Mod.Poly.Factor.FFI (
FmpzModPolyFactor (..)
, CFmpzModPolyFactor (..)
, newFmpzModPolyFactor
, withFmpzModPolyFactor
, fmpz_mod_poly_factor_init
, fmpz_mod_poly_factor_clear
, fmpz_mod_poly_factor_realloc
, fmpz_mod_poly_factor_fit_length
, fmpz_mod_poly_factor_set
, fmpz_mod_poly_factor_print
, fmpz_mod_poly_factor_print_pretty
, fmpz_mod_poly_factor_insert
, fmpz_mod_poly_factor_concat
, fmpz_mod_poly_factor_pow
, fmpz_mod_poly_is_irreducible
, fmpz_mod_poly_is_irreducible_ddf
, fmpz_mod_poly_is_irreducible_rabin
, fmpz_mod_poly_is_irreducible_rabin_f
, _fmpz_mod_poly_is_squarefree
, _fmpz_mod_poly_is_squarefree_f
, fmpz_mod_poly_is_squarefree
, fmpz_mod_poly_is_squarefree_f
, fmpz_mod_poly_factor_equal_deg_prob
, fmpz_mod_poly_factor_equal_deg
, fmpz_mod_poly_factor_distinct_deg
, fmpz_mod_poly_factor_distinct_deg_threaded
, fmpz_mod_poly_factor_squarefree
, fmpz_mod_poly_factor
, fmpz_mod_poly_factor_cantor_zassenhaus
, fmpz_mod_poly_factor_kaltofen_shoup
, fmpz_mod_poly_factor_berlekamp
, fmpz_mod_poly_roots
, fmpz_mod_poly_roots_factored
) where
import Control.Monad
import Foreign.C.String
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Ptr ( Ptr, FunPtr, plusPtr )
import Foreign.Storable
import Foreign.Marshal ( free )
import Data.Number.Flint.Flint
import Data.Number.Flint.ThreadPool
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Fmpz.Poly
import Data.Number.Flint.Fmpz.Mat
import Data.Number.Flint.Fmpz.Mod
import Data.Number.Flint.Fmpz.Mod.Poly
data FmpzModPolyFactor =
FmpzModPolyFactor {-# UNPACK #-} !(ForeignPtr CFmpzModPolyFactor)
data CFmpzModPolyFactor = CFmpzModPolyFactor (Ptr CFmpzModPoly) (Ptr CLong) CLong CLong
instance Storable CFmpzModPolyFactor where
{-# INLINE sizeOf #-}
sizeOf :: CFmpzModPolyFactor -> Int
sizeOf CFmpzModPolyFactor
_ = (Int
32)
{-# LINE 80 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
{-# INLINE alignment #-}
alignment :: CFmpzModPolyFactor -> Int
alignment CFmpzModPolyFactor
_ = Int
8
{-# LINE 82 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
peek ptr = return CFmpzModPolyFactor
`ap` (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 84 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
`ap` (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 85 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
`ap` (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 86 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
`ap` (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 87 "src/Data/Number/Flint/Fmpz/Mod/Poly/Factor/FFI.hsc" #-}
poke = undefined
newFmpzModPolyFactor :: FmpzModCtx -> IO FmpzModPolyFactor
newFmpzModPolyFactor ctx :: FmpzModCtx
ctx@(FmpzModCtx ForeignPtr CFmpzModCtx
mtx) = do
ForeignPtr CFmpzModPolyFactor
x <- IO (ForeignPtr CFmpzModPolyFactor)
forall a. Storable a => IO (ForeignPtr a)
mallocForeignPtr
ForeignPtr CFmpzModPolyFactor
-> (Ptr CFmpzModPolyFactor -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzModPolyFactor
x ((Ptr CFmpzModPolyFactor -> IO ()) -> IO ())
-> (Ptr CFmpzModPolyFactor -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzModPolyFactor
x -> do
FmpzModCtx -> (Ptr CFmpzModCtx -> IO ()) -> IO (FmpzModCtx, ())
forall {a}.
FmpzModCtx -> (Ptr CFmpzModCtx -> IO a) -> IO (FmpzModCtx, a)
withFmpzModCtx FmpzModCtx
ctx ((Ptr CFmpzModCtx -> IO ()) -> IO (FmpzModCtx, ()))
-> (Ptr CFmpzModCtx -> IO ()) -> IO (FmpzModCtx, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzModCtx
ctx -> do
Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
fmpz_mod_poly_factor_init Ptr CFmpzModPolyFactor
x Ptr CFmpzModCtx
ctx
FinalizerEnvPtr CFmpzModPolyFactor CFmpzModCtx
-> Ptr CFmpzModPolyFactor -> ForeignPtr CFmpzModCtx -> IO ()
forall env a.
FinalizerEnvPtr env a -> Ptr env -> ForeignPtr a -> IO ()
addForeignPtrFinalizerEnv FinalizerEnvPtr CFmpzModPolyFactor CFmpzModCtx
p_fmpz_mod_poly_factor_clear Ptr CFmpzModPolyFactor
x ForeignPtr CFmpzModCtx
mtx
FmpzModPolyFactor -> IO FmpzModPolyFactor
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (FmpzModPolyFactor -> IO FmpzModPolyFactor)
-> FmpzModPolyFactor -> IO FmpzModPolyFactor
forall a b. (a -> b) -> a -> b
$ ForeignPtr CFmpzModPolyFactor -> FmpzModPolyFactor
FmpzModPolyFactor ForeignPtr CFmpzModPolyFactor
x
{-# INLINE withFmpzModPolyFactor #-}
withFmpzModPolyFactor :: FmpzModPolyFactor
-> (Ptr CFmpzModPolyFactor -> IO a) -> IO (FmpzModPolyFactor, a)
withFmpzModPolyFactor (FmpzModPolyFactor ForeignPtr CFmpzModPolyFactor
x) Ptr CFmpzModPolyFactor -> IO a
f = do
ForeignPtr CFmpzModPolyFactor
-> (Ptr CFmpzModPolyFactor -> IO (FmpzModPolyFactor, a))
-> IO (FmpzModPolyFactor, a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzModPolyFactor
x ((Ptr CFmpzModPolyFactor -> IO (FmpzModPolyFactor, a))
-> IO (FmpzModPolyFactor, a))
-> (Ptr CFmpzModPolyFactor -> IO (FmpzModPolyFactor, a))
-> IO (FmpzModPolyFactor, a)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzModPolyFactor
px -> Ptr CFmpzModPolyFactor -> IO a
f Ptr CFmpzModPolyFactor
px IO a
-> (a -> IO (FmpzModPolyFactor, a)) -> IO (FmpzModPolyFactor, a)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (FmpzModPolyFactor, a) -> IO (FmpzModPolyFactor, a)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((FmpzModPolyFactor, a) -> IO (FmpzModPolyFactor, a))
-> (a -> (FmpzModPolyFactor, a)) -> a -> IO (FmpzModPolyFactor, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ForeignPtr CFmpzModPolyFactor -> FmpzModPolyFactor
FmpzModPolyFactor ForeignPtr CFmpzModPolyFactor
x,)
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_init"
fmpz_mod_poly_factor_init :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_clear"
fmpz_mod_poly_factor_clear :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h &fmpz_mod_poly_factor_clear"
p_fmpz_mod_poly_factor_clear :: FunPtr (Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ())
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_realloc"
fmpz_mod_poly_factor_realloc :: Ptr CFmpzModPolyFactor -> CLong -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_fit_length"
fmpz_mod_poly_factor_fit_length :: Ptr CFmpzModPolyFactor -> CLong -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_set"
fmpz_mod_poly_factor_set :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_get_str"
fmpz_mod_poly_factor_get_str :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO CString
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_get_str_pretty"
fmpz_mod_poly_factor_get_str_pretty :: Ptr CFmpzModPolyFactor -> CString -> Ptr CFmpzModCtx -> IO CString
fmpz_mod_poly_factor_print :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
fmpz_mod_poly_factor_print :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
fmpz_mod_poly_factor_print Ptr CFmpzModPolyFactor
fac Ptr CFmpzModCtx
ctx = do
(Ptr CFmpzModPolyFactor -> IO CString)
-> Ptr CFmpzModPolyFactor -> IO CInt
forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr ((Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO CString)
-> Ptr CFmpzModCtx -> Ptr CFmpzModPolyFactor -> IO CString
forall a b c. (a -> b -> c) -> b -> a -> c
flip Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO CString
fmpz_mod_poly_factor_get_str Ptr CFmpzModCtx
ctx) Ptr CFmpzModPolyFactor
fac
() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
fmpz_mod_poly_factor_print_pretty :: Ptr CFmpzModPolyFactor -> CString -> Ptr CFmpzModCtx -> IO ()
fmpz_mod_poly_factor_print_pretty :: Ptr CFmpzModPolyFactor -> CString -> Ptr CFmpzModCtx -> IO ()
fmpz_mod_poly_factor_print_pretty Ptr CFmpzModPolyFactor
fac CString
var Ptr CFmpzModCtx
ctx = do
(Ptr CFmpzModPolyFactor -> IO CString)
-> Ptr CFmpzModPolyFactor -> IO CInt
forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr (\Ptr CFmpzModPolyFactor
fac -> Ptr CFmpzModPolyFactor -> CString -> Ptr CFmpzModCtx -> IO CString
fmpz_mod_poly_factor_get_str_pretty Ptr CFmpzModPolyFactor
fac CString
var Ptr CFmpzModCtx
ctx) Ptr CFmpzModPolyFactor
fac
() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_insert"
fmpz_mod_poly_factor_insert :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> CLong -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_concat"
fmpz_mod_poly_factor_concat :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPolyFactor -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_pow"
fmpz_mod_poly_factor_pow :: Ptr CFmpzModPolyFactor -> CLong -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_is_irreducible"
fmpz_mod_poly_is_irreducible :: Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_is_irreducible_ddf"
fmpz_mod_poly_is_irreducible_ddf :: Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_is_irreducible_rabin"
fmpz_mod_poly_is_irreducible_rabin :: Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_is_irreducible_rabin_f"
fmpz_mod_poly_is_irreducible_rabin_f :: Ptr CFmpz -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h _fmpz_mod_poly_is_squarefree"
_fmpz_mod_poly_is_squarefree :: Ptr CFmpz -> CLong -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h _fmpz_mod_poly_is_squarefree_f"
_fmpz_mod_poly_is_squarefree_f :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_is_squarefree"
fmpz_mod_poly_is_squarefree :: Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_is_squarefree_f"
fmpz_mod_poly_is_squarefree_f :: Ptr CFmpz -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_equal_deg_prob"
fmpz_mod_poly_factor_equal_deg_prob :: Ptr CFmpzModPoly -> Ptr CFRandState -> Ptr CFmpzModPoly -> CLong -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_equal_deg"
fmpz_mod_poly_factor_equal_deg :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> CLong -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_distinct_deg"
fmpz_mod_poly_factor_distinct_deg :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr (Ptr CLong) -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_distinct_deg_threaded"
fmpz_mod_poly_factor_distinct_deg_threaded :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr (Ptr CLong) -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_squarefree"
fmpz_mod_poly_factor_squarefree :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor"
fmpz_mod_poly_factor :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_cantor_zassenhaus"
fmpz_mod_poly_factor_cantor_zassenhaus :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_kaltofen_shoup"
fmpz_mod_poly_factor_kaltofen_shoup :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_factor_berlekamp"
fmpz_mod_poly_factor_berlekamp :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_roots"
fmpz_mod_poly_roots :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> CInt -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_poly_factor.h fmpz_mod_poly_roots_factored"
fmpz_mod_poly_roots_factored :: Ptr CFmpzModPolyFactor -> Ptr CFmpzModPoly -> CInt -> Ptr CFmpzFactor -> Ptr CFmpzModCtx -> IO CInt