\begin{code} {-# LANGUAGE NoImplicitPrelude, RankNTypes #-} 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}