Questo è abbastanza ben studiato, come indica il commento di mcdowella. Ecco come il Cantor-Zassenhaus random algorithm funziona per il caso in cui si desidera trovare le radici di un polinomio, invece della fattorizzazione più generale.
Si noti che nell'anello di polinomi con coefficienti mod p, il prodotto x (x-1) (x-2) ... (x-p + 1) ha tutte le possibili radici e uguale a x^px di Fermat's Little Theorem e una fattorizzazione unica in questo anello.
Set g = GCD (f, x^p-x). L'uso di Euclid's algorithm per calcolare il GCD di due polinomi è in generale veloce, prendendo un numero di passaggi logaritmico nel grado massimo. Non richiede di calcolare i polinomi. g ha le stesse radici di f sul campo e nessun fattore ripetuto.
Grazie alla particolare forma di x^px, con solo due termini non nulli, il primo passo dell'algoritmo di Euclide può essere fatto da repeated squaring, in circa 2 log_2 (p) operazioni che coinvolgono solo polinomi di grado non più di due volte la grado di f, con coefficienti mod p. Possiamo calcolare x mod f, x^2 mod f, x^4 mod f, ecc., Quindi moltiplicare insieme i termini corrispondenti a posti diversi da zero nell'espansione binaria di p per calcolare x^p mod f, e infine sottrarre x.
Fare ripetutamente quanto segue: Scegliere un d casuale in Z/p. Calcola il GCD di g con r_d = (x + d)^((p-1)/2) -1, che riusciamo a calcolare rapidamente dall'algoritmo di Euclide, usando il quadrato ripetuto sul primo gradino. Se il grado di questo GCD è strettamente compreso tra 0 e il grado di g, abbiamo trovato un fattore non banale di g, e possiamo recurse fino a quando non abbiamo trovato i fattori lineari quindi radici di g e quindi f.
Quanto spesso funziona? r_d ha come radici i numeri che sono d minori di un quadrato diverso da zero p. Considera due radici distinte di g, aeb, quindi (x-a) e (x-b) sono fattori di g. Se + d è un quadrato diverso da zero e b + d non lo è, allora (xa) è un fattore comune di g e r_d, mentre (xb) non lo è, il che significa che GCD (g, r_d) è un fattore non banale di g . Allo stesso modo, se b + d è un quadrato diverso da zero mentre un + d non lo è, allora (x-b) è un fattore comune di g e r_d mentre (x-a) non lo è. Con la teoria dei numeri, un caso o l'altro accade vicino alla metà delle possibili scelte per d, il che significa che in media richiede un numero costante di scelte di d prima di trovare un fattore non banale di g, in realtà uno che separa (xa) da (xb).
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.133.1907&rep=rep1&type=pdf sottolinea che risolvere polinomi su campi finiti è un caso particolare di fattorizzazione, e ci sono algoritmi di tempo polinomiale randomizzati per il factoring di polinomi su campi finiti (vedi ad esempio http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_finite_fields). Dice che procede descrivendo algoritmi deterministici di tempo polinomiale per il reperimento delle radici, ma non ho letto fino a questo punto. – mcdowella