Hintergrund
Quaternion ist ein Zahlensystem, das komplexe Zahlen erweitert. Ein Quaternion hat die folgende Form
Dabei sind reelle Zahlen und drei grundlegende Quaternionseinheiten . Die Einheiten haben folgende Eigenschaften:
Beachten Sie, dass die Quaternion-Multiplikation nicht kommutativ ist .
Aufgabe
Berechnen Sie bei einer nicht reellen Quaternion mindestens eine ihrer Quadratwurzeln.
Wie?
Gemäß dieser Math.SE-Antwort können wir nicht-reale Quaternionen in der folgenden Form ausdrücken:
wobei reelle Zahlen sind und der imaginäre Einheitsvektor in der Form mit . Jedes solche hat die Eigenschaft , kann also als imaginäre Einheit betrachtet werden.
Dann sieht das Quadrat von aus:
Umgekehrt können wir bei einem gegebenen Quaternion die Quadratwurzel von durch Lösen der folgenden Gleichungen finden
Dies ist identisch mit dem Finden der Quadratwurzel einer komplexen Zahl.
Beachten Sie, dass eine negative reelle Zahl unendlich viele Quadratwurzeln der Quaternion hat , eine nicht-reelle Quaternion jedoch nur zwei Quadratwurzeln .
Ein- und Ausgabe
Die Eingabe ist eine nicht-reale Quaternion. Sie können es als vier reelle (Gleitkomma-) Zahlen in einer beliebigen Reihenfolge und Struktur Ihrer Wahl annehmen. Nicht real bedeutet, dass mindestens eines von nicht Null ist.
Die Ausgabe besteht aus einem oder zwei Quaternionen, die im Quadrat der Eingabe entsprechen.
Testfälle
Input (a, b, c, d) => Output (a, b, c, d) rounded to 6 digits
0.0, 1.0, 0.0, 0.0 => 0.707107, 0.707107, 0.000000, 0.000000
1.0, 1.0, 0.0, 0.0 => 1.098684, 0.455090, 0.000000, 0.000000
1.0, -1.0, 1.0, 0.0 => 1.168771, -0.427800, 0.427800, 0.000000
2.0, 0.0, -2.0, -1.0 => 1.581139, 0.000000, -0.632456, -0.316228
1.0, 1.0, 1.0, 1.0 => 1.224745, 0.408248, 0.408248, 0.408248
0.1, 0.2, 0.3, 0.4 => 0.569088, 0.175720, 0.263580, 0.351439
99.0, 0.0, 0.0, 0.1 => 9.949876, 0.000000, 0.000000, 0.005025
Mit diesem Python-Skript generiert . Für jeden Testfall ist nur eine der beiden richtigen Antworten angegeben. der andere ist alle vier Werte negiert.
Bewertungs & Gewinnkriterium
Es gelten die Standardregeln für Code-Golf . Das kürzeste Programm oder die kürzeste Funktion in Bytes in jeder Sprache gewinnt.
a,[b,[c,[d]]]
ist in Ordnung, wenn man irgendwie Bytes damit sparen kann :)
a, (b, c, d)
?