Schreiben Sie eine benannte Funktion oder ein benanntes Programm, das das Quaternionsprodukt von zwei Quaternionen berechnet. Verwenden Sie so wenig Bytes wie möglich.
Quaternionen
Quaternionen sind eine Erweiterung der reellen Zahlen, die die komplexen Zahlen weiter erweitert. i
Quaternionen verwenden nicht nur eine imaginäre Einheit , sondern drei imaginäre Einheiten i,j,k
, die die Beziehungen erfüllen.
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
(Es gibt auch Tabellen auf der Wikipedia-Seite .)
Mit anderen Worten, jede imaginäre Einheit ist ein Quadrat zu -1
und das Produkt von zwei verschiedenen imaginären Einheiten ist die verbleibende dritte Einheit mit einem in +/-
Abhängigkeit davon, ob die zyklische Reihenfolge (i,j,k)
eingehalten wird (dh die Rechtsregel ). Es kommt also auf die Reihenfolge der Multiplikation an.
Eine allgemeine Quaternion ist eine lineare Kombination eines Realteils und der drei imaginären Einheiten. Es wird also durch vier reelle Zahlen beschrieben (a,b,c,d)
.
x = a + b*i + c*j + d*k
Wir können also mit der Eigenschaft distributive zwei Quaternionen multiplizieren, wobei wir darauf achten, die Einheiten in der richtigen Reihenfolge zu multiplizieren und im Ergebnis ähnliche Begriffe zu gruppieren.
(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
So gesehen kann die Quaternion-Multiplikation als eine Abbildung von einem Paar von 4-Tupeln auf ein einzelnes 4-Tupel betrachtet werden, was Sie implementieren müssen.
Format
Sie sollten entweder ein Programm oder eine benannte Funktion schreiben . Ein Programm sollte Eingaben von STDIN nehmen und das Ergebnis ausdrucken. Eine Funktion sollte Funktionseingaben aufnehmen und eine Ausgabe zurückgeben (nicht drucken).
Eingabe- und Ausgabeformate sind flexibel. Die Eingabe besteht aus acht reellen Zahlen (die Koeffizienten für zwei Quaternionen), und die Ausgabe besteht aus vier reellen Zahlen. Die Eingabe kann aus acht Zahlen, zwei Listen mit vier Zahlen, einer 2x4-Matrix usw. bestehen. Das Eingabe- / Ausgabeformat muss nicht identisch sein. Die Reihenfolge der (1,i,j,k)
Koeffizienten liegt bei Ihnen.
Die Koeffizienten können negativ oder nicht ganz sein. Sorgen Sie sich nicht um echte Präzision oder Überläufe.
Verboten: Funktion oder Typen speziell für Quaternionen oder Äquivalente.
Testfälle
Diese sind im (1,i,j,k)
Koeffizientenformat.
[[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]
Referenzimplementierung
In Python als Funktion:
#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