module Symtegration.Integration.Rational
(
integrate,
hermiteReduce,
rationalIntegralLogTerms,
complexLogTermToAtan,
complexLogTermToRealTerm,
RationalFunction,
)
where
import Data.Foldable (asum)
import Data.List (find, intersect)
import Data.Monoid (Sum (..))
import Data.Text (Text)
import Symtegration.Polynomial hiding (integrate)
import Symtegration.Polynomial qualified as Polynomial
import Symtegration.Polynomial.Indexed
import Symtegration.Polynomial.Rational as Rational
import Symtegration.Polynomial.Solve
import Symtegration.Polynomial.Symbolic
import Symtegration.Symbolic
import Symtegration.Symbolic.Simplify
integrate :: Text -> Expression -> Maybe Expression
integrate :: Text -> Expression -> Maybe Expression
integrate Text
v Expression
e
| (Expression
x :/: Expression
y) <- Expression
e',
(Just P Int Rational
n) <- (Text -> Maybe (P Int Rational), Expression -> Maybe Rational)
-> Expression -> Maybe (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Fractional c) =>
(Text -> Maybe (p e c), Expression -> Maybe c)
-> Expression -> Maybe (p e c)
fromExpression (Text
-> (Text -> Maybe (P Int Rational), Expression -> Maybe Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Fractional c) =>
Text -> (Text -> Maybe (p e c), Expression -> Maybe c)
forVariable Text
v) Expression
x,
(Just P Int Rational
d) <- (Text -> Maybe (P Int Rational), Expression -> Maybe Rational)
-> Expression -> Maybe (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Fractional c) =>
(Text -> Maybe (p e c), Expression -> Maybe c)
-> Expression -> Maybe (p e c)
fromExpression (Text
-> (Text -> Maybe (P Int Rational), Expression -> Maybe Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Fractional c) =>
Text -> (Text -> Maybe (p e c), Expression -> Maybe c)
forVariable Text
v) Expression
y,
P Int Rational
d P Int Rational -> P Int Rational -> Bool
forall a. Eq a => a -> a -> Bool
/= P Int Rational
0 =
P Int Rational -> P Int Rational -> Maybe Expression
integrate' P Int Rational
n P Int Rational
d
| Bool
otherwise = Maybe Expression
forall a. Maybe a
Nothing
where
e' :: Expression
e' = Text -> Expression -> Expression
simplifyForVariable Text
v Expression
e
integrate' :: P Int Rational -> P Int Rational -> Maybe Expression
integrate' P Int Rational
n P Int Rational
d = Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
(+) Expression
reduced (Expression -> Expression)
-> (Expression -> Expression) -> Expression -> Expression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
(+) Expression
poly (Expression -> Expression) -> Maybe Expression -> Maybe Expression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Expression
logs
where
([Function (P Int Rational)]
g, Function (P Int Rational)
h) = Function (P Int Rational)
-> ([Function (P Int Rational)], Function (P Int Rational))
hermiteReduce (Function (P Int Rational)
-> ([Function (P Int Rational)], Function (P Int Rational)))
-> Function (P Int Rational)
-> ([Function (P Int Rational)], Function (P Int Rational))
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational -> Function (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> Function (p e c)
fromPolynomials P Int Rational
n P Int Rational
d
reduced :: Expression
reduced = [Expression] -> Expression
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Expression] -> Expression) -> [Expression] -> Expression
forall a b. (a -> b) -> a -> b
$ (Function (P Int Rational) -> Expression)
-> [Function (P Int Rational)] -> [Expression]
forall a b. (a -> b) -> [a] -> [b]
map Function (P Int Rational) -> Expression
forall {p :: * -> * -> *} {e} {c}.
(Polynomial p e c, Real c) =>
Function (p e c) -> Expression
fromRationalFunction [Function (P Int Rational)]
g
Rational.Function P Int Rational
numer P Int Rational
denom = Function (P Int Rational)
h
(P Int Rational
q, P Int Rational
r) = P Int Rational
numer P Int Rational
-> P Int Rational -> (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` P Int Rational
denom
poly :: Expression
poly = Text -> (Rational -> Expression) -> P Int Rational -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Rational -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient (P Int Rational -> Expression) -> P Int Rational -> Expression
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Fractional c) =>
p e c -> p e c
Polynomial.integrate P Int Rational
q
h' :: Function (P Int Rational)
h' = P Int Rational -> P Int Rational -> Function (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> Function (p e c)
fromPolynomials P Int Rational
r P Int Rational
denom
logTerms :: Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
logTerms = Function (P Int Rational)
-> Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
rationalIntegralLogTerms Function (P Int Rational)
h'
logs :: Maybe Expression
logs = [Maybe Expression] -> Maybe Expression
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Maybe Expression
realLogs, Maybe Expression
complexLogs] :: Maybe Expression
realLogs :: Maybe Expression
realLogs
| (Just [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
terms) <- Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
logTerms = [Expression] -> Expression
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Expression] -> Expression)
-> Maybe [Expression] -> Maybe Expression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Maybe Expression)
-> [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
-> Maybe [Expression]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Text
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Maybe Expression
complexLogTermToRealExpression Text
v) [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
terms
| Bool
otherwise = Maybe Expression
forall a. Maybe a
Nothing
complexLogs :: Maybe Expression
complexLogs
| (Just [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
terms) <- Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
logTerms = [Expression] -> Expression
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Expression] -> Expression)
-> Maybe [Expression] -> Maybe Expression
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Maybe Expression)
-> [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
-> Maybe [Expression]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Text
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Maybe Expression
complexLogTermToComplexExpression Text
v) [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
terms
| Bool
otherwise = Maybe Expression
forall a. Maybe a
Nothing
fromRationalFunction :: Function (p e c) -> Expression
fromRationalFunction (Rational.Function p e c
u p e c
w) = Expression
u' Expression -> Expression -> Expression
forall a. Fractional a => a -> a -> a
/ Expression
w'
where
u' :: Expression
u' = Text -> (c -> Expression) -> p e c -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v c -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient p e c
u
w' :: Expression
w' = Text -> (c -> Expression) -> p e c -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v c -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient p e c
w
type RationalFunction = Rational.Function IndexedPolynomial
hermiteReduce :: RationalFunction -> ([RationalFunction], RationalFunction)
hermiteReduce :: Function (P Int Rational)
-> ([Function (P Int Rational)], Function (P Int Rational))
hermiteReduce h :: Function (P Int Rational)
h@(Rational.Function P Int Rational
_ P Int Rational
0) = ([], Function (P Int Rational)
h)
hermiteReduce h :: Function (P Int Rational)
h@(Rational.Function P Int Rational
x P Int Rational
y)
| (Just ([Function (P Int Rational)], Function (P Int Rational))
z) <- P Int Rational
-> [Function (P Int Rational)]
-> P Int Rational
-> Maybe ([Function (P Int Rational)], Function (P Int Rational))
reduce P Int Rational
x [] P Int Rational
common = ([Function (P Int Rational)], Function (P Int Rational))
z
| Bool
otherwise = ([], Function (P Int Rational)
h)
where
common :: P Int Rational
common = P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq c, Fractional c) =>
p e c -> p e c
monic (P Int Rational -> P Int Rational)
-> P Int Rational -> P Int Rational
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> p e c
greatestCommonDivisor P Int Rational
y (P Int Rational -> P Int Rational)
-> P Int Rational -> P Int Rational
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Num c) =>
p e c -> p e c
differentiate P Int Rational
y
(P Int Rational
divisor, P Int Rational
_) = P Int Rational
y P Int Rational
-> P Int Rational -> (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` P Int Rational
common
reduce :: P Int Rational
-> [Function (P Int Rational)]
-> P Int Rational
-> Maybe ([Function (P Int Rational)], Function (P Int Rational))
reduce P Int Rational
a [Function (P Int Rational)]
g P Int Rational
d
| P Int Rational -> Int
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e
degree P Int Rational
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = do
let d' :: P Int Rational
d' = P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq c, Fractional c) =>
p e c -> p e c
monic (P Int Rational -> P Int Rational)
-> P Int Rational -> P Int Rational
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> p e c
greatestCommonDivisor P Int Rational
d (P Int Rational -> P Int Rational)
-> P Int Rational -> P Int Rational
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Num c) =>
p e c -> p e c
differentiate P Int Rational
d
let (P Int Rational
d'', P Int Rational
_) = P Int Rational
d P Int Rational
-> P Int Rational -> (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` P Int Rational
d'
let (P Int Rational
d''', P Int Rational
_) = (P Int Rational
divisor P Int Rational -> P Int Rational -> P Int Rational
forall a. Num a => a -> a -> a
* P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Num c) =>
p e c -> p e c
differentiate P Int Rational
d) P Int Rational
-> P Int Rational -> (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` P Int Rational
d
(P Int Rational
b, P Int Rational
c) <- P Int Rational
-> P Int Rational
-> P Int Rational
-> Maybe (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> p e c -> Maybe (p e c, p e c)
diophantineEuclidean (-P Int Rational
d''') P Int Rational
d'' P Int Rational
a
let (P Int Rational
b', P Int Rational
_) = (P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Num c) =>
p e c -> p e c
differentiate P Int Rational
b P Int Rational -> P Int Rational -> P Int Rational
forall a. Num a => a -> a -> a
* P Int Rational
divisor) P Int Rational
-> P Int Rational -> (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` P Int Rational
d''
let a' :: P Int Rational
a' = P Int Rational
c P Int Rational -> P Int Rational -> P Int Rational
forall a. Num a => a -> a -> a
- P Int Rational
b'
let g' :: [Function (P Int Rational)]
g' = P Int Rational -> P Int Rational -> Function (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> Function (p e c)
fromPolynomials P Int Rational
b P Int Rational
d Function (P Int Rational)
-> [Function (P Int Rational)] -> [Function (P Int Rational)]
forall a. a -> [a] -> [a]
: [Function (P Int Rational)]
g
P Int Rational
-> [Function (P Int Rational)]
-> P Int Rational
-> Maybe ([Function (P Int Rational)], Function (P Int Rational))
reduce P Int Rational
a' [Function (P Int Rational)]
g' P Int Rational
d'
| Bool
otherwise = ([Function (P Int Rational)], Function (P Int Rational))
-> Maybe ([Function (P Int Rational)], Function (P Int Rational))
forall a. a -> Maybe a
Just ([Function (P Int Rational)]
g, P Int Rational -> P Int Rational -> Function (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> Function (p e c)
fromPolynomials P Int Rational
a P Int Rational
divisor)
rationalIntegralLogTerms ::
RationalFunction ->
Maybe [(IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial)]
rationalIntegralLogTerms :: Function (P Int Rational)
-> Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
rationalIntegralLogTerms (Rational.Function P Int Rational
a P Int Rational
d) = do
let sa :: P Int (Function (P Int Rational))
sa = (Rational -> Function (P Int Rational))
-> P Int Rational -> P Int (Function (P Int Rational))
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients Rational -> Function (P Int Rational)
forall a. Fractional a => Rational -> a
fromRational P Int Rational
a
let sd :: P Int (Function (P Int Rational))
sd = (Rational -> Function (P Int Rational))
-> P Int Rational -> P Int (Function (P Int Rational))
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients Rational -> Function (P Int Rational)
forall a. Fractional a => Rational -> a
fromRational P Int Rational
d
let t :: Function (P Int Rational)
t = P Int Rational -> Function (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c)) =>
p e c -> Function (p e c)
fromPolynomial (P Int Rational -> Function (P Int Rational))
-> P Int Rational -> Function (P Int Rational)
forall a b. (a -> b) -> a -> b
$ Int -> P Int Rational
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1
let (Function (P Int Rational)
resultant, [P Int (Function (P Int Rational))]
prs) = P Int (Function (P Int Rational))
-> P Int (Function (P Int Rational))
-> (Function (P Int Rational), [P Int (Function (P Int Rational))])
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Num e, Fractional c) =>
p e c -> p e c -> (c, [p e c])
subresultant P Int (Function (P Int Rational))
sd (P Int (Function (P Int Rational))
-> (Function (P Int Rational),
[P Int (Function (P Int Rational))]))
-> P Int (Function (P Int Rational))
-> (Function (P Int Rational), [P Int (Function (P Int Rational))])
forall a b. (a -> b) -> a -> b
$ P Int (Function (P Int Rational))
sa P Int (Function (P Int Rational))
-> P Int (Function (P Int Rational))
-> P Int (Function (P Int Rational))
forall a. Num a => a -> a -> a
- Function (P Int Rational)
-> P Int (Function (P Int Rational))
-> P Int (Function (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale Function (P Int Rational)
t (P Int (Function (P Int Rational))
-> P Int (Function (P Int Rational))
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c), Num c) =>
p e c -> p e c
differentiate P Int (Function (P Int Rational))
sd)
IndexedPolynomialWith (P Int Rational)
sd' <- (Function (P Int Rational) -> Maybe (P Int Rational))
-> P Int (Function (P Int Rational))
-> Maybe (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c c' (m :: * -> *).
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c'),
Monad m) =>
(c -> m c') -> p e c -> m (p e c')
mapCoefficientsM Function (P Int Rational) -> Maybe (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
Function (p e c) -> Maybe (p e c)
toPolynomial P Int (Function (P Int Rational))
sd
P Int Rational
resultant' <- Function (P Int Rational) -> Maybe (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
Function (p e c) -> Maybe (p e c)
toPolynomial Function (P Int Rational)
resultant
[IndexedPolynomialWith (P Int Rational)]
prs' <- (P Int (Function (P Int Rational))
-> Maybe (IndexedPolynomialWith (P Int Rational)))
-> [P Int (Function (P Int Rational))]
-> Maybe [IndexedPolynomialWith (P Int Rational)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((Function (P Int Rational) -> Maybe (P Int Rational))
-> P Int (Function (P Int Rational))
-> Maybe (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c c' (m :: * -> *).
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c'),
Monad m) =>
(c -> m c') -> p e c -> m (p e c')
mapCoefficientsM Function (P Int Rational) -> Maybe (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
Function (p e c) -> Maybe (p e c)
toPolynomial) [P Int (Function (P Int Rational))]
prs :: Maybe [IndexedPolynomialWith IndexedPolynomial]
let qs :: [P Int Rational]
qs = P Int Rational -> [P Int Rational]
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Eq c, Fractional c) =>
p e c -> [p e c]
squarefree P Int Rational
resultant' :: [IndexedPolynomial]
let terms :: [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
terms = (Int
-> P Int Rational
-> (P Int Rational, IndexedPolynomialWith (P Int Rational)))
-> [Int]
-> [P Int Rational]
-> [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (IndexedPolynomialWith (P Int Rational)
-> [IndexedPolynomialWith (P Int Rational)]
-> Int
-> P Int Rational
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
toTerm IndexedPolynomialWith (P Int Rational)
sd' [IndexedPolynomialWith (P Int Rational)]
prs') [Int
1 ..] [P Int Rational]
qs
[(P Int Rational, IndexedPolynomialWith (P Int Rational))]
-> Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(P Int Rational, IndexedPolynomialWith (P Int Rational))]
-> Maybe
[(P Int Rational, IndexedPolynomialWith (P Int Rational))])
-> [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
-> Maybe [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
forall a b. (a -> b) -> a -> b
$ ((P Int Rational, IndexedPolynomialWith (P Int Rational)) -> Bool)
-> [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
-> [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
forall a. (a -> Bool) -> [a] -> [a]
filter (IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational) -> Bool
forall a. Eq a => a -> a -> Bool
(/=) IndexedPolynomialWith (P Int Rational)
1 (IndexedPolynomialWith (P Int Rational) -> Bool)
-> ((P Int Rational, IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (P Int Rational))
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (P Int Rational)
forall a b. (a, b) -> b
snd) [(P Int Rational, IndexedPolynomialWith (P Int Rational))]
terms
where
toTerm ::
IndexedPolynomialWith IndexedPolynomial ->
[IndexedPolynomialWith IndexedPolynomial] ->
Int ->
IndexedPolynomial ->
(IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial)
toTerm :: IndexedPolynomialWith (P Int Rational)
-> [IndexedPolynomialWith (P Int Rational)]
-> Int
-> P Int Rational
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
toTerm IndexedPolynomialWith (P Int Rational)
sd [IndexedPolynomialWith (P Int Rational)]
prs Int
i P Int Rational
q
| P Int Rational -> Int
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e
degree P Int Rational
q Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = (P Int Rational
q, IndexedPolynomialWith (P Int Rational)
1)
| Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== P Int Rational -> Int
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e
degree P Int Rational
d = (P Int Rational
q, IndexedPolynomialWith (P Int Rational)
sd)
| (Just IndexedPolynomialWith (P Int Rational)
r) <- (IndexedPolynomialWith (P Int Rational) -> Bool)
-> [IndexedPolynomialWith (P Int Rational)]
-> Maybe (IndexedPolynomialWith (P Int Rational))
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
(==) Int
i (Int -> Bool)
-> (IndexedPolynomialWith (P Int Rational) -> Int)
-> IndexedPolynomialWith (P Int Rational)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IndexedPolynomialWith (P Int Rational) -> Int
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e
degree) [IndexedPolynomialWith (P Int Rational)]
prs = P Int Rational
-> IndexedPolynomialWith (P Int Rational)
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
derive P Int Rational
q IndexedPolynomialWith (P Int Rational)
r
| Bool
otherwise = (P Int Rational
q, IndexedPolynomialWith (P Int Rational)
1)
derive ::
IndexedPolynomial ->
IndexedPolynomialWith IndexedPolynomial ->
(IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial)
derive :: P Int Rational
-> IndexedPolynomialWith (P Int Rational)
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
derive P Int Rational
q IndexedPolynomialWith (P Int Rational)
s = (P Int Rational
q, IndexedPolynomialWith (P Int Rational)
s')
where
as :: [P Int Rational]
as = P Int Rational -> [P Int Rational]
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Eq c, Fractional c) =>
p e c -> [p e c]
squarefree (P Int Rational -> [P Int Rational])
-> P Int Rational -> [P Int Rational]
forall a b. (a -> b) -> a -> b
$ IndexedPolynomialWith (P Int Rational) -> P Int Rational
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> c
leadingCoefficient IndexedPolynomialWith (P Int Rational)
s
s' :: IndexedPolynomialWith (P Int Rational)
s' = (IndexedPolynomialWith (P Int Rational)
-> (Int, P Int Rational) -> IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (P Int Rational)
-> [(Int, P Int Rational)]
-> IndexedPolynomialWith (P Int Rational)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl IndexedPolynomialWith (P Int Rational)
-> (Int, P Int Rational) -> IndexedPolynomialWith (P Int Rational)
forall {p :: * -> * -> *} {e} {p :: * -> * -> *} {b}.
(Polynomial p e (P Int Rational), Polynomial p e (P Int Rational),
Integral b, Num (p e (P Int Rational))) =>
p e (P Int Rational) -> (b, P Int Rational) -> p e (P Int Rational)
scalePoly IndexedPolynomialWith (P Int Rational)
s ([Int] -> [P Int Rational] -> [(Int, P Int Rational)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([Int
1 ..] :: [Int]) [P Int Rational]
as)
where
scalePoly :: p e (P Int Rational) -> (b, P Int Rational) -> p e (P Int Rational)
scalePoly p e (P Int Rational)
x (b
j, P Int Rational
u) =
Sum (p e (P Int Rational)) -> p e (P Int Rational)
forall a. Sum a -> a
getSum (Sum (p e (P Int Rational)) -> p e (P Int Rational))
-> Sum (p e (P Int Rational)) -> p e (P Int Rational)
forall a b. (a -> b) -> a -> b
$ (e -> P Int Rational -> Sum (p e (P Int Rational)))
-> p e (P Int Rational) -> Sum (p e (P Int Rational))
forall m.
Monoid m =>
(e -> P Int Rational -> m) -> p e (P Int Rational) -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms (P Int Rational -> e -> P Int Rational -> Sum (p e (P Int Rational))
forall {p :: * -> * -> *} {e} {p :: * -> * -> *} {e} {c}.
(Polynomial p e (p e c), Polynomial p e c, Fractional c,
Eq (p e c)) =>
p e c -> e -> p e c -> Sum (p e (p e c))
reduceTerm (P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq c, Fractional c) =>
p e c -> p e c
monic (P Int Rational -> P Int Rational)
-> P Int Rational -> P Int Rational
forall a b. (a -> b) -> a -> b
$ P Int Rational -> P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> p e c
greatestCommonDivisor P Int Rational
u P Int Rational
q P Int Rational -> b -> P Int Rational
forall a b. (Num a, Integral b) => a -> b -> a
^ b
j)) p e (P Int Rational)
x
reduceTerm :: p e c -> e -> p e c -> Sum (p e (p e c))
reduceTerm p e c
v e
e p e c
c = p e (p e c) -> Sum (p e (p e c))
forall a. a -> Sum a
Sum (p e (p e c) -> Sum (p e (p e c)))
-> p e (p e c) -> Sum (p e (p e c))
forall a b. (a -> b) -> a -> b
$ p e c -> p e (p e c) -> p e (p e c)
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (p e c -> p e c -> p e c
forall {p :: * -> * -> *} {e} {c}.
(Polynomial p e c, Fractional c, Eq (p e c), Num (p e c)) =>
p e c -> p e c -> p e c
exactDivide p e c
c p e c
v) (p e (p e c) -> p e (p e c)) -> p e (p e c) -> p e (p e c)
forall a b. (a -> b) -> a -> b
$ e -> p e (p e c)
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power e
e
exactDivide :: p e c -> p e c -> p e c
exactDivide p e c
u p e c
v = p e c
r
where
(p e c
r, p e c
_) = p e c
u p e c -> p e c -> (p e c, p e c)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` p e c
v
complexLogTermToAtan ::
Text ->
IndexedPolynomial ->
IndexedPolynomial ->
Expression
complexLogTermToAtan :: Text -> P Int Rational -> P Int Rational -> Expression
complexLogTermToAtan Text
v P Int Rational
a P Int Rational
b
| P Int Rational
r P Int Rational -> P Int Rational -> Bool
forall a. Eq a => a -> a -> Bool
== P Int Rational
0 = Expression
2 Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression -> Expression
forall a. Floating a => a -> a
atan (Expression
a' Expression -> Expression -> Expression
forall a. Fractional a => a -> a -> a
/ Expression
b')
| P Int Rational -> Int
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e
degree P Int Rational
a Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< P Int Rational -> Int
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e
degree P Int Rational
b = Text -> P Int Rational -> P Int Rational -> Expression
complexLogTermToAtan Text
v (-P Int Rational
b) P Int Rational
a
| Bool
otherwise = Expression
2 Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression -> Expression
forall a. Floating a => a -> a
atan (Expression
s' Expression -> Expression -> Expression
forall a. Fractional a => a -> a -> a
/ Expression
g') Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
+ Text -> P Int Rational -> P Int Rational -> Expression
complexLogTermToAtan Text
v P Int Rational
d P Int Rational
c
where
(P Int Rational
_, P Int Rational
r) = P Int Rational
a P Int Rational
-> P Int Rational -> (P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c)
`divide` P Int Rational
b
(P Int Rational
d, P Int Rational
c, P Int Rational
g) = P Int Rational
-> P Int Rational
-> (P Int Rational, P Int Rational, P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
p e c -> p e c -> (p e c, p e c, p e c)
extendedEuclidean P Int Rational
b (-P Int Rational
a)
a' :: Expression
a' = Text -> (Rational -> Expression) -> P Int Rational -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Rational -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient P Int Rational
a
b' :: Expression
b' = Text -> (Rational -> Expression) -> P Int Rational -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Rational -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient P Int Rational
b
g' :: Expression
g' = Text -> (Rational -> Expression) -> P Int Rational -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Rational -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient P Int Rational
g
s' :: Expression
s' = Text -> (Rational -> Expression) -> P Int Rational -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Rational -> Expression
forall c. Real c => c -> Expression
toRationalCoefficient (P Int Rational -> Expression) -> P Int Rational -> Expression
forall a b. (a -> b) -> a -> b
$ P Int Rational
a P Int Rational -> P Int Rational -> P Int Rational
forall a. Num a => a -> a -> a
* P Int Rational
d P Int Rational -> P Int Rational -> P Int Rational
forall a. Num a => a -> a -> a
+ P Int Rational
b P Int Rational -> P Int Rational -> P Int Rational
forall a. Num a => a -> a -> a
* P Int Rational
c
complexLogTermToRealTerm ::
(IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial) ->
( (IndexedPolynomialWith IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial),
(IndexedPolynomialWith (IndexedPolynomialWith IndexedPolynomial), IndexedPolynomialWith (IndexedPolynomialWith IndexedPolynomial))
)
complexLogTermToRealTerm :: (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> ((IndexedPolynomialWith (P Int Rational),
IndexedPolynomialWith (P Int Rational)),
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)),
IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
complexLogTermToRealTerm (P Int Rational
q, IndexedPolynomialWith (P Int Rational)
s) = ((IndexedPolynomialWith (P Int Rational)
qp, IndexedPolynomialWith (P Int Rational)
qq), (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
sp, IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
sq))
where
q' :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
q' = Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a. Sum a -> a
getSum (Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a b. (a -> b) -> a -> b
$ (Int
-> IndexedPolynomialWith (P Int Rational)
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall m.
Monoid m =>
(Int -> IndexedPolynomialWith (P Int Rational) -> m)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms Int
-> IndexedPolynomialWith (P Int Rational)
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a.
(Eq a, Num a) =>
Int -> a -> Sum (IndexedPolynomialWith a)
reduceImaginary (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (a -> b) -> a -> b
$ Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a. Sum a -> a
getSum (Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a b. (a -> b) -> a -> b
$ (Int
-> Rational
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> P Int Rational
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall m. Monoid m => (Int -> Rational -> m) -> P Int Rational -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms Int
-> Rational
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
fromTerm P Int Rational
q
where
fromTerm :: Int -> Rational -> Sum (IndexedPolynomialWith (IndexedPolynomialWith IndexedPolynomial))
fromTerm :: Int
-> Rational
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
fromTerm Int
e Rational
c = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. a -> Sum a
Sum (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (a -> b) -> a -> b
$ IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
c' IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a. Num a => a -> a -> a
* (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
u IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a. Num a => a -> a -> a
+ IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
i IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a. Num a => a -> a -> a
* IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
v) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
e
where
c' :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
c' = IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (P Int Rational
-> IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Rational -> P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale Rational
c P Int Rational
1) IndexedPolynomialWith (P Int Rational)
1) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
1
i :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
i = Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1
u :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
u = IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Int -> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
1
v :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
v = IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (P Int Rational
-> IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Int -> P Int Rational
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1) IndexedPolynomialWith (P Int Rational)
1) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
1
(IndexedPolynomialWith (P Int Rational)
qp, IndexedPolynomialWith (P Int Rational)
qq) = (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Int -> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e -> c
coefficient IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
q' Int
0, IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Int -> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e -> c
coefficient IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
q' Int
1)
s' :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
s' = Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Sum a -> a
getSum (Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (a -> b) -> a -> b
$ (Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall m.
Monoid m =>
(Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> m)
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall a.
(Eq a, Num a) =>
Int -> a -> Sum (IndexedPolynomialWith a)
reduceImaginary (IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall a b. (a -> b) -> a -> b
$ Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Sum a -> a
getSum (Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (a -> b) -> a -> b
$ (Int
-> P Int Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))))
-> IndexedPolynomialWith (P Int Rational)
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall m.
Monoid m =>
(Int -> P Int Rational -> m)
-> IndexedPolynomialWith (P Int Rational) -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms Int
-> P Int Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
fromTerm IndexedPolynomialWith (P Int Rational)
s
where
fromTerm :: Int -> IndexedPolynomial -> Sum (IndexedPolynomialWith (IndexedPolynomialWith (IndexedPolynomialWith IndexedPolynomial)))
fromTerm :: Int
-> P Int Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
fromTerm Int
e P Int Rational
c = IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall a. a -> Sum a
Sum (IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall a b. (a -> b) -> a -> b
$ IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
c' IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Num a => a -> a -> a
* IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
x IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Int
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
e
where
c' :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
c' = Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Sum a -> a
getSum (Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (a -> b) -> a -> b
$ (Int
-> Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))))
-> P Int Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall m. Monoid m => (Int -> Rational -> m) -> P Int Rational -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms Int
-> Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall {b}.
Integral b =>
b
-> Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
fromCoefficient P Int Rational
c
fromCoefficient :: b
-> Rational
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
fromCoefficient b
e' Rational
c'' = IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall a. a -> Sum a
Sum (IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Sum
(IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
forall a b. (a -> b) -> a -> b
$ IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
c''' IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Num a => a -> a -> a
* (IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
u IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Num a => a -> a -> a
+ IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
i IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a. Num a => a -> a -> a
* IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
v) IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> b
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall a b. (Num a, Integral b) => a -> b -> a
^ b
e'
where
c''' :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
c''' = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (P Int Rational
-> IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Rational -> P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale Rational
c'' P Int Rational
1) IndexedPolynomialWith (P Int Rational)
1) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
1) IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
1
i :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
i = Int
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1
x :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
x = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1) IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
1
u :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
u = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Int -> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
1) IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
1
v :: IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
v = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (P Int Rational
-> IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational)
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale (Int -> P Int Rational
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1) IndexedPolynomialWith (P Int Rational)
1) IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
1) IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
1
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
sp, IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
sq) = (IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e -> c
coefficient IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
s' Int
0, IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
-> Int
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
forall (p :: * -> * -> *) e c. Polynomial p e c => p e c -> e -> c
coefficient IndexedPolynomialWith
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)))
s' Int
1)
reduceImaginary :: (Eq a, Num a) => Int -> a -> Sum (IndexedPolynomialWith a)
reduceImaginary :: forall a.
(Eq a, Num a) =>
Int -> a -> Sum (IndexedPolynomialWith a)
reduceImaginary Int
e a
c = IndexedPolynomialWith a -> Sum (IndexedPolynomialWith a)
forall a. a -> Sum a
Sum (IndexedPolynomialWith a -> Sum (IndexedPolynomialWith a))
-> IndexedPolynomialWith a -> Sum (IndexedPolynomialWith a)
forall a b. (a -> b) -> a -> b
$ case Int
e Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
4 of
Int
0 -> IndexedPolynomialWith a
c'
Int
1 -> IndexedPolynomialWith a
c' IndexedPolynomialWith a
-> IndexedPolynomialWith a -> IndexedPolynomialWith a
forall a. Num a => a -> a -> a
* IndexedPolynomialWith a
i
Int
2 -> IndexedPolynomialWith a
c' IndexedPolynomialWith a
-> IndexedPolynomialWith a -> IndexedPolynomialWith a
forall a. Num a => a -> a -> a
* (-IndexedPolynomialWith a
1)
Int
3 -> IndexedPolynomialWith a
c' IndexedPolynomialWith a
-> IndexedPolynomialWith a -> IndexedPolynomialWith a
forall a. Num a => a -> a -> a
* (-IndexedPolynomialWith a
i)
Int
_ -> IndexedPolynomialWith a
0
where
i :: IndexedPolynomialWith a
i = Int -> IndexedPolynomialWith a
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
1
c' :: IndexedPolynomialWith a
c' = a -> IndexedPolynomialWith a -> IndexedPolynomialWith a
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale a
c IndexedPolynomialWith a
1
complexLogTermToRealExpression ::
Text ->
(IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial) ->
Maybe Expression
complexLogTermToRealExpression :: Text
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Maybe Expression
complexLogTermToRealExpression Text
v (P Int Rational
r, IndexedPolynomialWith (P Int Rational)
s)
| (Just [(Rational, Rational)]
xys) <- IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational)
-> Maybe [(Rational, Rational)]
solveBivariatePolynomials IndexedPolynomialWith (P Int Rational)
p IndexedPolynomialWith (P Int Rational)
q,
(Just [Expression]
h) <- [(Rational, Rational)] -> Maybe [Expression]
f [(Rational, Rational)]
xys,
(Just [Rational]
zs) <- Maybe [Expression] -> Maybe [Rational]
toRationalList (P Int Rational -> Maybe [Expression]
solve P Int Rational
r) =
Expression -> Maybe Expression
forall a. a -> Maybe a
Just (Expression -> Maybe Expression) -> Expression -> Maybe Expression
forall a b. (a -> b) -> a -> b
$ [Expression] -> Expression
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Expression]
h Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
+ [Rational] -> Expression
forall {t :: * -> *}.
(Foldable t, Monad t) =>
t Rational -> Expression
g [Rational]
zs
| Bool
otherwise = Maybe Expression
forall a. Maybe a
Nothing
where
((IndexedPolynomialWith (P Int Rational)
p, IndexedPolynomialWith (P Int Rational)
q), (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
a, IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
b)) = (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> ((IndexedPolynomialWith (P Int Rational),
IndexedPolynomialWith (P Int Rational)),
(IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational)),
IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))))
complexLogTermToRealTerm (P Int Rational
r, IndexedPolynomialWith (P Int Rational)
s)
f :: [(Rational, Rational)] -> Maybe [Expression]
f :: [(Rational, Rational)] -> Maybe [Expression]
f [(Rational, Rational)]
xys = [Maybe Expression] -> Maybe [Expression]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence ([Maybe Expression] -> Maybe [Expression])
-> [Maybe Expression] -> Maybe [Expression]
forall a b. (a -> b) -> a -> b
$ do
(Rational
x, Rational
y) <- ((Rational, Rational) -> Bool)
-> [(Rational, Rational)] -> [(Rational, Rational)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> Rational
0) (Rational -> Bool)
-> ((Rational, Rational) -> Rational)
-> (Rational, Rational)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rational, Rational) -> Rational
forall a b. (a, b) -> b
snd) [(Rational, Rational)]
xys
let flatten'' :: IndexedPolynomialWith (P Int Rational) -> P Int Expression
flatten'' = (P Int Rational -> Expression)
-> IndexedPolynomialWith (P Int Rational) -> P Int Expression
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients (Expression
-> (Rational -> Expression) -> P Int Rational -> Expression
forall {p :: * -> * -> *} {a} {t}.
Polynomial p a t =>
Expression -> (t -> Expression) -> p a t -> Expression
toExpr (Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational Rational
y) Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational)
let flatten' :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> P Int Expression
flatten' = (IndexedPolynomialWith (P Int Rational) -> Expression)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> P Int Expression
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients (Expression
-> (Expression -> Expression) -> P Int Expression -> Expression
forall {p :: * -> * -> *} {a} {t}.
Polynomial p a t =>
Expression -> (t -> Expression) -> p a t -> Expression
toExpr (Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational Rational
x) Expression -> Expression
forall a. a -> a
id (P Int Expression -> Expression)
-> (IndexedPolynomialWith (P Int Rational) -> P Int Expression)
-> IndexedPolynomialWith (P Int Rational)
-> Expression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IndexedPolynomialWith (P Int Rational) -> P Int Expression
flatten'')
let flatten :: IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Expression
flatten = Expression
-> (Expression -> Expression) -> P Int Expression -> Expression
forall {p :: * -> * -> *} {a} {t}.
Polynomial p a t =>
Expression -> (t -> Expression) -> p a t -> Expression
toExpr (Text -> Expression
Symbol Text
v) Expression -> Expression
forall a. a -> a
id (P Int Expression -> Expression)
-> (IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> P Int Expression)
-> IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Expression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> P Int Expression
flatten'
let a' :: Expression
a' = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Expression
flatten IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
a
let b' :: Expression
b' = IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> Expression
flatten IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
b
Maybe Expression -> [Maybe Expression]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Expression -> [Maybe Expression])
-> Maybe Expression -> [Maybe Expression]
forall a b. (a -> b) -> a -> b
$ do
P Int Rational
a'' <- P Int Expression -> Maybe (P Int Rational)
convertCoefficients (P Int Expression -> Maybe (P Int Rational))
-> P Int Expression -> Maybe (P Int Rational)
forall a b. (a -> b) -> a -> b
$ IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> P Int Expression
flatten' IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
a
P Int Rational
b'' <- P Int Expression -> Maybe (P Int Rational)
convertCoefficients (P Int Expression -> Maybe (P Int Rational))
-> P Int Expression -> Maybe (P Int Rational)
forall a b. (a -> b) -> a -> b
$ IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
-> P Int Expression
flatten' IndexedPolynomialWith (IndexedPolynomialWith (P Int Rational))
b
Expression -> Maybe Expression
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression -> Maybe Expression) -> Expression -> Maybe Expression
forall a b. (a -> b) -> a -> b
$ Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational Rational
x Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression -> Expression
forall a. Floating a => a -> a
log (Expression
a' Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression
a' Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
+ Expression
b' Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression
b') Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
+ Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational Rational
y Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Text -> P Int Rational -> P Int Rational -> Expression
complexLogTermToAtan Text
v P Int Rational
a'' P Int Rational
b''
g :: t Rational -> Expression
g t Rational
zs = t Expression -> Expression
forall a. Num a => t a -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (t Expression -> Expression) -> t Expression -> Expression
forall a b. (a -> b) -> a -> b
$ do
Rational
z <- t Rational
zs
let s' :: P Int Expression
s' = (P Int Rational -> Expression)
-> IndexedPolynomialWith (P Int Rational) -> P Int Expression
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients (Expression
-> (Rational -> Expression) -> P Int Rational -> Expression
forall {p :: * -> * -> *} {a} {t}.
Polynomial p a t =>
Expression -> (t -> Expression) -> p a t -> Expression
toExpr (Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational Rational
z) Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational) IndexedPolynomialWith (P Int Rational)
s
Expression -> t Expression
forall a. a -> t a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression -> t Expression) -> Expression -> t Expression
forall a b. (a -> b) -> a -> b
$ Rational -> Expression
forall a. Fractional a => Rational -> a
fromRational Rational
z Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression -> Expression
Log' (Text
-> (Expression -> Expression) -> P Int Expression -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Expression -> Expression
toSymbolicCoefficient P Int Expression
s')
toRationalList :: Maybe [Expression] -> Maybe [Rational]
toRationalList :: Maybe [Expression] -> Maybe [Rational]
toRationalList Maybe [Expression]
Nothing = Maybe [Rational]
forall a. Maybe a
Nothing
toRationalList (Just []) = [Rational] -> Maybe [Rational]
forall a. a -> Maybe a
Just []
toRationalList (Just (Expression
x : [Expression]
xs))
| (Just Rational
x'') <- Expression -> Maybe Rational
forall {a}. Fractional a => Expression -> Maybe a
convert (Expression -> Expression
simplify Expression
x'), (Just [Rational]
xs'') <- Maybe [Rational]
xs' = [Rational] -> Maybe [Rational]
forall a. a -> Maybe a
Just ([Rational] -> Maybe [Rational]) -> [Rational] -> Maybe [Rational]
forall a b. (a -> b) -> a -> b
$ Rational
x'' Rational -> [Rational] -> [Rational]
forall a. a -> [a] -> [a]
: [Rational]
xs''
| Bool
otherwise = Maybe [Rational]
forall a. Maybe a
Nothing
where
x' :: Expression
x' = Expression -> Expression
simplify Expression
x
xs' :: Maybe [Rational]
xs' = Maybe [Expression] -> Maybe [Rational]
toRationalList (Maybe [Expression] -> Maybe [Rational])
-> Maybe [Expression] -> Maybe [Rational]
forall a b. (a -> b) -> a -> b
$ [Expression] -> Maybe [Expression]
forall a. a -> Maybe a
Just [Expression]
xs
convert :: Expression -> Maybe a
convert (Number Integer
n) = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ Integer -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n
convert (Number Integer
n :/: Number Integer
m) = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$ Integer -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n a -> a -> a
forall a. Fractional a => a -> a -> a
/ Integer -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
m
convert Expression
_ = Maybe a
forall a. Maybe a
Nothing
convertCoefficients :: IndexedPolynomialWith Expression -> Maybe IndexedPolynomial
convertCoefficients :: P Int Expression -> Maybe (P Int Rational)
convertCoefficients P Int Expression
x = [P Int Rational] -> P Int Rational
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([P Int Rational] -> P Int Rational)
-> ([(Int, Rational)] -> [P Int Rational])
-> [(Int, Rational)]
-> P Int Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, Rational) -> P Int Rational)
-> [(Int, Rational)] -> [P Int Rational]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
e, Rational
c) -> Rational -> P Int Rational -> P Int Rational
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
c -> p e c -> p e c
scale Rational
c (Int -> P Int Rational
forall (p :: * -> * -> *) e c. Polynomial p e c => e -> p e c
power Int
e)) ([(Int, Rational)] -> P Int Rational)
-> Maybe [(Int, Rational)] -> Maybe (P Int Rational)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Maybe (Int, Rational)] -> Maybe [(Int, Rational)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence ((Int -> Expression -> [Maybe (Int, Rational)])
-> P Int Expression -> [Maybe (Int, Rational)]
forall m.
Monoid m =>
(Int -> Expression -> m) -> P Int Expression -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms (\Int
e Expression
c -> [(Int
e,) (Rational -> (Int, Rational))
-> Maybe Rational -> Maybe (Int, Rational)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expression -> Maybe Rational
forall {a}. Fractional a => Expression -> Maybe a
convert (Expression -> Expression
simplify Expression
c)]) P Int Expression
x)
toExpr :: Expression -> (t -> Expression) -> p a t -> Expression
toExpr Expression
x t -> Expression
h p a t
u = Sum Expression -> Expression
forall a. Sum a -> a
getSum (Sum Expression -> Expression) -> Sum Expression -> Expression
forall a b. (a -> b) -> a -> b
$ (a -> t -> Sum Expression) -> p a t -> Sum Expression
forall m. Monoid m => (a -> t -> m) -> p a t -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms (\a
e'' t
c -> Expression -> Sum Expression
forall a. a -> Sum a
Sum (Expression -> Sum Expression) -> Expression -> Sum Expression
forall a b. (a -> b) -> a -> b
$ t -> Expression
h t
c Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* (Expression
x Expression -> Expression -> Expression
forall a. Floating a => a -> a -> a
** Integer -> Expression
Number (a -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
e''))) p a t
u
complexLogTermToComplexExpression ::
Text ->
(IndexedPolynomial, IndexedPolynomialWith IndexedPolynomial) ->
Maybe Expression
complexLogTermToComplexExpression :: Text
-> (P Int Rational, IndexedPolynomialWith (P Int Rational))
-> Maybe Expression
complexLogTermToComplexExpression Text
v (P Int Rational
q, IndexedPolynomialWith (P Int Rational)
s) = do
[Expression]
as <- P Int Rational -> Maybe [Expression]
complexSolve P Int Rational
q
let terms :: [Expression]
terms = do
Expression
a <- [Expression]
as
let s' :: P Int Expression
s' = (P Int Rational -> Expression)
-> IndexedPolynomialWith (P Int Rational) -> P Int Expression
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients (Expression -> P Int Rational -> Expression
forall {p :: * -> * -> *} {a} {a}.
(Polynomial p a Rational, Floating a) =>
a -> p a Rational -> a
collapse Expression
a) IndexedPolynomialWith (P Int Rational)
s
let s'' :: Expression
s'' = Text
-> (Expression -> Expression) -> P Int Expression -> Expression
forall (p :: * -> * -> *) e c.
Polynomial p e c =>
Text -> (c -> Expression) -> p e c -> Expression
toExpression Text
v Expression -> Expression
toSymbolicCoefficient P Int Expression
s'
Expression -> [Expression]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression -> [Expression]) -> Expression -> [Expression]
forall a b. (a -> b) -> a -> b
$ Expression
a Expression -> Expression -> Expression
forall a. Num a => a -> a -> a
* Expression -> Expression
forall a. Floating a => a -> a
log Expression
s''
Expression -> Maybe Expression
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expression -> Maybe Expression) -> Expression -> Maybe Expression
forall a b. (a -> b) -> a -> b
$ [Expression] -> Expression
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Expression]
terms
where
collapse :: a -> p a Rational -> a
collapse a
a p a Rational
c' = Sum a -> a
forall a. Sum a -> a
getSum (Sum a -> a) -> Sum a -> a
forall a b. (a -> b) -> a -> b
$ (a -> Rational -> Sum a) -> p a Rational -> Sum a
forall m. Monoid m => (a -> Rational -> m) -> p a Rational -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms (\a
e Rational
c -> a -> Sum a
forall a. a -> Sum a
Sum (a -> Sum a) -> a -> Sum a
forall a b. (a -> b) -> a -> b
$ Rational -> a
forall a. Fractional a => Rational -> a
fromRational Rational
c a -> a -> a
forall a. Num a => a -> a -> a
* a
a a -> a -> a
forall a. Floating a => a -> a -> a
** a -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
e) p a Rational
c'
solveBivariatePolynomials ::
IndexedPolynomialWith IndexedPolynomial ->
IndexedPolynomialWith IndexedPolynomial ->
Maybe [(Rational, Rational)]
solveBivariatePolynomials :: IndexedPolynomialWith (P Int Rational)
-> IndexedPolynomialWith (P Int Rational)
-> Maybe [(Rational, Rational)]
solveBivariatePolynomials IndexedPolynomialWith (P Int Rational)
p IndexedPolynomialWith (P Int Rational)
q = do
let p' :: P Int (Function (P Int Rational))
p' = IndexedPolynomialWith (P Int Rational)
-> P Int (Function (P Int Rational))
toRationalFunctionCoefficients IndexedPolynomialWith (P Int Rational)
p
let q' :: P Int (Function (P Int Rational))
q' = IndexedPolynomialWith (P Int Rational)
-> P Int (Function (P Int Rational))
toRationalFunctionCoefficients IndexedPolynomialWith (P Int Rational)
q
P Int Rational
resultant <- Function (P Int Rational) -> Maybe (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Fractional c) =>
Function (p e c) -> Maybe (p e c)
toPolynomial (Function (P Int Rational) -> Maybe (P Int Rational))
-> Function (P Int Rational) -> Maybe (P Int Rational)
forall a b. (a -> b) -> a -> b
$ (Function (P Int Rational), [P Int (Function (P Int Rational))])
-> Function (P Int Rational)
forall a b. (a, b) -> a
fst ((Function (P Int Rational), [P Int (Function (P Int Rational))])
-> Function (P Int Rational))
-> (Function (P Int Rational), [P Int (Function (P Int Rational))])
-> Function (P Int Rational)
forall a b. (a -> b) -> a -> b
$ P Int (Function (P Int Rational))
-> P Int (Function (P Int Rational))
-> (Function (P Int Rational), [P Int (Function (P Int Rational))])
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Eq (p e c), Num (p e c), Num e, Fractional c) =>
p e c -> p e c -> (c, [p e c])
subresultant P Int (Function (P Int Rational))
p' P Int (Function (P Int Rational))
q'
[Expression]
vs' <- P Int Rational -> Maybe [Expression]
solve P Int Rational
resultant
[Rational]
vs <- (Expression -> Maybe Rational) -> [Expression] -> Maybe [Rational]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Expression -> Maybe Rational
convert (Expression -> Maybe Rational)
-> (Expression -> Expression) -> Expression -> Maybe Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression -> Expression
simplify) [Expression]
vs'
[[(Rational, Rational)]] -> [(Rational, Rational)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(Rational, Rational)]] -> [(Rational, Rational)])
-> Maybe [[(Rational, Rational)]] -> Maybe [(Rational, Rational)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Rational -> Maybe [(Rational, Rational)])
-> [Rational] -> Maybe [[(Rational, Rational)]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Rational -> Maybe [(Rational, Rational)]
solveForU [Rational]
vs
where
toRationalFunctionCoefficients :: IndexedPolynomialWith (P Int Rational)
-> P Int (Function (P Int Rational))
toRationalFunctionCoefficients = (P Int Rational -> Function (P Int Rational))
-> IndexedPolynomialWith (P Int Rational)
-> P Int (Function (P Int Rational))
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients P Int Rational -> Function (P Int Rational)
forall (p :: * -> * -> *) e c.
(Polynomial p e c, Num (p e c)) =>
p e c -> Function (p e c)
fromPolynomial
solveForU :: Rational -> Maybe [(Rational, Rational)]
solveForU :: Rational -> Maybe [(Rational, Rational)]
solveForU Rational
v
| P Int Rational
0 <- P Int Rational
p' = do
[Maybe Rational]
u <- (Expression -> Maybe Rational) -> [Expression] -> [Maybe Rational]
forall a b. (a -> b) -> [a] -> [b]
map (Expression -> Maybe Rational
convert (Expression -> Maybe Rational)
-> (Expression -> Expression) -> Expression -> Maybe Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression -> Expression
simplify) ([Expression] -> [Maybe Rational])
-> Maybe [Expression] -> Maybe [Maybe Rational]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> P Int Rational -> Maybe [Expression]
solve P Int Rational
q'
(Rational -> (Rational, Rational))
-> [Rational] -> [(Rational, Rational)]
forall a b. (a -> b) -> [a] -> [b]
map (,Rational
v) ([Rational] -> [(Rational, Rational)])
-> Maybe [Rational] -> Maybe [(Rational, Rational)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Maybe Rational] -> Maybe [Rational]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [Maybe Rational]
u
| P Int Rational
0 <- P Int Rational
q' = do
[Maybe Rational]
u <- (Expression -> Maybe Rational) -> [Expression] -> [Maybe Rational]
forall a b. (a -> b) -> [a] -> [b]
map (Expression -> Maybe Rational
convert (Expression -> Maybe Rational)
-> (Expression -> Expression) -> Expression -> Maybe Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression -> Expression
simplify) ([Expression] -> [Maybe Rational])
-> Maybe [Expression] -> Maybe [Maybe Rational]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> P Int Rational -> Maybe [Expression]
solve P Int Rational
p'
(Rational -> (Rational, Rational))
-> [Rational] -> [(Rational, Rational)]
forall a b. (a -> b) -> [a] -> [b]
map (,Rational
v) ([Rational] -> [(Rational, Rational)])
-> Maybe [Rational] -> Maybe [(Rational, Rational)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Maybe Rational] -> Maybe [Rational]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [Maybe Rational]
u
| Bool
otherwise = do
[Maybe Rational]
up <- (Expression -> Maybe Rational) -> [Expression] -> [Maybe Rational]
forall a b. (a -> b) -> [a] -> [b]
map (Expression -> Maybe Rational
convert (Expression -> Maybe Rational)
-> (Expression -> Expression) -> Expression -> Maybe Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression -> Expression
simplify) ([Expression] -> [Maybe Rational])
-> Maybe [Expression] -> Maybe [Maybe Rational]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> P Int Rational -> Maybe [Expression]
solve P Int Rational
p'
[Maybe Rational]
uq <- (Expression -> Maybe Rational) -> [Expression] -> [Maybe Rational]
forall a b. (a -> b) -> [a] -> [b]
map (Expression -> Maybe Rational
convert (Expression -> Maybe Rational)
-> (Expression -> Expression) -> Expression -> Maybe Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expression -> Expression
simplify) ([Expression] -> [Maybe Rational])
-> Maybe [Expression] -> Maybe [Maybe Rational]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> P Int Rational -> Maybe [Expression]
solve P Int Rational
q'
[Rational]
up' <- [Maybe Rational] -> Maybe [Rational]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [Maybe Rational]
up
[Rational]
uq' <- [Maybe Rational] -> Maybe [Rational]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [Maybe Rational]
uq
[(Rational, Rational)] -> Maybe [(Rational, Rational)]
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Rational, Rational)] -> Maybe [(Rational, Rational)])
-> [(Rational, Rational)] -> Maybe [(Rational, Rational)]
forall a b. (a -> b) -> a -> b
$ (Rational -> (Rational, Rational))
-> [Rational] -> [(Rational, Rational)]
forall a b. (a -> b) -> [a] -> [b]
map (,Rational
v) ([Rational] -> [(Rational, Rational)])
-> [Rational] -> [(Rational, Rational)]
forall a b. (a -> b) -> a -> b
$ [Rational]
up' [Rational] -> [Rational] -> [Rational]
forall a. Eq a => [a] -> [a] -> [a]
`intersect` [Rational]
uq'
where
p' :: P Int Rational
p' = (P Int Rational -> Rational)
-> IndexedPolynomialWith (P Int Rational) -> P Int Rational
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients (Sum Rational -> Rational
forall a. Sum a -> a
getSum (Sum Rational -> Rational)
-> (P Int Rational -> Sum Rational) -> P Int Rational -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Rational -> Sum Rational) -> P Int Rational -> Sum Rational
forall m. Monoid m => (Int -> Rational -> m) -> P Int Rational -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms (\Int
e Rational
c -> Rational -> Sum Rational
forall a. a -> Sum a
Sum (Rational -> Sum Rational) -> Rational -> Sum Rational
forall a b. (a -> b) -> a -> b
$ Rational
c Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
v Rational -> Int -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
e)) IndexedPolynomialWith (P Int Rational)
p
q' :: P Int Rational
q' = (P Int Rational -> Rational)
-> IndexedPolynomialWith (P Int Rational) -> P Int Rational
forall (p :: * -> * -> *) e c c'.
(Polynomial p e c, Polynomial p e c', Num (p e c), Num (p e c')) =>
(c -> c') -> p e c -> p e c'
mapCoefficients (Sum Rational -> Rational
forall a. Sum a -> a
getSum (Sum Rational -> Rational)
-> (P Int Rational -> Sum Rational) -> P Int Rational -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Rational -> Sum Rational) -> P Int Rational -> Sum Rational
forall m. Monoid m => (Int -> Rational -> m) -> P Int Rational -> m
forall (p :: * -> * -> *) e c m.
(Polynomial p e c, Monoid m) =>
(e -> c -> m) -> p e c -> m
foldTerms (\Int
e Rational
c -> Rational -> Sum Rational
forall a. a -> Sum a
Sum (Rational -> Sum Rational) -> Rational -> Sum Rational
forall a b. (a -> b) -> a -> b
$ Rational
c Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
v Rational -> Int -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
e)) IndexedPolynomialWith (P Int Rational)
q
convert :: Expression -> Maybe Rational
convert :: Expression -> Maybe Rational
convert (Number Integer
n) = Rational -> Maybe Rational
forall a. a -> Maybe a
Just (Rational -> Maybe Rational) -> Rational -> Maybe Rational
forall a b. (a -> b) -> a -> b
$ Integer -> Rational
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n
convert (Number Integer
n :/: Number Integer
m) = Rational -> Maybe Rational
forall a. a -> Maybe a
Just (Rational -> Maybe Rational) -> Rational -> Maybe Rational
forall a b. (a -> b) -> a -> b
$ Integer -> Rational
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Integer -> Rational
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
m
convert Expression
_ = Maybe Rational
forall a. Maybe a
Nothing