ndiv1(n):={ local d,l1,l2,k; d:=2; l1:=[1]; while (n!=1) { l2:=[]; k:=0; while (irem(n,d)==0) { n:=iquo(n,d); k:=k+1; l2:=concat(l2,l1*d^k); } l1:=concat(l1,l2); d:=d+1; } return(l1); }On peut améliorer ce programme si on tient compte du fait qu'après avoir éventuellement divisé N par 2 autant de fois qu'on le pouvait, les diviseurs potentiels de N sont impairs.
On améliore encore le programme précédent en remarquant que,
si le diviseur potentiel D est tel que
, c'est que
N est premier ou vaut 1.
On ne continue donc pas la recherche des diviseurs de N et quand
N est diffèrent de 1 on complète
L1 par L1*N.
Et aussi, on ne teste comme diviseur potentiel de N, que les
nombres 2, 3, puis les nombres de la forme 6*k - 1 ou de la forme 6*k + 1
(pour
k
).
On remplace donc :
si D=2 alors
sinon
fsi
par :
si D<4 alors
sinon
fsi