Poiché Sage è gratuito e open source, dovresti essere in grado di trovare l'algoritmo utilizzato da Sage e quindi chiamarlo o, nel peggiore dei casi, ri-implementarlo in C. Tuttavia, se davvero devi scrivere una procedura da zero, questa è quello che vorrei fare: innanzitutto trovare il gcd di tutti i coefficienti e dividerlo, il che rende il vostro polinomio "contenuto libero". Quindi prendi la derivata e trova il gcd polinomiale del polinomio originale e la sua derivata. Prendete questo fattore fuori dal polinomio originale per divisione polinomiale, che suddivide il vostro problema in due parti: fattorizzazione di un polinomio quadrato libero da contenuto (p/gcd (p, p ')) e factoring di un altro polinomio (gcd (p, p ')) che potrebbe non essere libero da quadrati. Per quest'ultimo, ricomincia dall'inizio, finché non hai ridotto il problema al factoring di uno o più polinomi privi di contenuto e quadrati.
Il prossimo passo sarebbe implementare un algoritmo di factoring mod p. L'algoritmo di Berlekamp è probabilmente il più semplice, anche se Cantor-Zassenhaus è allo stato dell'arte.
Infine, applicare l'algoritmo di Zassenhaus al fattore sui numeri interi. Se la trovi troppo lenta, può essere migliorata usando l'algoritmo di riduzione della base del reticolo "Lenstra-Lenstra-Lovasz". http://en.wikipedia.org/wiki/Factorization_of_polynomials#Factoring_univariate_polynomials_over_the_integers
Come potete vedere, questo è tutto piuttosto complicato e dipende da una grande quantità di teoria dell'algebra astratta. È molto meglio usare la stessa libreria utilizzata da Sage, o implementare nuovamente l'implementazione di Sage, o anche solo chiamare una versione in esecuzione del kernel Sage dal tuo programma.
fonte
2015-04-12 20:18:21
Perché non utilizzare MATLAB o simile? –
@NickRosencrantz, di solito uso Sage Math per questo scopo. Ma ora sto realizzando algoritmi che dipendono in modo significativo dalla fattorizzazione polinomiale e hanno anche la GPU (basata su Cuda o Opencl) come piattaforma di destinazione. Quindi dovrebbe essere C. – petRUShka
magari eseguire il metodo newton, trovare il fattore, la divisione polinomiale, ripetere. – Makoto