Crible Ératosthènes
Publié : lun. 06/déc./2004 19:32
Tout le monde connait cet algo qui sert à trouver les nombres premier inférieurs à un certain nombre. Par besoin pour un programme, je l'ai écrit en Pure pour qu'il donne un nombre premier au pif entre 2 et le nombre donné.
Vala
Toute remarque est bonne.
Code : Tout sélectionner
Structure Numbers
Number.b
Tried.b
EndStructure
NewList Numbers.Numbers()
Procedure IsDivisible(Number1, Number2)
Result = Number1 % Number2
If Result = 0 : ToReturn = 1
Else : ToReturn = 0
EndIf
ProcedureReturn ToReturn
EndProcedure
Procedure RandomSieveEratosthenes(Max)
Maximum = Random(Max)
If Maximum < 2
Maximum = 2
EndIf
; Step 1
For k = 2 To Maximum
AddElement(Numbers())
Numbers()\Number = k
Next k
;Step 2/4
Repeat
ResetList(Numbers())
Repeat
NextElement = NextElement(Numbers())
If NextElement
If Numbers()\Tried = 0
i = Numbers()\Number
Numbers()\Tried = 1
Break
EndIf
EndIf
Until NextElement = 0
If Pow(i, 2) > Maximum+1
Break
EndIf
; Step 3
For k = i To CountList(Numbers())*2
NextElement(Numbers())
If IsDivisible(Numbers()\Number, i)
DeleteElement(Numbers(), 1)
EndIf
Next k
ForEver
Get = Random(CountList(Numbers())-1)
SelectElement(Numbers(), Get)
ToReturn = Numbers()\Number
ClearList(Numbers())
ProcedureReturn ToReturn
EndProcedure
