⍝ 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