fonction factprem(N) local D FACT 2 -> D {} -> FACTtantque N
si N mod D = 0 alors concat(FACT,D) -> FACT N/D -> N sinon D+1 -> D fsi ftantque retourne FACT ffonction
- Première amélioration
On ne teste que les diviseurs D entre 2 et
E().
En effet si N = D1*D2 alors on a :
soit
D1 E(
), soit
D2
E(
) car sinon on aurait :
D1*D2 (E(
) + 1)2 > N.
fonction factprem1(N) local D FACT 2 -> D {} -> FACTtantque D*D
si N mod D = 0 alors concat(FACT,D) -> FACT N/D-> N sinon D+1 -> D fsi ftantque concat(FACT,N) -> FACT retourne FACT ffonctionDans la liste FACT, on a les diviseurs premiers éventuellement plusieurs fois, par exemple :
Dans la liste FACT, on fait suivre chaque diviseur premier par son
exposant, par exemple :
factprem2(12)={2,2,3,1}.
fonction facprem2(N) local K D FACT {}->FACT 0 -> K tantque N mod 2 = 0 faire K+1 -> K N/2 -> N ftantquesi K
concat(FACT,{2 K}) -> FACT fsi 3 ->Dtantque D*D
0 -> K tantque N mod D = 0 faire K+1 -> K N/D -> N ftantquesi K
concat(FACT,{D K}) -> FACT fsi D+2 -> D ftantquesi N
concat(FACT,{N 1}) -> FACT fsi retourne FACT ffonction- Troisième amélioration
fonction factprem3(N) local J,D,FACT 2->D {}->FACT tantque (D*D<=N) faire 0->J tantque (N mod D=0) faire N/D->N J+1->J ftantquesi (J
si (D<4) alors 2*D-1->D sinon D+(4*D mod 6)->D fsi ftantquesi (N