Écrivez une fonction ou un programme nommé qui calcule le produit quaternion de deux quaternions. Utilisez le moins d'octets possible.
Quaternions
Les quaternions sont une extension des nombres réels qui étend encore les nombres complexes. Plutôt qu'une seule unité imaginaire i
, les quaternions utilisent trois unités imaginaires i,j,k
qui satisfont les relations.
i*i = j*j = k*k = -1
i*j = k
j*i = -k
j*k = i
k*j = -i
k*i = j
i*k = -j
(Il y a aussi des tableaux de ceux-ci sur la page Wikipedia .)
En d'autres termes, chaque unité imaginaire est au carré -1
, et le produit de deux unités imaginaires différentes est le troisième restant avec un +/-
selon que l'ordre cyclique (i,j,k)
est respecté (c'est -à-dire la règle de droite) ). Donc, l'ordre de multiplication est important.
Un quaternion général est une combinaison linéaire d'une partie réelle et des trois unités imaginaires. Ainsi, il est décrit par quatre nombres réels (a,b,c,d)
.
x = a + b*i + c*j + d*k
Ainsi, nous pouvons multiplier deux quaternions en utilisant la propriété distributive, en prenant soin de multiplier les unités dans le bon ordre et en regroupant les termes similaires dans le résultat.
(a + b*i + c*j + d*k) * (e + f*i + g*j + h*k)
= (a*e - b*f - c*g - d*h) +
(a*f + b*e + c*h - d*g)*i +
(a*g - b*h + c*e + d*f)*j +
(a*h + b*g - c*f + d*e)*k
Vu de cette façon, la multiplication du quaternion peut être considérée comme une carte d'une paire de 4-tuples à un seul 4-tuples, ce que vous êtes invité à mettre en œuvre.
Format
Vous devez écrire un programme ou une fonction nommée . Un programme doit prendre les entrées de STDIN et imprimer le résultat. Une fonction doit accepter les entrées de fonction et retourner (pas imprimer) une sortie.
Les formats d'entrée et de sortie sont flexibles. L'entrée est huit nombres réels (les coefficients pour deux quaternions), et la sortie se compose de quatre nombres réels. L'entrée peut être huit nombres, deux listes de quatre nombres, une matrice 2x4, etc. Le format d'entrée / sortie n'a pas à être le même. L'ordre des (1,i,j,k)
coefficients dépend de vous.
Les coefficients peuvent être négatifs ou non entiers. Ne vous inquiétez pas de la précision réelle ou des débordements.
Interdit: Fonction ou types spécifiquement pour les quaternions ou équivalents.
Cas de test
Celles-ci sont au (1,i,j,k)
format coefficient.
[[12, 54, -2, 23], [1, 4, 6, -2]]
[-146, -32, 270, 331]
[[1, 4, 6, -2], [12, 54, -2, 23]]
[-146, 236, -130, -333]
[[3.5, 4.6, -0.24, 0], [2.1, -3, -4.3, -12]]
[20.118, 2.04, 39.646, -62.5]
Implémentation de référence
En Python, comme fonction:
#Input quaternions: [a,b,c,d], [e,f,g,h]
#Coeff order: [1,i,j,k]
def mult(a,b,c,d,e,f,g,h):
coeff_1 = a*e-b*f-c*g-d*h
coeff_i = a*f+b*e+c*h-d*g
coeff_j = a*g-b*h+c*e+d*f
coeff_k = a*h+b*g-c*f+d*e
result = [coeff_1, coeff_i, coeff_j, coeff_k]
return result