clifford
objectsAllows arithmetic operators to be used for multivariate polynomials such as addition, multiplication, integer powers, etc.
# S3 method for clifford
Ops(e1, e2)
clifford_negative(C)
geoprod(C1,C2)
clifford_times_scalar(C,x)
clifford_plus_clifford(C1,C2)
clifford_eq_clifford(C1,C2)
clifford_inverse(C)
cliffdotprod(C1,C2)
fatdot(C1,C2)
lefttick(C1,C2)
righttick(C1,C2)
wedge(C1,C2)
scalprod(C1,C2=rev(C1),drop=TRUE)
eucprod(C1,C2=C1,drop=TRUE)
maxyterm(C1,C2=as.clifford(0))
C1 %.% C2
C1 %^% C2
C1 %X% C2
C1 %star% C2
C1 % % C2
C1 %euc% C2
C1 %o% C2
C1 %_|% C2
C1 %|_% C2
Objects of class clifford
Scalar, length one numeric vector
Boolean, with default TRUE
meaning to return the
constant coerced to numeric, and FALSE
meaning to return a
(constant) Clifford object
The high-level functions documented here return an object of
clifford
. But don't use the low-level functions.
The function Ops.clifford()
passes unary and binary arithmetic
operators “+
”, “-
”, “*
”,
“/
” and “^
” to the appropriate specialist
function.
Functions c_foo()
are low-level helper functions that wrap the
C
code; function maxyterm()
returns the maximum index
in the terms of its arguments.
The package has several binary operators:
Geometric product | A*B = geoprod(A,B) |
\(\displaystyle AB=\sum_{r,s}\left\langle A\right\rangle_r\left\langle B\right\rangle_s\) |
Inner product | A %.% B = cliffdotprod(A,B) |
\(\displaystyle A\cdot B=\sum_{r\neq 0\atop s\ne 0}\left\langle\left\langle A\right\rangle_r\left\langle B\right\rangle_s\right\rangle_{\left|s-r\right|}\) |
Outer product | A %^% B = wedge(A,B) |
\(\displaystyle A\wedge B=\sum_{r,s}\left\langle\left\langle A\right\rangle_r\left\langle B\right\rangle_s\right\rangle_{s+r}\) |
Fat dot product | A %o% B = fatdot(A,B) |
\(\displaystyle A\bullet B=\sum_{r,s}\left\langle\left\langle A\right\rangle_r\left\langle B\right\rangle_s\right\rangle_{\left|s-r\right|}\) |
Left contraction | A %_|% B = lefttick(A,B) |
\(\displaystyle A\rfloor B=\sum_{r,s}\left\langle\left\langle A\right\rangle_r\left\langle B\right\rangle_s\right\rangle_{s-r}\) |
Right contraction | A %|_% B = righttick(A,B) |
\(\displaystyle A\lfloor B=\sum_{r,s}\left\langle\left\langle A\right\rangle_r\left\langle B\right\rangle_s\right\rangle_{r-s}\) |
Cross product | A %X% B = cross(A,B) |
\(\displaystyle A\times B=\frac{1}{2_{\vphantom{j}}}\left(AB-BA\right)\) |
Scalar product | A %star% B = star(A,B) |
\(\displaystyle A\ast B=\sum_{r,s}\left\langle\left\langle A\right\rangle_r\left\langle B\right\rangle_s\right\rangle_0\) |
Euclidean product | A %euc% B = eucprod(A,B) |
\(\displaystyle A\star B= A\ast B^\dag\) |
In R idiom, the geometric product geoprod(.,.)
has to be
indicated with a “*
” (as in A*B
) and so the
binary operator must be %*%
: we need a different idiom for
scalar product, which is why %star%
is used.
Because geometric product is often denoted by juxtaposition, package
idiom includes a % % b
for geometric product.
Function clifford_inverse()
is problematic as nonnull blades
always have an inverse; but function is.blade()
is not yet
implemented. Blades (including null blades) have a pseudoinverse, but
this is not implemented yet either.
The scalar product of two clifford objects is defined as the zero-grade component of their geometric product:
$$ A\ast B=\left<AB\right>_0\qquad{\mbox{NB: notation used by both Perwass and Hestenes}} $$
In package idiom the scalar product is given by A %star% B
or
scalprod(A,B)
. Hestenes and Perwass both use an asterisk for
scalar product as in “\(A*B\)”, but in package idiom, the
asterisk is reserved for geometric product.
Note: in the package, A*B
is the geometric product.
The Euclidean product (or Euclidean scalar product) of two clifford objects is defined as
$$ A\star B=A\ast B^\dag=\left<AB^\dag\right>_0\qquad{\mbox{Perwass}} $$
where \(B^\dag\) denotes Conjugate [as in Conj(a)
]. In
package idiom the Euclidean scalar product is given by
eucprod(A,B)
or A %euc% B
, both of which return
A * Conj(B)
.
Note that the scalar product \(A\ast A\) can be positive or negative
[that is, A %star% A
may be any sign], but the Euclidean
product is guaranteed to be non-negative [that is, A %euc% A
is always positive or zero].
Dorst defines the left and right contraction (Chisholm calls these the left and right inner product) as \(A\rfloor B\) and \(A\lfloor B\). See the vignette for more details.
# NOT RUN {
u <- rcliff(5)
v <- rcliff(5)
w <- rcliff(5)
u*v
u^3
u+(v+w) == (u+v)+w # should be TRUE
u*(v*w) == (u*v)*w # should be TRUE
u %^% v == (u*v-v*u)/2 # should be TRUE
# Now if x,y,z are _vectors_ we would have:
x <- as.1vector(5)
y <- as.1vector(5)
x*y == x%.%y + x%^%y # should be TRUE
x %^% y == x %^% (y + 3*x) # should be TRUE
## Inner product is "%.%" is not associative:
rcliff(5,g=2) -> x
rcliff(5,g=2) -> y
rcliff(5,g=2) -> z
x %.% (y %.% z)
(x %.% y) %.% z
## Geometric product *is* associative:
x * (y * z)
(x * y) * z
# }
Run the code above in your browser using DataLab