Faites tourner les racines

11

Étant donné un polynôme non nul avec des coefficients entiers et des racines qui sont sur l'imaginaire et sur la ligne réelle de telle sorte que si aest une racine, il en est de même -a, renvoyez un autre polynôme avec les racines tournées de 90 degrés.

Détails

Le polynôme peut être donné dans n'importe quel format raisonnable, par exemple sous la forme d'une liste de coefficients. La condition de symétrie qui aest une racine si et seulement si -aest une racine applique également le polynôme pivoté pour avoir également des coefficients entiers réels.

Exemples

Dans la suite, les polynômes sont donnés sous la forme d'une liste de coefficients des monômes en degrés décroissants. (c'est-à-dire que la constante vient en dernier) Le polynôme x^2-1a des racines {1,-1}. Les faire pivoter 90°signifie les multiplier par i(l'unité imaginaire), de sorte que le polynôme de sortie devrait avoir les racines {i,-i}, ce qui est 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]
flawr
la source
Puis-je prendre le degré du polynôme ainsi que le polynôme
Rohan Jhunjhunwala
Oui, je pense que c'est acceptable.
flawr
Tous vos exemples utilisent des polynômes moniques. Pouvons-nous supposer que le polynôme d'entrée sera monique? Le polynôme de sortie doit-il être monique?
Dennis
Non, il peut également avoir d'autres coefficients principaux que 1, et la sortie est également juste définie jusqu'à un multiple entier.
flawr
Il semble que le format ne soit pas nécessairement une liste de coefficients. Jusqu'où vont les formats raisonnables? Mon format peut-il être une expression de chaîne dans l'indéterminé x, afin que ma soumission puisse remplacer une chaîne xpar (i*x)? Mon format peut-il une fonction qui évalue le polynôme, de sorte que ma soumission est de le composer avec la fonction x -> i*x?
xnor

Réponses:

12

Mathematica, 10 octets

Fonction pure qui prend une fonction de x et se substitue à ix.

#/.x->I*x&

Alternative avec seulement 7 octets mais pas tout à fait sûr si cela compte. Fonction pure qui prend une fonction pure et renvoie une fonction de x.

#[I*x]&
Ian Miller
la source
5
Et vous n'avez même pas eu besoin de buildins!
Neil
Je suis à peu près sûr qu'un polynôme à fonction pure est un "format raisonnable" (comme c'était le cas ici ). Il utilise #comme variable et a un &à la fin.
JungHwan Min
Je voterais à deux reprises si je le pouvais
Greg Martin
Ma seule préoccupation au sujet de la deuxième réponse était le décalage entre l'entrée (une fonction pure) et la sortie (une fonction de x).
Ian Miller
6

Gelée , 5 octets

Jı*Ċ×

Essayez-le en ligne!

Comment ça fonctionne

Multiplie le premier élément par 1, le troisième élément par -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)

Preuve d'algorithme

Que le polynôme soit f(x).

Puisque nous sommes garantis que si xest une racine, alors il en est de même -x, ainsi fdoit être pair, ce qui signifie que son coefficient pour les puissances impaires doit être 0.

Maintenant, la rotation des racines 90°est essentiellement f(ix).

L'expansion puis la comparaison des coefficients prouve l'algorithme.

Leaky Nun
la source
Donc, nous n'avons pas besoin de toucher les 2,4e, 6e, 8e, etc.?
Rohan Jhunjhunwala
2
Ce sont zéro de toute façon.
flawr
Votre astuce avec ı*Ċest très sympa, vous devriez l'expliquer :)
Leo
@Leo C'est essentiellement une implémentation simple ...
Leaky Nun
La logique ici n'est pas tout à fait correcte, car vous pouvez plutôt avoir tous les coefficients pour les puissances paires égales à 0.
Ørjan Johansen
5

JavaScript (ES6), 25 octets

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

Le polynôme original a des solutions de la forme x = ±aoù a se trouve sur la ligne réelle ou imaginaire. Sauf quand a = 0(auquel cas xest un facteur du polynôme), cela signifie que x² - a²c'est un facteur du polynôme (ce qui signifie que les termes alternatifs sont toujours nuls). Maintenant, lorsque nous faisons pivoter les racines, le facteur devient x² + a². Puisque tous les facteurs changent en même temps, le troisième terme du polynôme, qui est la somme de tous les -a²termes, change de signe, le cinquième terme, qui est la somme des produits des paires de -a²termes, garde le même signe, etc. en alternance tous les deux termes.

Neil
la source
4

Octave , 27 octets

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

Essayez-le en ligne!

Cela applique directement la définition: calculer les racines, multiplier par j, reconvertir des racines en polynômes. Un arrondi final est nécessaire en raison d'erreurs numériques en virgule flottante.

Luis Mendo
la source
1

SILOS , 71 66 octets

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

Essayez-le en ligne!

Je n'ai aucune idée de ce que la magie @Leaky Nun a fait ici pour économiser 5 octets.

Il m'a fallu une seconde pour comprendre, mais le deuxième bit de C alternera comme nous le voulons. Par conséquent, @Leaky Nun a exploité cela pour enregistrer les bits dont nous avons besoin.

Rohan Jhunjhunwala
la source
66 octets
Leaky Nun
0

TI-Basic, 20 octets

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

Si stocké dans prgmA, exécutez avec:

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

seq(devait juste être la seule commande * qui ne supporte pas les nombres complexes. :)

*: Exagération

pizzapants184
la source
0

Casio-Basic, 8 octets

n|x=𝑖x

Fonction sans nom, utilisant l'approche Mathematica d'Ian Miller. Le inary imaginaire du clavier Math2 doit être utilisé (compte comme 2 octets, code de caractère 769), et le polynôme doit être entré comme une équation de x.

7 octets pour le code, 1 octet à spécifier ncomme paramètre.

Explication : prend l'équation n, puis remplace simplement toutes les instances de xpar 𝑖x.

engourdi
la source
0

Stax , 5 octets

Æ[]▐↨

Exécutez et déboguez en ligne!

Réponse de Port of the Jelly.

Utilise la représentation ASCII pour expliquer:

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

S'il peut y avoir des zéros non significatifs, ils doivent d'abord être coupés et cela peut être fait au prix d'un autre octet.

Weijun Zhou
la source