Polinomios primarios

21

Dado un polinomio, determina si es primo.

Un polinomio es ax^n + bx^(n-1) + ... + dx^3 + ex^2 + fx + g, donde cada término es un número constante (el coeficiente) multiplicado por una potencia entera no negativa de x. La potencia más alta con un coeficiente distinto de cero se llama grado. Para este desafío, solo consideramos polinomios de al menos grado 1. Es decir, cada polinomio contiene algunos x. Además, solo usamos polinomios con coeficientes enteros.

Los polinomios se pueden multiplicar. Por ejemplo, (x+3)(2x^2-2x+3)igual 2x^3+4x^2-3x+9. Por lo tanto, 2x^3+4x^2-3x+9puede factorizarse en x+3y 2x^2-2x+3, por lo tanto, es compuesto.

Otros polinomios no se pueden factorizar. Por ejemplo, 2x^2-2x+3no es el producto de dos polinomios (ignorando polinomios constantes o aquellos con coeficientes no enteros). Por lo tanto, es primo (también conocido como irreducible).

Reglas

  • La entrada y la salida pueden realizarse de cualquier forma estándar.
  • La entrada puede ser una cadena 2x^2-2x+3, una lista de coeficientes {2,-2,3}o cualquier medio similar.
  • La salida es un valor verdadero si es primo o un valor falso si es compuesto. Debe proporcionar el mismo valor de verdad para todos los números primos y el mismo valor de falsey para todos los polinomios compuestos.
  • La entrada será de al menos grado 1 y como máximo de grado 10.
  • No puede usar herramientas integradas para la factorización (de enteros o expresiones) o para resolver ecuaciones.

Ejemplos

Cierto - 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 - compuesto

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
fuente
11
Según algunas búsquedas rápidas en Google, este es un problema difícil independientemente del golf.
orlp
55
¿Estoy en lo cierto al pensar que por primo quieres decir irreducible ? Si es así, esta es básicamente una variante de esta pregunta sobre factorizar polinomios , y sospecho que no atraerá ninguna respuesta que no tenga en cuenta.
Peter Taylor
1
Según este artículo reciente , " Estamos interesados ​​en la cuestión de decidir si un polinomio dado es irreducible o no. En consecuencia, es deseable una prueba o criterio simple que proporcione esta información. Desafortunadamente, no existe ese criterio que se aplicará a todos los clases de polinomios aún se ha ideado ".
Peter Taylor
2
@AlexA., Hay muchas pruebas "if" que funcionan para algunos polinomios, pero la pregunta es pedir una prueba "if and only if" que funcione para todos los polinomios.
Peter Taylor
1
Este es un buen problema! Tenga en cuenta que, por lo general, los polinomios solo son primos en relación con un anillo base (o campo). En particular, si el campo son los números complejos, entonces ningún polinomio de grado mayor que 2 es primo. Por lo tanto, especificaría si desea un Racional (probablemente el más simple) Entero (esto también implicará algo de factorización de enteros), o módulo algún número m. Si m es primo, entonces hay algoritmos bastante fáciles. De lo contrario, las cosas son un poco más complicadas ... (pero factible)
cody

Respuestas:

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

Explicacion :

El método de Kronecker se usa aquí. Este método genera ciertos polinomios de menor grado y prueba si existe un factor del polinomio original.

Casos de prueba :

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

Se necesitan 14 segundos en mi computadora portátil para concluir que 3x^9-8x^8-3x^7+2x^3-10es excelente.

njpipeorgan
fuente
1

PARI / GP, 16 bytes, barato como el infierno

Por alguna razón, esto no fue rechazado (notando que el comando no factoriza ni resuelve ecuaciones):

polisirreducible

Caso de prueba

%(x^2+x+1)

devuelve 1(verdadero). Los otros ejemplos funcionan de manera similar.

Pero para mostrar que esto se puede resolver de la manera difícil, aquí hay una solución completa.

Menos barato, pero sloooooooooow

Realmente no tiene sentido jugar al 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
}

Editar: Los comentaristas han señalado que el primer método puede ser rechazado por el buen gusto, el espíritu de las reglas, la Convención de Ginebra, las reglas de laguna legal, etc. No estoy de acuerdo, pero en cualquier caso publiqué la segunda versión junto con el primero y ciertamente parece aceptable.

Charles
fuente
1
Hmmmm ... Estoy bastante seguro de que este comando hace de factores y / o resolver ecuaciones bajo el capó. (Además, si un desafío no permite ciertas incorporaciones, está implícito que una incorporación que solo resuelve el problema tampoco está en el espíritu del desafío.)
Martin Ender
@ MartinBüttner: Creo que la primera respuesta se ajusta a la letra, pero no al espíritu, de las reglas del desafío. Por eso escribí la segunda versión, que es una solución legítima. Puede verificar que x^4+1(que es famoso por ser mod reducible cualquier primo) es irreducible en 86 milisegundos. Si nada más, otros pueden adaptar y jugar golf esta versión.
Charles
1
La primera respuesta se encuentra en una laguna que está prohibida por defecto: el uso de funciones integradas para hacer el trabajo . Elimínelo de su respuesta, o al menos indique que no es una solución válida.
isaacg
55
@isaacg Eso no es actualmente un vacío legal válido (debido al desglose de votos + 44 / -29). Charles, si estás de acuerdo en que solo la segunda respuesta es realmente legítima, entonces debes incluir su recuento de bytes.
Martin Ender
@ MartinBüttner: No, creo que ambos son legítimos según las reglas de esta pregunta y el hilo de lagunas generales. Pero agregué un comentario para señalar el problema.
Charles