[29] | 1 | |
---|
| 2 | [def __R ['[*R]]] |
---|
| 3 | [def __C ['[*C]]] |
---|
| 4 | [def __H ['[*H]]] |
---|
| 5 | [def __O ['[*O]]] |
---|
| 6 | [def __R3 ['[*'''R<superscript>3</superscript>''']]] |
---|
| 7 | [def __R4 ['[*'''R<superscript>4</superscript>''']]] |
---|
| 8 | [def __octulple ('''α,β,γ,δ,ε,ζ,η,θ''')] |
---|
| 9 | [def __oct_formula ['[^o = '''α + βi + γj + δk + εe' + ζi' + ηj' + θk' ''']]] |
---|
| 10 | [def __oct_complex_formula ['[^o = ('''α + βi) + (γ + δi)j + (ε + ζi)e' + (η - θi)j' ''']]] |
---|
| 11 | [def __oct_quat_formula ['[^o = ('''α + βi + γj + δk) + (ε + ζi + ηj - θj)e' ''']]] |
---|
| 12 | [def __oct_not_equal ['[^x(yz) '''≠''' (xy)z]]] |
---|
| 13 | |
---|
| 14 | |
---|
| 15 | [section Octonions] |
---|
| 16 | |
---|
| 17 | [section Overview] |
---|
| 18 | |
---|
| 19 | Octonions, like [link boost_math.quaternions quaternions], are a relative of complex numbers. |
---|
| 20 | |
---|
| 21 | Octonions see some use in theoretical physics. |
---|
| 22 | |
---|
| 23 | In practical terms, an octonion is simply an octuple of real numbers __octulple, |
---|
| 24 | which we can write in the form __oct_formula, where ['[^i]], ['[^j]] and ['[^k]] |
---|
| 25 | are the same objects as for quaternions, and ['[^e']], ['[^i']], ['[^j']] and ['[^k']] |
---|
| 26 | are distinct objects which play essentially the same kind of role as ['[^i]] (or ['[^j]] or ['[^k]]). |
---|
| 27 | |
---|
| 28 | Addition and a multiplication is defined on the set of octonions, |
---|
| 29 | which generalize their quaternionic counterparts. The main novelty this time |
---|
| 30 | is that [*the multiplication is not only not commutative, is now not even |
---|
| 31 | associative] (i.e. there are quaternions ['[^x]], ['[^y]] and ['[^z]] such that __oct_not_equal). |
---|
| 32 | A way of remembering things is by using the following multiplication table: |
---|
| 33 | |
---|
| 34 | [$../../libs/math/octonion/graphics/octonion_blurb17.jpeg] |
---|
| 35 | |
---|
| 36 | Octonions (and their kin) are described in far more details in this other |
---|
| 37 | [@../../libs/math/quaternion/TQE.pdf document] |
---|
| 38 | (with [@../../libs/math/quaternion/TQE_EA.pdf errata and addenda]). |
---|
| 39 | |
---|
| 40 | Some traditional constructs, such as the exponential, carry over without too |
---|
| 41 | much change into the realms of octonions, but other, such as taking a square root, |
---|
| 42 | do not (the fact that the exponential has a closed form is a result of the |
---|
| 43 | author, but the fact that the exponential exists at all for octonions is known |
---|
| 44 | since quite a long time ago). |
---|
| 45 | |
---|
| 46 | [endsect] |
---|
| 47 | |
---|
| 48 | [section Header File] |
---|
| 49 | |
---|
| 50 | The interface and implementation are both supplied by the header file |
---|
| 51 | [@../../boost/math/octonion.hpp octonion.hpp]. |
---|
| 52 | |
---|
| 53 | [endsect] |
---|
| 54 | |
---|
| 55 | [section Synopsis] |
---|
| 56 | |
---|
| 57 | namespace boost{ namespace math{ |
---|
| 58 | |
---|
| 59 | template<typename T> class ``[link boost_math.octonions.template_class_octonion octonion]``; |
---|
| 60 | template<> class ``[link boost_math.octonions.octonion_specializations octonion<float>]``; |
---|
| 61 | template<> class ``[link boost_math.octonion_double octonion<double>]``; |
---|
| 62 | template<> class ``[link boost_math.octonion_long_double octonion<long double>]``; |
---|
| 63 | |
---|
| 64 | // operators |
---|
| 65 | |
---|
| 66 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (T const & lhs, octonion<T> const & rhs); |
---|
| 67 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (octonion<T> const & lhs, T const & rhs); |
---|
| 68 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 69 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 70 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 71 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 72 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_addition_operators operator +]`` (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 73 | |
---|
| 74 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (T const & lhs, octonion<T> const & rhs); |
---|
| 75 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (octonion<T> const & lhs, T const & rhs); |
---|
| 76 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 77 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 78 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 79 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 80 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_subtraction_operators operator -]`` (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 81 | |
---|
| 82 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (T const & lhs, octonion<T> const & rhs); |
---|
| 83 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (octonion<T> const & lhs, T const & rhs); |
---|
| 84 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 85 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 86 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 87 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 88 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_multiplication_operators operator *]`` (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 89 | |
---|
| 90 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (T const & lhs, octonion<T> const & rhs); |
---|
| 91 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (octonion<T> const & lhs, T const & rhs); |
---|
| 92 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 93 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 94 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 95 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 96 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.binary_division_operators operator /]`` (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 97 | |
---|
| 98 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.unary_plus_and_minus_operators operator +]`` (octonion<T> const & o); |
---|
| 99 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_non_member_operators.unary_plus_and_minus_operators operator -]`` (octonion<T> const & o); |
---|
| 100 | |
---|
| 101 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (T const & lhs, octonion<T> const & rhs); |
---|
| 102 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (octonion<T> const & lhs, T const & rhs); |
---|
| 103 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 104 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 105 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 106 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 107 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_equality_operators operator ==]`` (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 108 | |
---|
| 109 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (T const & lhs, octonion<T> const & rhs); |
---|
| 110 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (octonion<T> const & lhs, T const & rhs); |
---|
| 111 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 112 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 113 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 114 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 115 | template<typename T> bool ``[link boost_math.octonions.octonion_non_member_operators.binary_inequality_operators operator !=]`` (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 116 | |
---|
| 117 | template<typename T, typename charT, class traits> |
---|
| 118 | ::std::basic_istream<charT,traits> & ``[link boost_math.octonions.octonion_non_member_operators.stream_extractor operator >>]`` (::std::basic_istream<charT,traits> & is, octonion<T> & o); |
---|
| 119 | |
---|
| 120 | template<typename T, typename charT, class traits> |
---|
| 121 | ::std::basic_ostream<charT,traits> & ``[link boost_math.octonions.octonion_non_member_operators.stream_inserter operator <<]`` (::std::basic_ostream<charT,traits> & os, octonion<T> const & o); |
---|
| 122 | |
---|
| 123 | // values |
---|
| 124 | |
---|
| 125 | template<typename T> T ``[link boost_math.octonions.octonion_value_operations.real_and_unreal real]``(octonion<T> const & o); |
---|
| 126 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_value_operations.real_and_unreal unreal]``(octonion<T> const & o); |
---|
| 127 | |
---|
| 128 | template<typename T> T ``[link boost_math.octonions.octonion_value_operations.sup sup]``(octonion<T> const & o); |
---|
| 129 | template<typename T> T ``[link boost_math.octonions.octonion_value_operations.l1 l1]``(octonion<T>const & o); |
---|
| 130 | template<typename T> T ``[link boost_math.octonions.octonion_value_operations.abs abs]``(octonion<T> const & o); |
---|
| 131 | template<typename T> T ``[link boost_math.octonions.octonion_value_operations.norm norm]``(octonion<T>const & o); |
---|
| 132 | template<typename T> octonion<T> ``[link boost_math.octonions.octonion_value_operations.conj conj]``(octonion<T> const & o); |
---|
| 133 | |
---|
| 134 | template<typename T> octonion<T> ``[link boost_math.octonions.quaternion_creation_functions spherical]``(T const & rho, T const & theta, T const & phi1, T const & phi2, T const & phi3, T const & phi4, T const & phi5, T const & phi6); |
---|
| 135 | template<typename T> octonion<T> ``[link boost_math.octonions.quaternion_creation_functions multipolar]``(T const & rho1, T const & theta1, T const & rho2, T const & theta2, T const & rho3, T const & theta3, T const & rho4, T const & theta4); |
---|
| 136 | template<typename T> octonion<T> ``[link boost_math.octonions.quaternion_creation_functions cylindrical]``(T const & r, T const & angle, T const & h1, T const & h2, T const & h3, T const & h4, T const & h5, T const & h6); |
---|
| 137 | |
---|
| 138 | // transcendentals |
---|
| 139 | |
---|
| 140 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.exp exp]``(octonion<T> const & o); |
---|
| 141 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.cos cos]``(octonion<T> const & o); |
---|
| 142 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.sin sin]``(octonion<T> const & o); |
---|
| 143 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.tan tan]``(octonion<T> const & o); |
---|
| 144 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.cosh cosh]``(octonion<T> const & o); |
---|
| 145 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.sinh sinh]``(octonion<T> const & o); |
---|
| 146 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.tanh tanh]``(octonion<T> const & o); |
---|
| 147 | |
---|
| 148 | template<typename T> octonion<T> ``[link boost_math.octonions.octonions_transcendentals.pow pow]``(octonion<T> const & o, int n); |
---|
| 149 | |
---|
| 150 | } } // namespaces |
---|
| 151 | |
---|
| 152 | [endsect] |
---|
| 153 | |
---|
| 154 | [section Template Class octonion] |
---|
| 155 | |
---|
| 156 | namespace boost{ namespace math { |
---|
| 157 | |
---|
| 158 | template<typename T> |
---|
| 159 | class octonion |
---|
| 160 | { |
---|
| 161 | public: |
---|
| 162 | typedef T value_type; |
---|
| 163 | |
---|
| 164 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(T const & requested_a = T(), T const & requested_b = T(), T const & requested_c = T(), T const & requested_d = T(), T const & requested_e = T(), T const & requested_f = T(), T const & requested_g = T(), T const & requested_h = T()); |
---|
| 165 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(::std::complex<T> const & z0, ::std::complex<T> const & z1 = ::std::complex<T>(), ::std::complex<T> const & z2 = ::std::complex<T>(), ::std::complex<T> const & z3 = ::std::complex<T>()); |
---|
| 166 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(::boost::math::quaternion<T> const & q0, ::boost::math::quaternion<T> const & q1 = ::boost::math::quaternion<T>()); |
---|
| 167 | template<typename X> |
---|
| 168 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<X> const & a_recopier); |
---|
| 169 | |
---|
| 170 | T ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts real]``() const; |
---|
| 171 | octonion<T> ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts unreal]``() const; |
---|
| 172 | |
---|
| 173 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_1]``() const; |
---|
| 174 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_2]``() const; |
---|
| 175 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_3]``() const; |
---|
| 176 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_4]``() const; |
---|
| 177 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_5]``() const; |
---|
| 178 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_6]``() const; |
---|
| 179 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_7]``() const; |
---|
| 180 | T ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_8]``() const; |
---|
| 181 | |
---|
| 182 | ::std::complex<T> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_1]``() const; |
---|
| 183 | ::std::complex<T> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_2]``() const; |
---|
| 184 | ::std::complex<T> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_3]``() const; |
---|
| 185 | ::std::complex<T> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_4]``() const; |
---|
| 186 | |
---|
| 187 | ::boost::math::quaternion<T> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_1]``() const; |
---|
| 188 | ::boost::math::quaternion<T> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_2]``() const; |
---|
| 189 | |
---|
| 190 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<T> const & a_affecter); |
---|
| 191 | template<typename X> |
---|
| 192 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<X> const & a_affecter); |
---|
| 193 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (T const & a_affecter); |
---|
| 194 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::std::complex<T> const & a_affecter); |
---|
| 195 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::boost::math::quaternion<T> const & a_affecter); |
---|
| 196 | |
---|
| 197 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (T const & rhs); |
---|
| 198 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::std::complex<T> const & rhs); |
---|
| 199 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::boost::math::quaternion<T> const & rhs); |
---|
| 200 | template<typename X> |
---|
| 201 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (octonion<X> const & rhs); |
---|
| 202 | |
---|
| 203 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (T const & rhs); |
---|
| 204 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::std::complex<T> const & rhs); |
---|
| 205 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::boost::math::quaternion<T> const & rhs); |
---|
| 206 | template<typename X> |
---|
| 207 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (octonion<X> const & rhs); |
---|
| 208 | |
---|
| 209 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (T const & rhs); |
---|
| 210 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::std::complex<T> const & rhs); |
---|
| 211 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::boost::math::quaternion<T> const & rhs); |
---|
| 212 | template<typename X> |
---|
| 213 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (octonion<X> const & rhs); |
---|
| 214 | |
---|
| 215 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (T const & rhs); |
---|
| 216 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::std::complex<T> const & rhs); |
---|
| 217 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::boost::math::quaternion<T> const & rhs); |
---|
| 218 | template<typename X> |
---|
| 219 | octonion<T> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (octonion<X> const & rhs); |
---|
| 220 | }; |
---|
| 221 | |
---|
| 222 | } } // namespaces |
---|
| 223 | |
---|
| 224 | [endsect] |
---|
| 225 | |
---|
| 226 | [section Octonion Specializations] |
---|
| 227 | |
---|
| 228 | namespace boost{ namespace math{ |
---|
| 229 | |
---|
| 230 | template<> |
---|
| 231 | class octonion<float> |
---|
| 232 | { |
---|
| 233 | public: |
---|
| 234 | typedef float value_type; |
---|
| 235 | |
---|
| 236 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(float const & requested_a = 0.0f, float const & requested_b = 0.0f, float const & requested_c = 0.0f, float const & requested_d = 0.0f, float const & requested_e = 0.0f, float const & requested_f = 0.0f, float const & requested_g = 0.0f, float const & requested_h = 0.0f); |
---|
| 237 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(::std::complex<float> const & z0, ::std::complex<float> const & z1 = ::std::complex<float>(), ::std::complex<float> const & z2 = ::std::complex<float>(), ::std::complex<float> const & z3 = ::std::complex<float>()); |
---|
| 238 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(::boost::math::quaternion<float> const & q0, ::boost::math::quaternion<float> const & q1 = ::boost::math::quaternion<float>()); |
---|
| 239 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<double> const & a_recopier); |
---|
| 240 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<long double> const & a_recopier); |
---|
| 241 | |
---|
| 242 | float ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts real]``() const; |
---|
| 243 | octonion<float> ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts unreal]``() const; |
---|
| 244 | |
---|
| 245 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_1]``() const; |
---|
| 246 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_2]``() const; |
---|
| 247 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_3]``() const; |
---|
| 248 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_4]``() const; |
---|
| 249 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_5]``() const; |
---|
| 250 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_6]``() const; |
---|
| 251 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_7]``() const; |
---|
| 252 | float ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_8]``() const; |
---|
| 253 | |
---|
| 254 | ::std::complex<float> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_1]``() const; |
---|
| 255 | ::std::complex<float> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_2]``() const; |
---|
| 256 | ::std::complex<float> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_3]``() const; |
---|
| 257 | ::std::complex<float> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_4]``() const; |
---|
| 258 | |
---|
| 259 | ::boost::math::quaternion<float> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_1]``() const; |
---|
| 260 | ::boost::math::quaternion<float> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_2]``() const; |
---|
| 261 | |
---|
| 262 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<float> const & a_affecter); |
---|
| 263 | template<typename X> |
---|
| 264 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<X> const & a_affecter); |
---|
| 265 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (float const & a_affecter); |
---|
| 266 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::std::complex<float> const & a_affecter); |
---|
| 267 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::boost::math::quaternion<float> const & a_affecter); |
---|
| 268 | |
---|
| 269 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (float const & rhs); |
---|
| 270 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::std::complex<float> const & rhs); |
---|
| 271 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::boost::math::quaternion<float> const & rhs); |
---|
| 272 | template<typename X> |
---|
| 273 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (octonion<X> const & rhs); |
---|
| 274 | |
---|
| 275 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (float const & rhs); |
---|
| 276 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::std::complex<float> const & rhs); |
---|
| 277 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::boost::math::quaternion<float> const & rhs); |
---|
| 278 | template<typename X> |
---|
| 279 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (octonion<X> const & rhs); |
---|
| 280 | |
---|
| 281 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (float const & rhs); |
---|
| 282 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::std::complex<float> const & rhs); |
---|
| 283 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::boost::math::quaternion<float> const & rhs); |
---|
| 284 | template<typename X> |
---|
| 285 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (octonion<X> const & rhs); |
---|
| 286 | |
---|
| 287 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (float const & rhs); |
---|
| 288 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::std::complex<float> const & rhs); |
---|
| 289 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::boost::math::quaternion<float> const & rhs); |
---|
| 290 | template<typename X> |
---|
| 291 | octonion<float> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (octonion<X> const & rhs); |
---|
| 292 | }; |
---|
| 293 | |
---|
| 294 | [#boost_math.octonion_double] |
---|
| 295 | |
---|
| 296 | template<> |
---|
| 297 | class octonion<double> |
---|
| 298 | { |
---|
| 299 | public: |
---|
| 300 | typedef double value_type; |
---|
| 301 | |
---|
| 302 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(double const & requested_a = 0.0, double const & requested_b = 0.0, double const & requested_c = 0.0, double const & requested_d = 0.0, double const & requested_e = 0.0, double const & requested_f = 0.0, double const & requested_g = 0.0, double const & requested_h = 0.0); |
---|
| 303 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(::std::complex<double> const & z0, ::std::complex<double> const & z1 = ::std::complex<double>(), ::std::complex<double> const & z2 = ::std::complex<double>(), ::std::complex<double> const & z3 = ::std::complex<double>()); |
---|
| 304 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(::boost::math::quaternion<double> const & q0, ::boost::math::quaternion<double> const & q1 = ::boost::math::quaternion<double>()); |
---|
| 305 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<float> const & a_recopier); |
---|
| 306 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<long double> const & a_recopier); |
---|
| 307 | |
---|
| 308 | double ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts real]``() const; |
---|
| 309 | octonion<double> ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts unreal]``() const; |
---|
| 310 | |
---|
| 311 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_1]``() const; |
---|
| 312 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_2]``() const; |
---|
| 313 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_3]``() const; |
---|
| 314 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_4]``() const; |
---|
| 315 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_5]``() const; |
---|
| 316 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_6]``() const; |
---|
| 317 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_7]``() const; |
---|
| 318 | double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_8]``() const; |
---|
| 319 | |
---|
| 320 | ::std::complex<double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_1]``() const; |
---|
| 321 | ::std::complex<double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_2]``() const; |
---|
| 322 | ::std::complex<double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_3]``() const; |
---|
| 323 | ::std::complex<double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_4]``() const; |
---|
| 324 | |
---|
| 325 | ::boost::math::quaternion<double> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_1]``() const; |
---|
| 326 | ::boost::math::quaternion<double> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_2]``() const; |
---|
| 327 | |
---|
| 328 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<double> const & a_affecter); |
---|
| 329 | template<typename X> |
---|
| 330 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<X> const & a_affecter); |
---|
| 331 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (double const & a_affecter); |
---|
| 332 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::std::complex<double> const & a_affecter); |
---|
| 333 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::boost::math::quaternion<double> const & a_affecter); |
---|
| 334 | |
---|
| 335 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (double const & rhs); |
---|
| 336 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::std::complex<double> const & rhs); |
---|
| 337 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::boost::math::quaternion<double> const & rhs); |
---|
| 338 | template<typename X> |
---|
| 339 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (octonion<X> const & rhs); |
---|
| 340 | |
---|
| 341 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (double const & rhs); |
---|
| 342 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::std::complex<double> const & rhs); |
---|
| 343 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::boost::math::quaternion<double> const & rhs); |
---|
| 344 | template<typename X> |
---|
| 345 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (octonion<X> const & rhs); |
---|
| 346 | |
---|
| 347 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (double const & rhs); |
---|
| 348 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::std::complex<double> const & rhs); |
---|
| 349 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::boost::math::quaternion<double> const & rhs); |
---|
| 350 | template<typename X> |
---|
| 351 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (octonion<X> const & rhs); |
---|
| 352 | |
---|
| 353 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (double const & rhs); |
---|
| 354 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::std::complex<double> const & rhs); |
---|
| 355 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::boost::math::quaternion<double> const & rhs); |
---|
| 356 | template<typename X> |
---|
| 357 | octonion<double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (octonion<X> const & rhs); |
---|
| 358 | }; |
---|
| 359 | |
---|
| 360 | [#boost_math.octonion_long_double] |
---|
| 361 | |
---|
| 362 | template<> |
---|
| 363 | class octonion<long double> |
---|
| 364 | { |
---|
| 365 | public: |
---|
| 366 | typedef long double value_type; |
---|
| 367 | |
---|
| 368 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(long double const & requested_a = 0.0L, long double const & requested_b = 0.0L, long double const & requested_c = 0.0L, long double const & requested_d = 0.0L, long double const & requested_e = 0.0L, long double const & requested_f = 0.0L, long double const & requested_g = 0.0L, long double const & requested_h = 0.0L); |
---|
| 369 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``( ::std::complex<long double> const & z0, ::std::complex<long double> const & z1 = ::std::complex<long double>(), ::std::complex<long double> const & z2 = ::std::complex<long double>(), ::std::complex<long double> const & z3 = ::std::complex<long double>()); |
---|
| 370 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``( ::boost::math::quaternion<long double> const & q0, ::boost::math::quaternion<long double> const & z1 = ::boost::math::quaternion<long double>()); |
---|
| 371 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<float> const & a_recopier); |
---|
| 372 | explicit ``[link boost_math.octonions.octonion_member_functions.constructors octonion]``(octonion<double> const & a_recopier); |
---|
| 373 | |
---|
| 374 | long double ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts real]``() const; |
---|
| 375 | octonion<long double> ``[link boost_math.octonions.octonion_member_functions.real_and_unreal_parts unreal]``() const; |
---|
| 376 | |
---|
| 377 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_1]``() const; |
---|
| 378 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_2]``() const; |
---|
| 379 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_3]``() const; |
---|
| 380 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_4]``() const; |
---|
| 381 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_5]``() const; |
---|
| 382 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_6]``() const; |
---|
| 383 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_7]``() const; |
---|
| 384 | long double ``[link boost_math.octonions.octonion_member_functions.individual_real_components R_component_8]``() const; |
---|
| 385 | |
---|
| 386 | ::std::complex<long double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_1]``() const; |
---|
| 387 | ::std::complex<long double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_2]``() const; |
---|
| 388 | ::std::complex<long double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_3]``() const; |
---|
| 389 | ::std::complex<long double> ``[link boost_math.octonions.octonion_member_functions.individual_complex_components C_component_4]``() const; |
---|
| 390 | |
---|
| 391 | ::boost::math::quaternion<long double> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_1]``() const; |
---|
| 392 | ::boost::math::quaternion<long double> ``[link boost_math.octonions.octonion_member_functions.individual_quaternion_components H_component_2]``() const; |
---|
| 393 | |
---|
| 394 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<long double> const & a_affecter); |
---|
| 395 | template<typename X> |
---|
| 396 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (octonion<X> const & a_affecter); |
---|
| 397 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (long double const & a_affecter); |
---|
| 398 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::std::complex<long double> const & a_affecter); |
---|
| 399 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.assignment_operators operator =]`` (::boost::math::quaternion<long double> const & a_affecter); |
---|
| 400 | |
---|
| 401 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (long double const & rhs); |
---|
| 402 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::std::complex<long double> const & rhs); |
---|
| 403 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (::boost::math::quaternion<long double> const & rhs); |
---|
| 404 | template<typename X> |
---|
| 405 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator +=]`` (octonion<X> const & rhs); |
---|
| 406 | |
---|
| 407 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (long double const & rhs); |
---|
| 408 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::std::complex<long double> const & rhs); |
---|
| 409 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (::boost::math::quaternion<long double> const & rhs); |
---|
| 410 | template<typename X> |
---|
| 411 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator -=]`` (octonion<X> const & rhs); |
---|
| 412 | |
---|
| 413 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (long double const & rhs); |
---|
| 414 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::std::complex<long double> const & rhs); |
---|
| 415 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (::boost::math::quaternion<long double> const & rhs); |
---|
| 416 | template<typename X> |
---|
| 417 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator *=]`` (octonion<X> const & rhs); |
---|
| 418 | |
---|
| 419 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (long double const & rhs); |
---|
| 420 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::std::complex<long double> const & rhs); |
---|
| 421 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (::boost::math::quaternion<long double> const & rhs); |
---|
| 422 | template<typename X> |
---|
| 423 | octonion<long double> & ``[link boost_math.octonions.octonion_member_functions.other_member_operators operator /=]`` (octonion<X> const & rhs); |
---|
| 424 | }; |
---|
| 425 | |
---|
| 426 | } } // namespaces |
---|
| 427 | |
---|
| 428 | [endsect] |
---|
| 429 | |
---|
| 430 | [section Octonion Member Typedefs] |
---|
| 431 | |
---|
| 432 | [*value_type] |
---|
| 433 | |
---|
| 434 | Template version: |
---|
| 435 | |
---|
| 436 | typedef T value_type; |
---|
| 437 | |
---|
| 438 | Float specialization version: |
---|
| 439 | |
---|
| 440 | typedef float value_type; |
---|
| 441 | |
---|
| 442 | Double specialization version: |
---|
| 443 | |
---|
| 444 | typedef double value_type; |
---|
| 445 | |
---|
| 446 | Long double specialization version: |
---|
| 447 | |
---|
| 448 | typedef long double value_type; |
---|
| 449 | |
---|
| 450 | These provide easy acces to the type the template is built upon. |
---|
| 451 | |
---|
| 452 | [endsect] |
---|
| 453 | |
---|
| 454 | [section Octonion Member Functions] |
---|
| 455 | |
---|
| 456 | [h3 Constructors] |
---|
| 457 | |
---|
| 458 | Template version: |
---|
| 459 | |
---|
| 460 | explicit octonion(T const & requested_a = T(), T const & requested_b = T(), T const & requested_c = T(), T const & requested_d = T(), T const & requested_e = T(), T const & requested_f = T(), T const & requested_g = T(), T const & requested_h = T()); |
---|
| 461 | explicit octonion(::std::complex<T> const & z0, ::std::complex<T> const & z1 = ::std::complex<T>(), ::std::complex<T> const & z2 = ::std::complex<T>(), ::std::complex<T> const & z3 = ::std::complex<T>()); |
---|
| 462 | explicit octonion(::boost::math::quaternion<T> const & q0, ::boost::math::quaternion<T> const & q1 = ::boost::math::quaternion<T>()); |
---|
| 463 | template<typename X> |
---|
| 464 | explicit octonion(octonion<X> const & a_recopier); |
---|
| 465 | |
---|
| 466 | Float specialization version: |
---|
| 467 | |
---|
| 468 | explicit octonion(float const & requested_a = 0.0f, float const & requested_b = 0.0f, float const & requested_c = 0.0f, float const & requested_d = 0.0f, float const & requested_e = 0.0f, float const & requested_f = 0.0f, float const & requested_g = 0.0f, float const & requested_h = 0.0f); |
---|
| 469 | explicit octonion(::std::complex<float> const & z0, ::std::complex<float> const & z1 = ::std::complex<float>(), ::std::complex<float> const & z2 = ::std::complex<float>(), ::std::complex<float> const & z3 = ::std::complex<float>()); |
---|
| 470 | explicit octonion(::boost::math::quaternion<float> const & q0, ::boost::math::quaternion<float> const & q1 = ::boost::math::quaternion<float>()); |
---|
| 471 | explicit octonion(octonion<double> const & a_recopier); |
---|
| 472 | explicit octonion(octonion<long double> const & a_recopier); |
---|
| 473 | |
---|
| 474 | Double specialization version: |
---|
| 475 | |
---|
| 476 | explicit octonion(double const & requested_a = 0.0, double const & requested_b = 0.0, double const & requested_c = 0.0, double const & requested_d = 0.0, double const & requested_e = 0.0, double const & requested_f = 0.0, double const & requested_g = 0.0, double const & requested_h = 0.0); |
---|
| 477 | explicit octonion(::std::complex<double> const & z0, ::std::complex<double> const & z1 = ::std::complex<double>(), ::std::complex<double> const & z2 = ::std::complex<double>(), ::std::complex<double> const & z3 = ::std::complex<double>()); |
---|
| 478 | explicit octonion(::boost::math::quaternion<double> const & q0, ::boost::math::quaternion<double> const & q1 = ::boost::math::quaternion<double>()); |
---|
| 479 | explicit octonion(octonion<float> const & a_recopier); |
---|
| 480 | explicit octonion(octonion<long double> const & a_recopier); |
---|
| 481 | |
---|
| 482 | Long double specialization version: |
---|
| 483 | |
---|
| 484 | explicit octonion(long double const & requested_a = 0.0L, long double const & requested_b = 0.0L, long double const & requested_c = 0.0L, long double const & requested_d = 0.0L, long double const & requested_e = 0.0L, long double const & requested_f = 0.0L, long double const & requested_g = 0.0L, long double const & requested_h = 0.0L); |
---|
| 485 | explicit octonion( ::std::complex<long double> const & z0, ::std::complex<long double> const & z1 = ::std::complex<long double>(), ::std::complex<long double> const & z2 = ::std::complex<long double>(), ::std::complex<long double> const & z3 = ::std::complex<long double>()); |
---|
| 486 | explicit octonion(::boost::math::quaternion<long double> const & q0, ::boost::math::quaternion<long double> const & q1 = ::boost::math::quaternion<long double>()); |
---|
| 487 | explicit octonion(octonion<float> const & a_recopier); |
---|
| 488 | explicit octonion(octonion<double> const & a_recopier); |
---|
| 489 | |
---|
| 490 | A default constructor is provided for each form, which initializes each component |
---|
| 491 | to the default values for their type (i.e. zero for floating numbers). |
---|
| 492 | This constructor can also accept one to eight base type arguments. |
---|
| 493 | A constructor is also provided to build octonions from one to four complex numbers |
---|
| 494 | sharing the same base type, and another taking one or two quaternions |
---|
| 495 | sharing the same base type. The unspecialized template also sports a |
---|
| 496 | templarized copy constructor, while the specialized forms have copy |
---|
| 497 | constructors from the other two specializations, which are explicit |
---|
| 498 | when a risk of precision loss exists. For the unspecialized form, |
---|
| 499 | the base type's constructors must not throw. |
---|
| 500 | |
---|
| 501 | Destructors and untemplated copy constructors (from the same type) |
---|
| 502 | are provided by the compiler. Converting copy constructors make use |
---|
| 503 | of a templated helper function in a "detail" subnamespace. |
---|
| 504 | |
---|
| 505 | [h3 Other member functions] |
---|
| 506 | |
---|
| 507 | [h4 Real and Unreal Parts] |
---|
| 508 | |
---|
| 509 | T real() const; |
---|
| 510 | octonion<T> unreal() const; |
---|
| 511 | |
---|
| 512 | Like complex number, octonions do have a meaningful notion of "real part", |
---|
| 513 | but unlike them there is no meaningful notion of "imaginary part". |
---|
| 514 | Instead there is an "unreal part" which itself is a octonion, |
---|
| 515 | and usually nothing simpler (as opposed to the complex number case). |
---|
| 516 | These are returned by the first two functions. |
---|
| 517 | |
---|
| 518 | [h4 Individual Real Components] |
---|
| 519 | |
---|
| 520 | T R_component_1() const; |
---|
| 521 | T R_component_2() const; |
---|
| 522 | T R_component_3() const; |
---|
| 523 | T R_component_4() const; |
---|
| 524 | T R_component_5() const; |
---|
| 525 | T R_component_6() const; |
---|
| 526 | T R_component_7() const; |
---|
| 527 | T R_component_8() const; |
---|
| 528 | |
---|
| 529 | A octonion having eight real components, these are returned by |
---|
| 530 | these eight functions. Hence real and R_component_1 return the same value. |
---|
| 531 | |
---|
| 532 | [h4 Individual Complex Components] |
---|
| 533 | |
---|
| 534 | ::std::complex<T> C_component_1() const; |
---|
| 535 | ::std::complex<T> C_component_2() const; |
---|
| 536 | ::std::complex<T> C_component_3() const; |
---|
| 537 | ::std::complex<T> C_component_4() const; |
---|
| 538 | |
---|
| 539 | A octonion likewise has four complex components. Actually, octonions |
---|
| 540 | are indeed a (left) vector field over the complexes, but beware, as |
---|
| 541 | for any octonion __oct_formula we also have __oct_complex_formula |
---|
| 542 | (note the [*minus] sign in the last factor). |
---|
| 543 | What the C_component_n functions return, however, are the complexes |
---|
| 544 | which could be used to build the octonion using the constructor, and |
---|
| 545 | [*not] the components of the octonion on the basis ['[^(1, j, e', j')]]. |
---|
| 546 | |
---|
| 547 | [h4 Individual Quaternion Components] |
---|
| 548 | |
---|
| 549 | ::boost::math::quaternion<T> H_component_1() const; |
---|
| 550 | ::boost::math::quaternion<T> H_component_2() const; |
---|
| 551 | |
---|
| 552 | Likewise, for any octonion __oct_formula we also have __oct_quat_formula, though there |
---|
| 553 | is no meaningful vector-space-like structure based on the quaternions. |
---|
| 554 | What the H_component_n functions return are the quaternions which |
---|
| 555 | could be used to build the octonion using the constructor. |
---|
| 556 | |
---|
| 557 | [h3 Octonion Member Operators] |
---|
| 558 | [h4 Assignment Operators] |
---|
| 559 | |
---|
| 560 | octonion<T> & operator = (octonion<T> const & a_affecter); |
---|
| 561 | template<typename X> |
---|
| 562 | octonion<T> & operator = (octonion<X> const & a_affecter); |
---|
| 563 | octonion<T> & operator = (T const & a_affecter); |
---|
| 564 | octonion<T> & operator = (::std::complex<T> const & a_affecter); |
---|
| 565 | octonion<T> & operator = (::boost::math::quaternion<T> const & a_affecter); |
---|
| 566 | |
---|
| 567 | These perform the expected assignment, with type modification if |
---|
| 568 | necessary (for instance, assigning from a base type will set the |
---|
| 569 | real part to that value, and all other components to zero). |
---|
| 570 | For the unspecialized form, the base type's assignment operators must not throw. |
---|
| 571 | |
---|
| 572 | [h4 Other Member Operators] |
---|
| 573 | |
---|
| 574 | octonion<T> & operator += (T const & rhs) |
---|
| 575 | octonion<T> & operator += (::std::complex<T> const & rhs); |
---|
| 576 | octonion<T> & operator += (::boost::math::quaternion<T> const & rhs); |
---|
| 577 | template<typename X> |
---|
| 578 | octonion<T> & operator += (octonion<X> const & rhs); |
---|
| 579 | |
---|
| 580 | These perform the mathematical operation `(*this)+rhs` and store the result in |
---|
| 581 | `*this`. The unspecialized form has exception guards, which the specialized |
---|
| 582 | forms do not, so as to insure exception safety. For the unspecialized form, |
---|
| 583 | the base type's assignment operators must not throw. |
---|
| 584 | |
---|
| 585 | octonion<T> & operator -= (T const & rhs) |
---|
| 586 | octonion<T> & operator -= (::std::complex<T> const & rhs); |
---|
| 587 | octonion<T> & operator -= (::boost::math::quaternion<T> const & rhs); |
---|
| 588 | template<typename X> |
---|
| 589 | octonion<T> & operator -= (octonion<X> const & rhs); |
---|
| 590 | |
---|
| 591 | These perform the mathematical operation `(*this)-rhs` and store the result |
---|
| 592 | in `*this`. The unspecialized form has exception guards, which the |
---|
| 593 | specialized forms do not, so as to insure exception safety. |
---|
| 594 | For the unspecialized form, the base type's assignment operators must not throw. |
---|
| 595 | |
---|
| 596 | octonion<T> & operator *= (T const & rhs) |
---|
| 597 | octonion<T> & operator *= (::std::complex<T> const & rhs); |
---|
| 598 | octonion<T> & operator *= (::boost::math::quaternion<T> const & rhs); |
---|
| 599 | template<typename X> |
---|
| 600 | octonion<T> & operator *= (octonion<X> const & rhs); |
---|
| 601 | |
---|
| 602 | These perform the mathematical operation `(*this)*rhs` in this order |
---|
| 603 | (order is important as multiplication is not commutative for octonions) |
---|
| 604 | and store the result in `*this`. The unspecialized form has exception guards, |
---|
| 605 | which the specialized forms do not, so as to insure exception safety. |
---|
| 606 | For the unspecialized form, the base type's assignment operators must |
---|
| 607 | not throw. Also, for clarity's sake, you should always group the |
---|
| 608 | factors in a multiplication by groups of two, as the multiplication is |
---|
| 609 | not even associative on the octonions (though there are of course cases |
---|
| 610 | where this does not matter, it usually does). |
---|
| 611 | |
---|
| 612 | octonion<T> & operator /= (T const & rhs) |
---|
| 613 | octonion<T> & operator /= (::std::complex<T> const & rhs); |
---|
| 614 | octonion<T> & operator /= (::boost::math::quaternion<T> const & rhs); |
---|
| 615 | template<typename X> |
---|
| 616 | octonion<T> & operator /= (octonion<X> const & rhs); |
---|
| 617 | |
---|
| 618 | These perform the mathematical operation `(*this)*inverse_of(rhs)` |
---|
| 619 | in this order (order is important as multiplication is not commutative |
---|
| 620 | for octonions) and store the result in `*this`. The unspecialized form |
---|
| 621 | has exception guards, which the specialized forms do not, so as to |
---|
| 622 | insure exception safety. For the unspecialized form, the base |
---|
| 623 | type's assignment operators must not throw. As for the multiplication, |
---|
| 624 | remember to group any two factors using parenthesis. |
---|
| 625 | |
---|
| 626 | [endsect] |
---|
| 627 | |
---|
| 628 | [section Octonion Non-Member Operators] |
---|
| 629 | |
---|
| 630 | [h4 Unary Plus and Minus Operators] |
---|
| 631 | |
---|
| 632 | template<typename T> octonion<T> operator + (octonion<T> const & o); |
---|
| 633 | |
---|
| 634 | This unary operator simply returns o. |
---|
| 635 | |
---|
| 636 | template<typename T> octonion<T> operator - (octonion<T> const & o); |
---|
| 637 | |
---|
| 638 | This unary operator returns the opposite of o. |
---|
| 639 | |
---|
| 640 | [h4 Binary Addition Operators] |
---|
| 641 | |
---|
| 642 | template<typename T> octonion<T> operator + (T const & lhs, octonion<T> const & rhs); |
---|
| 643 | template<typename T> octonion<T> operator + (octonion<T> const & lhs, T const & rhs); |
---|
| 644 | template<typename T> octonion<T> operator + (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 645 | template<typename T> octonion<T> operator + (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 646 | template<typename T> octonion<T> operator + (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 647 | template<typename T> octonion<T> operator + (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 648 | template<typename T> octonion<T> operator + (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 649 | |
---|
| 650 | These operators return `octonion<T>(lhs) += rhs`. |
---|
| 651 | |
---|
| 652 | [h4 Binary Subtraction Operators] |
---|
| 653 | |
---|
| 654 | template<typename T> octonion<T> operator - (T const & lhs, octonion<T> const & rhs); |
---|
| 655 | template<typename T> octonion<T> operator - (octonion<T> const & lhs, T const & rhs); |
---|
| 656 | template<typename T> octonion<T> operator - (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 657 | template<typename T> octonion<T> operator - (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 658 | template<typename T> octonion<T> operator - (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 659 | template<typename T> octonion<T> operator - (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 660 | template<typename T> octonion<T> operator - (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 661 | |
---|
| 662 | These operators return `octonion<T>(lhs) -= rhs`. |
---|
| 663 | |
---|
| 664 | [h4 Binary Multiplication Operators] |
---|
| 665 | |
---|
| 666 | template<typename T> octonion<T> operator * (T const & lhs, octonion<T> const & rhs); |
---|
| 667 | template<typename T> octonion<T> operator * (octonion<T> const & lhs, T const & rhs); |
---|
| 668 | template<typename T> octonion<T> operator * (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 669 | template<typename T> octonion<T> operator * (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 670 | template<typename T> octonion<T> operator * (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 671 | template<typename T> octonion<T> operator * (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 672 | template<typename T> octonion<T> operator * (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 673 | |
---|
| 674 | These operators return `octonion<T>(lhs) *= rhs`. |
---|
| 675 | |
---|
| 676 | [h4 Binary Division Operators] |
---|
| 677 | |
---|
| 678 | template<typename T> octonion<T> operator / (T const & lhs, octonion<T> const & rhs); |
---|
| 679 | template<typename T> octonion<T> operator / (octonion<T> const & lhs, T const & rhs); |
---|
| 680 | template<typename T> octonion<T> operator / (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 681 | template<typename T> octonion<T> operator / (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 682 | template<typename T> octonion<T> operator / (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 683 | template<typename T> octonion<T> operator / (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 684 | template<typename T> octonion<T> operator / (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 685 | |
---|
| 686 | These operators return `octonion<T>(lhs) /= rhs`. It is of course still an |
---|
| 687 | error to divide by zero... |
---|
| 688 | |
---|
| 689 | [h4 Binary Equality Operators] |
---|
| 690 | |
---|
| 691 | template<typename T> bool operator == (T const & lhs, octonion<T> const & rhs); |
---|
| 692 | template<typename T> bool operator == (octonion<T> const & lhs, T const & rhs); |
---|
| 693 | template<typename T> bool operator == (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 694 | template<typename T> bool operator == (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 695 | template<typename T> bool operator == (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 696 | template<typename T> bool operator == (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 697 | template<typename T> bool operator == (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 698 | |
---|
| 699 | These return true if and only if the four components of `octonion<T>(lhs)` |
---|
| 700 | are equal to their counterparts in `octonion<T>(rhs)`. As with any |
---|
| 701 | floating-type entity, this is essentially meaningless. |
---|
| 702 | |
---|
| 703 | [h4 Binary Inequality Operators] |
---|
| 704 | |
---|
| 705 | template<typename T> bool operator != (T const & lhs, octonion<T> const & rhs); |
---|
| 706 | template<typename T> bool operator != (octonion<T> const & lhs, T const & rhs); |
---|
| 707 | template<typename T> bool operator != (::std::complex<T> const & lhs, octonion<T> const & rhs); |
---|
| 708 | template<typename T> bool operator != (octonion<T> const & lhs, ::std::complex<T> const & rhs); |
---|
| 709 | template<typename T> bool operator != (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs); |
---|
| 710 | template<typename T> bool operator != (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs); |
---|
| 711 | template<typename T> bool operator != (octonion<T> const & lhs, octonion<T> const & rhs); |
---|
| 712 | |
---|
| 713 | These return true if and only if `octonion<T>(lhs) == octonion<T>(rhs)` |
---|
| 714 | is false. As with any floating-type entity, this is essentially meaningless. |
---|
| 715 | |
---|
| 716 | [h4 Stream Extractor] |
---|
| 717 | |
---|
| 718 | template<typename T, typename charT, class traits> |
---|
| 719 | ::std::basic_istream<charT,traits> & operator >> (::std::basic_istream<charT,traits> & is, octonion<T> & o); |
---|
| 720 | |
---|
| 721 | Extracts an octonion `o`. We accept any format which seems reasonable. |
---|
| 722 | However, since this leads to a great many ambiguities, decisions were made |
---|
| 723 | to lift these. In case of doubt, stick to lists of reals. |
---|
| 724 | |
---|
| 725 | The input values must be convertible to T. If bad input is encountered, |
---|
| 726 | calls `is.setstate(ios::failbit)` (which may throw `ios::failure` (27.4.5.3)). |
---|
| 727 | |
---|
| 728 | Returns `is`. |
---|
| 729 | |
---|
| 730 | [h4 Stream Inserter] |
---|
| 731 | |
---|
| 732 | template<typename T, typename charT, class traits> |
---|
| 733 | ::std::basic_ostream<charT,traits> & operator << (::std::basic_ostream<charT,traits> & os, octonion<T> const & o); |
---|
| 734 | |
---|
| 735 | Inserts the octonion `o` onto the stream `os` as if it were implemented as follows: |
---|
| 736 | |
---|
| 737 | template<typename T, typename charT, class traits> |
---|
| 738 | ::std::basic_ostream<charT,traits> & operator << ( ::std::basic_ostream<charT,traits> & os, |
---|
| 739 | octonion<T> const & o) |
---|
| 740 | { |
---|
| 741 | ::std::basic_ostringstream<charT,traits> s; |
---|
| 742 | |
---|
| 743 | s.flags(os.flags()); |
---|
| 744 | s.imbue(os.getloc()); |
---|
| 745 | s.precision(os.precision()); |
---|
| 746 | |
---|
| 747 | s << '(' << o.R_component_1() << ',' |
---|
| 748 | << o.R_component_2() << ',' |
---|
| 749 | << o.R_component_3() << ',' |
---|
| 750 | << o.R_component_4() << ',' |
---|
| 751 | << o.R_component_5() << ',' |
---|
| 752 | << o.R_component_6() << ',' |
---|
| 753 | << o.R_component_7() << ',' |
---|
| 754 | << o.R_component_8() << ')'; |
---|
| 755 | |
---|
| 756 | return os << s.str(); |
---|
| 757 | } |
---|
| 758 | |
---|
| 759 | [endsect] |
---|
| 760 | |
---|
| 761 | [section Octonion Value Operations] |
---|
| 762 | |
---|
| 763 | [h4 Real and Unreal] |
---|
| 764 | |
---|
| 765 | template<typename T> T real(octonion<T> const & o); |
---|
| 766 | template<typename T> octonion<T> unreal(octonion<T> const & o); |
---|
| 767 | |
---|
| 768 | These return `o.real()` and `o.unreal()` respectively. |
---|
| 769 | |
---|
| 770 | [h4 conj] |
---|
| 771 | |
---|
| 772 | template<typename T> octonion<T> conj(octonion<T> const & o); |
---|
| 773 | |
---|
| 774 | This returns the conjugate of the octonion. |
---|
| 775 | |
---|
| 776 | [h4 sup] |
---|
| 777 | |
---|
| 778 | template<typename T> T sup(octonion<T> const & o); |
---|
| 779 | |
---|
| 780 | This return the sup norm (the greatest among |
---|
| 781 | `abs(o.R_component_1())...abs(o.R_component_8()))` of the octonion. |
---|
| 782 | |
---|
| 783 | [h4 l1] |
---|
| 784 | |
---|
| 785 | template<typename T> T l1(octonion<T> const & o); |
---|
| 786 | |
---|
| 787 | This return the l1 norm (`abs(o.R_component_1())+...+abs(o.R_component_8())`) |
---|
| 788 | of the octonion. |
---|
| 789 | |
---|
| 790 | [h4 abs] |
---|
| 791 | |
---|
| 792 | template<typename T> T abs(octonion<T> const & o); |
---|
| 793 | |
---|
| 794 | This return the magnitude (Euclidian norm) of the octonion. |
---|
| 795 | |
---|
| 796 | [h4 norm] |
---|
| 797 | |
---|
| 798 | template<typename T> T norm(octonion<T>const & o); |
---|
| 799 | |
---|
| 800 | This return the (Cayley) norm of the octonion. The term "norm" might |
---|
| 801 | be confusing, as most people associate it with the Euclidian norm |
---|
| 802 | (and quadratic functionals). For this version of (the mathematical |
---|
| 803 | objects known as) octonions, the Euclidian norm (also known as |
---|
| 804 | magnitude) is the square root of the Cayley norm. |
---|
| 805 | |
---|
| 806 | [endsect] |
---|
| 807 | |
---|
| 808 | [section Quaternion Creation Functions] |
---|
| 809 | |
---|
| 810 | template<typename T> octonion<T> spherical(T const & rho, T const & theta, T const & phi1, T const & phi2, T const & phi3, T const & phi4, T const & phi5, T const & phi6); |
---|
| 811 | template<typename T> octonion<T> multipolar(T const & rho1, T const & theta1, T const & rho2, T const & theta2, T const & rho3, T const & theta3, T const & rho4, T const & theta4); |
---|
| 812 | template<typename T> octonion<T> cylindrical(T const & r, T const & angle, T const & h1, T const & h2, T const & h3, T const & h4, T const & h5, T const & h6); |
---|
| 813 | |
---|
| 814 | These build octonions in a way similar to the way polar builds |
---|
| 815 | complex numbers, as there is no strict equivalent to |
---|
| 816 | polar coordinates for octonions. |
---|
| 817 | |
---|
| 818 | `spherical` is a simple transposition of `polar`, it takes as inputs a |
---|
| 819 | (positive) magnitude and a point on the hypersphere, given |
---|
| 820 | by three angles. The first of these, ['theta] has a natural range of |
---|
| 821 | -pi to +pi, and the other two have natural ranges of |
---|
| 822 | -pi/2 to +pi/2 (as is the case with the usual spherical |
---|
| 823 | coordinates in __R3). Due to the many symmetries and periodicities, |
---|
| 824 | nothing untoward happens if the magnitude is negative or the angles are |
---|
| 825 | outside their natural ranges. The expected degeneracies (a magnitude of |
---|
| 826 | zero ignores the angles settings...) do happen however. |
---|
| 827 | |
---|
| 828 | `cylindrical` is likewise a simple transposition of the usual |
---|
| 829 | cylindrical coordinates in __R3, which in turn is another derivative of |
---|
| 830 | planar polar coordinates. The first two inputs are the polar |
---|
| 831 | coordinates of the first __C component of the octonion. The third and |
---|
| 832 | fourth inputs are placed into the third and fourth __R components of the |
---|
| 833 | octonion, respectively. |
---|
| 834 | |
---|
| 835 | `multipolar` is yet another simple generalization of polar coordinates. |
---|
| 836 | This time, both __C components of the octonion are given in polar coordinates. |
---|
| 837 | |
---|
| 838 | In this version of our implementation of octonions, there is no |
---|
| 839 | analogue of the complex value operation arg as the situation is |
---|
| 840 | somewhat more complicated. |
---|
| 841 | |
---|
| 842 | [endsect] |
---|
| 843 | |
---|
| 844 | [section Octonions Transcendentals] |
---|
| 845 | |
---|
| 846 | There is no `log` or `sqrt` provided for octonions in this implementation, |
---|
| 847 | and `pow` is likewise restricted to integral powers of the exponent. |
---|
| 848 | There are several reasons to this: on the one hand, the equivalent of |
---|
| 849 | analytic continuation for octonions ("branch cuts") remains to be |
---|
| 850 | investigated thoroughly (by me, at any rate...), and we wish to avoid |
---|
| 851 | the nonsense introduced in the standard by exponentiations of |
---|
| 852 | complexes by complexes (which is well defined, but not in the standard...). |
---|
| 853 | Talking of nonsense, saying that `pow(0,0)` is "implementation defined" is |
---|
| 854 | just plain brain-dead... |
---|
| 855 | |
---|
| 856 | We do, however provide several transcendentals, chief among which is |
---|
| 857 | the exponential. That it allows for a "closed formula" is a result |
---|
| 858 | of the author (the existence and definition of the exponential, on the |
---|
| 859 | octonions among others, on the other hand, is a few centuries old). |
---|
| 860 | Basically, any converging power series with real coefficients which |
---|
| 861 | allows for a closed formula in __C can be transposed to __O. More |
---|
| 862 | transcendentals of this type could be added in a further revision upon |
---|
| 863 | request. It should be noted that it is these functions which force the |
---|
| 864 | dependency upon the |
---|
| 865 | [@../../boost/math/special_functions/sinc.hpp boost/math/special_functions/sinc.hpp] |
---|
| 866 | and the |
---|
| 867 | [@../../boost/math/special_functions/sinhc.hpp boost/math/special_functions/sinhc.hpp] |
---|
| 868 | headers. |
---|
| 869 | |
---|
| 870 | [h4 exp] |
---|
| 871 | |
---|
| 872 | template<typename T> |
---|
| 873 | octonion<T> exp(octonion<T> const & o); |
---|
| 874 | |
---|
| 875 | Computes the exponential of the octonion. |
---|
| 876 | |
---|
| 877 | [h4 cos] |
---|
| 878 | |
---|
| 879 | template<typename T> |
---|
| 880 | octonion<T> cos(octonion<T> const & o); |
---|
| 881 | |
---|
| 882 | Computes the cosine of the octonion |
---|
| 883 | |
---|
| 884 | [h4 sin] |
---|
| 885 | |
---|
| 886 | template<typename T> |
---|
| 887 | octonion<T> sin(octonion<T> const & o); |
---|
| 888 | |
---|
| 889 | Computes the sine of the octonion. |
---|
| 890 | |
---|
| 891 | [h4 tan] |
---|
| 892 | |
---|
| 893 | template<typename T> |
---|
| 894 | octonion<T> tan(octonion<T> const & o); |
---|
| 895 | |
---|
| 896 | Computes the tangent of the octonion. |
---|
| 897 | |
---|
| 898 | [h4 cosh] |
---|
| 899 | |
---|
| 900 | template<typename T> |
---|
| 901 | octonion<T> cosh(octonion<T> const & o); |
---|
| 902 | |
---|
| 903 | Computes the hyperbolic cosine of the octonion. |
---|
| 904 | |
---|
| 905 | [h4 sinh] |
---|
| 906 | |
---|
| 907 | template<typename T> |
---|
| 908 | octonion<T> sinh(octonion<T> const & o); |
---|
| 909 | |
---|
| 910 | Computes the hyperbolic sine of the octonion. |
---|
| 911 | |
---|
| 912 | [h4 tanh] |
---|
| 913 | |
---|
| 914 | template<typename T> |
---|
| 915 | octonion<T> tanh(octonion<T> const & o); |
---|
| 916 | |
---|
| 917 | Computes the hyperbolic tangent of the octonion. |
---|
| 918 | |
---|
| 919 | [h4 pow] |
---|
| 920 | |
---|
| 921 | template<typename T> |
---|
| 922 | octonion<T> pow(octonion<T> const & o, int n); |
---|
| 923 | |
---|
| 924 | Computes the n-th power of the octonion q. |
---|
| 925 | |
---|
| 926 | [endsect] |
---|
| 927 | |
---|
| 928 | [section Test Program] |
---|
| 929 | |
---|
| 930 | The [@../../libs/math/octonion/octonion_test.cpp octonion_test.cpp] |
---|
| 931 | test program tests octonions specialisations for float, double and long double |
---|
| 932 | ([@../../libs/math/octonion/output.txt sample output]). |
---|
| 933 | |
---|
| 934 | If you define the symbol BOOST_OCTONION_TEST_VERBOSE, you will get additional |
---|
| 935 | output ([@../../libs/math/octonion/output_more.txt verbose output]); this will |
---|
| 936 | only be helpfull if you enable message output at the same time, of course |
---|
| 937 | (by uncommenting the relevant line in the test or by adding --log_level=messages |
---|
| 938 | to your command line,...). In that case, and if you are running interactively, |
---|
| 939 | you may in addition define the symbol BOOST_INTERACTIVE_TEST_INPUT_ITERATOR to |
---|
| 940 | interactively test the input operator with input of your choice from the |
---|
| 941 | standard input (instead of hard-coding it in the test). |
---|
| 942 | |
---|
| 943 | [endsect] |
---|
| 944 | |
---|
| 945 | [section Acknowledgements] |
---|
| 946 | |
---|
| 947 | The mathematical text has been typeset with |
---|
| 948 | [@http://www.nisus-soft.com/ Nisus Writer]. |
---|
| 949 | Jens Maurer has helped with portability and standard adherence, and was the |
---|
| 950 | Review Manager for this library. More acknowledgements in the |
---|
| 951 | History section. Thank you to all who contributed to the discussion about this library. |
---|
| 952 | |
---|
| 953 | [endsect] |
---|
| 954 | |
---|
| 955 | [section History] |
---|
| 956 | |
---|
| 957 | * 1.5.8 - 17/12/2005: Converted documentation to Quickbook Format. |
---|
| 958 | * 1.5.7 - 25/02/2003: transitionned to the unit test framework; <boost/config.hpp> now included by the library header (rather than the test files), via <boost/math/quaternion.hpp>. |
---|
| 959 | * 1.5.6 - 15/10/2002: Gcc2.95.x and stlport on linux compatibility by Alkis Evlogimenos (alkis@routescience.com). |
---|
| 960 | * 1.5.5 - 27/09/2002: Microsoft VCPP 7 compatibility, by Michael Stevens (michael@acfr.usyd.edu.au); requires the /Za compiler option. |
---|
| 961 | * 1.5.4 - 19/09/2002: fixed problem with multiple inclusion (in different translation units); attempt at an improved compatibility with Microsoft compilers, by Michael Stevens (michael@acfr.usyd.edu.au) and Fredrik Blomqvist; other compatibility fixes. |
---|
| 962 | * 1.5.3 - 01/02/2002: bugfix and Gcc 2.95.3 compatibility by Douglas Gregor (gregod@cs.rpi.edu). |
---|
| 963 | * 1.5.2 - 07/07/2001: introduced namespace math. |
---|
| 964 | * 1.5.1 - 07/06/2001: (end of Boost review) now includes <boost/math/special_functions/sinc.hpp> and <boost/math/special_functions/sinhc.hpp> instead of <boost/special_functions.hpp>; corrected bug in sin (Daryle Walker); removed check for self-assignment (Gary Powel); made converting functions explicit (Gary Powel); added overflow guards for division operators and abs (Peter Schmitteckert); added sup and l1; used Vesa Karvonen's CPP metaprograming technique to simplify code. |
---|
| 965 | * 1.5.0 - 23/03/2001: boostification, inlining of all operators except input, output and pow, fixed exception safety of some members (template version). |
---|
| 966 | * 1.4.0 - 09/01/2001: added tan and tanh. |
---|
| 967 | * 1.3.1 - 08/01/2001: cosmetic fixes. |
---|
| 968 | * 1.3.0 - 12/07/2000: pow now uses Maarten Hilferink's (mhilferink@tip.nl) algorithm. |
---|
| 969 | * 1.2.0 - 25/05/2000: fixed the division operators and output; changed many signatures. |
---|
| 970 | * 1.1.0 - 23/05/2000: changed sinc into sinc_pi; added sin, cos, sinh, cosh. |
---|
| 971 | * 1.0.0 - 10/08/1999: first public version. |
---|
| 972 | |
---|
| 973 | [endsect] |
---|
| 974 | |
---|
| 975 | [section To Do] |
---|
| 976 | |
---|
| 977 | * Improve testing. |
---|
| 978 | * Rewrite input operatore using Spirit (creates a dependency). |
---|
| 979 | * Put in place an Expression Template mechanism (perhaps borrowing from uBlas). |
---|
| 980 | |
---|
| 981 | [endsect] |
---|
| 982 | |
---|
| 983 | [endsect] |
---|