{-# LANGUAGE CPP #-}
module Factory.Data.Monomial(
Monomial,
double,
mod',
negateCoefficient,
realCoefficientToFrac,
shiftCoefficient,
shiftExponent,
square,
getExponent,
getCoefficient,
(<=>),
(</>),
(<*>),
(=~),
isMonomial
) where
import qualified Control.Arrow
#if MIN_VERSION_base(4,8,0)
import Prelude hiding ((<*>))
#endif
infix 4 <=>
infix 4 =~
infixl 7 </>
infixl 7 <*>
type Monomial coefficient exponent = (coefficient, exponent)
{-# INLINE getCoefficient #-}
getCoefficient :: Monomial c e -> c
getCoefficient :: Monomial c e -> c
getCoefficient = Monomial c e -> c
forall a b. (a, b) -> a
fst
{-# INLINE getExponent #-}
getExponent :: Monomial c e -> e
getExponent :: Monomial c e -> e
getExponent = Monomial c e -> e
forall a b. (a, b) -> b
snd
isMonomial :: Integral e => Monomial c e -> Bool
isMonomial :: Monomial c e -> Bool
isMonomial = (e -> e -> Bool
forall a. Ord a => a -> a -> Bool
>= e
0) (e -> Bool) -> (Monomial c e -> e) -> Monomial c e -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Monomial c e -> e
forall a b. (a, b) -> b
getExponent
{-# INLINE (<=>) #-}
(<=>) :: Ord e => Monomial c e -> Monomial c e -> Ordering
(c
_, e
l) <=> :: Monomial c e -> Monomial c e -> Ordering
<=> (c
_, e
r) = e
l e -> e -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` e
r
(=~) :: Eq e => Monomial c e -> Monomial c e -> Bool
(c
_, e
l) =~ :: Monomial c e -> Monomial c e -> Bool
=~ (c
_, e
r) = e
l e -> e -> Bool
forall a. Eq a => a -> a -> Bool
== e
r
{-# INLINE (<*>) #-}
(<*>) :: (Num c, Num e) => Monomial c e -> Monomial c e -> Monomial c e
(c
cL, e
eL) <*> :: Monomial c e -> Monomial c e -> Monomial c e
<*> (c
cR, e
eR) = (c
cL c -> c -> c
forall a. Num a => a -> a -> a
* c
cR, e
eL e -> e -> e
forall a. Num a => a -> a -> a
+ e
eR)
(</>) :: (Eq c, Fractional c, Num e)
=> Monomial c e
-> Monomial c e
-> Monomial c e
(c
cN, e
eN) </> :: Monomial c e -> Monomial c e -> Monomial c e
</> (c
1, e
eD) = (c
cN, e
eN e -> e -> e
forall a. Num a => a -> a -> a
- e
eD)
(c
cN, e
eN) </> (c
cD, e
eD) = (c
cN c -> c -> c
forall a. Fractional a => a -> a -> a
/ c
cD, e
eN e -> e -> e
forall a. Num a => a -> a -> a
- e
eD)
square :: (Num c, Num e) => Monomial c e -> Monomial c e
square :: Monomial c e -> Monomial c e
square (c
c, e
e) = (c
c c -> Int -> c
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int), e
2 e -> e -> e
forall a. Num a => a -> a -> a
* e
e)
{-# INLINE double #-}
double :: Num c => Monomial c e -> Monomial c e
double :: Monomial c e -> Monomial c e
double (c
c, e
e) = (c
2 c -> c -> c
forall a. Num a => a -> a -> a
* c
c, e
e)
{-# INLINE shiftCoefficient #-}
shiftCoefficient :: Num c
=> Monomial c e
-> c
-> Monomial c e
(c
c, e
e) shiftCoefficient :: Monomial c e -> c -> Monomial c e
`shiftCoefficient` c
i = (c
c c -> c -> c
forall a. Num a => a -> a -> a
+ c
i, e
e)
{-# INLINE shiftExponent #-}
shiftExponent :: Num e
=> Monomial c e
-> e
-> Monomial c e
(c
c, e
e) shiftExponent :: Monomial c e -> e -> Monomial c e
`shiftExponent` e
i = (c
c, e
e e -> e -> e
forall a. Num a => a -> a -> a
+ e
i)
negateCoefficient :: Num c => Monomial c e -> Monomial c e
negateCoefficient :: Monomial c e -> Monomial c e
negateCoefficient = (c -> c) -> Monomial c e -> Monomial c e
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Control.Arrow.first c -> c
forall a. Num a => a -> a
negate
{-# INLINE mod' #-}
mod' :: Integral c
=> Monomial c e
-> c
-> Monomial c e
Monomial c e
monomial mod' :: Monomial c e -> c -> Monomial c e
`mod'` c
modulus = (c -> c) -> Monomial c e -> Monomial c e
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Control.Arrow.first (c -> c -> c
forall a. Integral a => a -> a -> a
`mod` c
modulus) Monomial c e
monomial
realCoefficientToFrac :: (Real r, Fractional f) => Monomial r e -> Monomial f e
realCoefficientToFrac :: Monomial r e -> Monomial f e
realCoefficientToFrac = (r -> f) -> Monomial r e -> Monomial f e
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
Control.Arrow.first r -> f
forall a b. (Real a, Fractional b) => a -> b
realToFrac