Drehen Sie die Wurzeln


11

Bei einem Polynom ungleich Null mit ganzzahligen Koeffizienten und Wurzeln, die sich auf der imaginären und der realen Linie befinden, so dass, wenn aes sich um eine Wurzel handelt -a, ein weiteres Polynom mit um 90 Grad gedrehten Wurzeln zurückgegeben wird.

Einzelheiten

Das Polynom kann in jedem vernünftigen Format angegeben werden, z. B. als Liste von Koeffizienten. Die Symmetriebedingung, die agenau dann -aeine Wurzel ist, wenn eine Wurzel zu stark ist, erzwingt, dass das gedrehte Polynom auch echte ganzzahlige Koeffizienten aufweist.

Beispiele

Im Folgenden werden die Polynome als Liste der Koeffizienten der Monome in absteigendem Grad angegeben. (dh die Konstante kommt zuletzt) ​​Das Polynom x^2-1hat Wurzeln {1,-1}. Drehen Sie sie durch 90°Multiplizieren mit i(der imaginären Einheit), so dass das Ausgangspolynom die Wurzeln haben sollte {i,-i}, d x^2 + 1. H.

Input / Output
[1 0 10 0 -127 0 -460 0 576]  [1 0 -10 0 -127 0 460 0 576]
[1 0 -4 0] [1 0 4 0]
[1] [1]

Darf ich den Grad des Polynoms sowie des Polynoms aufnehmen
Rohan Jhunjhunwala

Ja, ich denke das ist akzeptabel.
Fehler

Alle Ihre Beispiele verwenden monische Polynome. Können wir annehmen, dass das Eingabepolynom monisch ist? Hat Polynom die Ausgabe haben monic sein?
Dennis

Nein, es kann auch andere führende Koeffizienten als 1 haben, und die Ausgabe wird auch nur bis zu einem ganzzahligen Vielfachen definiert.
Fehler

Es scheint, dass das Format keine Liste von Koeffizienten sein muss. Wie weit gehen die vernünftigen Formate? Kann mein Format ein Zeichenfolgenausdruck im Unbestimmten sein x, sodass meine Übermittlung durch Zeichenfolgen ersetzt xwerden kann (i*x)? Kann ich eine Funktion formatieren, die das Polynom auswertet, sodass ich es mit der Funktion zusammenstellen soll x -> i*x?
xnor

Antworten:


12

Mathematica, 10 Bytes

Reine Funktion, die eine Funktion von x übernimmt und in ix ersetzt.

#/.x->I*x&

Alternative mit nur 7 Bytes, aber nicht ganz sicher, ob es zählt. Reine Funktion, die eine reine Funktion aufnimmt und eine Funktion von x zurückgibt.

#[I*x]&

5
Und Sie brauchten nicht einmal eingebaute!
Neil

Ich bin mir ziemlich sicher, dass ein reines Funktionspolynom ein "vernünftiges Format" ist (wie hier ). Es wird #als Variable verwendet und hat &am Ende ein.
JungHwan Min

Ich würde dies zweimal positiv bewerten, wenn ich könnte
Greg Martin

Meine einzige Sorge bezüglich der zweiten Antwort war die Nichtübereinstimmung zwischen Eingabe (eine reine Funktion) und Ausgabe (eine Funktion von x).
Ian Miller

6

Gelee , 5 Bytes

Jı*Ċ×

Probieren Sie es online aus!

Wie es funktioniert

Multipliziert das erste Element mit 1, das dritte Element mit -1usw.

Jı*Ċ×  argument: z
J      [1,2,...,len(z)]
 ı     i (the imaginary unit)
  *    to the power of (each element)
   Ċ   imaginary part
    ×  multiply by input (vectorize)

Beweis des Algorithmus

Das Polynom sei f(x).

Da wir garantiert sind, dass wenn xes eine Wurzel ist -x, dann ist es so , so fmuss es gerade sein, was bedeutet, dass sein Koeffizient für die ungeraden Potenzen sein muss 0.

