module Data.Number.Flint.Fmpz.Poly.Q.Instances (
    FmpzPolyQ (..)
) where

import Test.QuickCheck

import GHC.Exts

import System.IO.Unsafe
import Control.Monad

import Foreign.Ptr
import Foreign.C.String
import Foreign.Storable
import Foreign.Marshal.Alloc (free)
import Foreign.Marshal.Array (advancePtr)

import Data.Number.Flint.Quotient
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Fmpz.Instances
import Data.Number.Flint.Fmpz.Poly
import Data.Number.Flint.Fmpz.Poly.Factor
import Data.Number.Flint.Fmpz.Poly.Q

instance Show FmpzPolyQ where
  show :: FmpzPolyQ -> String
show FmpzPolyQ
p = (FmpzPolyQ, String) -> String
forall a b. (a, b) -> b
snd ((FmpzPolyQ, String) -> String) -> (FmpzPolyQ, String) -> String
forall a b. (a -> b) -> a -> b
$ IO (FmpzPolyQ, String) -> (FmpzPolyQ, String)
forall a. IO a -> a
unsafePerformIO (IO (FmpzPolyQ, String) -> (FmpzPolyQ, String))
-> IO (FmpzPolyQ, String) -> (FmpzPolyQ, String)
forall a b. (a -> b) -> a -> b
$ do
    FmpzPolyQ
-> (Ptr CFmpzPolyQ -> IO String) -> IO (FmpzPolyQ, String)
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
p ((Ptr CFmpzPolyQ -> IO String) -> IO (FmpzPolyQ, String))
-> (Ptr CFmpzPolyQ -> IO String) -> IO (FmpzPolyQ, String)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
p -> do
      String -> (CString -> IO String) -> IO String
forall a. String -> (CString -> IO a) -> IO a
withCString String
"x" ((CString -> IO String) -> IO String)
-> (CString -> IO String) -> IO String
forall a b. (a -> b) -> a -> b
$ \CString
x -> do
        CString
cs <- Ptr CFmpzPolyQ -> CString -> IO CString
fmpz_poly_q_get_str_pretty Ptr CFmpzPolyQ
p CString
x
        String
s <- CString -> IO String
peekCString CString
cs
        CString -> IO ()
forall a. Ptr a -> IO ()
free CString
cs
        String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return String
s

instance Quotient FmpzPolyQ FmpzPoly where
  // :: FmpzPoly -> FmpzPoly -> FmpzPolyQ
