Ist es ein Faktor eines Polynoms?

11

Ein Polynom teilbar durch einen Faktor , (x-n)wenn f(n)=0für eine Funktion f. Ihre Aufgabe: festzustellen, ob eine Polynomfunktion f(x)durch teilbar ist (x-n).

Die Eingabe

Die Eingabe erfolgt in Form von (x-n), (Polynomial). Denken Sie daran, wenn n negativ ist, (x-n)liegt es in der Eingabeform von vor(x+n) . Für das Polynom werden alle Exponenten als eingegeben ^. Koeffizienten werden neben der Variablen geschrieben x. Ein Beispielpolynom könnte sein 2x^2 + x^1. Es wird keine Leerzeichen zwischen irgendetwas geben. Der Begriff xwird eingegeben als x^1. Also, wie "normal" aussehen würde, (x - 1)wird es sein (x^1-1). Die Koeffizienten und Potenzen sind immer ganze Zahlen. Der Koeffizient eins ist implizit, wenn er gerecht ist x. Dh xkann interpretiert werden als1x

Die Ausgabe

Ein boolescher Wert. Wahrheit oder Falsey.

Danke an @AlexA. Um mir zu helfen, das zu klären!

Beispiele

Input:(x^1-1),(x^1-1)
Output: True

Input: (x^1+2),(2x^2+4x^1+2)
Output: False

Input: (x^1+7),(x^2-49)
Output: True

Regeln

  • Dies ist , also gewinnt der kürzeste Code in Bytes

Leider weiß ich nicht, wie ich die Snippet-Bestenliste implementieren soll. Wenn jemand weiß wie, zögern Sie nicht, den Beitrag zu bearbeiten.

intboolstring
quelle
Wird die Eingabe eine Zeichenfolge mit genau dieser Form sein, dh Parens um den Divisorkandidaten, ein Komma mit null oder einem Leerzeichen und Parens um das Polynom?
Alex A.
2
Mögliches Duplikat
Intrepidcoder
Auf keinen Fall ein Duplikat davon.
Intboolstring
@intrepidcoder Dies ist kein Duplikat, da die Frage nicht darin besteht, ein Polynom zu faktorisieren. Es ist zu sehen, ob ein Polynom durch einen linearen Faktor geteilt werden kann.
Intboolstring
Werden Polynomkoeffizienten immer ganze Zahlen sein?
Digitales Trauma

Antworten:

5

Pyth - 39 Bytes

Dies ist eine monströse Kombination aus Regexp und Eval. Ich mag den Ansatz, werde aber versuchen, die Implementierung zu verbessern.

Es verwendet den Polynom-Restsatz .

K_sPe:z"-|\+"3!v.ssXPtw,\^\x,"**""*K"\*

Funktioniert aufgrund der evalen Verwendung nicht online.

Maltysen
quelle
3

Casio Basic, 19 Bytes

