Erweitern Sie Wurzeln zu einem Polynom

8

Herausforderung

Geben Sie die erweiterte Form des Polynoms aus, wenn die Wurzeln eines Polynoms durch Leerzeichen als Eingabe getrennt sind.

Zum Beispiel die Eingabe

1 2

repräsentiert diese Gleichung:

(x-1)(x-2)

Und sollte ausgeben:

x^2-3x+2

Das genaue Ausgabeformat ist nicht wichtig, es kann sein:

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

oder:

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

oder:

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

Wertung / Regeln

  • eval und Likes sind nicht erlaubt.
  • Sie können eine beliebige Version von Python oder eine andere Sprache verwenden .
Aliqandil
quelle
Was ist mit eingebauten numpy.poly?
Dennis
@ Tennis Numpy ist nicht eingebaut, denke ich!
Aliqandil
Python + NumPy-Antworten werden allgemein akzeptiert, aber das ist nicht der Punkt. Kann ich eine Funktion verwenden, die Wurzeln in Polynomkoeffizienten umwandelt? Ich frage, seit Sie eval verboten haben, und das ist wesentlich mächtiger als eval.
Dennis
@ Tennis Das denkt so ziemlich das ganze! Aber mach weiter! Da die gleiche Funktion in den meisten Sprachen eingebaut ist.
Aliqandil
Können wir annehmen, dass die Wurzeln ganze Zahlen sind? Können wir annehmen, dass es sich um nichtnegative ganze Zahlen handelt?
stolzer Haskeller

Antworten:

3

Gelee, 15 Bytes

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

Dies wird verwendet Æṛ, um die Koeffizienten eines monischen Polynoms mit gegebenen Wurzeln zu konstruieren. Probieren Sie es online aus!

Wie es funktioniert

Æṛ‘Ė’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 '+'.

Alternative Version, 24 Bytes

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

Dies verwendet keine polynombezogenen Einbauten. Probieren Sie es online aus!

Wie es funktioniert

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
quelle
4

MATL , 29 Bytes

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

Eingabe ist ein Array mit den Wurzeln.

EDITS:

  • (20. Mai 2016): Die X+Funktion wurde entfernt, Y+einschließlich ihrer Funktionalität. So in dem obigen Code ersetzen X+durch Y+.
  • (29. September 2017): Aufgrund von Änderungen in der YDFunktion sollte wder obige Code entfernt werden.

Der folgende Link enthält diese Änderungen.

Probieren Sie es online aus!

Erläuterung

Dies gilt für die wiederholte Faltung mit Begriffen der Form, [1, -r]in der rsich eine Wurzel befindet.

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

Ruby, 155 Bytes

Anonyme Funktion, Eingabe ist ein Array der Wurzeln.

Druckt zuerst mit der niedrigsten Leistung. f[[1,2]]Wenn Sie also aufrufen (vorausgesetzt, Sie haben die Funktion zugewiesen f), wird die Zeichenfolge zurückgegeben "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('+')}
Wert Tinte
quelle
1

Python 3, 453 Bytes (Leerzeichen entfernt und mehr) -> 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])

Überprüfen Sie diesen Link , um den Grund für diese beiden Importe zu verstehen.

Aliqandil
quelle
Sie könnten eine Menge zusätzlicher Leerzeichen loswerden
stolzer Haskeller
@proudhaskeller Du hast recht! Ich habe die Regeln geändert und irgendwie vergessen, meine eigene Antwort zu ändern.
Aliqandil
1
from operator import*, from functools import*speichern Sie ein paar 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

druckt zuerst die unteren Potenzen aus, 0+am Anfang eine zusätzliche . zum Beispiel:

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

Die Funktion berechnet die Koeffizienten, indem sie nach und nach mehr Wurzeln wie Faltungen hinzufügt, jedoch ohne die eingebauten.

Dann verwenden wir die Listenmonade, um implizit concatalle verschiedenen Monome zu verwenden.

stolzer haskeller
quelle
0

Salbei, 38 Bytes

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

Probieren Sie es online aus

Dies definiert ein unbenanntes Lambda, das eine iterierbare Wurzel als Eingabe verwendet, das Produkt berechnet (x-x_n) for x_n in rootsund es dann erweitert.

Mego
quelle
0

Mathematica, 26 Bytes

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

Mathematica hat mächtige Polynom-Buildins.

Verwendungszweck

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

JavaScript (ES6), 96 Byte

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
quelle