(//) FmpzPoly
x FmpzPoly
y = (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ()))) -> FmpzPolyQ
forall a b. (a, b) -> a
fst ((FmpzPolyQ, (FmpzPoly, (FmpzPoly, ()))) -> FmpzPolyQ)
-> (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ()))) -> FmpzPolyQ
forall a b. (a -> b) -> a -> b
$ IO (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
-> (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
forall a. IO a -> a
unsafePerformIO (IO (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
 -> (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ()))))
-> IO (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
-> (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
forall a b. (a -> b) -> a -> b
$ do
    (Ptr CFmpzPolyQ -> IO (FmpzPoly, (FmpzPoly, ())))
-> IO (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
forall {a}. (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withNewFmpzPolyQ ((Ptr CFmpzPolyQ -> IO (FmpzPoly, (FmpzPoly, ())))
 -> IO (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ()))))
-> (Ptr CFmpzPolyQ -> IO (FmpzPoly, (FmpzPoly, ())))
-> IO (FmpzPolyQ, (FmpzPoly, (FmpzPoly, ())))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
poly -> do
      FmpzPoly
-> (Ptr CFmpzPoly -> IO (FmpzPoly, ()))
-> IO (FmpzPoly, (FmpzPoly, ()))
forall {a}. FmpzPoly -> (Ptr CFmpzPoly -> IO a) -> IO (FmpzPoly, a)
withFmpzPoly FmpzPoly
x ((Ptr CFmpzPoly -> IO (FmpzPoly, ()))
 -> IO (FmpzPoly, (FmpzPoly, ())))
-> (Ptr CFmpzPoly -> IO (FmpzPoly, ()))
-> IO (FmpzPoly, (FmpzPoly, ()))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPoly
x -> do
        FmpzPoly -> (Ptr CFmpzPoly -> IO ()) -> IO (FmpzPoly, ())
forall {a}. FmpzPoly -> (Ptr CFmpzPoly -> IO a) -> IO (FmpzPoly, a)
withFmpzPoly FmpzPoly
y ((Ptr CFmpzPoly -> IO ()) -> IO (FmpzPoly, ()))
-> (Ptr CFmpzPoly -> IO ()) -> IO (FmpzPoly, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPoly
y -> do
          CFmpzPolyQ Ptr CFmpzPoly
p Ptr CFmpzPoly
q <- Ptr CFmpzPolyQ -> IO CFmpzPolyQ
forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzPolyQ
poly
          Ptr CFmpzPoly -> Ptr CFmpzPoly -> IO ()
fmpz_poly_set Ptr CFmpzPoly
p Ptr CFmpzPoly
x
          Ptr CFmpzPoly -> Ptr CFmpzPoly -> IO ()
fmpz_poly_set Ptr CFmpzPoly
q Ptr CFmpzPoly
y
  numerator :: FmpzPolyQ -> FmpzPoly
numerator FmpzPolyQ
q = (FmpzPoly, (FmpzPolyQ, ())) -> FmpzPoly
forall a b. (a, b) -> a
fst ((FmpzPoly, (FmpzPolyQ, ())) -> FmpzPoly)
-> (FmpzPoly, (FmpzPolyQ, ())) -> FmpzPoly
forall a b. (a -> b) -> a -> b
$ IO (FmpzPoly, (FmpzPolyQ, ())) -> (FmpzPoly, (FmpzPolyQ, ()))
forall a. IO a -> a
unsafePerformIO (IO (FmpzPoly, (FmpzPolyQ, ())) -> (FmpzPoly, (FmpzPolyQ, ())))
-> IO (FmpzPoly, (FmpzPolyQ, ())) -> (FmpzPoly, (FmpzPolyQ, ()))
forall a b. (a -> b) -> a -> b
$ do
    (Ptr CFmpzPoly -> IO (FmpzPolyQ, ()))
-> IO (FmpzPoly, (FmpzPolyQ, ()))
forall {a}. (Ptr CFmpzPoly -> IO a) -> IO (FmpzPoly, a)
withNewFmpzPoly ((Ptr CFmpzPoly -> IO (FmpzPolyQ, ()))
 -> IO (FmpzPoly, (FmpzPolyQ, ())))
-> (Ptr CFmpzPoly -> IO (FmpzPolyQ, ()))
-> IO (FmpzPoly, (FmpzPolyQ, ()))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPoly
poly -> do 
      FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ())
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
q ((Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ()))
-> (Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
q -> do
        CFmpzPolyQ Ptr CFmpzPoly
num Ptr CFmpzPoly
_ <- Ptr CFmpzPolyQ -> IO CFmpzPolyQ
forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzPolyQ
q
        Ptr CFmpzPoly -> Ptr CFmpzPoly -> IO ()
fmpz_poly_set Ptr CFmpzPoly
poly Ptr CFmpzPoly
num
  denominator :: FmpzPolyQ -> FmpzPoly
denominator FmpzPolyQ
q = (FmpzPoly, (FmpzPolyQ, ())) -> FmpzPoly
forall a b. (a, b) -> a
fst ((FmpzPoly, (FmpzPolyQ, ())) -> FmpzPoly)
-> (FmpzPoly, (FmpzPolyQ, ())) -> FmpzPoly
forall a b. (a -> b) -> a -> b
$ IO (FmpzPoly, (FmpzPolyQ, ())) -> (FmpzPoly, (FmpzPolyQ, ()))
forall a. IO a -> a
unsafePerformIO (IO (FmpzPoly, (FmpzPolyQ, ())) -> (FmpzPoly, (FmpzPolyQ, ())))
-> IO (FmpzPoly, (FmpzPolyQ, ())) -> (FmpzPoly, (FmpzPolyQ, ()))
forall a b. (a -> b) -> a -> b
$ do
    (Ptr CFmpzPoly -> IO (FmpzPolyQ, ()))
-> IO (FmpzPoly, (FmpzPolyQ, ()))
forall {a}. (Ptr CFmpzPoly -> IO a) -> IO (FmpzPoly, a)
withNewFmpzPoly ((Ptr CFmpzPoly -> IO (FmpzPolyQ, ()))
 -> IO (FmpzPoly, (FmpzPolyQ, ())))
-> (Ptr CFmpzPoly -> IO (FmpzPolyQ, ()))
-> IO (FmpzPoly, (FmpzPolyQ, ()))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPoly
poly -> do 
      FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ())
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
q ((Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ()))
-> (Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
q -> do
        CFmpzPolyQ Ptr CFmpzPoly
_ Ptr CFmpzPoly
den <- Ptr CFmpzPolyQ -> IO CFmpzPolyQ
forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzPolyQ
q
        Ptr CFmpzPoly -> Ptr CFmpzPoly -> IO ()
fmpz_poly_set Ptr CFmpzPoly
poly Ptr CFmpzPoly
den

instance Num FmpzPolyQ where
  * :: FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
(*) = (Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO ())
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
forall {a}.
(Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a)
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
lift2 Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO ()
fmpz_poly_q_mul
  + :: FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
(+) = (Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO ())
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
forall {a}.
(Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a)
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
lift2 Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO ()
fmpz_poly_q_add
  (-) = (Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO ())
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
forall {a}.
(Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a)
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
lift2 Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO ()
fmpz_poly_q_sub
  abs :: FmpzPolyQ -> FmpzPolyQ
abs = FmpzPolyQ -> FmpzPolyQ
forall a. HasCallStack => a
undefined
  signum :: FmpzPolyQ -> FmpzPolyQ
signum = FmpzPolyQ -> FmpzPolyQ
forall a. HasCallStack => a
undefined
  fromInteger :: Integer -> FmpzPolyQ
fromInteger Integer
x = IO FmpzPolyQ -> FmpzPolyQ
forall a. IO a -> a
unsafePerformIO (IO FmpzPolyQ -> FmpzPolyQ) -> IO FmpzPolyQ -> FmpzPolyQ
forall a b. (a -> b) -> a -> b
$ do
    FmpzPolyQ
result <- IO FmpzPolyQ
newFmpzPolyQ
    FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ())
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
result ((Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ()))
-> (Ptr CFmpzPolyQ -> IO ()) -> IO (FmpzPolyQ, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
result -> 
      Ptr CFmpzPolyQ -> CLong -> IO ()
fmpz_poly_q_set_si Ptr CFmpzPolyQ
result (Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
x)
    FmpzPolyQ -> IO FmpzPolyQ
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return FmpzPolyQ
result

instance Eq FmpzPolyQ where
  == :: FmpzPolyQ -> FmpzPolyQ -> Bool
(==) FmpzPolyQ
x FmpzPolyQ
y = (FmpzPolyQ, Bool) -> Bool
forall a b. (a, b) -> b
snd ((FmpzPolyQ, Bool) -> Bool) -> (FmpzPolyQ, Bool) -> Bool
forall a b. (a -> b) -> a -> b
$ (FmpzPolyQ, (FmpzPolyQ, Bool)) -> (FmpzPolyQ, Bool)
forall a b. (a, b) -> b
snd ((FmpzPolyQ, (FmpzPolyQ, Bool)) -> (FmpzPolyQ, Bool))
-> (FmpzPolyQ, (FmpzPolyQ, Bool)) -> (FmpzPolyQ, Bool)
forall a b. (a -> b) -> a -> b
$ IO (FmpzPolyQ, (FmpzPolyQ, Bool)) -> (FmpzPolyQ, (FmpzPolyQ, Bool))
forall a. IO a -> a
unsafePerformIO (IO (FmpzPolyQ, (FmpzPolyQ, Bool))
 -> (FmpzPolyQ, (FmpzPolyQ, Bool)))
-> IO (FmpzPolyQ, (FmpzPolyQ, Bool))
-> (FmpzPolyQ, (FmpzPolyQ, Bool))
forall a b. (a -> b) -> a -> b
$ do
    FmpzPolyQ
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, Bool))
-> IO (FmpzPolyQ, (FmpzPolyQ, Bool))
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
x ((Ptr CFmpzPolyQ -> IO (FmpzPolyQ, Bool))
 -> IO (FmpzPolyQ, (FmpzPolyQ, Bool)))
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, Bool))
-> IO (FmpzPolyQ, (FmpzPolyQ, Bool))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
x ->
      FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO Bool) -> IO (FmpzPolyQ, Bool)
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
y ((Ptr CFmpzPolyQ -> IO Bool) -> IO (FmpzPolyQ, Bool))
-> (Ptr CFmpzPolyQ -> IO Bool) -> IO (FmpzPolyQ, Bool)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
y -> do
        CInt
