Function: Cliff5[cmul] - Clifford product in the Clifford algebra Cl(B) and its infix form '&c'

Calling Sequence:

cmul(p1,p2,...pn);
cmul[K](p1,p2,...pn);

p1 &c p2 &c ... &c pn;
&c[K](p1,p2,...,pn);
&c[''K''](p1,p2,...pn) (when K is assigned a matrix)

Parameters:

p1, p2, ..., pn - expressions of the type 'cliscalar' or 'clipolynom'
K - (optional) index of type name, symbol, matrix, or array, or `&*`(numeric,{name,symbol,array,matrix})

Description:

Procedure 'cmul' and its infix form '&c' give the Clifford multiplication in the Clifford algebra of an arbitrary bilinear form B when no optional index is specified. If index K is specified, then computations takes place in Cl(K). For example, it is often desirable to compute Clifford product in Cl(g) where g is the symmetric part of B.

The bilinear form B is totally arbitrary: symbolic, undefined, symmetric, diagonal, with or without an antisymmetric part, numeric.

Procedure 'cmul' works in all dimensions 1 through 9. When the bilinear form is diagonal, use 'cmulQ' which gives Clifford multiplication in orthogonal Clifford algebras. See cmulQ for more help.

Via the procedure 'rmulm', this multiplication can also be applied to matrices with entries in the Clifford algebra Cl(B). See rmulm for more help. Clifford multiplication 'cmul' can be based on the recursive use of the following formula:

xu = cmul(x,u) = x &c u = wedge(x, u) + LC(x, u) = x &w u + LC(x, u)

or on the Rota-Stein cliffordization technique. In the first case, 'cmul' internally uses procedure
cmulNUM while in the second case it uses cmulRS . Selection which product is used can be made by the user using procedure useproduct . The default is 'cmulRS'. See also cmulgen which is the generic name for the Clifford product used by CLIFFORD. To find out which product is currently use, execute procedure CLIFFORD_ENV which displays all values of environmental variables used by CLIFFORD, or, see the value currently assigned to the global variable _default_Clifford_product.

In the above, x is a 1-vector and u is any element in the algebra Cl(Q), wedge(x,u) = x &w u denotes the wedge or exterior product between x and u, and LCQ(x, u) denotes the left contraction of u by x. See wedge and LCQ for more help.

Through this formula, the Clifford algebra Cl(B) becomes a subalgebra of an algebra of endomorphisms of an exterior algebra over V.

Clifford inverse in Cl(B) is computed with cinv . In general, Clifford inverse of p in Cl(K) is computed with cinv(p,K) .

To speed up computations, set the global variable _prolevel to 'true'. To find out more, see help page on cliparse and `type/clipolynom` .

See also procedure cmulB in the package 'GTP' for the Clifford product in the Clifford algebra Cl(B). The difference between 'cmul' and 'cmulB' is that 'cmul' uses one bilinear form B which is globally defined. On the other hand, 'cmulB' needs some bilinear form B to be specified as one of its inputs. This allows one to use 'cmulB' with different bilinear forms B in the same worksheet.

Upon loading of a supplementary package 'Cli5plus', this procedure can then apply Clifford product to polynomials containing unevaluated Clifford products, that is, expressions of `type/cliprod` like `&C`(e1,e3,e4), or `&C`[K](e1,e2), etc.

In the ampresand version &c of 'cmul', when index K has been assigned a matrix, one must use double quotes as in &c[''K'']( p1,p2,...,pn) to stop premature evaluation of K to a matrix by Maple. Enclosing K in the double quotes is not needed in 'cmul'.

To see how to define a new "Clifford product", go to cmul_user_defined for some help.

Examples:

> restart:with(Cliff5):eval(makealiases(6,'ordered')):
s:=time():

> _prolevel; #default value is 'false'
_default_Clifford_product;

[Maple Math]

[Maple Math]

>

Example 1: Let's see simple computations involving Clifford product and a symbolic, unassigned bilinear form B:

> assigned(B);

[Maple Math]

