\begin{code}
module Numeric.Clifford.LinearOperators where
import NumericPrelude
import Numeric.Clifford.Multivector
import Algebra.Algebraic
import Algebra.Transcendental
import GHC.TypeLits
\end{code}
What is a linear operator? Just a Vector -> Vector!
\begin{code}
type LinearOperator p q f = Multivector p q f -> Multivector p q f
type LinearOperatorCreator p q f = (Algebra.Algebraic.C f, Ord f, SingI p, SingI q) => Multivector p q f -> LinearOperator p q f
reflect u x = (u)*x*recip u
makeReflectionOperator ::LinearOperatorCreator p q f
makeReflectionOperator u = reflect u
rotate spinor x = (reverseMultivector spinor) * x * spinor
rotatePlaneAngle plane angle = rotate (exp (((fst.normalised) plane) * (angle/2)))
makeRotationOperator :: LinearOperatorCreator p q f
makeRotationOperator u = rotate u
project u x = inverse u * (u `dot` x)
makeProjectionOperator :: LinearOperatorCreator p q f
makeProjectionOperator u = project u
\end{code}