Factoriza un polinomio sobre un campo finito o los enteros

20

Sin utilizar ninguna función de factorización / polinomio incorporada, factorice un polinomio completamente en irreductibles sobre los enteros o un campo finito.

Entrada

Su programa / función recibirá algún número primo (o cero) ncomo entrada. El campo / anillo es el campo finito de ese orden (es decir Z/nZ), o solo Zsi lo nes 0. Su programa puede fallar si no lo nes 0o es un primer. El polinomio estará en F[x].

Su programa / función también recibirá el polinomio como entrada.

Hay cierta flexibilidad en la entrada, asegúrese de especificar cómo piensa recibirla. Por ejemplo, el polinomio podría ingresarse como una lista de coeficientes, o en la forma que la mayoría de la gente espera (ej . 50x^3 + x^2:), o en alguna otra forma razonable. O el formato de entrada del campo / anillo también podría ser diferente.

Salida

Su programa / función generará el polinomio factorizado completamente. Puede dejar múltiples raíces expandidas (es decir, en (x + 1)(x + 1)lugar de (x + 1)^2). Puede eliminar espacios en blanco entre operadores binarios. Puede reemplazar la yuxtaposición con *. Puede insertar espacios en blanco en lugares extraños. Puede reordenar los factores en el orden que desee. El xtérmino podría ser simplemente (x). xse puede escribir como x^1; Sin embargo, el término constante puede no tener x^0. Se permiten +signos extraños. Es posible que no tenga un término con un 0frente, deben omitirse. El término principal de cada factor debe ser positivo, los signos negativos deben estar afuera.

Casos de prueba, su programa debería poder producir resultados para cada uno de estos en un tiempo razonable (por ejemplo, <= 2 horas):

Entrada: 2, x^3 + x^2 + x + 1

Salida: (x + 1)^3

Entrada: 0, x^3 + x^2 + x + 1

Salida: (x + 1)(x^2 + 1)

Entrada: 0, 6x^4 – 11x^3 + 8x^2 – 33x – 30

Salida: (3x + 2)(2x - 5)(x^2 + 3)

Entrada: 5, x^4 + 4x^3 + 4x^2 + x

Salida: x(x + 4)(x + 4)(x + 1)

Entrada: 0, x^5 + 5x^3 + x^2 + 4x + 1

Salida: (x^3 + 4x + 1)(x^2 + 1)

Un agradecimiento especial a Peter Taylor por criticar mis casos de prueba

Justin
fuente
1
Creo que esto me está dando un recuerdo de algunas de las matemáticas de pregrado más difíciles . ¿Estoy yendo en la dirección correcta aquí?
Trauma digital
1
Esto me recuerda el momento en que tuve pesadillas tratando de imprimir polinomios correctamente ...
Sp3000
Lamento no haberlo entendido, pero ¿cuál se supone que debe hacer el primer número de entrada? o cómo afecta a la salida?
Optimizador
@Optimizer El primer número de entrada determina en qué campo / los enteros está trabajando. Si el número no es cero, está trabajando sobre el campo finito de ese orden. Un campo finito de orden ptiene los elementos {0, 1, ... , p-1}y está bajo el modo de suma / multiplicación p. Básicamente, reduzca cualquier coeficiente por mod py estará bien. Además, tenga en cuenta que si tiene una raíz, es decir, un factor lineal, uno de {0, ... , p-1}ellos producirá 0(mod p) cuando esté conectado al polinomio.
Justin
1
@flawr, el enfoque estándar para factorizar más Zes factorizar Z/pZpara un plevantamiento adecuado y luego Hensel. Sin embargo, el enfoque golfable es probablemente (y esta es ciertamente la ruta que estoy mirando) usar un límite simple en la altura de los factores y la fuerza bruta.
Peter Taylor

Respuestas:

17

GolfScript (222 bytes)

~.@:[email protected]\{abs+}/2@,2/)?*or:^{\1$^base{^q- 2/-}%.0=1=1$0=q>+{{:D[1$.,2$,-)0:e;{.0=0D=%e|:e;(D(@\/:x@@[{x*~)}%\]zip{{+}*q!!{q%}*}%}*e+])0-{;0}{@;@\D.}if}do}*;\).^3$,)2/?<}do;][[1]]-{'('\.,:x;{.`'+'\+'x^'x(:x+x!!*+\!!*}%')'}/

Demostración en línea

Notas

  1. El formato de entrada es nseguido por una matriz de coeficientes GolfScript de los más significativos a los menos significativos. Por ejemplo, 0, x^5 + 5x^3 + x^2 + 4x + 1debe formatearse como 0 [1 0 5 1 4 1].
  2. Sobre un campo finito, solo hay finitamente muchos polinomios de grado suficientemente pequeño como para ser relevantes. Sin embargo, este no es el caso Z. Lo manejo Zusando una forma relajada del límite de altura de Mignotte. Un gran artículo sobre límites de altura en la factorización es Bounds on Factors in Z [x] , John Abbott, 2009 (el enlace es para preimpresión arxiv; su CV dice que ha sido aceptado por el Journal of Symbolic Computation ). La forma más relajada dada es en términos de la norma L-2, pero para guardar bytes me relajo aún más y uso la norma L-1 en su lugar. Entonces es un caso de fuerza bruta por división de juicio.
  3. Sobre un campo finito, cada polinomio es constante por un polinomio monico, por lo que solo hago la división de prueba por polinomios monicos y guardo un recíproco en el campo. Sin embargo, Zes solo un anillo y, por lo tanto, es necesario hacer una división de prueba por factores candidatos no monicos. Me las arreglo para no implementar números racionales haciendo una prueba de división de factor principal y acumulando un indicador de "error" e.
  4. Ambos puntos 2 y 3 implican que el caso de factoring over Zes generalmente más lento y no se puede probar con la demostración en línea. Sin embargo, el más lento de los casos de prueba oficiales toma 10 minutos, lo cual está dentro del límite de tiempo "razonable".
Peter Taylor
fuente