```⍝ Quaternion arithmetic:

ijk ← ↓ ⍎H'0i1 0j1 0k1'                 ⍝ unit vectors: i j k

⍕H¨ ijk ∘.(×H) ijk                      ⍝ i² = j² = k² = -1
┌────┬────┬────┐
│¯1  │0k1 │0j¯1│
├────┼────┼────┤
│0k¯1│¯1  │0i1 │
├────┼────┼────┤
│0j1 │0i¯1│¯1  │
└────┴────┴────┘

⍕H ⊃×H/ ijk                             ⍝ ijk = -1
¯1
dp ← {(10*-⍺)×⌊0.5+⍵×10*⍺}              ⍝ rounded to ⍺ decimal places
∆ ← ⍕H∘(2∘dp)                          ⍝ format of rounded result

S ← ⍳4                                  ⍝ quaternion scalar
M ← 2 3 4⍴⍳24                           ⍝     ..     matrix

∆ M                                     ⍝ formatted matrix
1i2j3k4     5i6j7k8     9i10j11k12
13i14j15k16 17i18j19k20 21i22j23k24

∆ +H M                                  ⍝ conjugate (q*)
1i¯2j¯3k¯4     5i¯6j¯7k¯8     9i¯10j¯11k¯12
13i¯14j¯15k¯16 17i¯18j¯19k¯20 21i¯22j¯23k¯24

∆ ÷H M                                  ⍝ reciprocal
0.03i¯0.07j¯0.1k¯0.13  0.03i¯0.03j¯0.04k¯0.05 0.02i¯0.02j¯0.02k¯0.03
0.02i¯0.02j¯0.02k¯0.02 0.01i¯0.01j¯0.01k¯0.01 0.01i¯0.01j¯0.01k¯0.01

∆ |H M                                  ⍝ norm
5.48 13.19 21.12
29.09 37.07 45.06

∆ |H ⍎H '2i4j5k6'                       ⍝ whole-number norm cf: |3j4 → 5
9
∆ ×H M                                  ⍝ direction (unit versor)
0.18i0.37j0.55k0.73 0.38i0.45j0.53k0.61 0.43i0.47j0.52k0.57
0.45i0.48j0.52k0.55 0.46i0.49j0.51k0.54 0.47i0.49j0.51k0.53

∆ S +H M                                ⍝ sum
2i4j6k8     6i8j10k12  10i12j14k16
14i16j18k20 18i20j22k24 22i24j26k28

∆ S -H M                                ⍝ difference
0              ¯4i¯4j¯4k¯4     ¯8i¯8j¯8k¯8
¯12i¯12j¯12k¯12 ¯16i¯16j¯16k¯16 ¯20i¯20j¯20k¯20

∆ S ×H M                                ⍝ product
¯28i4j6k8     ¯60i12j30k24   ¯92i20j54k40
¯124i28j78k56 ¯156i36j102k72 ¯188i44j126k88

∆ M ×H S                                ⍝ product is non-commutative
¯28i4j6k8     ¯60i20j14k32   ¯92i36j22k56
¯124i52j30k80 ¯156i68j38k104 ¯188i84j46k128

∆ M ×H +H M                             ⍝ qq* is real
30  174  446
846 1374 2030

∆ M ÷H S                                ⍝ right quotient M×(÷S)
1           2.33i¯0.27k¯0.53 3.67i¯0.53k¯1.07
5i¯0.8k¯1.6 6.33i¯1.07k¯2.13 7.67i¯1.33k¯2.67

∆ (÷H S)×H M                            ⍝ left quotient (÷S)×M
1           2.33j¯0.53k¯0.27 3.67j¯1.07k¯0.53
5j¯1.6k¯0.8 6.33j¯2.13k¯1.07 7.67j¯2.67k¯1.33

cube ← 0,⍉2 2 2⊤0 to 7                  ⍝ unit cube
cube
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1

spin ← {15 dp(○⍺÷180)⌽H ⍵}              ⍝ ⍵ rotated ⊃⍺° about 1↓⍺ vector

120 1 1 1 spin cube                     ⍝ 120° rotation about 1 1 1 diagonal
0 0 0 0
0 1 0 0
0 0 0 1
0 1 0 1
0 0 1 0
0 1 1 0
0 0 1 1
0 1 1 1

⍕H ↑ cube (120 1 1 1 spin cube)         ⍝ formatted cube and 120° rotation
0 0k1 0j1 0j1k1 0i1 0i1k1 0i1j1 0i1j1k1
0 0i1 0k1 0i1k1 0j1 0i1j1 0j1k1 0i1j1k1

a ← ○÷3                                 ⍝ 60° rotation angle around vector:
u ← 0,2 1○○÷3                           ⍝   60° from y axis in y z plane
p ← 1 ¯1 2                              ⍝ position before rotation
x ← (10 1 14+4 2 ¯3×3*÷2)÷8             ⍝ expected position after rotation

:If ⎕FR=645
(0,x) ≡ (a,u)⌽H 0,p                 ⍝ check against expected
1
:Else                                                                   ⍝ <V>1287
:EndIf

M ≡ ⍎H ⍕H M                             ⍝ check ⍎ ⍕ round-trip
1

Back to: code

Back to: Workspaces
```