Ref:
http://en.wikipedia.org/wiki/Cayley%E2%80%93Dickson_construction
"The Cayley–Dickson construction, named after Arthur Cayley and Leonard Eugene Dickson, produces a sequence of algebras over the field of real numbers, each with twice the dimension of the previous one. The algebras produced by this process are known as Cayley–Dickson algebras; since they extend the complex numbers, ... "
complex numbers, quaternions, octonions, sedenions, ...
http://en.wikipedia.org/wiki/Hypercomplex_number
spad
)abbrev domain CALEY CaleyDickson
CaleyDickson(C:CommutativeRing,gen:Symbol,gamma:C):ComplexCategory(C) with
scalar:List % -> %
== add
Rep == DirectProduct(2,C)
rep(x:%):Rep == x pretend Rep
per(x:Rep):% == x pretend %
pair(x:C,y:C):Rep == directProduct vector [x,y]
complex(x:C,y:C):% == per pair(x,y)
real(x:%):C == rep(x).1
imag(x:%):C == rep(x).2
0:% == complex(0,0)
zero?(x:%):Boolean == zero? rep(x)
1:% == per pair(1,0)
one?(x:%):Boolean == one? real x and zero? imag x
if C has conjugate:C->C then
-- In general we need conjugate
(x:% * y:%):% ==
--print(x::OutputForm * y::OutputForm)
complex(real x * real y - gamma*conjugate imag y * imag x,
imag y * real x + imag x * conjugate real y)
conjugate(x:%):% == complex(conjugate(real x), -imag x)
else
-- If not complex then conjugate is identity
(x:% * y:%):% ==
complex(real x * real y - gamma*imag y * imag x,
imag y * real x + imag x * real y)
conjugate(x:%):% == complex(real x, -imag x)
if C has Field then
inv(x:%):% == per(inv(real(conjugate x * x))$C * rep conjugate x)
(x:% / y:%):% == x * inv(y)
if C has rank:()->PositiveInteger then
rank():PositiveInteger == 2*rank()$C
else
rank():PositiveInteger == 2
if C has basis:()->Vector C then
basis():Vector % ==
concat([complex(i,0) for i in entries basis()$C],
[complex(0,i) for i in entries basis()$C])
else
basis():Vector % == [1,imaginary()]
if C has scalar:List C -> C then
scalar(x:List %):% ==
h:Integer := divide(#x,2).quotient
complex(scalar([retract(x.i)@C for i in 1..h]),scalar([retract(x.i)@C for i in h+1..#x]))
else
scalar(x:List %):% == complex(retract x.1,retract x.2)
coerce(x:%):OutputForm ==
outr:=real(x)::OutputForm
imag x = 0 => return outr
outi := hconcat(imag(x)::OutputForm, gen::OutputForm)
if imag x = 1 then
outi := gen::OutputForm
if imag x = -1 then
outi := -(gen::OutputForm)
if C has imaginary:()->C then
if imag x = -imaginary()$C then
outi := -hconcat(imaginary()$C::OutputForm,gen::OutputForm)
real x = 0 => return outi
return outr + outi
--
-- Many other funtctions are inherited from ComplexCategory
--
-- To Do:
-- 1) Check which other functions are still correct for higher-order algebras!
--
-- re-defined these only to save function calls
(x:% + y:%):% == per(rep x + rep y)
(x:% = y:%):Boolean == rep x = rep y
spad
Compiling FriCAS source code from file
/var/zope2/var/LatexWiki/8303746987006969608-25px001.spad using
old system compiler.
CALEY abbreviates domain CaleyDickson
------------------------------------------------------------------------
initializing NRLIB CALEY for CaleyDickson
compiling into NRLIB CALEY
****** Domain: C already in scope
compiling local rep : $ -> DirectProduct(2,C)
CALEY;rep is replaced by x
Time: 0.35 SEC.
compiling local per : DirectProduct(2,C) -> $
CALEY;per is replaced by x
Time: 0 SEC.
compiling local pair : (C,C) -> DirectProduct(2,C)
Time: 0.01 SEC.
compiling exported complex : (C,C) -> $
Time: 0 SEC.
compiling exported real : $ -> C
Time: 0 SEC.
compiling exported imag : $ -> C
Time: 0 SEC.
compiling exported Zero : () -> $
Time: 0 SEC.
compiling exported zero? : $ -> Boolean
Time: 0 SEC.
compiling exported One : () -> $
Time: 0 SEC.
compiling exported one? : $ -> Boolean
Time: 0 SEC.
augmenting C: (SIGNATURE C conjugate (C C))
compiling exported * : ($,$) -> $
Time: 0.01 SEC.
compiling exported conjugate : $ -> $
Time: 0 SEC.
compiling exported * : ($,$) -> $
Time: 0.01 SEC.
compiling exported conjugate : $ -> $
Time: 0.01 SEC.
****** Domain: C already in scope
augmenting C: (Field)
compiling exported inv : $ -> $
Time: 0.03 SEC.
compiling exported / : ($,$) -> $
Time: 0 SEC.
augmenting C: (SIGNATURE C rank ((PositiveInteger)))
compiling exported rank : () -> PositiveInteger
Time: 0 SEC.
compiling exported rank : () -> PositiveInteger
CALEY;rank;Pi;18 is replaced by 2
Time: 0 SEC.
augmenting C: (SIGNATURE C basis ((Vector C)))
compiling exported basis : () -> Vector $
Time: 0.03 SEC.
compiling exported basis : () -> Vector $
Time: 0.01 SEC.
augmenting C: (SIGNATURE C scalar (C (List C)))
compiling exported scalar : List $ -> $
Time: 0.05 SEC.
compiling exported scalar : List $ -> $
Time: 0 SEC.
compiling exported coerce : $ -> OutputForm
augmenting C: (SIGNATURE C imaginary (C))
Time: 0.02 SEC.
compiling exported + : ($,$) -> $
Time: 0 SEC.
compiling exported = : ($,$) -> Boolean
Time: 0.01 SEC.
****** Domain: C already in scope
augmenting C: (EuclideanDomain)
****** Domain: C already in scope
augmenting C: (PolynomialFactorizationExplicit)
****** Domain: C already in scope
augmenting C: (RadicalCategory)
****** Domain: C already in scope
augmenting C: (TranscendentalFunctionCategory)
****** Domain: C already in scope
augmenting C: (RealNumberSystem)
****** Domain: C already in scope
augmenting C: (TranscendentalFunctionCategory)
****** Domain: C already in scope
augmenting C: (Comparable)
****** Domain: C already in scope
augmenting C: (ConvertibleTo (InputForm))
****** Domain: C already in scope
augmenting C: (ConvertibleTo (Pattern (Float)))
****** Domain: C already in scope
augmenting C: (ConvertibleTo (Pattern (Integer)))
****** Domain: C already in scope
augmenting C: (DifferentialRing)
****** Domain: C already in scope
augmenting C: (Eltable C C)
****** Domain: C already in scope
augmenting C: (EuclideanDomain)
****** Domain: C already in scope
augmenting C: (Evalable C)
****** Domain: C already in scope
augmenting C: (Field)
****** Domain: C already in scope
augmenting C: (Finite)
****** Domain: C already in scope
augmenting C: (FiniteFieldCategory)
****** Domain: C already in scope
augmenting C: (InnerEvalable (Symbol) C)
****** Domain: C already in scope
augmenting C: (IntegerNumberSystem)
****** Domain: C already in scope
augmenting C: (IntegralDomain)
****** Domain: C already in scope
augmenting C: (LinearlyExplicitRingOver (Integer))
****** Domain: C already in scope
augmenting C: (PartialDifferentialRing (Symbol))
****** Domain: C already in scope
augmenting C: (PatternMatchable (Float))
****** Domain: C already in scope
augmenting C: (PatternMatchable (Integer))
****** Domain: C already in scope
augmenting C: (RealConstant)
****** Domain: C already in scope
augmenting C: (RealNumberSystem)
****** Domain: C already in scope
augmenting C: (RetractableTo (Fraction (Integer)))
****** Domain: C already in scope
augmenting C: (RetractableTo (Integer))
****** Domain: C already in scope
augmenting C: (TranscendentalFunctionCategory)
(time taken in buildFunctor: 1810)
;;; *** |CaleyDickson| REDEFINED
;;; *** |CaleyDickson| REDEFINED
Time: 1.94 SEC.
Cumulative Statistics for Constructor CaleyDickson
Time: 2.48 seconds
finalizing NRLIB CALEY
Processing CaleyDickson for Browser database:
--->-->CaleyDickson((scalar (% (List %)))): Not documented!!!!
--->-->CaleyDickson(constructor): Not documented!!!!
--->-->CaleyDickson(): Missing Description
; compiling file "/var/zope2/var/LatexWiki/CALEY.NRLIB/CALEY.lsp" (written 18 APR 2011 04:34:09 PM):
; /var/zope2/var/LatexWiki/CALEY.NRLIB/CALEY.fasl written
; compilation finished in 0:00:00.667
------------------------------------------------------------------------
CaleyDickson is now explicitly exposed in frame initial
CaleyDickson will be automatically loaded when needed from
/var/zope2/var/LatexWiki/CALEY.NRLIB/CALEY
>> System error:
The bounding indices 163 and 162 are bad for a sequence of length 162.
See also:
The ANSI Standard, Glossary entry for "bounding index designator"
The ANSI Standard, writeup for Issue SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR
Test
axiom
)set output tex on
axiom
)set output algebra off
Complex Numbers
axiom
C := CaleyDickson(FRAC INT,'i,1)
Type: Type
axiom
rank()$C
axiom
c:C := scalar [2,3]
Type: CaleyDickson
?(Fraction(Integer),
i,
1)
axiom
Ce:ILIST(C,0) := construct entries basis()$C
Type: IndexedList
?(CaleyDickson
?(Fraction(Integer),
i,
1),
0)
axiom
matrix [[Ce.i * Ce.j for j in 0..#Ce-1] for i in 0..#Ce-1]
Type: Matrix(CaleyDickson
?(Fraction(Integer),
i,
1))
axiom
--
-- compare
--
Cg:ILIST(Complex FRAC INT,0) := construct map(x+-> complex(x.1,x.2),
1$SquareMatrix(2,FRAC INT)::List List FRAC INT)
Type: IndexedList
?(Complex(Fraction(Integer)),
0)
axiom
matrix [[Cg.i * Cg.j for j in 0..#Cg-1] for i in 0..#Cg-1]
Type: Matrix(Complex(Fraction(Integer)))
Quaternions
axiom
Q := CaleyDickson(C,'j,1)
Type: Type
axiom
rank()$Q
axiom
q:Q := scalar [2,3,4,5]
Type: CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1)
axiom
Qe:ILIST(Q,0) := construct entries basis()$Q
Type: IndexedList
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
0)
axiom
matrix [[Qe.i * Qe.j for j in 0..#Qe-1] for i in 0..#Qe-1]
Type: Matrix(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1))
axiom
--
-- compare
--
Qg:ILIST(Quaternion FRAC INT,0) := construct map(x+-> quatern(x.1,x.2,x.3,x.4),
1$SquareMatrix(4,FRAC INT)::List List FRAC INT)
Type: IndexedList
?(Quaternion(Fraction(Integer)),
0)
axiom
matrix [[Qg.i * Qg.j for j in 0..#Qg-1] for i in 0..#Qg-1]
Type: Matrix(Quaternion(Fraction(Integer)))
axiom
-- non-commutative
test( Qe.1 * Qe.2 = - Qe.2 * Qe.1 )
Type: Boolean
Octonions
Ref: http://en.wikipedia.org/wiki/Octonion
axiom
O:=CaleyDickson(Q,'k,1)
Type: Type
axiom
rank()$O
axiom
o:O := scalar [2,3,4,5,6,7,8,9]
Type: CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1)
axiom
Oe:ILIST(O,0) := construct entries basis()$O
Type: IndexedList
?(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1),
0)
axiom
matrix [[Oe.i * Oe.j for j in 0..#Oe-1] for i in 0..#Oe-1]
Type: Matrix(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1))
axiom
--
-- compare
--
Og:ILIST(Octonion FRAC INT,0):=map(x+-> octon(x.1,x.2,x.3,x.4,x.5,x.6,x.7,x.8),
1$SquareMatrix(8,FRAC INT)::List List FRAC INT)
Type: IndexedList
?(Octonion(Fraction(Integer)),
0)
axiom
matrix [[Og.i * Og.j for j in 0..#Og-1] for i in 0..#Og-1]
Type: Matrix(Octonion(Fraction(Integer)))
axiom
-- Non-commutative
test( Oe.2 * Oe.4 = - Oe.4 * Oe.2 )
Type: Boolean
axiom
-- Non-associative
test((Oe.2 * Oe.4) * Oe.7 = - Oe.2 * (Oe.4 * Oe.7))
Type: Boolean
Sedenions
Ref: http://en.wikipedia.org/wiki/Sedenion
axiom
S:=CaleyDickson(O,'l,1)
Type: Type
axiom
rank()$S
axiom
s:S := scalar [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
Type: CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1),
l,
1)
axiom
Se:ILIST(S,0) := construct entries basis()$S
Type: IndexedList
?(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1),
l,
1),
0)
axiom
matrix [[Se.i * Se.j for j in 0..#Se-1] for i in 0..#Se-1]
Type: Matrix(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1),
l,
1))
axiom
-- Non-commutative
test( Se.3 * Se.10 = - Se.10 * Se.3 )
Type: Boolean
axiom
-- Non-associative
test( (Se.3 * Se.6) * Se.11 = -Se.3 * (Se.6 * Se.11) )
Type: Boolean
axiom
-- zero divisor
(Se.3 + Se.10) * (Se.6 - Se.15)
Type: CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(CaleyDickson
?(Fraction(Integer),
i,
1),
j,
1),
k,
1),
l,
1)