Expande las raíces en un polinomio

8

Desafío

Dadas las raíces de un polinomio separadas por espacios como entrada, genera la forma expandida del polinomio.

Por ejemplo, la entrada

1 2

representa esta ecuación:

(x-1)(x-2)

Y debería dar salida:

x^2-3x+2

El formato exacto de salida no es importante, puede ser:

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

o:

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

o:

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

Puntuación / Reglas

  • eval y los "me gusta" no están permitidos.
  • Puede usar cualquier versión de Python o cualquier otro idioma .
aliqandil
fuente
¿Qué pasa con los empotrados numpy.poly?
Dennis
@Dennis numpy no está integrado, ¡creo!
aliqandil
Las respuestas de Python + NumPy son generalmente aceptadas, pero eso no viene al caso. ¿Puedo usar una función que convierta las raíces en coeficientes polinómicos? Le pregunto desde que prohibió la evaluación, y eso es considerablemente más poderoso que la evaluación.
Dennis
@Dennis ¡Eso es todo lo que piensas! ¡Pero adelante! Dado que la misma función está incorporada en la mayoría de los idiomas.
aliqandil
¿podemos suponer que las raíces son enteros? ¿podemos suponer que son enteros no negativos?
orgulloso Haskeller

Respuestas:

3

Jalea, 15 bytes

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

Esto se usa Æṛpara construir los coeficientes de un polinomio monico con raíces dadas. Pruébalo en línea!

Cómo 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 '+'.

Versión alternativa, 24 bytes.

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

Esto no utiliza elementos integrados relacionados con polinomios. Pruébalo en línea!

Cómo 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
fuente
4

MATL , 29 bytes

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

La entrada es una matriz con las raíces.

EDICIONES:

  • (20 de mayo de 2016): la X+función se ha eliminado, ya que Y+incluye su funcionalidad. Entonces, en el código anterior, reemplace X+por Y+.
  • (29 de septiembre de 2017): debido a cambios en la YDfunción, wen el código anterior debe eliminarse.

El siguiente enlace incluye esos cambios.

Pruébalo en línea!

Explicación

Esto aplica una convolución repetida con términos de la forma [1, -r]donde res una raíz.

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
fuente
2

Ruby, 155 bytes

Función anónima, la entrada es una matriz de las raíces.

Imprime desde la potencia más baja primero, por lo que al llamar f[[1,2]](suponiendo que le haya asignado la función f) se devuelve la cadena "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('+')}
Tinta de valor
fuente
1

Python 3, 453 bytes (espacios eliminados y más) -> 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 enlace , lo ayudará a entender la razón detrás de esas dos importaciones.

aliqandil
fuente
Podrías deshacerte de muchos espacios en blanco adicionales
orgulloso Haskeller
@proudhaskeller ¡Tienes razón! Cambié las reglas, olvidé cambiar mi propia respuesta.
aliqandil
1
from operator import*, from functools import*guarde algunos bytes
shooqie
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 las potencias inferiores primero, con una adicional 0+al comienzo. por ejemplo:

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

La función calcula los coeficientes agregando progresivamente más raíces, como convoluciones, pero sin la función incorporada.

Luego usamos la lista mónada para implícitamente concattodos los monomios diferentes.

orgulloso Haskeller
fuente
0

Sabio, 38 bytes

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

Pruébalo en línea

Esto define una lambda sin nombre que toma un iterable de raíces como entrada y calcula el producto (x-x_n) for x_n in roots, luego lo expande.

Mego
fuente
0

Mathematica, 26 bytes

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

Mathematica tiene potentes polinomios incorporados.

Uso

  f = Expand@Product[x-k,{k,#}]&
  f@{3, 14, 15, 92}
x^4 - 124 x^3 + 3241 x^2 - 27954 x + 57960
millas
fuente
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
fuente