Pierwotne wielomiany

21

Biorąc pod uwagę wielomian, określ, czy jest liczbą pierwszą.

Wielomianem jest ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g, gdzie każdy warunek jest liczbą stałą (współczynnikiem) pomnożoną przez nieujemną moc całkowitą wynoszącą x. Najwyższą moc o niezerowym współczynniku nazywa się stopniem. W przypadku tego wyzwania bierzemy pod uwagę wielomian co najmniej stopnia 1. Oznacza to, że każdy wielomian zawiera niektóre x. Używamy również wielomianów o współczynnikach całkowitych.

Wielomiany można mnożyć. Na przykład (x+3)(2x^2-2x+3)równa się 2x^3+4x^2-3x+9. W ten sposób 2x^3+4x^2-3x+9można go rozdzielić na x+3i 2x^2-2x+3dlatego jest złożony.

Inne wielomiany nie mogą być uwzględnione. Na przykład 2x^2-2x+3nie jest iloczynem dwóch dowolnych wielomianów (ignorowanie stałych wielomianów lub tych o współczynnikach niecałkowitych). Dlatego jest liczbą pierwszą (znaną również jako nieredukowalna).

Zasady

  • Wejście i wyjście może odbywać się dowolnym standardowym sposobem.
  • Dane wejściowe mogą być ciągiem znaków 2x^2-2x+3, listą współczynników podobnych {2,-2,3}lub dowolnymi podobnymi środkami.
  • Wyjście jest albo prawdą, jeśli jest liczbą pierwszą, albo wartością falsey, jeśli jest złożone. Musisz podać tę samą prawdziwą wartość dla wszystkich liczb pierwszych i tę samą wartość falsey dla wszystkich wielomianów złożonych.
  • Dane wejściowe będą co najmniej stopnia 1, a co najwyżej stopnia 10.
  • Nie można używać wbudowanych narzędzi do faktoryzacji (liczb całkowitych lub wyrażeń) lub rozwiązywania równań.

Przykłady

Prawda - liczba pierwsza

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

Fałsz - kompozyt

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
źródło
11
Po szybkim googlowaniu jest to trudny problem niezależnie od gry w golfa.
orlp
5
Czy mam rację sądząc, że przez prime masz na myśli nieredukowalną ? Jeśli tak, to jest to w zasadzie wariant tego pytania na temat wielomianów faktoringowych i podejrzewam, że nie przyciągnie on żadnych odpowiedzi, które nie uwzględniają czynników.
Peter Taylor
1
Zgodnie z tym ostatnim artykułem : „ Interesuje nas kwestia podjęcia decyzji, czy dany wielomian jest nieredukowalny, czy nie. W związku z tym pożądany jest prosty test lub kryterium, które dałoby te informacje. Niestety nie ma takiego kryterium, które miałoby zastosowanie do wszystkich klasy wielomianów zostały jeszcze opracowane ".
Peter Taylor
2
@AlexA., Istnieje wiele wielu testów „jeśli”, które działają dla niektórych wielomianów, ale pytanie dotyczy testu „jeśli i tylko jeśli”, który działa dla wszystkich wielomianów.
Peter Taylor
1
To niezły problem! Zauważ, że zwykle wielomiany są tylko pierwsze względem pierścienia podstawowego (lub pola). W szczególności, jeśli pole jest liczbami zespolonymi, to żaden wielomian stopnia większego niż 2 nie jest liczbą pierwszą. Więc sprecyzowałbym, czy chcesz Rational (prawdopodobnie najprostsza) liczba całkowita (będzie to obejmowało również faktoring całkowity), czy modulo jakaś liczba m. Jeśli m jest liczbą pierwszą, wówczas istnieją dość łatwe algorytmy. W przeciwnym razie sprawy są nieco trudniejsze ... (ale wykonalne)
cody

Odpowiedzi:

3

Mathematica, 224 bajty

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])

Objaśnienie :

Zastosowano tutaj metodę Kroneckera . Ta metoda generuje pewne wielomiany niższego stopnia i sprawdza, czy istnieje czynnik pierwotnego wielomianu.

Przypadki testowe :

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} *)

Na moim laptopie potrzeba 14 sekund, aby dojść do wniosku, że 3x^9-8x^8-3x^7+2x^3-10jest liczbą pierwszą.

njpipeorgan
źródło
1

PARI / GP, 16 bajtów, tanie jak diabli

Z jakiegoś powodu nie zostało to zabronione (zauważając, że polecenie nie uwzględnia ani nie rozwiązuje równań):

polisirreducible

Przypadek testowy

%(x^2+x+1)

zwraca 1(prawda). Inne przykłady działają podobnie.

Ale aby pokazać, że jest to trudne do rozwiązania, oto pełne rozwiązanie.

Mniej taniej, ale sloooooooooow

Naprawdę nie ma sensu grać w golfa.

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
}

Edycja: Komentatorzy zwrócili uwagę, że pierwsza metoda może być niedozwolona przez dobry gust, ducha zasad, Konwencję genewską, standardowe zasady dotyczące luk itp. Nie zgadzam się, ale w każdym razie opublikowałem drugą wersję wraz z pierwszy i na pewno wydaje się do przyjęcia.

Charles
źródło
1
Hmmmm ... Jestem pewien, że ta komenda robi równań czynnik i / lub rozwiązania pod maską. (Ponadto, jeśli wyzwanie nie zezwala na pewne wbudowane elementy, oznacza to, że wbudowane rozwiązanie, które tylko rozwiązuje problem, również nie jest zgodne z duchem wyzwania.)
Martin Ender
@ MartinBüttner: Myślę, że pierwsza odpowiedź pasuje do litery, ale nie do ducha reguł wyzwania. Dlatego napisałem drugą wersję, która jest uzasadnionym rozwiązaniem. Może sprawdzić, czy x^4+1(który jest znanym modem redukującym dowolną liczbę pierwszą) jest nieredukowalny w 86 milisekund. Jeśli nic innego nie może dostosować i grać w tę wersję.
Charles
1
Pierwsza odpowiedź zawiera lukę, która jest domyślnie zablokowana: Korzystanie z wbudowanych funkcji do wykonywania pracy . Usuń go z odpowiedzi lub przynajmniej wskaż, że nie jest to prawidłowe rozwiązanie.
isaacg
5
@isaacg Nie jest to obecnie ważna standardowa luka (z powodu podziału głosów + 44 / -29). Karol, jeśli zgadzają się, że tylko druga odpowiedź jest naprawdę uzasadnione, to powinno obejmować swoją liczbę bajtów zamiast.
Martin Ender
@ MartinBüttner: Nie sądzę - myślę, że oba są uzasadnione na podstawie zasad tego pytania i ogólnego wątku dotyczącego luk. Ale dodałem komentarz, aby wskazać problem.
Charles