L'algo de Nat the great est tres elegant, compact et efficace.
A titre d'information et puisque on a parlé d'assembleur, j'ai tenté de decortiquer le code generé par PB.
Sans être un UBER specialiste, je l'ai trouvé tres bon.
Atitre d'exemple, voici ce que ca donne en optimisant une partie du code.
Nb : Activez l'assembleur en ligne dans les options du compilateur.
Code:
; algo nat the great pour blitzmax
; port en pb by zaphod - 23/05/2011
; en blitzmax = 0.838 sec
; en pb = 1.42 sec
; pentium 4 - 3 Ghz
;
; >>>> Compiler sans le debuger
;
Define num.i = 15485864
Define sqrnum.i = Sqr(num)+1
Dim PrimeFlags.b(num)
Dim Primes.i(num)
Define tim.i,count.i = 2
Define mill.i = ElapsedMilliseconds()
;
For x = 3 To sqrnum Step 2
If PrimeFlags(x) = #False
Primes(count) = x
count+1
tim = x + x
;-------------------------------------- Partie du code remplacé en assembleur
;;; Repeat;
;;; PrimeFlags(tim) = #True
;;; tim + x
;;; Until tim >= num
; Repeat
MOV ebx,dword [v_tim]
MOV ebp,dword [a_PrimeFlags]
Repeat5:
; PrimeFlags(tim) = #True
;MOV ebx,dword [v_tim] ; deplacé en dehors de la boucle
;MOV ebp,dword [a_PrimeFlags] ; deplacé en dehors de la boucle
MOV byte [ebp+ebx],1
; tim + x
;MOV ebx,dword [v_tim]
ADD ebx,dword [v_x]
;MOV dword [v_tim],ebx ; deplacé en dehors de la boucle
; Until tim >= num
;MOV ebx,dword [v_tim]
CMP ebx,dword [v_num]
JL l_repeat5
;_Until5:
MOV dword [v_tim],ebx
;--------------------------------------
EndIf
Next
;Local count:Int
Primes(1) = 2
For y = x To num Step 2
If PrimeFlags(y) = #False
Primes(count) = y
count+1
EndIf
Next
mill = ElapsedMilliseconds()-mill
;
MessageRequester("",StrF(mill/1000.0) +" seconds "+ Str(count)+" primes found!")