Falls jemand eine noch schnellere Lösung hat kann er es gerne schreiben.
Code: Alles auswählen
Procedure.q NextPrime(number.q)
Protected max.q, divisor.q
Protected isPrime
If number < 3
ProcedureReturn 2
EndIf
number + 1 - (number % 2)
Repeat
isPrime = #True
max = IntQ(Sqr(number))+1
divisor = 3
While divisor <= max
If number % divisor = 0
isPrime = #False
Break
EndIf
divisor + 2
Wend
If isPrime = #True
ProcedureReturn number
EndIf
number + 2
ForEver
EndProcedure
Procedure.q IsPrime(number.q)
Protected max.q, divisor.q
If number < 3
If number = 2
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndIf
If number%2 = 0
ProcedureReturn #False
EndIf
divisor = 3
max = IntQ(Sqr(number))+1
While divisor < max
If number%divisor = 0
ProcedureReturn #False
EndIf
divisor = divisor+2
Wend
ProcedureReturn #True
EndProcedure
Procedure.q RandomPrime(min.q, max.q)
Protected random.q
If NextPrime(min)>max
ProcedureReturn -1
EndIf
Repeat
random = Random(max-min)+min
random = NextPrime(random)
Until random < max
ProcedureReturn random
EndProcedure
Procedure SiebDesEratosthenes(Array status.b(1), max.q)
Protected j.q, i.q , wurzel.q
status(0) = 1
status(1) = 1
i = 4
While i <= max
status(i) = 1
i = i+2
Wend
i = 3
wurzel = IntQ(Sqr(max))+1
While i <= wurzel
If status(i) = 0
j = i*i
While j <= max
status(j) = 1
j = j+i+i
Wend
EndIf
i = i+2
Wend
EndProcedure