Ruota le radici


11

Dato un polinomio diverso da zero con coefficienti e radici interi che si trovano sull'immaginario e sulla linea reale in modo tale che se aè una radice lo è anche -a, restituisce un altro polinomio con le radici ruotate di 90 gradi.

Dettagli

Il polinomio può essere fornito in qualsiasi formato ragionevole, ad esempio come un elenco di coefficienti. La condizione di simmetria che aè una radice se e solo se -aè anche una radice impone al polinomio ruotato di avere anche coefficienti interi reali.

Esempi

Di seguito i polinomi sono riportati come un elenco di coefficienti dei monomi in grado decrescente. (cioè la costante arriva per ultima) Il polinomio x^2-1ha radici {1,-1}. Ruotandoli per 90°mezzo di moltiplicare per i(l'unità immaginaria), quindi il polinomio di uscita dovrebbe avere le radici {i,-i}, che è x^2 + 1.

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]

Vorrei prendere in considerazione il grado del polinomio e del polinomio
Rohan Jhunjhunwala

Sì, penso sia accettabile.
flawr

Tutti i tuoi esempi usano polinomi monici. Possiamo supporre che il polinomio di input sarà monico? Il polinomio di output deve essere monico?
Dennis,

No, può anche avere altri coefficienti iniziali diversi da 1 e anche l'output viene definito fino a un multiplo integrale.
flawr

Sembra che il formato non debba essere un elenco di coefficienti. Fino a che punto vanno i formati ragionevoli? Il mio formato può essere un'espressione di stringa nell'indeterminato x, in modo che il mio invio possa sostituire la stringa xcon (i*x)? Posso formattare una funzione che valuta il polinomio, in modo che la mia presentazione sia di comporlo con la funzione x -> i*x?
xnor

Risposte:


12

Mathematica, 10 byte

Funzione pura che prende una funzione di x e sostituisce in ix.

#/.x->I*x&

Alternativa con solo 7 byte ma non del tutto sicura se conta. Funzione pura che accetta una funzione pura e restituisce una funzione di x.

#[I*x]&

5
E non hai nemmeno bisogno di alcun builtin!
Neil,

Sono abbastanza sicuro che un polinomio di pura funzione sia un "formato ragionevole" (come se fosse qui ) Utilizza #come variabile e ha un &alla fine.
JungHwan Min

Voterei questo due volte se potessi
Greg Martin,

La mia unica preoccupazione per la seconda risposta era la mancata corrispondenza tra input (una funzione pura) e output (una funzione di x).
Ian Miller,

6

Gelatina , 5 byte

Jı*Ċ×

Provalo online!

Come funziona

Moltiplica il primo elemento per 1, il terzo elemento per -1, ecc.

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

Prova dell'algoritmo

Lascia che sia il polinomio f(x).

Dal momento che ci viene garantito che se xè una radice, allora lo è -x, così fdeve essere pari, il che significa che deve essere il suo coefficiente per i poteri dispari 0.

Ora, ruotando le radici di 90°è essenzialmente f(ix).

L'espansione quindi il confronto dei coefficienti dimostra l'algoritmo.


Quindi, non abbiamo bisogno di toccare il 2 °, 6 °, 8 ° ecc.?
Rohan Jhunjhunwala

2
Quelli sono zero comunque.
flawr

Il tuo trucco ı*Ċè molto bello, dovresti spiegarlo :)
Leo,

@Leo È essenzialmente un'implementazione semplice, però ...
Leaky Nun,

La logica non è giusto, perché si può invece avere tutti i coefficienti per anche poteri essere 0.
Ørjan Johansen

5

JavaScript (ES6), 25 byte

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

Il polinomio originale ha soluzioni della forma in x = ±acui si trova una linea reale o immaginaria. Tranne quando a = 0(nel qual caso xè un fattore del polinomio), ciò significa che x² - a²è un fattore del polinomio (il che significa che i termini alternativi sono sempre zero). Ora, quando ruotiamo le radici, il fattore cambia in x² + a². Poiché tutti i fattori cambiano contemporaneamente, il terzo termine del polinomio, che è la somma di tutti i -a²termini, cambia segno, il quinto termine, che è la somma dei prodotti di coppie di -a²termini, mantiene lo stesso segno, ecc. alternando ogni altro termine.


4

Ottava , 27 byte

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

Provalo online!

Questo applica direttamente la definizione: calcolare le radici, moltiplicare per j, riconvertire da radici a polinomiali. È necessario un arrotondamento finale a causa di errori numerici in virgola mobile.



1

SILOS , 71 66 byte

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

Provalo online!

Non ho idea di cosa abbia fatto qui la procedura guidata @Leaky Nun per salvare 5 byte.

Mi ci è voluto un secondo per capire, ma il secondo bit di C si alternerà come vogliamo. Pertanto @Leaky Nun ha sfruttato questo per salvare i bit di cui abbiamo bisogno.



0

TI-Basic, 20 byte

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

Se memorizzato prgmA, esegui con:

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

seq(doveva solo essere l' unico * comando che non supporta numeri complessi. :)

*: Esagerazione


0

Casio-Basic, 8 byte

n|x=𝑖x

Funzione senza nome, usando l'approccio Mathematica di Ian Miller. È necessario utilizzare l'immaginario 𝑖 della tastiera Math2 (conta come 2 byte, codice char 769) e il polinomio deve essere inserito come equazione di x.

7 byte per il codice, 1 byte da specificare n come parametro.

Spiegazione : prende l'equazione n, quindi sostituisce semplicemente tutte le istanze di xcon 𝑖x.



0

Stax , 5 byte

Æ[]▐↨

Esegui ed esegui il debug online!

Risposta Port of the Jelly.

Utilizza la rappresentazione ASCII per spiegare:

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

Se possono esserci zeri iniziali, è necessario prima tagliarli e ciò può essere fatto al costo di un altro byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.