Expanda raízes em um polinômio

8

Desafio

Dadas as raízes de um polinômio separadas por espaços como entrada, produza a forma expandida do polinômio.

Por exemplo, a entrada

1 2

representa esta equação:

(x-1)(x-2)

E deve produzir:

x^2-3x+2

O formato exato da saída não é importante, pode ser:

1x^2+-3x^1+2x^0

ou:

0 0 0
1x^3+0x^2+0x^1+0

ou:

3 14 15 92
1x^4+-124x^3+3241x^2+-27954x^1+57960

Pontuação / Regras

  • eval e gostos são proibidos.
  • Você pode usar qualquer versão do Python ou qualquer outro idioma .
aliqandil
fonte
E os incorporados, como numpy.poly?
Dennis
@ Dennis numpy não está embutido, eu acho!
27616 aliqandil
As respostas Python + NumPy são geralmente aceitas, mas isso não vem ao caso. Posso usar uma função que transforma raízes em coeficientes polinomiais? Estou perguntando desde que você baniu o eval, e isso é consideravelmente mais poderoso que o eval.
Dennis
@ Dennis Isso praticamente todo o pensamento! Mas vá em frente! Uma vez que a mesma função está embutida na maioria dos idiomas.
27616 aliqandil
podemos assumir que as raízes são inteiras? podemos assumir que são números inteiros não negativos?
haskeller orgulhoso

Respostas:

3

Gelatina, 15 bytes

Æṛ‘Ė’Uj€“x^”j”+

Isso é usado Æṛpara construir os coeficientes de um polinômio monônico com raízes determinadas. Experimente online!

Como funciona

Æṛ‘Ė’Uj€“x^”j”+  Main link. Argument: A (list of roots)

Æṛ               Yield the coefficients of a monic polynomial with roots A.
  ‘              Increment each root by 1.
   Ė             Enumerate the roots, yielding
                 [[1, coeff. of x^0 + 1], ... [n + 1, coeff. of x^n + 1]].
    ’            Decrement all involved integers, yielding
                 [[0, coeff. of x^0], ... [n, coeff. of x^n]].
     U           Upend to yield [[coeff. of x^0, 0], ... [coeff. of x^n, n]].
      j€“x^”     Join each pair, separating by 'x^'.
            j”+  Join the pairs, separating by '+'.

Versão alternativa, 24 bytes

1WW;ð0;_×µ/‘Ė’Uj€“x^”j”+

Isso não usa embutidos relacionados a polinômios. Experimente online!

Como funciona

1WW;ð0;_×µ/‘Ė’Uj€“x^”j”+  Main link. Argument: A (list of roots)

1WW                       Yield [[1]].
   ;                      Concatenate with A.
    ð    µ/               Reduce [[1]] + A by the following, dyadic chain:
     0;                     Prepend a zero to the left argument (initially [1]).
                            This multiplies the left argument by "x".
        ×                   Take the product of both, unaltered arguments.
                            This multiplies the left argument by "r", where r is
                            the root specified in the right argument.
      _                     Subtract.
                            This computes the left argument multiplied by "x-r".
           ‘Ė’Uj€“x^”j”+  As before.
Dennis
fonte
4

MATL , 29 bytes

ljU"1@_hX+]tn:Pqv'+%gx^%g'wYD

Entrada é uma matriz com as raízes.

EDITAR% S:

  • (20 de maio de 2016): a X+função foi removida, pois Y+inclui sua funcionalidade. Portanto, no código acima, substitua X+por Y+.
  • (29 de setembro de 2017): devido a alterações na YDfunção, wo código acima deve ser removido.

O link a seguir inclui essas alterações.

Experimente online!

Explicação

Isso se aplica à convolução repetida com termos do formulário [1, -r]onde ré uma raiz.

l          % push number 1
jU         % take input string. Convert to number array
"          % for each root r
  1        %   push number 1
  @_       %   push -r
  h        %   concatenate horizontally
  X+       %   convolve. This gradually builds array of coefficients
]          % end for each
tn:Pq      % produce array [n-1,n-2,...,0], where n is the number of roots
v          % concatenate vertically with array of coefficients
'+%gx^%g'  % format string, sprintf-style
w          % swap
YD         % sprintf. Implicitly display
Luis Mendo
fonte
2

Ruby, 155 bytes

Função anônima, input é uma matriz das raízes.

Imprime primeiro com a menor potência, portanto, a chamada f[[1,2]](assumindo que você atribuiu a função f) retorna a sequência "2x^0+-3x^1+1x^2".

->x{j=-1
x.map{|r|[-r,1]}.reduce{|a,b|q=a.map{|c|b=[0]+b
b.map{|e|e*c}[1..-1]}
q.pop.zip(*q).map{|e|(e-[p]).reduce(:+)}}.map{|e|"#{e}x^#{j+=1}"}.join('+')}
Value Ink
fonte
1

Python 3, 453 bytes (espaços removidos e mais) -> 392 bytes

import functools
import operator
print([('+'.join(["x^"+str(len(R))]+[str(q)+"x^"+str(r)if r>0else"{0:g}".format(q)for r,q in enumerate([sum(functools.reduce(operator.mul,(-int(R[n])for n,m in enumerate(j)if int(m)==1),1)for j in[(len(R)-len(bin(i)[2:]))*'0'+bin(i)[2:]for i in range(1,2**len(R))]if sum(1-int(k) for k in j)==p)for p in range(len(R))]) ][::-1]))for R in[input().split()]][0])

Marque Este link , ajudará a entender o motivo por trás dessas duas importações.

aliqandil
fonte
Você pode se livrar de um monte de espaço em branco adicional
haskeller orgulhoso
@proudhaskeller Você está certo! Mudei as regras meio que esqueci de mudar minha própria resposta.
aliqandil
1
from operator import*, from functools import*salve alguns bytes
shooqie 25/03
import functools,operator
CalculatorFeline
0

Haskell, 99

l%r=zipWith(-)(0:l)$map(r*)l++[0]
f e='0':do(c,i)<-zip(foldl(%)[1]e)[0..];'+':show c++"x^"++show i

imprime as potências inferiores primeiro, com uma adicional 0+no início. por exemplo:

>f [1,1]
"0+1x^0+-2x^1+1x^2"

A função calcula os coeficientes adicionando progressivamente mais raízes, como convoluções, mas sem o builtin.

Em seguida, usamos a lista mônada para implicitamente concattodos os diferentes monômios.

orgulhoso haskeller
fonte
0

Sábio, 38 bytes

lambda N:prod(x-t for t in N).expand()

Experimente online

Isso define um lambda sem nome que pega uma iterável de raízes como entrada e calcula o produto (x-x_n) for x_n in rootse depois o expande.

Mego
fonte
0

Mathematica, 26 bytes

Expand@Product[x-k,{k,#}]&

O Mathematica possui poderosos recursos polinomiais.

Uso

  f = Expand@Product[x-k,{k,#}]&
  f@{3, 14, 15, 92}
x^4 - 124 x^3 + 3241 x^2 - 27954 x + 57960
milhas
fonte
0

JavaScript (ES6), 96 bytes

a=>a.map(x=>r.map((n,i)=>(r[i]-=x*a,a=n),++j,r.push(a=0)),r=[j=1])&&r.map(n=>n+`x^`+--j).join`+`
Neil
fonte