f <- Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO CInt
fmpz_poly_q_equal Ptr CFmpzPolyQ
x Ptr CFmpzPolyQ
y
        Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> IO Bool) -> Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ CInt
f CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
1

instance Ord FmpzPolyQ where
  compare :: FmpzPolyQ -> FmpzPolyQ -> Ordering
compare = FmpzPolyQ -> FmpzPolyQ -> Ordering
forall a. HasCallStack => a
undefined
  
instance Real FmpzPolyQ where
  toRational :: FmpzPolyQ -> Rational
toRational = FmpzPolyQ -> Rational
forall a. HasCallStack => a
undefined

instance Enum FmpzPolyQ where
  toEnum :: Int -> FmpzPolyQ
toEnum = Int -> FmpzPolyQ
forall a. HasCallStack => a
undefined
  fromEnum :: FmpzPolyQ -> Int
fromEnum = FmpzPolyQ -> Int
forall a. HasCallStack => a
undefined

lift2 :: (Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a)
-> FmpzPolyQ -> FmpzPolyQ -> FmpzPolyQ
lift2 Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a
f FmpzPolyQ
x FmpzPolyQ
y = IO FmpzPolyQ -> FmpzPolyQ
forall a. IO a -> a
unsafePerformIO (IO FmpzPolyQ -> FmpzPolyQ) -> IO FmpzPolyQ -> FmpzPolyQ
forall a b. (a -> b) -> a -> b
$ do
  FmpzPolyQ
