{-# LANGUAGE RebindableSyntax #-}
module Data.YAP.Algebra (
AdditiveMonoid(..),
atimesIdempotent, timesCancelling,
AbelianGroup(..),
subtract,
gtimesIdempotent,
Semiring(..),
Ring(..),
StandardAssociate(..),
Euclidean(..),
gcd, lcm, bezout, extendedEuclid,
DivisionSemiring(..),
Semifield(..),
DivisionRing,
Field,
FromRational(..),
ToRational(..), ToInteger(..),
Differentiable(..), Integrable(..),
AdditiveFunctor(..),
) where
import Data.YAP.Algebra.Internal
import Prelude.YAP
atimesIdempotent :: (ToInteger b, AdditiveMonoid a) => b -> a -> a
atimesIdempotent :: forall b a. (ToInteger b, AdditiveMonoid a) => b -> a -> a
atimesIdempotent b
n a
x
| b
n b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== b
forall a. AdditiveMonoid a => a
zero = a
forall a. AdditiveMonoid a => a
zero
| Bool
otherwise = a
x
gtimesIdempotent :: (ToInteger b, AbelianGroup a) => b -> a -> a
gtimesIdempotent :: forall b a. (ToInteger b, AbelianGroup a) => b -> a -> a
gtimesIdempotent b
n a
x = case b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare b
n b
forall a. AdditiveMonoid a => a
zero of
Ordering
LT -> a -> a
forall a. AbelianGroup a => a -> a
negate a
x
Ordering
EQ -> a
forall a. AdditiveMonoid a => a
zero
Ordering
GT -> a
x
timesCancelling :: (ToInteger a, AdditiveMonoid b) => a -> b -> b
timesCancelling :: forall b a. (ToInteger b, AdditiveMonoid a) => b -> a -> a
timesCancelling a
n b
x
| a -> Bool
forall a. ToInteger a => a -> Bool
odd a
n = b
x
| Bool
otherwise = b
forall a. AdditiveMonoid a => a
zero
bezout :: (Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> (a, a)
bezout :: forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> (a, a)
bezout a
x a
y
| a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
forall a. AdditiveMonoid a => a
zero = (a -> a
forall a. StandardAssociate a => a -> a
stdRecip a
x, a
forall a. AdditiveMonoid a => a
zero)
| Bool
otherwise = case a -> a -> (a, a)
forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> (a, a)
bezout a
y a
r of (a
a, a
b) -> (a
b, a
a a -> a -> a
forall a. AbelianGroup a => a -> a -> a
- a
ba -> a -> a
forall a. Semiring a => a -> a -> a
*a
q)
where
(a
q, a
r) = a -> a -> (a, a)
forall a. Euclidean a => a -> a -> (a, a)
divMod a
x a
y
extendedEuclid :: (Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> [(a, a, a, a)]
extendedEuclid :: forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> [(a, a, a, a)]
extendedEuclid a
a a
b = a -> a -> a -> a -> a -> a -> [(a, a, a, a)]
forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> a -> a -> a -> a -> [(a, a, a, a)]
extendedEuclidAux a
a a
b a
forall a. Semiring a => a
one a
forall a. AdditiveMonoid a => a
zero a
forall a. AdditiveMonoid a => a
zero a
forall a. Semiring a => a
one
extendedEuclidAux ::
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> a -> a -> a -> a -> [(a, a, a, a)]
extendedEuclidAux :: forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> a -> a -> a -> a -> [(a, a, a, a)]
extendedEuclidAux a
r_prev a
r a
s_prev a
s a
t_prev a
t =
(a
q, a
r, a
s, a
t) (a, a, a, a) -> [(a, a, a, a)] -> [(a, a, a, a)]
forall a. a -> [a] -> [a]
: if a
r_next a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
forall a. AdditiveMonoid a => a
zero then [] else
a -> a -> a -> a -> a -> a -> [(a, a, a, a)]
forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> a -> a -> a -> a -> [(a, a, a, a)]
extendedEuclidAux a
r a
r_next a
s a
s_next a
t a
t_next
where
(a
q, a
r_next) = a -> a -> (a, a)
forall a. Euclidean a => a -> a -> (a, a)
divMod a
r_prev a
r
s_next :: a
s_next = a
s_prev a -> a -> a
forall a. AbelianGroup a => a -> a -> a
- a
qa -> a -> a
forall a. Semiring a => a -> a -> a
*a
s
t_next :: a
t_next = a
t_prev a -> a -> a
forall a. AbelianGroup a => a -> a -> a
- a
qa -> a -> a
forall a. Semiring a => a -> a -> a
*a
t
class (Semiring a) => Differentiable a where
derivative :: a -> a
class (Differentiable a) => Integrable a where
integral :: a -> a
class AdditiveFunctor f where
mapAdditive :: (AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b