Rotar las raíces

11

Dado un polinomio distinto de cero con coeficientes enteros y raíces que están en el imaginario y en la línea real de modo que si aes una raíz, entonces también lo es -a, devuelve otro polinomio con las raíces giradas 90 grados.

Detalles

El polinomio se puede dar en cualquier formato razonable, por ejemplo, como una lista de coeficientes. La condición de simetría que aes una raíz si y solo si -aes una raíz también impone que el polinomio girado tenga también coeficientes enteros reales.

Ejemplos

A continuación, los polinomios se dan como una lista de coeficientes de los monomios en grado descendente. (es decir, la constante viene al final) El polinomio x^2-1tiene raíces {1,-1}. Girándolos 90°multiplicando por i(la unidad imaginaria), por lo que el polinomio de salida debe tener las raíces {i,-i}, que es 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]
falla
fuente
¿Puedo ver el grado del polinomio y del polinomio
Rohan Jhunjhunwala
Sí, creo que eso es aceptable.
flawr
Todos sus ejemplos usan polinomios monicos. ¿Podemos suponer que el polinomio de entrada será monic? ¿El polinomio de salida tiene que ser monic?
Dennis
No, también puede tener otros coeficientes principales que 1, y la salida también se define hasta un múltiplo integral.
flawr
Parece que el formato no tiene que ser una lista de coeficientes. ¿Hasta dónde llegan los formatos razonables? ¿Puede mi formato de ser una expresión de cadena en el indeterminada x, por lo que mi presentación lata cadena de reemplazar xcon (i*x)? ¿Puede formatear una función que evalúa el polinomio, de modo que mi envío es componerlo con la función x -> i*x?
xnor

Respuestas:

12

Mathematica, 10 Bytes

Función pura que toma una función de x y sustituye en ix.

#/.x->I*x&

Alternativa con solo 7 bytes, pero no estoy seguro de si cuenta. Función pura que toma una función pura y devuelve una función de x.

#[I*x]&
Ian Miller
fuente
55
¡Y ni siquiera necesitabas ninguna construcción!
Neil
Estoy bastante seguro de que un polinomio de función pura es un "formato razonable" (como si estuviera aquí ). Se usa #como variable y tiene un &al final.
JungHwan Min
Me upvote esto dos veces si pudiera
Greg Martin
Mi única preocupación sobre la segunda respuesta fue la falta de coincidencia entre la entrada (una función pura) y la salida (una función de x).
Ian Miller
6

Jalea , 5 bytes

Jı*Ċ×

Pruébalo en línea!

Cómo funciona

Multiplica el primer elemento por 1, el tercer elemento por -1, etc.

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

Prueba de algoritmo

Deja que el polinomio sea f(x).

Dado que tenemos la garantía de que si xes una raíz, entonces también lo es -x, fdebe ser par, lo que significa que su coeficiente para las potencias impares debe ser 0.

Ahora, rotar las raíces 90°es esencialmente f(ix).

Expandir y luego comparar coeficientes prueba el algoritmo.

Monja permeable
fuente
Entonces, ¿no necesitamos tocar el 2,4, 6, 8, etc.?
Rohan Jhunjhunwala
2
Esos son cero de todos modos.
flawr
Tu truco ı*Ċes muy bueno, deberías explicarlo :)
Leo
@Leo Es esencialmente una implementación sencilla aunque ...
Leaky Nun
La lógica aquí no es del todo correcta, porque en su lugar puede tener todos los coeficientes para potencias par ser 0.
Ørjan Johansen
5

JavaScript (ES6), 25 bytes

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

El polinomio original tiene soluciones de la forma x = ±aen la que a se encuentra en la línea real o imaginaria. Excepto cuando a = 0(en cuyo caso xes un factor del polinomio), esto significa que x² - a²es un factor del polinomio (lo que significa que los términos alternativos son siempre cero). Ahora, cuando rotamos las raíces, el factor cambia a x² + a². Como todos los factores cambian al mismo tiempo, el tercer término del polinomio, que es la suma de todos los -a²términos, cambia de signo, el quinto término, que es la suma de productos de pares de -a²términos, mantiene el mismo signo, etc. alternando cada dos términos.

Neil
fuente
4

Octava , 27 bytes

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

Pruébalo en línea!

Esto aplica directamente la definición: calcular raíces, multiplicar por j, volver a convertir de raíces a polinomios. Es necesario un redondeo final debido a errores numéricos de punto flotante.

Luis Mendo
fuente
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

Pruébalo en línea!

No tengo idea de qué hechicería @Leaky Nun hizo aquí para guardar 5 bytes.

Me tomó un segundo averiguarlo, pero el segundo bit de C se alternará como queramos. Por lo tanto, @Leaky Nun explotó esto para guardar los bits que necesitamos.

Rohan Jhunjhunwala
fuente
66 bytes
Leaky Nun
0

TI-Basic, 20 bytes

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

Si se almacena en prgmA, ejecutar con:

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

seq(solo tenía que ser el comando one * que no admite números complejos. :)

*: Exageración

pizzapants184
fuente
0

Casio-Basic, 8 bytes

n|x=𝑖x

Función sin nombre, utilizando el enfoque de Mathematica de Ian Miller. Se debe usar el inary imaginario del teclado Math2 (cuenta como 2 bytes, código char 769), y el polinomio se debe ingresar como una ecuación de x.

7 bytes para el código, 1 byte para especificar ncomo parámetro.

Explicación : Toma la ecuación n, luego simplemente reemplaza todas las instancias de xcon 𝑖x.

numbermaniac
fuente
0

Stax , 5 bytes

Æ[]▐↨

¡Ejecute y depure en línea!

La respuesta de Port of the Jelly.

Utiliza representación ASCII para explicar:

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

Si puede haber ceros a la izquierda, primero deben recortarse y se puede hacer a costa de otro byte.

Weijun Zhou
fuente