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]

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]&

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.


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.


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.



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.



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


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.



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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.