result <- IO FmpzPolyQ
newFmpzPolyQ
  FmpzPolyQ
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, (FmpzPolyQ, a)))
-> IO (FmpzPolyQ, (FmpzPolyQ, (FmpzPolyQ, a)))
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
result ((Ptr CFmpzPolyQ -> IO (FmpzPolyQ, (FmpzPolyQ, a)))
 -> IO (FmpzPolyQ, (FmpzPolyQ, (FmpzPolyQ, a))))
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, (FmpzPolyQ, a)))
-> IO (FmpzPolyQ, (FmpzPolyQ, (FmpzPolyQ, a)))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
result -> do
    FmpzPolyQ
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, a))
-> IO (FmpzPolyQ, (FmpzPolyQ, a))
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
x ((Ptr CFmpzPolyQ -> IO (FmpzPolyQ, a))
 -> IO (FmpzPolyQ, (FmpzPolyQ, a)))
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, a))
-> IO (FmpzPolyQ, (FmpzPolyQ, a))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
x -> do
      FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
y ((Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a))
-> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
y -> do
        Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a
f Ptr CFmpzPolyQ
result Ptr CFmpzPolyQ
x Ptr CFmpzPolyQ
y
  FmpzPolyQ -> IO FmpzPolyQ
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return FmpzPolyQ
result

lift1 :: (Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a)
-> FmpzPolyQ -> FmpzPolyQ
lift1 Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a
f FmpzPolyQ
x = IO FmpzPolyQ -> FmpzPolyQ
forall a. IO a -> a
unsafePerformIO (IO FmpzPolyQ -> FmpzPolyQ) -> IO FmpzPolyQ -> FmpzPolyQ
forall a b. (a -> b) -> a -> b
$ do
  FmpzPolyQ
result <- IO FmpzPolyQ
newFmpzPolyQ
  FmpzPolyQ
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, a))
-> IO (FmpzPolyQ, (FmpzPolyQ, a))
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
result ((Ptr CFmpzPolyQ -> IO (FmpzPolyQ, a))
 -> IO (FmpzPolyQ, (FmpzPolyQ, a)))
-> (Ptr CFmpzPolyQ -> IO (FmpzPolyQ, a))
-> IO (FmpzPolyQ, (FmpzPolyQ, a))
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
result ->
    FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
forall {a}.
FmpzPolyQ -> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
withFmpzPolyQ FmpzPolyQ
x ((Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a))
-> (Ptr CFmpzPolyQ -> IO a) -> IO (FmpzPolyQ, a)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyQ
x ->
    Ptr CFmpzPolyQ -> Ptr CFmpzPolyQ -> IO a
f Ptr CFmpzPolyQ
result Ptr CFmpzPolyQ
x
  FmpzPolyQ -> IO FmpzPolyQ
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return FmpzPolyQ
result