GS (20190504) The idea behind the Cayley-Dickson construction [L1 ] is that a complex number a + ib can be written as a pair of real numbers (a,b).
Multiplication is done like this :
(a,b)(c,d) = (ac - db,ad + cb)
And the conjugate of a complex number is defined like this :
(a,b)* = (a,-b)
Now a quaternion can be considered as a pair of complex numbers where multiplication is :
(a,b)(c,d) = (ac - db*,a*d + cb)
And the conjugate of a quaternion is defined like this :
(a,b)* = (a*,-b)
We can continue considering octonion to be a pair of quaternions.
So, Cayley-Dickson construction can be used to multiply complex number, quaternion, octonion, sedenion and so forth. Length of lists must be a power of 2.
# cayleydickson.tcl # Author: Gerard Sookahet # Date: 04 mai 2019 # Version: 0.1 # Description: Cayley-Dickson construction to multiply complex number quaternion octonion namespace path ::tcl::mathop proc Conjugate x { set res [lmap i $x {- $i}] lreplace $res 0 0 [- [lindex $res 0]] } # Vector operation (add or substract) proc Vec {op a b} { if {[llength $a] == 1 && [llength $b] == 1} { $op $a $b } else { lmap i $a j $b {Vec $op $i $j} } } proc CayleyDickson {x y} { set n [llength $x] if {$n == 1} {return [* $x $y]} set m [/ $n 2] set m1 [- $m 1] set a [lrange $x 0 $m1] set b [lrange $x $m end] set c [lrange $y 0 $m1] set d [lrange $y $m end] return [list {*}[Vec - [CayleyDickson $a $c] [CayleyDickson [Conjugate $d] $b]] \ {*}[Vec + [CayleyDickson $d $a] [CayleyDickson $b [Conjugate $c]]]] } # Tests # Multiply two real 2 and 3 CayleyDickson 2 3 # Multiply two complex numbers 3 + i2 and 1 + i7 => -11 + i23 CayleyDickson [list 3 2] [list 1 7] # Multiply two quaternions 0 + i3 + 0 - k and 2 + 0 + j + k => 1 + i7 - j3 + k CayleyDickson [list 0 3 0 -1] [list 2 0 1 1]