{-# LANGUAGE BangPatterns, CPP, DataKinds, GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiWayIf, OverloadedLabels, ScopedTypeVariables        #-}
module Algebra.Field.RationalFunction
       ( RationalFunction
       , evalRationalFunctionOnField
       , evalRationalFunction
       , fromPolynomial
       , variable, diffRF, taylor, taylorCoeff
       )where
import           Algebra.Prelude.Core
import           Algebra.Ring.Polynomial.Univariate (Unipol)
import qualified Numeric.Field.Fraction             as NA

-- | Unary rational field over a field @k@.
--
--  With @OverloadedLabels@ extension, you can use @'IsLabel'@ instance
--  to write variable as @#x@; for example @1 / (#x - 2) ^ n@.
newtype RationalFunction k = RF (Fraction (Unipol k))
                             deriving (RationalFunction k -> RationalFunction k -> Bool
(RationalFunction k -> RationalFunction k -> Bool)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> Eq (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RationalFunction k -> RationalFunction k -> Bool
$c/= :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
== :: RationalFunction k -> RationalFunction k -> Bool
$c== :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
Eq, Eq (RationalFunction k)
Eq (RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> Ordering)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> Ord (RationalFunction k)
RationalFunction k -> RationalFunction k -> Bool
RationalFunction k -> RationalFunction k -> Ordering
RationalFunction k -> RationalFunction k -> RationalFunction k
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k.
(Euclidean k, Division k, Ord k) =>
Eq (RationalFunction k)
forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Bool
forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Ordering
forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
min :: RationalFunction k -> RationalFunction k -> RationalFunction k
$cmin :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
max :: RationalFunction k -> RationalFunction k -> RationalFunction k
$cmax :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
>= :: RationalFunction k -> RationalFunction k -> Bool
$c>= :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Bool
> :: RationalFunction k -> RationalFunction k -> Bool
$c> :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Bool
<= :: RationalFunction k -> RationalFunction k -> Bool
$c<= :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Bool
< :: RationalFunction k -> RationalFunction k -> Bool
$c< :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Bool
compare :: RationalFunction k -> RationalFunction k -> Ordering
$ccompare :: forall k.
(Euclidean k, Division k, Ord k) =>
RationalFunction k -> RationalFunction k -> Ordering
$cp1Ord :: forall k.
(Euclidean k, Division k, Ord k) =>
Eq (RationalFunction k)
Ord, Integer -> RationalFunction k
RationalFunction k -> RationalFunction k
RationalFunction k -> RationalFunction k -> RationalFunction k
(RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> (Integer -> RationalFunction k)
-> Num (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Integer -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> RationalFunction k
$cfromInteger :: forall k.
(Eq k, Euclidean k, Division k) =>
Integer -> RationalFunction k
signum :: RationalFunction k -> RationalFunction k
$csignum :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
abs :: RationalFunction k -> RationalFunction k
$cabs :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
negate :: RationalFunction k -> RationalFunction k
$cnegate :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
* :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c* :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
- :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c- :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
+ :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c+ :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
Num, Unital (RationalFunction k)
Unital (RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (forall n.
    Integral n =>
    RationalFunction k -> n -> RationalFunction k)
-> Division (RationalFunction k)
RationalFunction k -> RationalFunction k
RationalFunction k -> n -> RationalFunction k
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k n.
(Eq k, Euclidean k, Division k, Integral n) =>
RationalFunction k -> n -> RationalFunction k
forall n.
Integral n =>
RationalFunction k -> n -> RationalFunction k
forall r.
Unital r
-> (r -> r)
-> (r -> r -> r)
-> (r -> r -> r)
-> (forall n. Integral n => r -> n -> r)
-> Division r
^ :: RationalFunction k -> n -> RationalFunction k
$c^ :: forall k n.
(Eq k, Euclidean k, Division k, Integral n) =>
RationalFunction k -> n -> RationalFunction k
\\ :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c\\ :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
/ :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c/ :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
recip :: RationalFunction k -> RationalFunction k
$crecip :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
$cp1Division :: forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
Division, Multiplicative (RationalFunction k)
Additive (RationalFunction k)
Abelian (RationalFunction k)
Additive (RationalFunction k)
-> Abelian (RationalFunction k)
-> Multiplicative (RationalFunction k)
-> Semiring (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Multiplicative (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Additive (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Abelian (RationalFunction k)
forall r. Additive r -> Abelian r -> Multiplicative r -> Semiring r
$cp3Semiring :: forall k.
(Eq k, Euclidean k, Division k) =>
Multiplicative (RationalFunction k)
$cp2Semiring :: forall k.
(Eq k, Euclidean k, Division k) =>
Abelian (RationalFunction k)
$cp1Semiring :: forall k.
(Eq k, Euclidean k, Division k) =>
Additive (RationalFunction k)
Semiring, Rng (RationalFunction k)
Rig (RationalFunction k)
Integer -> RationalFunction k
Rig (RationalFunction k)
-> Rng (RationalFunction k)
-> (Integer -> RationalFunction k)
-> Ring (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Rng (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Rig (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Integer -> RationalFunction k
forall r. Rig r -> Rng r -> (Integer -> r) -> Ring r
fromInteger :: Integer -> RationalFunction k
$cfromInteger :: forall k.
(Eq k, Euclidean k, Division k) =>
Integer -> RationalFunction k
$cp2Ring :: forall k.
(Eq k, Euclidean k, Division k) =>
Rng (RationalFunction k)
$cp1Ring :: forall k.
(Eq k, Euclidean k, Division k) =>
Rig (RationalFunction k)
Ring, Unital (RationalFunction k)
Semiring (RationalFunction k)
Monoidal (RationalFunction k)
Natural -> RationalFunction k
Semiring (RationalFunction k)
-> Unital (RationalFunction k)
-> Monoidal (RationalFunction k)
-> (Natural -> RationalFunction k)
-> Rig (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Semiring (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Natural -> RationalFunction k
forall r.
Semiring r -> Unital r -> Monoidal r -> (Natural -> r) -> Rig r
fromNatural :: Natural -> RationalFunction k
$cfromNatural :: forall k.
(Eq k, Euclidean k, Division k) =>
Natural -> RationalFunction k
$cp3Rig :: forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
$cp2Rig :: forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
$cp1Rig :: forall k.
(Eq k, Euclidean k, Division k) =>
Semiring (RationalFunction k)
Rig,
                                       Natural -> RationalFunction k -> RationalFunction k
RationalFunction k -> RationalFunction k -> RationalFunction k
(a -> RationalFunction k) -> f a -> RationalFunction k
(RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (Natural -> RationalFunction k -> RationalFunction k)
-> (forall (f :: * -> *) a.
    Foldable1 f =>
    (a -> RationalFunction k) -> f a -> RationalFunction k)
-> Additive (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Natural -> RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable1 f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
forall r.
(r -> r -> r)
-> (Natural -> r -> r)
-> (forall (f :: * -> *) a. Foldable1 f => (a -> r) -> f a -> r)
-> Additive r
forall (f :: * -> *) a.
Foldable1 f =>
(a -> RationalFunction k) -> f a -> RationalFunction k
sumWith1 :: (a -> RationalFunction k) -> f a -> RationalFunction k
$csumWith1 :: forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable1 f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
sinnum1p :: Natural -> RationalFunction k -> RationalFunction k
$csinnum1p :: forall k.
(Eq k, Euclidean k, Division k) =>
Natural -> RationalFunction k -> RationalFunction k
+ :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c+ :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
Additive, RationalFunction k -> Natural -> RationalFunction k
RationalFunction k -> RationalFunction k -> RationalFunction k
(a -> RationalFunction k) -> f a -> RationalFunction k
(RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> Natural -> RationalFunction k)
-> (forall (f :: * -> *) a.
    Foldable1 f =>
    (a -> RationalFunction k) -> f a -> RationalFunction k)
-> Multiplicative (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Natural -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable1 f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
forall r.
(r -> r -> r)
-> (r -> Natural -> r)
-> (forall (f :: * -> *) a. Foldable1 f => (a -> r) -> f a -> r)
-> Multiplicative r
forall (f :: * -> *) a.
Foldable1 f =>
(a -> RationalFunction k) -> f a -> RationalFunction k
productWith1 :: (a -> RationalFunction k) -> f a -> RationalFunction k
$cproductWith1 :: forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable1 f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
pow1p :: RationalFunction k -> Natural -> RationalFunction k
$cpow1p :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Natural -> RationalFunction k
* :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c* :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
Multiplicative, Multiplicative (RationalFunction k)
RationalFunction k
Multiplicative (RationalFunction k)
-> RationalFunction k
-> (RationalFunction k -> Natural -> RationalFunction k)
-> (forall (f :: * -> *) a.
    Foldable f =>
    (a -> RationalFunction k) -> f a -> RationalFunction k)
-> Unital (RationalFunction k)
RationalFunction k -> Natural -> RationalFunction k
(a -> RationalFunction k) -> f a -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
Multiplicative (RationalFunction k)
forall k. (Eq k, Euclidean k, Division k) => RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Natural -> RationalFunction k
forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
forall r.
Multiplicative r
-> r
-> (r -> Natural -> r)
-> (forall (f :: * -> *) a. Foldable f => (a -> r) -> f a -> r)
-> Unital r
forall (f :: * -> *) a.
Foldable f =>
(a -> RationalFunction k) -> f a -> RationalFunction k
productWith :: (a -> RationalFunction k) -> f a -> RationalFunction k
$cproductWith :: forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
pow :: RationalFunction k -> Natural -> RationalFunction k
$cpow :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Natural -> RationalFunction k
one :: RationalFunction k
$cone :: forall k. (Eq k, Euclidean k, Division k) => RationalFunction k
$cp1Unital :: forall k.
(Eq k, Euclidean k, Division k) =>
Multiplicative (RationalFunction k)
Unital,
                                       RightModule Natural (RationalFunction k)
LeftModule Natural (RationalFunction k)
RationalFunction k
Natural -> RationalFunction k -> RationalFunction k
LeftModule Natural (RationalFunction k)
-> RightModule Natural (RationalFunction k)
-> RationalFunction k
-> (Natural -> RationalFunction k -> RationalFunction k)
-> (forall (f :: * -> *) a.
    Foldable f =>
    (a -> RationalFunction k) -> f a -> RationalFunction k)
-> Monoidal (RationalFunction k)
(a -> RationalFunction k) -> f a -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RightModule Natural (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
LeftModule Natural (RationalFunction k)
forall k. (Eq k, Euclidean k, Division k) => RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
Natural -> RationalFunction k -> RationalFunction k
forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
forall m.
LeftModule Natural m
-> RightModule Natural m
-> m
-> (Natural -> m -> m)
-> (forall (f :: * -> *) a. Foldable f => (a -> m) -> f a -> m)
-> Monoidal m
forall (f :: * -> *) a.
Foldable f =>
(a -> RationalFunction k) -> f a -> RationalFunction k
sumWith :: (a -> RationalFunction k) -> f a -> RationalFunction k
$csumWith :: forall k (f :: * -> *) a.
(Eq k, Euclidean k, Division k, Foldable f) =>
(a -> RationalFunction k) -> f a -> RationalFunction k
sinnum :: Natural -> RationalFunction k -> RationalFunction k
$csinnum :: forall k.
(Eq k, Euclidean k, Division k) =>
Natural -> RationalFunction k -> RationalFunction k
zero :: RationalFunction k
$czero :: forall k. (Eq k, Euclidean k, Division k) => RationalFunction k
$cp2Monoidal :: forall k.
(Eq k, Euclidean k, Division k) =>
RightModule Natural (RationalFunction k)
$cp1Monoidal :: forall k.
(Eq k, Euclidean k, Division k) =>
LeftModule Natural (RationalFunction k)
Monoidal, Multiplicative (RationalFunction k)
Multiplicative (RationalFunction k)
-> Commutative (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Multiplicative (RationalFunction k)
forall r. Multiplicative r -> Commutative r
Commutative, RightModule Integer (RationalFunction k)
Monoidal (RationalFunction k)
LeftModule Integer (RationalFunction k)
n -> RationalFunction k -> RationalFunction k
LeftModule Integer (RationalFunction k)
-> RightModule Integer (RationalFunction k)
-> Monoidal (RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (forall n.
    Integral n =>
    n -> RationalFunction k -> RationalFunction k)
-> Group (RationalFunction k)
RationalFunction k -> RationalFunction k
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RightModule Integer (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
LeftModule Integer (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k n.
(Eq k, Euclidean k, Division k, Integral n) =>
n -> RationalFunction k -> RationalFunction k
forall n.
Integral n =>
n -> RationalFunction k -> RationalFunction k
forall r.
LeftModule Integer r
-> RightModule Integer r
-> Monoidal r
-> (r -> r -> r)
-> (r -> r)
-> (r -> r -> r)
-> (forall n. Integral n => n -> r -> r)
-> Group r
times :: n -> RationalFunction k -> RationalFunction k
$ctimes :: forall k n.
(Eq k, Euclidean k, Division k, Integral n) =>
n -> RationalFunction k -> RationalFunction k
subtract :: RationalFunction k -> RationalFunction k -> RationalFunction k
$csubtract :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
negate :: RationalFunction k -> RationalFunction k
$cnegate :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k
- :: RationalFunction k -> RationalFunction k -> RationalFunction k
$c- :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
$cp3Group :: forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
$cp2Group :: forall k.
(Eq k, Euclidean k, Division k) =>
RightModule Integer (RationalFunction k)
$cp1Group :: forall k.
(Eq k, Euclidean k, Division k) =>
LeftModule Integer (RationalFunction k)
Group, Additive (RationalFunction k)
Additive (RationalFunction k) -> Abelian (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Additive (RationalFunction k)
forall r. Additive r -> Abelian r
Abelian,
                                       LeftModule Integer, RightModule Integer,
                                       LeftModule Natural, RightModule Natural,
                                       IntegralDomain (RationalFunction k)
UnitNormalForm (RationalFunction k)
DecidableZero (RationalFunction k)
IntegralDomain (RationalFunction k)
-> UnitNormalForm (RationalFunction k)
-> DecidableZero (RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k
    -> RationalFunction k -> (RationalFunction k, RationalFunction k))
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> GCDDomain (RationalFunction k)
RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
IntegralDomain (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
UnitNormalForm (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
DecidableZero (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall d.
IntegralDomain d
-> UnitNormalForm d
-> DecidableZero d
-> (d -> d -> d)
-> (d -> d -> (d, d))
-> (d -> d -> d)
-> GCDDomain d
lcm :: RationalFunction k -> RationalFunction k -> RationalFunction k
$clcm :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
reduceFraction :: RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
$creduceFraction :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
gcd :: RationalFunction k -> RationalFunction k -> RationalFunction k
$cgcd :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
$cp3GCDDomain :: forall k.
(Eq k, Euclidean k, Division k) =>
DecidableZero (RationalFunction k)
$cp2GCDDomain :: forall k.
(Eq k, Euclidean k, Division k) =>
UnitNormalForm (RationalFunction k)
$cp1GCDDomain :: forall k.
(Eq k, Euclidean k, Division k) =>
IntegralDomain (RationalFunction k)
GCDDomain, UFD (RationalFunction k)
UFD (RationalFunction k)
-> (RationalFunction k
    -> RationalFunction k
    -> (RationalFunction k, RationalFunction k, RationalFunction k))
-> PID (RationalFunction k)
RationalFunction k
-> RationalFunction k
-> (RationalFunction k, RationalFunction k, RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
UFD (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k
-> (RationalFunction k, RationalFunction k, RationalFunction k)
forall d. UFD d -> (d -> d -> (d, d, d)) -> PID d
egcd :: RationalFunction k
-> RationalFunction k
-> (RationalFunction k, RationalFunction k, RationalFunction k)
$cegcd :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k
-> (RationalFunction k, RationalFunction k, RationalFunction k)
$cp1PID :: forall k.
(Eq k, Euclidean k, Division k) =>
UFD (RationalFunction k)
PID, GCDDomain (RationalFunction k)
GCDDomain (RationalFunction k) -> UFD (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
GCDDomain (RationalFunction k)
forall d. GCDDomain d -> UFD d
UFD, PID (RationalFunction k)
PID (RationalFunction k)
-> (RationalFunction k -> Maybe Natural)
-> (RationalFunction k
    -> RationalFunction k -> (RationalFunction k, RationalFunction k))
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> RationalFunction k)
-> Euclidean (RationalFunction k)
RationalFunction k -> Maybe Natural
RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
RationalFunction k -> RationalFunction k -> RationalFunction k
forall k.
(Eq k, Euclidean k, Division k) =>
PID (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Maybe Natural
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
forall d.
PID d
-> (d -> Maybe Natural)
-> (d -> d -> (d, d))
-> (d -> d -> d)
-> (d -> d -> d)
-> Euclidean d
rem :: RationalFunction k -> RationalFunction k -> RationalFunction k
$crem :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
quot :: RationalFunction k -> RationalFunction k -> RationalFunction k
$cquot :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> RationalFunction k
divide :: RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
$cdivide :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k -> (RationalFunction k, RationalFunction k)
degree :: RationalFunction k -> Maybe Natural
$cdegree :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Maybe Natural
$cp1Euclidean :: forall k.
(Eq k, Euclidean k, Division k) =>
PID (RationalFunction k)
Euclidean, Domain (RationalFunction k)
Commutative (RationalFunction k)
Domain (RationalFunction k)
-> Commutative (RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> (RationalFunction k
    -> RationalFunction k -> Maybe (RationalFunction k))
-> IntegralDomain (RationalFunction k)
RationalFunction k -> RationalFunction k -> Bool
RationalFunction k
-> RationalFunction k -> Maybe (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Domain (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Commutative (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k -> Maybe (RationalFunction k)
forall d.
Domain d
-> Commutative d
-> (d -> d -> Bool)
-> (d -> d -> Maybe d)
-> IntegralDomain d
maybeQuot :: RationalFunction k
-> RationalFunction k -> Maybe (RationalFunction k)
$cmaybeQuot :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k
-> RationalFunction k -> Maybe (RationalFunction k)
divides :: RationalFunction k -> RationalFunction k -> Bool
$cdivides :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
$cp2IntegralDomain :: forall k.
(Eq k, Euclidean k, Division k) =>
Commutative (RationalFunction k)
$cp1IntegralDomain :: forall k.
(Eq k, Euclidean k, Division k) =>
Domain (RationalFunction k)
IntegralDomain,
                                       Semiring (RationalFunction k)
Monoidal (RationalFunction k)
Monoidal (RationalFunction k)
-> Semiring (RationalFunction k)
-> ZeroProductSemiring (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Semiring (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
forall r. Monoidal r -> Semiring r -> ZeroProductSemiring r
$cp2ZeroProductSemiring :: forall k.
(Eq k, Euclidean k, Division k) =>
Semiring (RationalFunction k)
$cp1ZeroProductSemiring :: forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
ZeroProductSemiring, Unital (RationalFunction k)
Unital (RationalFunction k)
-> (RationalFunction k -> RationalFunction k -> Bool)
-> DecidableAssociates (RationalFunction k)
RationalFunction k -> RationalFunction k -> Bool
forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
forall r. Unital r -> (r -> r -> Bool) -> DecidableAssociates r
isAssociate :: RationalFunction k -> RationalFunction k -> Bool
$cisAssociate :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> RationalFunction k -> Bool
$cp1DecidableAssociates :: forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
DecidableAssociates,
                                       Unital (RationalFunction k)
Unital (RationalFunction k)
-> (RationalFunction k -> Maybe (RationalFunction k))
-> (RationalFunction k -> Bool)
-> (forall n.
    Integral n =>
    RationalFunction k -> n -> Maybe (RationalFunction k))
-> DecidableUnits (RationalFunction k)
RationalFunction k -> Bool
RationalFunction k -> Maybe (RationalFunction k)
RationalFunction k -> n -> Maybe (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Bool
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Maybe (RationalFunction k)
forall k n.
(Eq k, Euclidean k, Division k, Integral n) =>
RationalFunction k -> n -> Maybe (RationalFunction k)
forall n.
Integral n =>
RationalFunction k -> n -> Maybe (RationalFunction k)
forall r.
Unital r
-> (r -> Maybe r)
-> (r -> Bool)
-> (forall n. Integral n => r -> n -> Maybe r)
-> DecidableUnits r
^? :: RationalFunction k -> n -> Maybe (RationalFunction k)
$c^? :: forall k n.
(Eq k, Euclidean k, Division k, Integral n) =>
RationalFunction k -> n -> Maybe (RationalFunction k)
isUnit :: RationalFunction k -> Bool
$cisUnit :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Bool
recipUnit :: RationalFunction k -> Maybe (RationalFunction k)
$crecipUnit :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Maybe (RationalFunction k)
$cp1DecidableUnits :: forall k.
(Eq k, Euclidean k, Division k) =>
Unital (RationalFunction k)
DecidableUnits, Monoidal (RationalFunction k)
Monoidal (RationalFunction k)
-> (RationalFunction k -> Bool)
-> DecidableZero (RationalFunction k)
RationalFunction k -> Bool
forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Bool
forall r. Monoidal r -> (r -> Bool) -> DecidableZero r
isZero :: RationalFunction k -> Bool
$cisZero :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> Bool
$cp1DecidableZero :: forall k.
(Eq k, Euclidean k, Division k) =>
Monoidal (RationalFunction k)
DecidableZero, DecidableUnits (RationalFunction k)
DecidableAssociates (RationalFunction k)
DecidableUnits (RationalFunction k)
-> DecidableAssociates (RationalFunction k)
-> (RationalFunction k -> (RationalFunction k, RationalFunction k))
-> UnitNormalForm (RationalFunction k)
RationalFunction k -> (RationalFunction k, RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
DecidableUnits (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
DecidableAssociates (RationalFunction k)
forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> (RationalFunction k, RationalFunction k)
forall r.
DecidableUnits r
-> DecidableAssociates r -> (r -> (r, r)) -> UnitNormalForm r
splitUnit :: RationalFunction k -> (RationalFunction k, RationalFunction k)
$csplitUnit :: forall k.
(Eq k, Euclidean k, Division k) =>
RationalFunction k -> (RationalFunction k, RationalFunction k)
$cp2UnitNormalForm :: forall k.
(Eq k, Euclidean k, Division k) =>
DecidableAssociates (RationalFunction k)
$cp1UnitNormalForm :: forall k.
(Eq k, Euclidean k, Division k) =>
DecidableUnits (RationalFunction k)
UnitNormalForm
                                      )

instance (CoeffRing k, PrettyCoeff k) => Show (RationalFunction k) where
  showsPrec :: Int -> RationalFunction k -> ShowS
showsPrec Int
d (RF Fraction (Unipol k)
r) = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
    Int -> Unipol k -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 (Fraction (Unipol k) -> Unipol k
forall t. Fraction t -> t
numerator Fraction (Unipol k)
r) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" / " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Unipol k -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 (Fraction (Unipol k) -> Unipol k
forall t. Fraction t -> t
denominator Fraction (Unipol k)
r)

instance (Field k, Eq k) => IsLabel "x" (RationalFunction k) where
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 802
  fromLabel :: RationalFunction k
fromLabel 
#else
  fromLabel _
#endif
    = Fraction (Unipol k) -> RationalFunction k
forall k. Fraction (Unipol k) -> RationalFunction k
RF (IsLabel "x" (Unipol k)
Unipol k
#x Unipol k -> Unipol k -> Fraction (Unipol k)
forall d. GCDDomain d => d -> d -> Fraction d
NA.% Unipol k
forall r. Unital r => r
one)

evalRationalFunctionOnField :: (Eq k, Field k) => RationalFunction k -> k -> k
evalRationalFunctionOnField :: RationalFunction k -> k -> k
evalRationalFunctionOnField RationalFunction k
rat k
k =
  let d :: Fraction k
d = RationalFunction k -> k -> Fraction k
forall r.
(GCDDomain r, CoeffRing r) =>
RationalFunction r -> r -> Fraction r
evalRationalFunction RationalFunction k
rat k
k
  in Fraction k -> k
forall t. Fraction t -> t
numerator Fraction k
d k -> k -> k
forall r. Division r => r -> r -> r
/ Fraction k -> k
forall t. Fraction t -> t
denominator Fraction k
d

fromPolynomial :: (IsOrderedPolynomial poly, Arity poly ~ 1, Field (Coefficient poly))
               => poly -> RationalFunction (Coefficient poly)
fromPolynomial :: poly -> RationalFunction (Coefficient poly)
fromPolynomial = Fraction (Unipol (Coefficient poly))
-> RationalFunction (Coefficient poly)
forall k. Fraction (Unipol k) -> RationalFunction k
RF (Fraction (Unipol (Coefficient poly))
 -> RationalFunction (Coefficient poly))
-> (poly -> Fraction (Unipol (Coefficient poly)))
-> poly
-> RationalFunction (Coefficient poly)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Unipol (Coefficient poly)
-> Unipol (Coefficient poly)
-> Fraction (Unipol (Coefficient poly))
forall d. GCDDomain d => d -> d -> Fraction d
NA.% Unipol (Coefficient poly)
forall r. Unital r => r
one) (Unipol (Coefficient poly) -> Fraction (Unipol (Coefficient poly)))
-> (poly -> Unipol (Coefficient poly))
-> poly
-> Fraction (Unipol (Coefficient poly))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map (Sized Vector 1 Int) (Coefficient poly)
-> Unipol (Coefficient poly)
forall poly.
IsPolynomial poly =>
Map (Monomial (Arity poly)) (Coefficient poly) -> poly
polynomial' (Map (Sized Vector 1 Int) (Coefficient poly)
 -> Unipol (Coefficient poly))
-> (poly -> Map (Sized Vector 1 Int) (Coefficient poly))
-> poly
-> Unipol (Coefficient poly)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. poly -> Map (Sized Vector 1 Int) (Coefficient poly)
forall poly.
IsPolynomial poly =>
poly -> Map (Monomial (Arity poly)) (Coefficient poly)
terms'

variable :: (Eq k, Field k) => RationalFunction k
variable :: RationalFunction k
variable = IsLabel "x" (RationalFunction k)
RationalFunction k
#x

evalRationalFunction :: (GCDDomain r, CoeffRing r) => RationalFunction r -> r -> Fraction r
evalRationalFunction :: RationalFunction r -> r -> Fraction r
evalRationalFunction (RF Fraction (Unipol r)
rat) r
k =
  let p :: Coefficient (Unipol r)
p = (Ordinal (Arity (Unipol r)) -> Coefficient (Unipol r))
-> Unipol r -> Coefficient (Unipol r)
forall poly.
IsPolynomial poly =>
(Ordinal (Arity poly) -> Coefficient poly)
-> poly -> Coefficient poly
liftMapCoeff (r -> Ordinal 1 -> r
forall a b. a -> b -> a
const r
k) (Unipol r -> Coefficient (Unipol r))
-> Unipol r -> Coefficient (Unipol r)
forall a b. (a -> b) -> a -> b
$ Fraction (Unipol r) -> Unipol r
forall t. Fraction t -> t
numerator Fraction (Unipol r)
rat
      q :: Coefficient (Unipol r)
q = (Ordinal (Arity (Unipol r)) -> Coefficient (Unipol r))
-> Unipol r -> Coefficient (Unipol r)
forall poly.
IsPolynomial poly =>
(Ordinal (Arity poly) -> Coefficient poly)
-> poly -> Coefficient poly
liftMapCoeff (r -> Ordinal 1 -> r
forall a b. a -> b -> a
const r
k) (Unipol r -> Coefficient (Unipol r))
-> Unipol r -> Coefficient (Unipol r)
forall a b. (a -> b) -> a -> b
$ Fraction (Unipol r) -> Unipol r
forall t. Fraction t -> t
denominator Fraction (Unipol r)
rat
  in r
Coefficient (Unipol r)
p r -> r -> Fraction r
forall d. GCDDomain d => d -> d -> Fraction d
NA.% r
Coefficient (Unipol r)
q

-- | Formal differentiation
diffRF :: (Eq k, Field k) => RationalFunction k -> RationalFunction k
diffRF :: RationalFunction k -> RationalFunction k
diffRF (RF Fraction (Unipol k)
pq) =
  let f :: Unipol k
f = Fraction (Unipol k) -> Unipol k
forall t. Fraction t -> t
numerator Fraction (Unipol k)
pq
      g :: Unipol k
g = Fraction (Unipol k) -> Unipol k
forall t. Fraction t -> t
denominator Fraction (Unipol k)
pq
  in Fraction (Unipol k) -> RationalFunction k
forall k. Fraction (Unipol k) -> RationalFunction k
RF (Fraction (Unipol k) -> RationalFunction k)
-> Fraction (Unipol k) -> RationalFunction k
forall a b. (a -> b) -> a -> b
$ (Unipol k
g Unipol k -> Unipol k -> Unipol k
forall r. Multiplicative r => r -> r -> r
* Ordinal (Arity (Unipol k)) -> Unipol k -> Unipol k
forall poly.
IsOrderedPolynomial poly =>
Ordinal (Arity poly) -> poly -> poly
diff Ordinal (Arity (Unipol k))
0 Unipol k
f Unipol k -> Unipol k -> Unipol k
forall r. Group r => r -> r -> r
- Ordinal (Arity (Unipol k)) -> Unipol k -> Unipol k
forall poly.
IsOrderedPolynomial poly =>
Ordinal (Arity poly) -> poly -> poly
diff Ordinal (Arity (Unipol k))
0 Unipol k
g Unipol k -> Unipol k -> Unipol k
forall r. Multiplicative r => r -> r -> r
* Unipol k
f) Unipol k -> Unipol k -> Fraction (Unipol k)
forall d. GCDDomain d => d -> d -> Fraction d
NA.% (Unipol k
g Unipol k -> Natural -> Unipol k
forall r. Unital r => r -> Natural -> r
^ Natural
2)

-- | Formal Taylor expansion
taylor :: (Eq k, Field k) => RationalFunction k -> [k]
taylor :: RationalFunction k -> [k]
taylor = Integer -> k -> RationalFunction k -> [k]
forall k.
(Division k, Eq k, Euclidean k) =>
Integer -> k -> RationalFunction k -> [k]
go Integer
0 k
forall r. Unital r => r
one
  where
    go :: Integer -> k -> RationalFunction k -> [k]
go !Integer
n !k
acc RationalFunction k
f =
      let acc' :: k
acc' = k
acc k -> k -> k
forall r. Division r => r -> r -> r
/ Integer -> k
forall r. Ring r => Integer -> r
fromInteger' (Integer
n Integer -> Integer -> Integer
forall r. Additive r => r -> r -> r
+ Integer
1)
      in RationalFunction k -> k -> k
forall k. (Eq k, Field k) => RationalFunction k -> k -> k
evalRationalFunctionOnField RationalFunction k
f k
forall m. Monoidal m => m
zero k -> k -> k
forall r. Multiplicative r => r -> r -> r
* k
acc k -> [k] -> [k]
forall a. a -> [a] -> [a]
: Integer -> k -> RationalFunction k -> [k]
go (Integer
n Integer -> Integer -> Integer
forall r. Additive r => r -> r -> r
+ Integer
1) k
acc' (RationalFunction k -> RationalFunction k
forall k.
(Eq k, Field k) =>
RationalFunction k -> RationalFunction k
diffRF RationalFunction k
f)

taylorCoeff :: (Eq k, Field k) => Int -> RationalFunction k -> k
taylorCoeff :: Int -> RationalFunction k -> k
taylorCoeff Int
n RationalFunction k
rf =
    RationalFunction k -> k -> k
forall k. (Eq k, Field k) => RationalFunction k -> k -> k
evalRationalFunctionOnField (((RationalFunction k -> RationalFunction k)
 -> (RationalFunction k -> RationalFunction k)
 -> RationalFunction k
 -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> [RationalFunction k -> RationalFunction k]
-> RationalFunction k
-> RationalFunction k
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (RationalFunction k -> RationalFunction k)
-> (RationalFunction k -> RationalFunction k)
-> RationalFunction k
-> RationalFunction k
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) RationalFunction k -> RationalFunction k
forall a. a -> a
id (Int
-> (RationalFunction k -> RationalFunction k)
-> [RationalFunction k -> RationalFunction k]
forall a. Int -> a -> [a]
replicate Int
n RationalFunction k -> RationalFunction k
forall k.
(Eq k, Field k) =>
RationalFunction k -> RationalFunction k
diffRF) RationalFunction k
rf) k
forall m. Monoidal m => m
zero
  k -> k -> k
forall r. Division r => r -> r -> r
/ Integer -> k
forall r. Ring r => Integer -> r
fromInteger' ([Integer] -> Integer
forall (f :: * -> *) r. (Foldable f, Unital r) => f r -> r
product [Integer
1..Int -> Integer
forall a. Integral a => a -> Integer
toInteger Int
n])