This page discusses methods to implement the inner products and Clifford products for the more general non-orthogonal basis.

To do this we need a bilinear form in addition to the operands to the multiplications. The bilinear form can be supplied as an n×n square matrix where 'n' is the dimension of the underlining vector space. If the matrix is diagonal (i.e. non-diagonal terms are zero) then the results will be the same as the simpler orthogonal case explained on this page. Since that method is more efficient I suggest using that where the basis vectors are known to be orthogonal.

## Inner Product using Poincaré Duality

There are many types of inner product including regressive inner product, the left and right contraction inner products, meet and so on.

When we are dealing with pure vectors (grade 1 multivectors) then these coincide and are easily implemented as a bilinear product, but for other grades, the results of these inner products diverge.

There are different strategies for implementing the higher grade inner products. It would be good to implement the regressive product directly because it has better algebraic properties, it is associative and it has Poincaré duality with the exterior product. So in theory we could implement the regressive inner product using:

A \/ B = (A* /\ B*)*

I think the problem here is that the Poincaré duality involves Clifford multiplication with the pseudoscalar.

A* = A ° I

but to implement Clifford multiplication we need the regressive product so we have a circular requirements dependency. To break out of this we need a way to multiply with the pseudoscalar without the full multiplication. I am not sure how to do this?

Let W be a fixed volume form, i.e. W=e1/\../\en for the generators {ei}_{i=1}^n of V A* = a(l+1)/\.../\an, such that A/\A*=c W with c in k The meet can now be computed in the dual algebra by using the wedge there ! A=a/\x, B=x/\c, W = a/\b/\c |

## Left and Right Contraction Inner Product

The alternative is to work out the left contraction and use this to calculate the other products

lc (and rc) can be computed recursively (on the basis and then linearly extended)

- lc(1,1)=1
- lc(ei,ej) = B[i,j]
- lc(ei,ej/\../\ek) = sum_r =1^N (-1)^(r-1) B[i,r] * ej/\../\^er/\../\ek

- lc(ei/\.../\ej, u) = lc(ei,lc(...,lc(ej,u)...))

where:

- ^er means that this term is missing, and ej .. ek are N basis vectors.
- B means bilinear form

Let x,y,z.. in V and u,v,w,.. in /\V i) x _| y = B(x,y) We are almost there... :-) We can now define (extend) the bilinear form on all Grassmann elements as follows: < | > : /\V x /\V --> k :: (A,B) |--> <A | B > = constant term of(=[1](..) ) (a1/\../\al) _| (b1/\../\bl) Example: This map generalizes the duality V --> V* to /\V --> /\V* ~= (/\V)* |

### Code

Here is SPAD code for left and right inner products: