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 .

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.

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

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

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.


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.


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.


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

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`+`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.