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) n
como entrada. El campo / anillo es el campo finito de ese orden (es decir Z/nZ
), o solo Z
si lo n
es 0
. Su programa puede fallar si no lo n
es 0
o 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 x
término podría ser simplemente (x)
. x
se 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 0
frente, 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
p
tiene los elementos {0, 1, ... , p-1}
y está bajo el modo de suma / multiplicación p
. Básicamente, reduzca cualquier coeficiente por mod p
y 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.
Z
es factorizar Z/pZ
para un p
levantamiento 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.