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;
>
Example 1: Let's see simple computations involving Clifford product and a symbolic, unassigned bilinear form B:
> assigned(B);
> cmul(3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);
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);
>
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'
> (4+e1) &c (eiwej+4*alpha*Pi*Id);
> cmul(ei,ej)+cmul(ej,ei);clicollect(%); #equals 0 when B[i,j]=-B[j,i]
> clicollect(e1 &c e2 + e2 &c e1); #equals 0 when B[1,2]=-B[2,1]
> clicollect(e1 &cQ e2 + e2 &cQ e1); #equals 0
> e1 &c e1, e1 &c e2, e1 &cQ e1, e1 &cQ e2;
>
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);
> cmul[g](3*Pi*e2we1,e4+3*e5,e6,2*e4); # long notation using 'cmul'
> &c[-g](3*Pi*e2we1,e4+3*e5,e6,2*e4); # short notation using &c
> (4+e1) &c (eiwej+4*alpha*Pi*Id);
>
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]
>
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]
> clicollect(e1 &cQ e2 + e2 &cQ e1); #equals 0
> e1 &c e1, e1 &c e2, e1 &cQ e1, e1 &cQ e2;
>
Example 3: Same computations as in Example 3 except that we assign a matrix to B.
> B:=linalg[diag](1$6);
>
cmul(3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);
cmul[B](3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);
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:
> &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:
> &c[''B''](3*Pi*e2we1we3,e4+3*e5,e6,e4+3*e5);
>
Example 4: Let's see how to multiply basis monomials in Cl(3):
> clibasis:=cbasis(3);B:=linalg[diag](1,1,1):
> M:=matrix(8,8,(i,j)->cmul(clibasis[i],clibasis[j])):
> evalm(M);
> time()-s;
>
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.