Prime-Polynome

21

Bestimmen Sie bei einem gegebenen Polynom, ob es eine Primzahl ist.

Ein Polynom ist ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g, wo jeder Term eine konstante Zahl (der Koeffizient) multipliziert mit einer nichtnegativen ganzzahligen Potenz von ist x. Die höchste Leistung mit einem Koeffizienten ungleich Null wird als Grad bezeichnet. Für diese Herausforderung betrachten wir nur Polynome von mindestens Grad 1. Das heißt, jedes Polynom enthält einige x. Außerdem verwenden wir nur Polynome mit ganzzahligen Koeffizienten.

Polynome können multipliziert werden. Zum Beispiel ist (x+3)(2x^2-2x+3)gleich 2x^3+4x^2-3x+9. Somit 2x^3+4x^2-3x+9kann in einkalkuliert werden x+3und 2x^2-2x+3, so es Verbund ist.

Andere Polynome können nicht berücksichtigt werden. Beispielsweise 2x^2-2x+3ist nicht das Produkt von zwei Polynomen (Ignorieren von konstanten Polynomen oder solchen mit nicht ganzzahligen Koeffizienten). Daher ist es prim (auch als irreduzibel bekannt).

Regeln

  • Die Ein- und Ausgabe kann auf jedem Standardweg erfolgen.
  • Die Eingabe kann eine Zeichenfolge 2x^2-2x+3, eine Liste von Koeffizienten {2,-2,3}oder ein ähnliches Mittel sein.
  • Die Ausgabe ist entweder ein wahrer Wert, wenn es sich um einen Primwert handelt, oder ein falscher Wert, wenn es sich um einen zusammengesetzten Wert handelt. Sie müssen für alle Primzahlen den gleichen Wahrheitswert und für alle zusammengesetzten Polynome den gleichen Falsey-Wert liefern.
  • Die Eingabe hat mindestens Grad 1 und höchstens Grad 10.
  • Sie dürfen keine eingebauten Werkzeuge zur Faktorisierung (von ganzen Zahlen oder Ausdrücken) oder zum Lösen von Gleichungen verwenden.

Beispiele

True - Prime

x+3
-2x
x^2+x+1
x^3-3x-1
-2x^6-3x^4+2
3x^9-8x^8-3x^7+2x^3-10

Falsch - zusammengesetzt

x^2
x^2+2x+1
x^4+2x^3+3x^2+2x+1
-3x^7+5x^6-2x
x^9-8x^8+7x^7+19x^6-10x^5-35x^4-14x^3+36x^2+16x-12
Ypnypn
quelle
11
Von einigen schnellen googeln ist dies ein schwieriges Problem, unabhängig vom Golfspielen.
Orlp
5
Habe ich Recht, wenn ich denke, dass Sie unter Prime irreduzibel verstehen ? Wenn ja, dann ist dies im Grunde eine Variante dieser Frage zum Faktorisieren von Polynomen , und ich vermute, dass sie keine Antworten anzieht, die keinen Einfluss haben.
Peter Taylor
1
Nach diesem jüngsten Papier , " Wir sind in der Frage interessiert , zu entscheiden , ob ein gegebenes Polynom irreduzibel ist oder nicht. Folglich ist ein einfacher Test oder ein Kriterium , die dieser Information ist wünschenswert , geben würde. Leider kein solches Kriterium , die für alle gilt die Klassen von Polynomen wurden noch nicht entwickelt ".
Peter Taylor
2
@AlexA., Es gibt viele, viele "if" -Tests, die für einige Polynome funktionieren , aber die Frage ist, ob ein "if and only if" -Test für alle Polynome funktioniert.
Peter Taylor
1
Das ist ein schönes Problem! Beachten Sie, dass Polynome in der Regel nur Primzahlen in Bezug auf einen Basisring (oder ein Feld) sind. Insbesondere wenn das Feld die komplexen Zahlen sind, ist kein Polynom mit einem Grad größer als 2 eine Primzahl. Also würde ich angeben, ob Sie Rational (wahrscheinlich die einfachste) Integer (dies wird auch ein Integer-Factoring beinhalten) oder modulo eine Zahl m wollen. Wenn m eine Primzahl ist, gibt es ziemlich einfache Algorithmen. Ansonsten sind die Dinge etwas kniffliger ... (aber machbar)
cody

Antworten:

3

Mathematica, 224 Bytes