> cmul(3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

One can also enter B explicitly. In place of `B`, one can use name of another form, or a numeric multiple of a name:

> 'cmul[B](ei,ej,ek)'=cmul[B](ei,ej,ek);
'&c[B](ei,ej,ek)'=&c[B](ei,ej,ek);
'cmul[K](ei,ej,ek)'=cmul[K](ei,ej,ek);
'&c[K](ei,ej,ek)'=&c[K](ei,ej,ek);
'cmul[g](ei,ej,ek)'=cmul[g](ei,ej,ek);
'&c[g](ei,ej,ek)'=&c[g](ei,ej,ek);
'cmul[-B](ei,ej,ek)'=cmul[-B](ei,ej,ek);
'&c[-B](ei,ej,ek)'=&c[-B](ei,ej,ek);
'cmul[-K](ei,ej,ek)'=cmul[-K](ei,ej,ek);
'&c[-K](ei,ej,ek)'=&c[-K](ei,ej,ek);
'cmul[-g](ei,ej,ek)'=cmul[-g](ei,ej,ek);
'&c[-g](ei,ej,ek)'=&c[-g](ei,ej,ek);

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

> e1 &c e2 &c e3; e1 &cQ e1 &cQ e3; #the infix forms of 'cmul' and 'cmulQ'
&c(e1,e2,e3); &cQ(e1,e1,e3); #the infix forms of 'cmul' and 'cmulQ'
&c[K](e1,e2,e3); &cQ[K](e1,e1,e3); #the infix forms of 'cmul' and 'cmulQ'
&c[-K](e1,e2,e3); &cQ[-K](e1,e1,e3); #the infix forms of 'cmul' and 'cmulQ'

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

> (4+e1) &c (eiwej+4*alpha*Pi*Id);

[Maple Math]

> cmul(ei,ej)+cmul(ej,ei);clicollect(%); #equals 0 when B[i,j]=-B[j,i]

[Maple Math]

[Maple Math]

> clicollect(e1 &c e2 + e2 &c e1); #equals 0 when B[1,2]=-B[2,1]

[Maple Math]

> clicollect(e1 &cQ e2 + e2 &cQ e1); #equals 0

[Maple Math]

> e1 &c e1, e1 &c e2, e1 &cQ e1, e1 &cQ e2;

[Maple Math]

>

Example 2: Now, the same computations as in Example 1 above but performed with an arbitrary symbolic form g of `type/name` used as an index. For example, g could be the symmetric part of B.

> type(g,name);

[Maple Math]

> cmul[g](3*Pi*e2we1,e4+3*e5,e6,2*e4); # long notation using 'cmul'

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> &c[-g](3*Pi*e2we1,e4+3*e5,e6,2*e4); # short notation using &c

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> (4+e1) &c (eiwej+4*alpha*Pi*Id);

[Maple Math]

> cmul[B](ei,ej)+cmul[B](ej,ei);clicollect(%); #equals 0 when B[i,j]=-B[j,i]
cmul[-B](ei,ej)+cmul[-B](ej,ei);clicollect(%); #equals 0 when B[i,j]=-B[j,i]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

> clicollect(e1 &c e2 + e2 &c e1); #equals 0 when B[1,2]=-B[2,1]
clicollect(&c[B](e1,e2) + &c[B](e2,e1)); #equals 0 when B[1,2]=-B[2,1]

[Maple Math]

[Maple Math]

> clicollect(e1 &cQ e2 + e2 &cQ e1); #equals 0

[Maple Math]

> e1 &c e1, e1 &c e2, e1 &cQ e1, e1 &cQ e2;

[Maple Math]

>

Example 3: Same computations as in Example 3 except that we assign a matrix to B.

> B:=linalg[diag](1$6);

[Maple Math]

> cmul(3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);
cmul[B](3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);

[Maple Math]

[Maple Math]

Since B has been assigned a matrix, we must use double quotes around the index in `&c` to prevent premature evaluation of the index by Maple as shown below:

> &c[B](3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);

Warning, enclose index in double quotes as in &c[''B''] or &c[''-B''] when B has been assigned a matrix to avoid the following:

[Maple Math]

> &c['B'](3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);

Warning, enclose index in double quotes as in &c[''B''] or &c[''-B''] when B has been assigned a matrix to avoid the following:

[Maple Math]

> &c[''B''](3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);

[Maple Math]

>

Example 4: Let's see how to multiply basis monomials in Cl(3):

> clibasis:=cbasis(3);B:=linalg[diag](1,1,1):

[Maple Math]

> M:=matrix(8,8,(i,j)->cmul(clibasis[i],clibasis[j])):

> evalm(M);

[Maple Math]

> time()-s;

[Maple Math]

>

Thus, the above is the multiplication table for the basis monomials in Cl(3).

See Also: Cliff5[cmulQ] , Cliff5[rmulm] , Cliff5[`type/clipolynom`] , Cliff5[`type/climon`] , Cliff5[`type/clibasmon`] , Cliff5[`type/cliscalar`] , Cliff5[cmulNUM] , Cliff5[cmulRS] , Cliff5[cmulgen] , Cliff5[useproduct]

(c) Copyright October 8, 1995, by Rafal Ablamowicz & Bertfried Fauser, all rights reserved.
Last modified: December 26, 2001, RA/BF.