{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, TypeSynonymInstances, NoMonomorphismRestriction #-}
module Math.Algebras.Quaternions where
import Prelude hiding ( (*>) )
import Math.Core.Field
import Math.Algebras.VectorSpace
import Math.Algebras.TensorProduct
import Math.Algebras.Structures
data HBasis = One | I | J | K deriving (HBasis -> HBasis -> Bool
(HBasis -> HBasis -> Bool)
-> (HBasis -> HBasis -> Bool) -> Eq HBasis
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HBasis -> HBasis -> Bool
$c/= :: HBasis -> HBasis -> Bool
== :: HBasis -> HBasis -> Bool
$c== :: HBasis -> HBasis -> Bool
Eq,Eq HBasis
Eq HBasis =>
(HBasis -> HBasis -> Ordering)
-> (HBasis -> HBasis -> Bool)
-> (HBasis -> HBasis -> Bool)
-> (HBasis -> HBasis -> Bool)
-> (HBasis -> HBasis -> Bool)
-> (HBasis -> HBasis -> HBasis)
-> (HBasis -> HBasis -> HBasis)
-> Ord HBasis
HBasis -> HBasis -> Bool
HBasis -> HBasis -> Ordering
HBasis -> HBasis -> HBasis
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
min :: HBasis -> HBasis -> HBasis
$cmin :: HBasis -> HBasis -> HBasis
max :: HBasis -> HBasis -> HBasis
$cmax :: HBasis -> HBasis -> HBasis
>= :: HBasis -> HBasis -> Bool
$c>= :: HBasis -> HBasis -> Bool
> :: HBasis -> HBasis -> Bool
$c> :: HBasis -> HBasis -> Bool
<= :: HBasis -> HBasis -> Bool
$c<= :: HBasis -> HBasis -> Bool
< :: HBasis -> HBasis -> Bool
$c< :: HBasis -> HBasis -> Bool
compare :: HBasis -> HBasis -> Ordering
$ccompare :: HBasis -> HBasis -> Ordering
$cp1Ord :: Eq HBasis
Ord)
type Quaternion k = Vect k HBasis
instance Show HBasis where
show :: HBasis -> String
show One = "1"
show I = "i"
show J = "j"
show K = "k"
instance (Eq k, Num k) => Algebra k HBasis where
unit :: k -> Vect k HBasis
unit x :: k
x = k
x k -> Vect k HBasis -> Vect k HBasis
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
One
mult :: Vect k (Tensor HBasis HBasis) -> Vect k HBasis
mult = (Tensor HBasis HBasis -> Vect k HBasis)
-> Vect k (Tensor HBasis HBasis) -> Vect k HBasis
forall k b a.
(Eq k, Num k, Ord b) =>
(a -> Vect k b) -> Vect k a -> Vect k b
linear Tensor HBasis HBasis -> Vect k HBasis
forall k. (Num k, Eq k) => Tensor HBasis HBasis -> Vect k HBasis
mult'
where mult' :: Tensor HBasis HBasis -> Vect k HBasis
mult' (One,b :: HBasis
b) = HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
b
mult' (b :: HBasis
b,One) = HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
b
mult' (I,I) = k -> Vect k HBasis
forall k b. Algebra k b => k -> Vect k b
unit (-1)
mult' (J,J) = k -> Vect k HBasis
forall k b. Algebra k b => k -> Vect k b
unit (-1)
mult' (K,K) = k -> Vect k HBasis
forall k b. Algebra k b => k -> Vect k b
unit (-1)
mult' (I,J) = HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
K
mult' (J,I) = -1 k -> Vect k HBasis -> Vect k HBasis
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
K
mult' (J,K) = HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
I
mult' (K,J) = -1 k -> Vect k HBasis -> Vect k HBasis
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
I
mult' (K,I) = HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
J
mult' (I,K) = -1 k -> Vect k HBasis -> Vect k HBasis
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
J
i,j,k :: Num k => Quaternion k
i :: Quaternion k
i = HBasis -> Quaternion k
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
I
j :: Quaternion k
j = HBasis -> Quaternion k
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
J
k :: Quaternion k
k = HBasis -> Quaternion k
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
K
class Algebra k a => HasConjugation k a where
conj :: Vect k a -> Vect k a
sqnorm :: Vect k a -> k
instance (Eq k, Fractional k, Ord a, Show a, HasConjugation k a) => Fractional (Vect k a) where
recip :: Vect k a -> Vect k a
recip 0 = String -> Vect k a
forall a. HasCallStack => String -> a
error "recip 0"
recip x :: Vect k a
x = (1 k -> k -> k
forall a. Fractional a => a -> a -> a
/ Vect k a -> k
forall k a. HasConjugation k a => Vect k a -> k
sqnorm Vect k a
x) k -> Vect k a -> Vect k a
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> Vect k a -> Vect k a
forall k a. HasConjugation k a => Vect k a -> Vect k a
conj Vect k a
x
fromRational :: Rational -> Vect k a
fromRational q :: Rational
q = Rational -> k
forall a. Fractional a => Rational -> a
fromRational Rational
q k -> Vect k a -> Vect k a
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> 1
scalarPart :: (Num k) => Quaternion k -> k
scalarPart :: Quaternion k -> k
scalarPart = HBasis -> Quaternion k -> k
forall k b. (Num k, Eq b) => b -> Vect k b -> k
coeff HBasis
One
vectorPart :: (Eq k, Num k) => Quaternion k -> Quaternion k
vectorPart :: Quaternion k -> Quaternion k
vectorPart q :: Quaternion k
q = Quaternion k
q Quaternion k -> Quaternion k -> Quaternion k
forall a. Num a => a -> a -> a
- Quaternion k -> k
forall k. Num k => Quaternion k -> k
scalarPart Quaternion k
q k -> Quaternion k -> Quaternion k
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> 1
instance (Eq k, Num k) => HasConjugation k HBasis where
conj :: Vect k HBasis -> Vect k HBasis
conj = (Vect k HBasis -> (HBasis -> Vect k HBasis) -> Vect k HBasis
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HBasis -> Vect k HBasis
forall k. (Num k, Eq k) => HBasis -> Vect k HBasis
conj') where
conj' :: HBasis -> Vect k HBasis
conj' One = HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
One
conj' imag :: HBasis
imag = -1 k -> Vect k HBasis -> Vect k HBasis
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> HBasis -> Vect k HBasis
forall (m :: * -> *) a. Monad m => a -> m a
return HBasis
imag
sqnorm :: Vect k HBasis -> k
sqnorm x :: Vect k HBasis
x = [k] -> k
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([k] -> k) -> [k] -> k
forall a b. (a -> b) -> a -> b
$ ((HBasis, k) -> k) -> [(HBasis, k)] -> [k]
forall a b. (a -> b) -> [a] -> [b]
map ((k -> Integer -> k
forall a b. (Num a, Integral b) => a -> b -> a
^2) (k -> k) -> ((HBasis, k) -> k) -> (HBasis, k) -> k
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (HBasis, k) -> k
forall a b. (a, b) -> b
snd) ([(HBasis, k)] -> [k]) -> [(HBasis, k)] -> [k]
forall a b. (a -> b) -> a -> b
$ Vect k HBasis -> [(HBasis, k)]
forall k b. Vect k b -> [(b, k)]
terms Vect k HBasis
x
x :: Vect k HBasis
x <.> :: Vect k HBasis -> Vect k HBasis -> k
<.> y :: Vect k HBasis
y = Vect k HBasis -> k
forall k. Num k => Quaternion k -> k
scalarPart (Vect k HBasis -> Vect k HBasis
forall k a. HasConjugation k a => Vect k a -> Vect k a
conj Vect k HBasis
x Vect k HBasis -> Vect k HBasis -> Vect k HBasis
forall a. Num a => a -> a -> a
* Vect k HBasis
y)
x :: a
x^- :: a -> a -> a
^-1 = a -> a
forall a. Fractional a => a -> a
recip a
x
refl :: Vect k a -> Vect k a -> Vect k a
refl q :: Vect k a
q = \x :: Vect k a
x -> -Vect k a
q Vect k a -> Vect k a -> Vect k a
forall a. Num a => a -> a -> a
* Vect k a -> Vect k a
forall k a. HasConjugation k a => Vect k a -> Vect k a
conj Vect k a
x Vect k a -> Vect k a -> Vect k a
forall a. Num a => a -> a -> a
* Vect k a
q
asMatrix :: (Vect a HBasis -> Vect a HBasis) -> [Vect a HBasis] -> [[a]]
asMatrix f :: Vect a HBasis -> Vect a HBasis
f bs :: [Vect a HBasis]
bs = [ let fi :: Vect a HBasis
fi = Vect a HBasis -> Vect a HBasis
f Vect a HBasis
ei in [Vect a HBasis
ej Vect a HBasis -> Vect a HBasis -> a
forall k. (Num k, Eq k) => Vect k HBasis -> Vect k HBasis -> k
<.> Vect a HBasis
fi | Vect a HBasis
ej <- [Vect a HBasis]
bs] | Vect a HBasis
ei <- [Vect a HBasis]
bs ]
reprSO3' :: a -> a -> a
reprSO3' q :: a
q = \x :: a
x -> a
qa -> Integer -> a
forall a a. (Eq a, Fractional a, Num a) => a -> a -> a
^-1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
q
reprSO3 :: (Eq k, Fractional k) => Quaternion k -> [[k]]
reprSO3 :: Quaternion k -> [[k]]
reprSO3 q :: Quaternion k
q = Quaternion k -> Quaternion k -> Quaternion k
forall a. Fractional a => a -> a -> a
reprSO3' Quaternion k
q (Quaternion k -> Quaternion k) -> [Quaternion k] -> [[k]]
forall a.
(Num a, Eq a) =>
(Vect a HBasis -> Vect a HBasis) -> [Vect a HBasis] -> [[a]]
`asMatrix` [Quaternion k
forall k. Num k => Quaternion k
i,Quaternion k
forall k. Num k => Quaternion k
j,Quaternion k
forall k. Num k => Quaternion k
k]
reprSO4' :: (a, a) -> a -> a
reprSO4' (l :: a
l,r :: a
r) = \x :: a
x -> a
la -> Integer -> a
forall a a. (Eq a, Fractional a, Num a) => a -> a -> a
^-1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
r
reprSO4 :: (Eq k, Fractional k) => (Quaternion k, Quaternion k) -> [[k]]
reprSO4 :: (Quaternion k, Quaternion k) -> [[k]]
reprSO4 (l :: Quaternion k
l,r :: Quaternion k
r) = (Quaternion k, Quaternion k) -> Quaternion k -> Quaternion k
forall a. Fractional a => (a, a) -> a -> a
reprSO4' (Quaternion k
l,Quaternion k
r) (Quaternion k -> Quaternion k) -> [Quaternion k] -> [[k]]
forall a.
(Num a, Eq a) =>
(Vect a HBasis -> Vect a HBasis) -> [Vect a HBasis] -> [[a]]
`asMatrix` [1,Quaternion k
forall k. Num k => Quaternion k
i,Quaternion k
forall k. Num k => Quaternion k
j,Quaternion k
forall k. Num k => Quaternion k
k]
reprSO4d :: Vect k (DSum HBasis HBasis) -> [[k]]
reprSO4d lr :: Vect k (DSum HBasis HBasis)
lr = (Quaternion k, Quaternion k) -> [[k]]
forall k.
(Eq k, Fractional k) =>
(Quaternion k, Quaternion k) -> [[k]]
reprSO4 (Vect k (DSum HBasis HBasis) -> Quaternion k
forall k a b. (Eq k, Num k, Ord a) => Vect k (DSum a b) -> Vect k a
p1 Vect k (DSum HBasis HBasis)
lr, Vect k (DSum HBasis HBasis) -> Quaternion k
forall k b a. (Eq k, Num k, Ord b) => Vect k (DSum a b) -> Vect k b
p2 Vect k (DSum HBasis HBasis)
lr)
one',i',j',k' :: Num k => Vect k (Dual HBasis)
one' :: Vect k (Dual HBasis)
one' = Dual HBasis -> Vect k (Dual HBasis)
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One)
i' :: Vect k (Dual HBasis)
i' = Dual HBasis -> Vect k (Dual HBasis)
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I)
j' :: Vect k (Dual HBasis)
j' = Dual HBasis -> Vect k (Dual HBasis)
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J)
k' :: Vect k (Dual HBasis)
k' = Dual HBasis -> Vect k (Dual HBasis)
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K)
instance (Eq k, Num k) => Coalgebra k (Dual HBasis) where
counit :: Vect k (Dual HBasis) -> k
counit = Vect k () -> k
forall k. Num k => Vect k () -> k
unwrap (Vect k () -> k)
-> (Vect k (Dual HBasis) -> Vect k ()) -> Vect k (Dual HBasis) -> k
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Dual HBasis -> Vect k ()) -> Vect k (Dual HBasis) -> Vect k ()
forall k b a.
(Eq k, Num k, Ord b) =>
(a -> Vect k b) -> Vect k a -> Vect k b
linear Dual HBasis -> Vect k ()
forall k. Num k => Dual HBasis -> Vect k ()
counit'
where counit' :: Dual HBasis -> Vect k ()
counit' (Dual One) = () -> Vect k ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
counit' _ = Vect k ()
forall k b. Vect k b
zerov
comult :: Vect k (Dual HBasis) -> Vect k (Tensor (Dual HBasis) (Dual HBasis))
comult = (Dual HBasis -> Vect k (Tensor (Dual HBasis) (Dual HBasis)))
-> Vect k (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b a.
(Eq k, Num k, Ord b) =>
(a -> Vect k b) -> Vect k a -> Vect k b
linear Dual HBasis -> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k.
(Eq k, Num k) =>
Dual HBasis -> Vect k (Tensor (Dual HBasis) (Dual HBasis))
comult'
where comult' :: Dual HBasis -> Vect k (Tensor (Dual HBasis) (Dual HBasis))
comult' (Dual One) = Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+>
(-1) k
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> ( Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K) )
comult' (Dual I) = Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+>
Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> (-1) k
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J)
comult' (Dual J) = Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+>
Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> (-1) k
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K)
comult' (Dual K) = Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
K, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
One) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+>
Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J) Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b.
(Eq k, Num k, Ord b) =>
Vect k b -> Vect k b -> Vect k b
<+> (-1) k
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall k b. (Eq k, Num k) => k -> Vect k b -> Vect k b
*> Tensor (Dual HBasis) (Dual HBasis)
-> Vect k (Tensor (Dual HBasis) (Dual HBasis))
forall (m :: * -> *) a. Monad m => a -> m a
return (HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
J, HBasis -> Dual HBasis
forall b. b -> Dual b
Dual HBasis
I)