f@p_:=(e=p~Exponent~x;r=Range[⌈e/-4⌉,(e+2)/4];e<2||FreeQ[PolynomialRemainder[p,Thread@{r,#}~InterpolatingPolynomial~x,x]&/@Tuples[#~Join~-#&[Join@@Position[#/Range@Abs@#,_Integer]]&/@#]~DeleteCases~{(a_)..},0|{}]&[p/.x->r])

Erklärung :

Hier wird die Methode von Kronecker angewendet. Diese Methode erzeugt bestimmte Polynome niedrigeren Grades und prüft, ob ein Faktor des ursprünglichen Polynoms existiert.

Testfälle :

f/@{x+3, -2x, x^2+x+1, x^3-3x-1, -2x^6-3x^4+2, 3x^9-8x^8-3x^7+2x^3-10}
(* {True, True, True, True, True, True} *)

f/@{x^2, x^2+2x+1, x^4+2x^3+3x^2+2x+1, -3x^7+5x^6-2x, x^9-8x^8+7x^7+19x^6-10x^5-35x^4-14x^3+36x^2+16x-12}
(* {True, True, True, True, True} *)

Es dauert 14s auf meinem Laptop, um zu schließen, dass 3x^9-8x^8-3x^7+2x^3-10Prime ist.

njpipeorgan
quelle
1

PARI / GP, 16 Bytes, billig wie die Hölle

Aus irgendeinem Grund wurde dies nicht abgelehnt (mit der Bemerkung, dass der Befehl nicht faktorisiert oder durch Gleichungen gelöst werden kann):

polisirreducible

Testfall

%(x^2+x+1)

gibt zurück 1(true). Die anderen Beispiele funktionieren ähnlich.

Um zu zeigen, dass dies auf die harte Tour lösbar ist, finden Sie hier eine vollständige Lösung.

Weniger billig, aber langsam

Es macht wirklich keinen Sinn, das zu spielen.

Beauzamy(P)=
{
  my(d=poldegree(P),s,c);
  s=sum(i=0,d,polcoeff(P,i)^2/binomial(d,i));
  c = 3^(3/2 + d);
  c *= s / (4*d*Pi);
  abs(c * pollead(P))
}
factorpol(P)=
{
  my(B=Beauzamy(P)\1, t=B*2+1, d=poldegree(P)\2, Q);
  for(i=0,t^(d+1)-1,
    Q=Pol(apply(n->n-B, digits(i,t)));
    if(Q && poldegree(Q) && P%Q==0, return(Q))
  );
  0
}
irr(P)=
{
  factorpol(P)==0
}

Bearbeiten: Kommentatoren haben darauf hingewiesen, dass die erste Methode durch guten Geschmack, den Geist der Regeln, die Genfer Konvention, Standard-Regelungslücke, etc. nicht erlaubt sein kann. Ich bin nicht einverstanden, aber auf jeden Fall habe ich die zweite Version zusammen mit gepostet die erste und sicherlich scheint es akzeptabel.

Charles
quelle
1
Hmmmm ... Ich bin mir ziemlich sicher , dass dieser Befehl tut Faktor und / oder Gleichungen lösen unter der Haube. (Auch wenn eine Herausforderung bestimmte integrierte Funktionen nicht zulässt, bedeutet dies, dass eine integrierte Funktion, die das Problem nur löst, auch nicht dem Geist der Herausforderung entspricht.)
Martin Ender
@ MartinBüttner: Ich denke, dass die erste Antwort zum Buchstaben, aber nicht zum Geist der Herausforderungsregeln passt. Deshalb habe ich die zweite Version geschrieben, die eine legitime Lösung ist. Es kann überprüfen, dass x^4+1(was bekanntermaßen für jede Primzahl reduzierbar ist) in 86 Millisekunden nicht reduzierbar ist. Wenn nichts anderes kann andere diese Version anpassen und Golf spielen.
Charles
1
Die erste Antwort fällt in eine Lücke, die standardmäßig gesperrt ist: Verwenden von integrierten Funktionen, um die Arbeit zu erledigen . Bitte entfernen Sie es aus Ihrer Antwort oder geben Sie zumindest an, dass es keine gültige Lösung ist.
Isaacg
5
@isaacg Dies ist derzeit keine gültige Standardlücke (aufgrund der Abstimmungsunterbrechung + 44 / -29). Charles, wenn Sie einverstanden sind, dass nur die zweite Antwort wirklich legitim ist, dann sollten Sie enthalten seine Byteanzahl statt.
Martin Ender
@ MartinBüttner: Ich nicht - ich denke, beide sind legitim durch die Regeln dieser Frage und den allgemeinen Schlupfloch-Thread. Aber ich habe einen Kommentar hinzugefügt, um auf das Problem hinzuweisen.
Charles