Nun ist das Drehen der Wurzeln um 90°im Wesentlichen f(ix).

Das Erweitern und Vergleichen von Koeffizienten beweist den Algorithmus.


Also müssen wir nicht die 2,4, 6, 8 usw. berühren?
Rohan Jhunjhunwala

2
Das sind sowieso Null.
Fehler

Ihr Trick mit ı*Ċist sehr schön, Sie sollten es erklären :)
Leo

@ Leo Es ist im Wesentlichen eine einfache Implementierung, obwohl ...
Leaky Nun

Die Logik hier ist nicht ganz richtig, weil Sie stattdessen alle Koeffizienten für gerade Potenzen 0 haben können.
Ørjan Johansen

5

JavaScript (ES6), 25 Byte

a=>a.map((e,i)=>i%4?-e:e)

Das ursprüngliche Polynom hat Lösungen der Form, x = ±ain der a auf der realen oder imaginären Linie liegt. Außer wenn a = 0(in diesem Fall xist dies ein Faktor des Polynoms), bedeutet dies, dass dies x² - a²ein Faktor des Polynoms ist (was bedeutet, dass alternative Terme immer Null sind). Wenn wir nun die Wurzeln drehen, ändert sich der Faktor zu x² + a². Da sich alle Faktoren gleichzeitig ändern, ändert der dritte Term des Polynoms, der die Summe aller -a²Terme ist, das Vorzeichen, der fünfte Term, der die Summe der Produkte von Termpaaren -a²ist, das gleiche Vorzeichen usw. jeden zweiten Begriff abwechselnd.


4

Oktave , 27 Bytes

@(x)round(poly(roots(x)*j))

Probieren Sie es online aus!

Dies wendet direkt die Definition an: Wurzeln berechnen, multiplizieren mit j, von Wurzeln zurück in Polynom konvertieren. Eine endgültige Rundung ist aufgrund von numerischen Gleitkommafehlern erforderlich.



1

SILOS , 71 66 Bytes

readIO
b=i
lbla
readIO
d=c
d&2
i=i*(1-d)
printInt i
b-1
c+1
if b a

Probieren Sie es online aus!

Ich habe keine Ahnung, was Wizardry @Leaky Nun hier getan hat, um 5 Bytes zu sparen.

Ich habe eine Sekunde gebraucht, um das herauszufinden, aber das zweite Bit von C wird sich abwechseln, wie wir wollen. Deshalb hat @Leaky Nun dies ausgenutzt, um die benötigten Bits zu speichern.



0

TI-Basic, 20 Bytes

seq(real(i^X/i)Ans(X),X,1,dim(Ans

Wenn in gespeichert prgmA, führen Sie Folgendes aus:

{1, 0, 3, 0, 1}:prgmA

seq(musste nur der one * -Befehl sein, der keine komplexen Zahlen unterstützt. :) :)

*: Übertreibung


0

Casio-Basic, 8 Bytes

n|x=𝑖x

Unbenannte Funktion unter Verwendung des Mathematica-Ansatzes von Ian Miller. Das imaginäre 𝑖 von der Math2-Tastatur muss verwendet werden (zählt als 2 Bytes, Zeichencode 769), und das Polynom sollte als Gleichung von eingegeben werden x.

7 Bytes für den Code, 1 Byte nals Parameter.

Erläuterung : Nimmt die Gleichung nund ersetzt dann einfach alle Instanzen von xdurch 𝑖x.



0

Stax , 5 Bytes

Æ[]▐↨

Online ausführen und debuggen!

Port of the Jelly Antwort.

Verwendet die ASCII-Darstellung, um Folgendes zu erklären:

mih|1*
m         Map each element with rest of program, print mapped results on individual lines
 i        Current 0-based loop index
  h       Floor(i/2)
   |1     (-1)^(i/2)
     *    Multiply with current element

Wenn es führende Nullen geben kann, müssen diese zuerst abgeschnitten werden, und dies kann auf Kosten eines anderen Bytes erfolgen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.