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.
quelle
a, (b, c, d)
?a,[b,[c,[d]]]
ist in Ordnung, wenn man irgendwie Bytes damit sparen kann :)Antworten:
APL (NARS) , 2 Byte
√
NARS bietet integrierte Unterstützung für Quaternionen. ¯ \ _ (⍨) _ / ¯
quelle
¯\_(⍨)√¯
Python 2 , 72 Bytes
Probieren Sie es online!
Mehr oder weniger eine rohe Formel. Ich dachte, ich könnte Listenverständnisse verwenden, um eine Schleife
b,c,d
zu erstellen, aber das scheint länger zu dauern. Python ist hier wirklich verletzt durch einen Mangel an Vektoroperationen, insbesondere Skalierung und Norm.Python 3 , 77 Bytes
Probieren Sie es online!
Das direkte Lösen des Quadrats war auch kürzer als die Verwendung von Pythons Quadratwurzel mit komplexen Zahlen, um es wie in der Problemstellung zu lösen.
quelle
(s*s).sum()**.5
.Wolfram Language (Mathematica) , 19 Bytes
Probieren Sie es online!
In Mathematica ist Quaternion ebenfalls integriert, es ist jedoch ausführlicher.
Obwohl eingebaute Funktionen cool aussehen, sollten Sie Lösungen wählen, die keine eingebauten Funktionen verwenden! Ich möchte nicht, dass die Abstimmungen bei Fragen, die das HNQ erreichen, schief laufen.
quelle
JavaScript (ES7),
5553 BytesBasierend auf der direkten Formel von xnor .
Übernimmt die Eingabe als Array.
Probieren Sie es online!
Wie?
Gegeben ein Arrayq= [ a , b , c , d] Dies berechnet:
Und kehrt zurück:
quelle
Haskell , 51 Bytes
Probieren Sie es online!
Eine direkte Formel. Der Haupttrick, um den Realteil der Ausgabe so
r/sqrt(r*2)
auszudrücken, dass er dem Imaginärteil-Ausdruck entspricht, wodurch ein paar Bytes eingespart werden:54 Bytes
Probieren Sie es online!
quelle
Holzkohle , 32 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Port von @ xnors Python-Antwort. Erläuterung:
Quadrieren Sie alle Elemente der Eingabe und nehmen Sie die Summe und dann die Quadratwurzel. Dies berechnet| x+yu⃗ | = x2+ y2------√= ( a2- b2)2+ ( 2 a b )2---------------√= a2+ b2 . Hinzufügenx gibt 2 a2 das wird dann verdoppelt und Quadratwurzel zu geben 2 a .
weily= 2 a b , Berechnung b durch dividieren durch 2 a .
Setzen Sie das erste Element des Arrays (dh den Realteil) auf die Hälfte von2 a .
Wandeln Sie die Werte in Zeichenfolgen um und geben Sie sie implizit aus.
quelle
Java 8, 84 Bytes
Port von @xnors Python 2 Antwort .
Probieren Sie es online aus.
Erläuterung:
quelle
05AB1E , 14 Bytes
Port von @xnors Python 2 Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Wolfram Language (Mathematica) , 28 Byte
Port von @ xnors Python 2 Antwort .
Probieren Sie es online!
quelle
C # .NET, 88 Bytes
Port meiner Java 8-Antwort , gibt jedoch ein Tupel anstelle eines Strings zurück. Ich dachte, das wäre kürzer gewesen, aber leider ist
Math.Sqrt
einSystem
-import in C # .NET erforderlich , der 4 Bytes länger als 10 Bytes kürzer ist ..>.>Die Lambda-Deklaration sieht allerdings ziemlich lustig aus:
Probieren Sie es online aus.
quelle
Perl 6 , 49 Bytes
Probieren Sie es online!
Eingegebene Curry-Funktion als
f(b,c,d)(a)
. Gibt quaternion als zurücka,(b,c,d)
.Erläuterung
quelle