[an error occurred while processing this directive] [an error occurred while processing this directive]
[an error occurred while processing this directive] Skip to the content of the web site.The C++ classes Sedenion<long double>, Sedenion<double>, and Sedenion<float> represent floating-point sedenions of the form z = a + ib1 + jb2 + kb3 + u1b4 + i1b5 + j1b6 + k1b7 + u2b8 + i2b9 + j2b10 + k2b11 + u3b12 + i3b13 + j3b14 + k3b15.
The symbols i, j, k, u1, i1, j1, k1, u2, i2, j2, k2, u3, i3, j3, and k3 follow the multiplication rules shown in Table 1.Table 1. Multiplication rules for sedenion symbols.
× | i | j | k | u1 | i1 | j1 | k1 | u2 | i2 | j2 | k2 | u3 | i3 | j3 | k3 |
i | −1 | k | −j | i1 | −u1 | −k1 | j1 | i2 | −u2 | −k2 | j2 | −i3 | u3 | k3 | −j3 |
j | −k | −1 | i | j1 | k1 | −u1 | −i1 | j2 | k2 | −u2 | −i2 | −j3 | −k3 | u3 | i3 |
k | j | −i | −1 | k1 | −j1 | i1 | −u1 | k2 | −j2 | i2 | −u2 | −k3 | j3 | −i3 | u3 |
u1 | −i1 | −j1 | −k1 | −1 | i | j | k | u3 | i3 | j3 | k3 | −u2 | −i2 | −j2 | −k2 |
i1 | u1 | −k1 | j1 | −i | −1 | −k | j | i3 | −u3 | k3 | −j3 | i2 | −u2 | k2 | −j2 |
j1 | k1 | u1 | −i1 | −j | k | −1 | −i | j3 | −k3 | −u3 | i3 | j2 | −k2 | −u2 | i2 |
k1 | −j1 | i1 | u1 | −k | −j | i | −1 | k3 | j3 | −i3 | −u3 | k2 | j2 | −i2 | −u2 |
u2 | −i2 | −j2 | −k2 | −u3 | −i3 | −j3 | −k3 | −1 | i | j | k | u1 | i1 | j1 | k1 |
i2 | u2 | −k2 | j2 | −i3 | u3 | k3 | −j3 | −i | −1 | −k | j | −i1 | u1 | k1 | −j1 |
j2 | k2 | u2 | −i2 | −j3 | −k3 | u3 | i3 | −j | k | −1 | −i | −j1 | −k1 | u1 | i1 |
k2 | −j2 | i2 | u2 | −k3 | j3 | −i3 | u3 | −k | −j | i | −1 | −k1 | j1 | −i1 | u1 |
u3 | i3 | j3 | k3 | u2 | −i2 | −j2 | −k2 | −u1 | i1 | j1 | k1 | −1 | −i | −j | −k |
i3 | −u3 | k3 | −j3 | i2 | u2 | k2 | −j2 | −i1 | −u1 | k1 | −j1 | i | −1 | k | −j |
j3 | −k3 | −u3 | i3 | j2 | −k2 | u2 | i2 | −j1 | −k1 | −u1 | i1 | j | −k | −1 | i |
k3 | j3 | −i3 | −u3 | k2 | j2 | −i2 | u2 | −k1 | j1 | −i1 | −u1 | k | j | −i | −1 |
Sedenions no longer form a division algebra, as there exist zero divisors: for example
(i + j2)×(i3 − j1) = 0.
We can also use this example to construct a counter-example to show that sedenions are not even alternative, that is, it is not true that (wz)z = w(z2). Consider
because the first product is a zero divisor, however:
This is because any purely-imaginary sedenion z has the property that z2 = -|z|2.
Throughout this document, the variable z is used to represent *this object. The choice of u over e for the additional symbol relates mostly to the special nature of e in printing doubles. The template variable T represents the field of the coefficients.
There are two constructors
Sedenion( T a = 0 ); Sedenion( T a, T b1, T b2, T b3, T b4, T b5, T b6, T b7, T b8, T b9, T b10, T b11, T b12, T b13, T b14, T b15 );
which create the sedenions a + 0i + 0j + 0k + 0u1 + ⋅⋅⋅ + 0k3 and a + ib1 + jb2 + kb3 + u1b4 + ⋅⋅⋅ + k3b15, respectively.
There are nine static constants defined in each class:
ZERO | 0 |
ONE | 1 |
I | i |
J | j |
K | k |
U1 | u1 |
I1 | i1 |
J1 | j1 |
K1 | k1 |
U2 | u2 |
I2 | i2 |
J2 | j2 |
K2 | k2 |
U3 | u3 |
I3 | i3 |
J3 | j3 |
K3 | k3 |
The constants may be accessed through the array UNITS[16] = {ONE, I, J, K, U1, I1, J1, K1, U2, I2, J2, K2, U3, I3, J3, K3}.
Each of the real-valued member functions has the prototype T f() const; and has a corresponding procedural function T f( const Sedenion<T> );.
real | imag_i | imag_j | imag_k | imag_u1 | imag_i1 | imag_j1 | imag_k1 | imag_u2 | imag_i2 | imag_j2 |
imag_k2 | imag_u3 | imag_i3 | imag_j3 | imag_k3 | csgn | abs | norm | abs_imag | norm_imag | arg |
Descriptions of each of the functions follow:
The function T operator [](int n) const returns the coefficient of the unit UNITS[n] for n = 0, 1, 2, ..., 15.
Each of these sedenion-valued member functions has the prototype Sedenion<T> f() const; and has a corresponding procedural function Sedenion<T> f( const Sedenion<T> );.
imag | conj | signum |
Descriptions of each of the functions follow:
Each of the square, square root, and inverse member functions has the prototype Sedenion<T> f() const; and has a corresponding procedural function Sedenion<T> f( const Sedenion<T> );.
sqr | sqrt | inverse |
Descriptions of each of the functions follow:
The member function Sedenion<T> rotate( const Sedenion<T> w ) const; and its associated procedural function Sedenion<T> rotate( const Sedenion<T> z, const Sedenion<T> w ) calculates wzw*. If w has unit length and z is an imaginary quaternion, then this member function returns vector z rotated 2 arg(w) radians around the line defined by ℑ(w).
The power function is overloaded with two prototypes:
Sedenion<T> pow( T ) | Sedenion<T> pow( Sedenion<T> ) |
Each of the exponential and logarithmic member functions has the prototype Sedenion<T> f() const; and has a corresponding procedural function Sedenion<T> f( const Sedenion<T> );.
exp | log | log10 |
Descriptions of each of the functions follow:
As with octonions, because of the loss of associativity, unless x and y commute, exp(x + y) ≠ exp(x)exp(y), log(xy) ≠ log(x) + log(y), and log10(xy) ≠ log10(x) + log10(y).
Each of the trigonometric, hyperbolic, inverse trigonometric, and inverse hyperbolic member functions has the prototype Sedenion<T> f() const; and has a corresponding procedural function Sedenion<T> f( const Sedenion<T> );.
sin | cos | tan | sec | csc | cot |
sinh | cosh | tanh | sech | csch | coth |
asin | acos | atan | asec | acsc | acot |
asinh | acosh | atanh | asech | acsch | acoth |
For example, the sin function calculates the result of z − z3/3! + z5/5! − z7/7! + z9/9! − z11/11! + ⋅⋅⋅ by using the formula
Bessel functions of the first kind, Jn(z) are implemented for integer values of n. The prototype of the member function is Sedenion<T> bessel_J( int ) const; and there is the corresponding procedural function Sedenion<T> bessel_J( int, const Sedenion<T>) const;.
Because the coefficients of the Taylor series for Bessel functions of the first kind are real, this function is well defined even for the non-commutative sedenions.
Each of the integer-valued member functions has the prototype Sedenion<T> f() const; and has a corresponding procedural function Sedenion<T> f( const Sedenion<T> );.
floor | ceil |
In both cases, the floor and ceiling, respectively, are calculated for each component.
The polynomial v0zn − 1 + v1zn − 2 + v2zn − 3 + ⋅⋅⋅ vn − 3z2 + vn − 2z + vn − 1 may be calculated efficiently using Horner's rule. The array v of n entries may be of type T *. The lack of commutativity dictates that the polynomial is not well defined from sedenionic coefficients, hence the coefficients are restricted to real values.
Sedenion<T> horner( T * v, unsigned int n );
The Newton polynomial with offsets:
v0(z − cn − 1)(z − cn − 2)⋅⋅⋅(z − c3)(z − c2)(z − c1) +
v1(z − cn − 1)(z − cn − 2)⋅⋅⋅(z − c3)(z − c2) +
v2(z − cn − 1)(z − cn − 2)⋅⋅⋅(z − c3) + ⋅⋅⋅ +
vn − 3(z − cn − 1)(z − cn − 2) +
vn − 2(z − cn − 1) +
vn − 1 may also be
calculated efficiently using Horner's rule. The arrays v and c of n entries
must be of type T *.
Sedenion<T> horner( T * v, T * c, unsigned int n );
Similarly, due to commutativity, the coefficients and the offsets must be restricted to real values.
Corresponding to each of this functions is a procedural function which takes the variable z as a first argument.
All binary arithmetic operators operator ⋅ have the following prototypes:
operator ⋅ ( const Sedenion<T> &, const Sedenion<T> & ), operator ⋅ ( T, const Sedenion<T> & ), and operator ⋅ ( const Sedenion<T> &, T ). The standard operations are:+ | - | * | / |
Note that z/w is defined as zw-1.
The unary arithmetic operator operator - has the prototype operator - ( const Sedenion<T> & ) and returns the negative of the sedenion.
The assignment operators operator ⋅ have the prototypes operator ⋅ ( const Sedenion<T> & ) and operator ⋅ ( T ) and appropriately modifies and returns this sedenion. The operations are:
= | += | -= | *= | /= |
The auto increment and auto decrement operators work on the real part of the sedenion.
All binary Boolean operators have the following prototypes:
operator ⋅ ( const Sedenion<T> &, const Sedenion<T> & ), operator ⋅ ( T, const Sedenion<T> & ), and operator ⋅ ( const Sedenion<T> &, T ). The standard operations are:== | != |
Descriptions of each of the functions follow:
Each of the following member functions has the prototype bool f() const; and returns a value based on the components of this sedenion.
is_imaginary | is_inf | is_nan | is_neg_inf |
is_pos_inf | is_real | is_real_inf | is_zero |
Descriptions of each of the functions follow:
Each of the following static factory functions has the prototype static Sedenion<T> f() const; and returns a random sedenion according to the following definitions:
where rk is a random real value.
The stream operators have been overloaded to print and read sedenions.