# Mathématiques avec Python et Ruby/Quaternions et octonions en Python
## Ruby

[ Modifier le sommaire ]

## Complexes

On a vu dans le chapitre précédent que pour Python, un nombre complexe z est essentiellement une structure abritant deux réels, accessibles par z.real et z.imag respectivement. La construction de Cayley-Dickson généralise ce point de vue : En prenant deux complexes a et b, on peut les regrouper dans une nouvelle structure qui est considérée comme un nombre : Un quaternion.
Pour toute la suite, il est conseillé d'importer les fonctions du module math de Python :
Mais en réalité, seule la méthode hypot sera utilisée, ce qui signifie que le minimum nécessaire était

## Quaternions
### Définition

Toutes les méthodes (qui permettent de manipuler les quaternions) peuvent être regroupées dans une classe nommée Quaternion :
La première méthode, l'initialisation, crée donc deux variables a et b (qui seront des complexes, mais Python ne le sait pas encore) et les rendre accessibles par la notation avec un point, les nombres q.a et q.b (les deux complexes qui définissent le quaternion q) étant des propriétés du quaternion.

### Affichage

Pour y voir quelque chose, une méthode d'affichage est nécessaire. Comme Python en possède déjà une (la conversion en chaîne de caractères, ou string, notée __str__), on va la surcharger :
Un quaternion possède deux propriétés qui sont des nombres complexes, mais chacun d'eux est formé de deux nombres réels, donc un quaternion est formé de 4 nombres réels, ce sont ceux qui sont affichés par la méthode ci-dessus, lorsqu'on entre par exemple print(q).

### Fonctions
#### Opposé

En écrivant -q, on aura désormais l'opposé de q.

#### Module

Grâce à cette méthode, abs(q) retourne un réel, la racine carrée de sa norme.

#### Conjugué

abs(q.conjugate) renvoie le même résultat que abs(q) parce que tout quaternion a la même norme que son conjugué.

### Opérations
#### Addition

Pour additionner deux quaternions, on additionne leurs a respectifs, et leurs b respectifs :

#### Multiplication

Le produit de deux quaternions est plus difficile à définir :
Ce produit admet le quaternion Quaternion(1,0) comme élément neutre, et il est associatif comme tout produit qui se respecte. Mais il n'est pas commutatif :

#### Division
##### Multiplication par un réel

Pour définir le plus facilement possible le quotient de deux quaternions, on a intérêt à définir le produit d'un quaternion par un réel (on peut déjà l'effectuer avec la méthode de produit, en assimilant le réel r avec la quaternion Quaternion(r,0)). Mais comme le symbole de multiplication est déjà utilisé pour la multiplication des quaternions, il en faut un autre pour la multiplication d'un quaternion par un réel. Or il se trouve que __rmul__ (multiplication à l'envers) est encore disponible, donc pour peu qu'on multiplie à droite dans la définition, et à gauche en pratique, on peut ajouter cette méthode :
Alors, pour tripler un quaternion q, on peut faire, au choix, q*Quaternion(3,0), ou 3*q.

##### Division

Le quotient de deux quaternions est désormais simple à définir :
Le quotient d'un quaternion par son conjugué est de norme 1 :
Cet exemple révèle que $\left(-{\frac {5}{9}}\right)^{2}+\left(-{\frac {2}{9}}\right)^{2}+\left(-{\frac {4}{9}}\right)^{2}+\left(-{\frac {6}{9}}\right)^{2}=1$, ce qui revient à la décomposition suivante de 81 (un carré) comme somme de 4 carrés : $5^{2}+2^{2}+4^{2}+6^{2}=25+4+16+36=81=9^{2}$.

#### Puissances

Même si la multiplication des quaternions n'est pas commutative, elle est associative, c'est tout ce qu'il faut pour définir les puissances des quaternions à exposants entiers (et donc, par formules de Taylor, de la trigonométrie et des exponentielles de quaternions) :
Par exemple, on peut calculer le carré d'un quaternion :
Plus généralement, l'ensemble des solutions de $q^{2}=-1$ est une sphère.
L'étude des itérés de $q^{2}+c$ où q et c sont des quaternions, mène à des ensembles de Mandelbrot quaternionniques

### Résumé

Voici le contenu complet de la classe Quaternion de Python :
Il suffit de placer tout ça dans un fichier appelé quaternions.py et disposer de toutes ces méthodes en important le module nouvellement créé par
Ce qui permet alors de déclarer des quaternions, puis d'effectuer des opérations dessus.

## Octonions

Ce qui est intéressant avec la construction de Cayley-Dickson utilisée ci-dessus pour les quaternions, c'est qu'elle se généralise : En définissant une structure (un objet) comprenant deux quaternions a et b, on définit un octonion.

### Définition et affichage
#### Affichage

Comme $\mathbb {O}$ est de dimension 8 sur $\mathbb {R}$, l'affichage est plus compliqué que celui des quaternions :
On voit une arborescence apparaître, le a.a.real désignant la partie réelle du a du quaternion a de l'octonion. La notation avec les points prend ici tout son intérêt, permettant une concision pythonienne qui rendrait presque apprivoisés ces redoutables octonions!

### Fonctions

Les fonctions sur les octonions se définissent presque comme celles sur les quaternions, Cayley-Dickson oblige :

#### Module

C'est pour permettre cette concision qu'on a importé la méthode hypot du module math.

#### Conjugué
### Opérations
#### Addition

Encore une fois, le fait d'avoir surchargé la méthode __add__ de Python permet de noter simplement m+n la somme des octonions m et n.

#### Multiplication

Non seulement la multiplication des octonions n'est pas commutative, elle n'est plus associative non plus :

#### Division

Grâce à la notion de conjugué, on peut facilement définir le quotient de deux octonions, mais c'est encore plus facile en multipliant un octonion par un réel :

##### Quotient de deux octonions

Là encore, le quotient d'un octonion par son conjugué est de norme 1 :
Ces calculs permettent de décomposer un carré en somme de 8 carrés.

#### Puissances

Comme la multiplication des octonions n'est pas associative, les puissances des octonions ne présentent guère d'intérêt, sauf pour la puissance 2, et sur $\mathbb {O}$, l'ensemble des solutions de l'équation $z^{2}=-1$ est une sphère de dimension 6.

### Résumé

La classe Octonion de Python peut se résumer à ceci :
Pour peu qu'on l'ait enregistrée dans un fichier octonions.py, il suffit pour pouvoir effectuer des calculs sur les octonions, d'importer ce fichier par

## Bibliographie

* De par leur utilité en infographie 3D, les quaternions sont utilisés dans Blender, avec cette description :
* Sur les octonions, le livre de John Baez est une lecture hautement conseillée :