MyNixOS website logo
Description

Octonions and Quaternions.

Quaternions and Octonions are four- and eight- dimensional extensions of the complex numbers. They are normed division algebras over the real numbers and find applications in spatial rotations (quaternions), and string theory and relativity (octonions). The quaternions are noncommutative and the octonions nonassociative. See the package vignette for more details.

Quaternions and octonions in R

CRAN_Status_Badge

Overview

The onion package provides functionality for working with quaternions and octonions in R. A detailed vignette is provided in the package.

Informally, the quaternions, usually denoted \mathbb{H}, are a generalization of the complex numbers represented as a four-dimensional vector space over the reals. An arbitrary quaternion q represented as

q=a + b\mathbf{i} + c\mathbf{j}+ d\mathbf{k}

where a,b,c,d\in\mathbb{R} and \mathbf{i},\mathbf{j},\mathbf{k} are the quaternion units linked by the equations

\mathbf{i}^2=\mathbf{j}^2=\mathbf{k}^2=\mathbf{i}\mathbf{j}\mathbf{k}=-1.

which, together with distributivity, define quaternion multiplication. We can see that the quaternions are not commutative, for while \mathbf{i}\mathbf{j}=\mathbf{k}, it is easy to show that \mathbf{j}\mathbf{i}=-\mathbf{k}. Quaternion multiplication is, however, associative (the proof is messy and long).

Defining

\left( a+b\mathbf{i} + c\mathbf{j}+ d\mathbf{k}\right)^{-1}=\frac{1}{a^2 + b^2 + c^2 + d^2}\left(a-b\mathbf{i} - c\mathbf{j}- d\mathbf{k}\right)

shows that the quaternions are a division algebra: division works as expected (although one has to be careful about ordering terms).

The octonions\mathbb{O} are essentially a pair of quaternions, with a general octonion written

a+b\mathbf{i}+c\mathbf{j}+d\mathbf{k}+e\mathbf{l}+f\mathbf{il}+g\mathbf{jl}+h\mathbf{kl}

(other notations are sometimes used); Baez gives a multiplication table for the unit octonions and together with distributivity we have a well-defined division algebra. However, octonion multiplication is not associative and we have x(yz)\neq (xy)z in general.

Installation

You can install the released version of onion from CRAN with:

# install.packages("onion")  # uncomment this to install the package
library("onion")

The onion package in use

The basic quaternions are denoted H1, Hi, Hj and Hk and these should behave as expected in R idiom:

a <- 1:9 + Hi -2*Hj
a
#>    [1] [2] [3] [4] [5] [6] [7] [8] [9]
#> Re   1   2   3   4   5   6   7   8   9
#> i    1   1   1   1   1   1   1   1   1
#> j   -2  -2  -2  -2  -2  -2  -2  -2  -2
#> k    0   0   0   0   0   0   0   0   0
a*Hk
#>    [1] [2] [3] [4] [5] [6] [7] [8] [9]
#> Re   0   0   0   0   0   0   0   0   0
#> i   -2  -2  -2  -2  -2  -2  -2  -2  -2
#> j   -1  -1  -1  -1  -1  -1  -1  -1  -1
#> k    1   2   3   4   5   6   7   8   9
Hk*a
#>    [1] [2] [3] [4] [5] [6] [7] [8] [9]
#> Re   0   0   0   0   0   0   0   0   0
#> i    2   2   2   2   2   2   2   2   2
#> j    1   1   1   1   1   1   1   1   1
#> k    1   2   3   4   5   6   7   8   9

Function rquat() generates random quaternions:

a <- rquat(9)
names(a) <- letters[1:9]
a
#>             a          b            c          d          e          f
#> Re  1.2629543  0.4146414 -0.005767173 -1.1476570  0.2522234 -0.2242679
#> i  -0.3262334 -1.5399500  2.404653389 -0.2894616 -0.8919211  0.3773956
#> j   1.3297993 -0.9285670  0.763593461 -0.2992151  0.4356833  0.1333364
#> k   1.2724293 -0.2947204 -0.799009249 -0.4115108 -1.2375384  0.8041895
#>              g           h          i
#> Re -0.05710677 -1.28459935 -0.4333103
#> i   0.50360797  0.04672617 -0.6494716
#> j   1.08576936 -0.23570656  0.7267507
#> k  -0.69095384 -0.54288826  1.1519118
a[6] <- 33
a
#>             a          b            c          d          e  f           g
#> Re  1.2629543  0.4146414 -0.005767173 -1.1476570  0.2522234 33 -0.05710677
#> i  -0.3262334 -1.5399500  2.404653389 -0.2894616 -0.8919211  0  0.50360797
#> j   1.3297993 -0.9285670  0.763593461 -0.2992151  0.4356833  0  1.08576936
#> k   1.2724293 -0.2947204 -0.799009249 -0.4115108 -1.2375384  0 -0.69095384
#>              h          i
#> Re -1.28459935 -0.4333103
#> i   0.04672617 -0.6494716
#> j  -0.23570656  0.7267507
#> k  -0.54288826  1.1519118
cumsum(a)
#>             a          b         c          d          e          f          g
#> Re  1.2629543  1.6775957 1.6718285  0.5241715  0.7763950 33.7763950 33.7192882
#> i  -0.3262334 -1.8661834 0.5384700  0.2490084 -0.6429127 -0.6429127 -0.1393047
#> j   1.3297993  0.4012322 1.1648257  0.8656106  1.3012939  1.3012939  2.3870632
#> k   1.2724293  0.9777089 0.1786996 -0.2328112 -1.4703496 -1.4703496 -2.1613035
#>              h          i
#> Re 32.43468886 32.0013785
#> i  -0.09257857 -0.7420502
#> j   2.15135668  2.8781074
#> k  -2.70419172 -1.5522800

Octonions

Octonions follow the same general pattern and we may show nonassociativity numerically:

x <- roct(5)
y <- roct(5)
z <- roct(5)
x*(y*z) - (x*y)*z
#>          [1]           [2]           [3]           [4]           [5]
#> Re  0.000000 -5.329071e-15 -1.776357e-15 -8.881784e-16  8.881784e-16
#> i   7.201225  1.045435e+00 -3.015861e+00 -4.261327e+00  8.612680e+00
#> j   6.177845 -5.797569e+00 -5.642415e+00 -6.342342e+00  1.118819e+01
#> k  -4.917863 -4.484153e+00 -1.591524e+01 -1.119394e+00  1.571936e+01
#> l  -1.403122  1.827970e-01  7.268523e+00 -6.298392e-01 -3.564195e+00
#> il -4.950594  4.440918e+00  9.922722e+00 -7.116999e-01  7.448039e+00
#> jl  5.253879  9.239258e+00  7.195855e+00  4.224830e+00 -4.883673e+00
#> kl -2.031907  1.159402e+01 -1.147093e+01 -1.264476e+00 -2.728531e+00

References

  • RKS Hankin (2006). “Normed division algebras with R: introducing the onion package”. R News, 6(2):49-52
  • JC Baez (2001). “The octonions”. Bulletin of the American Mathematical Society, 39(5), 145–205

Further information

For more detail, see the package vignette

vignette("onionpaper")

Metadata

Version

1.5-3

License

Unknown

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows