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 .

¿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.

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

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('+')}

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.


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.


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.


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

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`+`
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.