{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-} module Data.Number.Flint.Fmpq.Poly.Instances ( FmpqPoly (..) ) where import GHC.Exts import System.IO.Unsafe import Control.Monad import Foreign.C.String import Foreign.Marshal.Alloc import Data.Ratio hiding (numerator, denominator) import Data.Number.Flint.Fmpz import Data.Number.Flint.Fmpz.Instances import Data.Number.Flint.Fmpq import Data.Number.Flint.Fmpq.Poly instance IsList FmpqPoly where type Item FmpqPoly = Fmpq fromList :: [Item FmpqPoly] -> FmpqPoly fromList [Item FmpqPoly] c = forall a. IO a -> a unsafePerformIO forall a b. (a -> b) -> a -> b $ do FmpqPoly p <- IO FmpqPoly newFmpqPoly forall {a}. FmpqPoly -> (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withFmpqPoly FmpqPoly p forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly p -> do forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [Int 0..forall (t :: * -> *) a. Foldable t => t a -> Int length [Item FmpqPoly] cforall a. Num a => a -> a -> a -Int 1] forall a b. (a -> b) -> a -> b $ \Int j -> do forall {a}. Fmpq -> (Ptr CFmpq -> IO a) -> IO (Fmpq, a) withFmpq ([Item FmpqPoly] cforall a. [a] -> Int -> a !!Int j) forall a b. (a -> b) -> a -> b $ \Ptr CFmpq a -> Ptr CFmpqPoly -> CLong -> Ptr CFmpq -> IO () fmpq_poly_set_coeff_fmpq Ptr CFmpqPoly p (forall a b. (Integral a, Num b) => a -> b fromIntegral Int j) Ptr CFmpq a forall (m :: * -> *) a. Monad m => a -> m a return FmpqPoly p toList :: FmpqPoly -> [Item FmpqPoly] toList FmpqPoly p = forall a b. (a, b) -> b snd forall a b. (a -> b) -> a -> b $ forall a. IO a -> a unsafePerformIO forall a b. (a -> b) -> a -> b $ do forall {a}. FmpqPoly -> (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withFmpqPoly FmpqPoly p forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly p -> do CLong d <- Ptr CFmpqPoly -> IO CLong fmpq_poly_degree Ptr CFmpqPoly p forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) forM [CLong 0..CLong d] forall a b. (a -> b) -> a -> b $ \CLong j -> do Fmpq c <- IO Fmpq newFmpq forall {a}. Fmpq -> (Ptr CFmpq -> IO a) -> IO (Fmpq, a) withFmpq Fmpq c forall a b. (a -> b) -> a -> b $ \Ptr CFmpq c -> Ptr CFmpq -> Ptr CFmpqPoly -> CLong -> IO () fmpq_poly_get_coeff_fmpq Ptr CFmpq c Ptr CFmpqPoly p CLong j forall (m :: * -> *) a. Monad m => a -> m a return Fmpq c instance Show FmpqPoly where show :: FmpqPoly -> String show FmpqPoly p = forall a b. (a, b) -> b snd forall a b. (a -> b) -> a -> b $ forall a. IO a -> a unsafePerformIO forall a b. (a -> b) -> a -> b $ do forall {a}. FmpqPoly -> (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withFmpqPoly FmpqPoly p forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly p -> do forall a. String -> (CString -> IO a) -> IO a withCString String "x" forall a b. (a -> b) -> a -> b $ \CString x -> do CString cs <- Ptr CFmpqPoly -> CString -> IO CString fmpq_poly_get_str_pretty Ptr CFmpqPoly p CString x String s <- CString -> IO String peekCString CString cs forall a. Ptr a -> IO () free CString cs forall (m :: * -> *) a. Monad m => a -> m a return String s instance Num FmpqPoly where * :: FmpqPoly -> FmpqPoly -> FmpqPoly (*) = forall {a}. (Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO a) -> FmpqPoly -> FmpqPoly -> FmpqPoly lift2 Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO () fmpq_poly_mul + :: FmpqPoly -> FmpqPoly -> FmpqPoly (+) = forall {a}. (Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO a) -> FmpqPoly -> FmpqPoly -> FmpqPoly lift2 Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO () fmpq_poly_add (-) = forall {a}. (Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO a) -> FmpqPoly -> FmpqPoly -> FmpqPoly lift2 Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO () fmpq_poly_sub abs :: FmpqPoly -> FmpqPoly abs = forall a. HasCallStack => a undefined signum :: FmpqPoly -> FmpqPoly signum = forall a. HasCallStack => a undefined fromInteger :: Integer -> FmpqPoly fromInteger Integer x = forall a b. (a, b) -> a fst forall a b. (a -> b) -> a -> b $ forall a. IO a -> a unsafePerformIO forall a b. (a -> b) -> a -> b $ do let t :: Fmpz t = forall a. Num a => Integer -> a fromInteger Integer x :: Fmpz forall {a}. (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withNewFmpqPoly forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly poly -> do forall {a}. Fmpz -> (Ptr CFmpz -> IO a) -> IO (Fmpz, a) withFmpz Fmpz t forall a b. (a -> b) -> a -> b $ \Ptr CFmpz x -> do Ptr CFmpqPoly -> Ptr CFmpz -> IO () fmpq_poly_set_fmpz Ptr CFmpqPoly poly Ptr CFmpz x lift2 :: (Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO a) -> FmpqPoly -> FmpqPoly -> FmpqPoly lift2 Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO a f FmpqPoly x FmpqPoly y = forall a. IO a -> a unsafePerformIO forall a b. (a -> b) -> a -> b $ do FmpqPoly result <- IO FmpqPoly newFmpqPoly forall {a}. FmpqPoly -> (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withFmpqPoly FmpqPoly result forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly result -> do forall {a}. FmpqPoly -> (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withFmpqPoly FmpqPoly x forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly x -> do forall {a}. FmpqPoly -> (Ptr CFmpqPoly -> IO a) -> IO (FmpqPoly, a) withFmpqPoly FmpqPoly y forall a b. (a -> b) -> a -> b $ \Ptr CFmpqPoly y -> do Ptr CFmpqPoly -> Ptr CFmpqPoly -> Ptr CFmpqPoly -> IO a f Ptr CFmpqPoly result Ptr CFmpqPoly x Ptr CFmpqPoly y forall (m :: * -> *) a. Monad m => a -> m a return FmpqPoly result