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.