## Cayley-Dickson construction to multiply complex, quaternion, octonion and so forth

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]```

 Category Mathematics