Gire as raízes

11

Dado um polinômio diferente de zero, com coeficientes e raízes inteiros que estão no imaginário e na linha real, de modo que, se afor uma raiz, o mesmo ocorre -a, retorne outro polinômio com as raízes giradas em 90 graus.

Detalhes

O polinômio pode ser dado em qualquer formato razoável, por exemplo, como uma lista de coeficientes. A condição de simetria que aé uma raiz se, e somente se, -afor uma raiz também impõe o polinômio girado para ter coeficientes inteiros reais também.

Exemplos

A seguir, os polinômios são apresentados como uma lista de coeficientes dos monômios em graus descendentes. (ou seja, a constante vem por último) O polinômio x^2-1tem raízes {1,-1}. Girando-os por 90°meio da multiplicação por i(a unidade imaginária), o polinômio de saída deve ter as raízes {i,-i}, o que é 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
fonte
Posso tomar o grau do polinômio, bem como o polinômio
Rohan Jhunjhunwala
Sim, eu acho que é aceitável.
flawr
Todos os seus exemplos usam polinômios monônicos. Podemos supor que o polinômio de entrada será monônico? O polinômio de saída precisa ser monônico?
Dennis
Não, ele também pode ter outros coeficientes iniciais além de 1, e a saída também é definida apenas como um múltiplo integral.
flawr
Parece que o formato não precisa ser uma lista de coeficientes. Até onde vão os formatos razoáveis? Meu formato pode ser uma expressão de sequência indeterminada x, para que meu envio possa ser substituído xpor uma sequência (i*x)? Meu formato pode ser uma função que avalia o polinômio, para que minha submissão seja composta com a função x -> i*x?
Xnor 14/05

Respostas:

12

Mathematica, 10 bytes

Função pura que assume uma função de x e substitui em ix.

#/.x->I*x&

Alternativa com apenas 7 bytes, mas não tenho certeza se conta. Função pura que assume uma função pura e retorna uma função de x.

#[I*x]&
Ian Miller
fonte
5
E você nem precisava de nenhum builtins!
Neil
Tenho certeza de que um polinômio de função pura é um "formato razoável" (como era aqui ). Ele usa #como variável e tem um &no final.
JungHwan Min 14/05
Eu upvote isso duas vezes se eu pudesse
Greg Martin
Minha única preocupação com a segunda resposta foi a incompatibilidade entre entrada (uma função pura) e saída (uma função de x).
Ian Miller
6

Gelatina , 5 bytes

Jı*Ċ×

Experimente online!

Como funciona

Multiplica o primeiro elemento por 1, o terceiro 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)

Prova de algoritmo

Seja o polinômio f(x).

Como temos a garantia de que se xé uma raiz, então é -x, portanto, fdeve ser par, o que significa que seu coeficiente para os poderes ímpares deve ser 0.

Agora, girar as raízes 90°é essencialmente f(ix).

Expandir e comparar coeficientes prova o algoritmo.

Freira Furada
fonte
Então, não precisamos tocar no 2,4, 6, 8, etc?
Rohan Jhunjhunwala
2
Esses são zero de qualquer maneira.
flawr
Seu truque com ı*Ċé muito bom, você deve explicá-lo :) #
Leo #
@Leo É essencialmente uma implementação simples embora ...
Leaky Nun
A lógica aqui não é muito justo, porque você pode sim ter todos os coeficientes para o mesmo poder ser 0.
Ørjan Johansen
5

JavaScript (ES6), 25 bytes

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

O polinômio original possui soluções da forma em x = ±aque se encontra a linha real ou imaginária. Exceto quando a = 0(nesse caso, xé um fator do polinômio), isso significa que x² - a²é um fator do polinômio (que significa que os termos alternativos são sempre zero). Agora, quando giramos as raízes, o fator muda para x² + a². Como todos os fatores mudam ao mesmo tempo, o terceiro termo do polinômio, que é a soma de todos os -a²termos, muda de sinal, o quinto termo, que é a soma dos produtos de pares de -a²termos, mantém o mesmo sinal, etc. alternando todos os outros termos.

Neil
fonte
4

Oitava , 27 bytes

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

Experimente online!

Isso se aplica diretamente à definição: calcular raízes, multiplicar por j, converter novamente de raízes em polinômio. Um arredondamento final é necessário devido a erros numéricos de ponto flutuante.

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

Experimente online!

Não faço ideia do que a @Leaky Nun de feitiçaria fez aqui para economizar 5 bytes.

Levei um segundo para descobrir, mas o segundo bit de C alternará como queremos. Portanto, o @Leaky Nun explorou isso para salvar os bits de que precisamos.

Rohan Jhunjhunwala
fonte
66 bytes
Freira vazada
0

TI-Basic, 20 bytes

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

Se armazenado prgmA, execute com:

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

seq(só tinha que ser o único comando * que não suporta números complexos. :)

*: Exagero

pizzapants184
fonte
0

Casio-Basic, 8 bytes

n|x=𝑖x

Função sem nome, usando a abordagem Mathematica de Ian Miller. O imaginário 𝑖 do teclado Math2 precisa ser usado (conta como 2 bytes, código de caractere 769), e o polinômio deve ser inserido como uma equação de x.

7 bytes para o código, 1 byte para especificar ncomo parâmetro.

Explicação : Pega a equação ne simplesmente substitui todas as instâncias de xpor 𝑖x.

numbermaniac
fonte
0

Stax , 5 bytes

Æ[]▐↨

Execute e depure online!

Resposta do porto da geléia.

Usa representação 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

Se houver zeros à esquerda, eles precisam ser aparados primeiro e isso pode ser feito ao custo de outro byte.

Weijun Zhou
fonte