Polinomi principali


21

Dato un polinomio, determinare se è primo.

Un polinomio è ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g, dove ogni termine è un numero costante (il coefficiente) moltiplicato per un potere intero non negativo di x. La massima potenza con un coefficiente diverso da zero si chiama grado. Per questa sfida, consideriamo solo i polinomi di almeno grado 1. Cioè, ogni polinomio ne contiene alcuni x. Inoltre, utilizziamo solo polinomi con coefficienti interi.

I polinomi possono essere moltiplicati. Ad esempio, (x+3)(2x^2-2x+3)uguale a 2x^3+4x^2-3x+9. Pertanto, 2x^3+4x^2-3x+9può essere preso in considerazione x+3e 2x^2-2x+3, quindi, è composito.

Altri polinomi non possono essere presi in considerazione. Ad esempio, 2x^2-2x+3non è il prodotto di due polinomi (ignorando i polinomi costanti o quelli con coefficienti non interi). Quindi, è primo (noto anche come irriducibile).

Regole

  • L'input e l'output possono avvenire in qualsiasi modo standard.
  • L'input può essere una stringa come 2x^2-2x+3, un elenco di coefficienti simili {2,-2,3}o qualsiasi mezzo simile.
  • L'output è un valore di verità se è primo o un valore di falsa se è composto. Devi fornire lo stesso valore di verità per tutti i numeri primi e lo stesso valore di falsità per tutti i polinomi compositi.
  • L'input sarà di almeno grado 1 e al massimo grado 10.
  • Non è possibile utilizzare strumenti integrati per la fattorizzazione (di numeri interi o espressioni) o per la risoluzione di equazioni.

Esempi

Vero - primo

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

Falso - composito

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

11
Da alcuni google veloci questo è un problema difficile indipendentemente dal golf.
orlp

5
Ho ragione nel pensare che per prime intendi irriducibile ? In tal caso, questa è sostanzialmente una variante di questa domanda sui polinomi di factoring e sospetto che non attirerà risposte che non contano.
Peter Taylor,

1
Secondo questo recente articolo , " Siamo interessati alla questione di decidere se un determinato polinomio è irriducibile o meno. Di conseguenza, è desiderabile un semplice test o criterio che darebbe queste informazioni. Sfortunatamente, nessun tale criterio che si applicherà a tutti i classi di polinomi sono ancora state ideate ".
Peter Taylor,

2
@AlexA., Ci sono molti test "if" che funzionano per alcuni polinomi, ma la domanda è chiedere un test "if and only if" che funzioni per tutti i polinomi.
Peter Taylor,

1
Questo è un bel problema! Si noti che di solito i polinomi sono solo primi relativi a un anello (o campo) di base. In particolare, se il campo è composto da numeri complessi, allora nessun polinomio di grado maggiore di 2 è primo. Quindi vorrei specificare se vuoi Rational (probabilmente il più semplice) Integer (questo comporterà anche un factoring intero), o modulo un numero m. Se m è primo, allora ci sono algoritmi piuttosto semplici. Altrimenti le cose sono un po 'più difficili ... (ma fattibili)
cody

Risposte:


3

Mathematica, 224 byte

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

Spiegazione :

Il metodo di Kronecker è usato qui. Questo metodo genera alcuni polinomi di grado inferiore e verifica se esiste un fattore del polinomio originale.

Casi di prova :

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

Ci vogliono 14 secondi sul mio laptop per concludere che 3x^9-8x^8-3x^7+2x^3-10è perfetto.


1

PARI / GP, 16 byte, economico come l'inferno

Per qualche motivo questo non è stato vietato (notando che il comando non tiene conto o risolve l'equazione):

polisirreducible

Caso di prova

%(x^2+x+1)

ritorna 1(vero). Gli altri esempi funzionano in modo simile.

Ma per dimostrare che questo è risolvibile nel modo più duro, ecco una soluzione completa.

Meno economico, ma sloooooooooow

Non ha davvero senso giocare a golf.

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
}

Modifica: I commentatori hanno sottolineato che il primo metodo può essere vietato dal buon gusto, dallo spirito delle regole, dalla Convenzione di Ginevra, dalle regole standard di scappatoia, ecc. Non sono d'accordo, ma in ogni caso ho pubblicato la seconda versione insieme a il primo e sicuramente sembra accettabile.


1
Hmmmm ... Sono abbastanza sicuro che questo comando tiene conto e / o risolve equazioni sotto il cofano. (Inoltre, se una sfida non consente alcuni built-in è un po 'implicito che un built-in che risolva il problema non è nello spirito della sfida.)
Martin Ender

@ MartinBüttner: penso che la prima risposta corrisponda alla lettera, ma non allo spirito, delle regole della sfida. Ecco perché ho scritto la seconda versione, che è una soluzione legittima. Può verificare che x^4+1(che è notoriamente riducibile mod qualsiasi primo) sia irriducibile in 86 millisecondi. Se non altro gli altri possono adattarsi e giocare a golf questa versione.
Charles,

1
La prima risposta cade in una scappatoia che è vietata di default: usare le funzioni integrate per fare il lavoro . Rimuovilo dalla tua risposta, o almeno indica che non è una soluzione valida.
isaacg

5
@isaacg Al momento non è una scappatoia standard valida (a causa della suddivisione del voto + 44 / -29). Charles, se sei d'accordo sul fatto che solo la seconda risposta è davvero legittima, allora dovresti includere il suo conteggio dei byte.
Martin Ender,

@ MartinBüttner: io no - penso che entrambi siano legittimi dalle regole di questa domanda e dal filo generale delle scappatoie. Ma ho aggiunto un commento per sottolineare il problema.
Charles
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.