Quaternionen vormen een uitbreiding van de complexe getallen1. Ze werden in 1843 bedacht door de Ierse wiskundige William Rowan Hamilton2 voor toepassing in de mechanica. Het symbool $$\mathbb{H}$$ voor de verzameling van alle quaternionen is dan ook een verwijzing naar hem. Net zoals complexe getallen een tweedimensionale uitbreiding zijn van de reële getallen3, zijn quaternionen een tweedimensionale uitbreiding van de complexe getallen en daarmee dus een vierdimensionale uitbreiding van de reële getallen.
In computerprogramma's worden meestal quaternionen gebruikt om rotaties in een driedimensionale ruimte te beschrijven. Daarmee gaat dit veel beter dan met eulerhoeken (rollen, stampen, gieren) omdat kleine veranderingen van oriëntatie altijd leiden tot kleine veranderingen in de vier coördinaten van quaternionen, waar eulerhoeken soms plotseling van 359° naar 1° verspringen met alle problemen van dien. In de ruimtevaart worden ze bijvoorbeeld gebruikt om twee ruimtevaartuigen aan elkaar te koppelen, in de automobielindustrie om met computervisie de bewegingen van robotarmen aan te sturen en uiteraard ook in driedimensonale computerspellen.
Een quaternion is een uitdrukking van de vorm
$$q = a + bi + cj + dk$$
waarin $$a$$, $$b$$, $$c$$ en $$d$$ reële getallen zijn en waarin naast de eenheden $$1$$ en de imaginaire eenheid $$i$$ die al bekend zijn uit de complexe getallen, en waarvoor geldt dat
$$1^2 = 1, 1i = i1 = i, i^2 = -1$$
nog twee eenheden $$j$$ en $$k$$ voorkomen die voldoen aan de relaties
$$j^2 = k^2 = ijk = -1$$
$$1j = j1 = j$$
$$1k = k1 = k$$
$$ij = -ji = k$$
$$jk = -kj = i$$
$$ki = -ik = j$$
Net als bij complexe getallen kan er een norm $$|q|$$ aan een quaternion $$q$$ toegekend worden
$$|q| = \sqrt{a^2 + b^2 + c^2 + d^2}$$
Voor de optelling van twee quaternionen $$q_1 = a_1 + b_1i + c_1j + d_1k$$ en $$q_2 = a_2 + b_2i + c_2j + d_2k$$ geldt dat
$$\begin{align} q_1 + q_2 & = (a_1 + b_1i + c_1j + d_1k) + (a_2 + b_2i + c_2j + d_2k) \\ & = (a_1 + a_2) + (b_1 + b_2)i + (c_1 + c_2)j + (d_1 + d_2)k \end{align}$$
De optelling is zowel commutatief als associatief. De vermenigvulding is distributief over de optelling. Dat houdt in dat het product van de som van de termen gelijk is aan de som van de producten van de afzonderlijke termen. Het product van twee quaternionen $$q_1$$ en $$q_2$$ kan dus op de gebruikelijke manier termsgewijs berekend worden
$$\begin{align} q_1 q_2 & = (a_1 + b_1i + c_1j + d_1k)(a_2 + b_2i + c_2j + d_2k) \\ & = (a_1a_2 - b_1b_2 - c_1c_2 - d_1d_2) \\ & + (a_1b_2 + b_1a_2 + c_1d_2 - d_1c_2)i \\ & + (a_1c_2 - b_1d_2 + c_1a_2 + d_1b_2)j \\ & + (a_1d_2 + b_1c_2 - c_1b_2 + d_1a_2)k \end{align}$$
Aangezien de eenheden onder de vermenigvuldiging wel commutatief zijn met de reële getallen, maar niet onderling, is de vermenigvuldiging niet commutatief. Zo geldt bijvoorbeeld dat
$$ij = k \neq ji = -k$$
Definieer een klasse Quaternion waarmee quaternionen kunnen voorgesteld worden. Bij het aanmaken van een quaternion (Quaternion) kunnen vier gehele getallen (int) doorgegeven worden aan de parameters a, b, c en d. Een parameter waaraan niet expliciet een waarde wordt doorgegeven, krijgt de waarde 0 (nul).
Een quaternion $$q$$ (Quaternion) moet een methode norm hebben waaraan geen argumenten moeten doorgeven worden. De methode moet de norm $$|q|$$ (float) teruggeven.
Als er een quaternion $$q$$ (Quaternion) wordt doorgegeven aan de ingebouwde functie str, dan moet een stringvoorstelling (str) van $$q$$ teruggegeven worden die leest als a ± bi ± cj ± dk. Daarbij wordt a ingevuld met de parameter a van $$q$$, die dus voorafgegaan wordt door een minteken als die parameter negatief is. De waarden b, c en d worden ingevuld met de absolute waarden van de parameters b, c en d van $$q$$. Op elke plaats waar er een ± staat, komt er een minteken (-) als de daaropvolgende parameter negatief is, anders een plusteken (+).
Als er een quaternion $$q$$ (Quaternion) wordt doorgegeven aan de ingebouwde functie repr, dan moet een stringvoorstelling (str) van $$q$$ teruggegeven worden die leest als een Python expressie waarmee een nieuw quaternion (Quaternion) wordt aangemaakt met dezelfde parameterwaarden als $$q$$. Hierbij moeten de vier argumenten expliciet en positioneel doorgegegeven worden.
Zorg ervoor dat de binaire operatoren voor de optelling (+) en de vermenigvuldiging (*) telkens een nieuw quaternion (Quaternion) opleveren als beide operandi quaternionen (Quaternion) zijn of als één van beide operandi een quaternion (Quaternion) is en het ander een integer (int). Bij het berekenen van de som en het product van een quaternion en een integer $$m$$ (int), gedraagt $$m$$ zich als een quaternion met $$a = m$$ en $$b = c = d = 0$$.
>>> q1 = Quaternion(2, 4, 7, 3)
>>> q1.norm()
8.831760866327848
>>> print(q1)
2 + 4i + 7j + 3k
>>> q1
Quaternion(2, 4, 7, 3)
>>> q2 = Quaternion(a=-5, c=2, d=-4)
>>> q2.norm()
6.708203932499369
>>> print(q2)
-5 + 0i + 2j - 4k
>>> q2
Quaternion(-5, 0, 2, -4)
>>> q1 + q2
Quaternion(-3, 4, 9, -1)
>>> q2 + q1
Quaternion(-3, 4, 9, -1)
>>> q1 + 3
Quaternion(5, 4, 7, 3)
>>> 3 + q1
Quaternion(5, 4, 7, 3)
>>> q1 * q2
Quaternion(-12, -54, -15, -15)
>>> q2 * q1
Quaternion(-12, 14, -47, -31)
>>> q1 * 3
Quaternion(6, 12, 21, 9)
>>> 3 * q1
Quaternion(6, 12, 21, 9)