judge(mod(b,a)=0

Wie sich herausstellt, kann der fx-CP400 modalgebraische Ausdrücke verarbeiten!

Polynom und Faktor sollten als Ausdrücke eingegeben werden. 16 Bytes für den Code, 3 Bytes für die Eingabe a,bin das Parameterwertfeld.

Zahlmaniac
quelle
1

MATLAB, 103 99 97 95 93 Bytes

Ich probiere verschiedene Dinge aus und habe dies zum Laufen gebracht, um ein paar Bytes zu sparen:

eval([regexprep(input(''),{'.+?1(.+)\),','(\d)x'},{'x=str2num(''$1'');disp(~','$1\*x'}) 41]);

Wenn ich das noch weiter reduzieren kann, werde ich eine Erklärung veröffentlichen.


Alter Code eine Erklärung

t=sscanf(input(''),'(x^1%d),%s')';x=-t(1);disp(~eval(regexprep([t(2:end) ''],'(\d)x','$1\*x')))

Dies funktioniert auch mit Octave . Sie können es online versuchen . Ich habe das Programm als Skript mit dem Namen gespeichert isFactor.m, sodass Sie es einfach isFactoran der Eingabeaufforderung eingeben können . [Hinweis: In Octave wird beim Ausführen eine Warnung ausgegeben - MATLAB generiert diese nicht].

Die Eingabe muss im Format '(x^1+7),(x^2-49)'gemäß der Frage erfolgen. Die Anführungszeichen werden hinzugefügt, damit MATLAB / Octave weiß, dass es sich um eine Zeichenfolge handelt.

Die Ausgabe ist entweder a 0oder a, 1je nachdem, ob sie wahr oder falsch ist.


Der Code funktioniert also wie folgt. Zuerst fordern wir eine Eingabe an und analysieren sie dann. Die Analysezeichenfolge extrahiert die vorzeichenbehaftete Zahl nach der ersten (x^1in der Zeichenfolge - dies ist unser Wert von n. Dann wird der String ( %s) nach dem ),in der Eingabe weiter extrahiert - dies ist unser Ausdruck.

t=sscanf(input(''),'(x^1%d),%s')';

Als nächstes extrahieren wir den Wert von nund setzen ihn xgleich - wir werden bewerten, ob der Ausdruck wann gleich Null n==xist. Deshalb speichern wir den Wert in x. Außerdem negieren wir die extrahierte Zahl aufgrund des Minuszeichens beim Parsen.

x=-t(1);

Wir werden dann die Ausgabe anzeigen, die ein Boolescher Wert ist

disp(

Die Ausgabe ist im Grunde die logische Negation unserer bewerteten Gleichung. Wenn f(x)Null ist, wird 1 zurückgegeben, andernfalls wird Null ausgegeben.

     ~eval(

Wir evaluieren den Eingabeausdruck, aber um dies zu tun, müssen wir ihn leicht neu formatieren, damit MATLAB ihn verstehen kann. Wenn wir die Zeichenfolge lesen, handelt es sich tatsächlich um ein Array vom doubleTyp, daher müssen wir diese in ein Zeichenarray konvertieren. Vor der Konvertierung werden wir auch das erste Element entfernen, da wir dafür verwendet haben n. Wir müssen dann jedes Vorkommen x, dem eine Zahl (z. B. 4x) vorangestellt ist, durch dasselbe ersetzen , jedoch durch ein Multiplikationszeichen ( *) dazwischen, damit MATLAB es berechnen kann.

           regexprep(char([t(2:end) ''],'(\d)x','$1\*x')
     )
)
Tom Carpenter
quelle
1

VBScript, 118 116 Bytes

a=inputbox(""):for i=0 to 9:a=replace(a,i&"x",i&"*x"):next:b=split(a,","):x=-eval(b(0)):msgbox not cbool(eval(b(1)))

Da wir wissen, dass der erste Teil der Eingabe ein lineares Polynom ist, müssen wir nur prüfen, ob seine Wurzel mit der des zweiten Polynoms übereinstimmt. und wir müssen den Begriff vorbereiten, evalindem wir ihn nach Bedarf einfügen *.

Hilbert
quelle
1

Axiom 77 180 Bytes

f(a:UP(x,INT),b:UP(x,INT)):Boolean==(ground?(a)or ground?(b)=>false;p:=b;r:=a;if degree(a::POLY INT,x)>degree(b::POLY INT,x)then(p:=a;r:=b);(p rem r)$UP(x,FRAC INT)~=0=>false;true)

die vorherige Lösung

v(a,b)==(ground?(a) or ground?(b) or (b rem a)$UP(x,FRAC INT)~=0=>false;true)

war falsch, weil es Grad (b)> = Grad (a) einen Fehler voraussetzt, den ich geschrieben habe ... Test und Ergebnisse

(3) -> f(x^1-1,x^1-1)
   (3)  true
                                                            Type: Boolean
(4) -> f(x^1+1,2*x^2+4*x^1+2)
   (4)  true
                                                            Type: Boolean
(5) -> f(x^1+2,2*x^2+4*x^1+2)
   (5)  false
                                                            Type: Boolean
(6) -> f(x^1+7,x^2-49)
   (6)  true
                                                            Type: Boolean
(7) -> f(1, 1)
   (7)  false
                                                            Type: Boolean
(8) -> f(1, x^2+1)
   (8)  false
                                                            Type: Boolean
(9) -> f(x^8-1, x^2-1)
   (9)  true
RosLuP
quelle