Den sista divisorn $3$ är den största gemensamma delaren. Processen kan åskådliggöras även på följande sätt:

%. Programmet ska enbart skriva ut svaret.
Skriv ditt program här:
def ar_primtal(tal):
if tal < 2:
return False
for divisor in range(2, tal):
if tal % divisor == 0:
return False
return True
print(ar_primtal(137))
Utskrift:
TrueSnabbheten hos algoritmen ovan kan testas genom att använda funktionen
time i modulen time. Ett tillräckligt stort primtal väljs och testas:
from time import time
def ar_primtal(tal):
if tal < 2:
return False
for divisor in range(2, tal):
if tal % divisor == 0:
return False
return True
n = 30000001
starttid = time()
print(ar_primtal(n))
sluttid = time()
print("Tid i sekunder:")
print(sluttid-starttid)
Detta program har lång exekveringstid.
Detta betyder att om talet $n$ inte är ett primtal, har det en delare som är större än ett och vars storlek är högst $\sqrt{n}$. Vid primtalstestning räcker det alltså att kontrollera divisorerna $2$, $3$, ..., $\sqrt{n}$.
Kopiera koden i föregående exempel och förbättra funktionen ar_primtal på tidigare nämnda sätt. Lämna programmets utskrifter såsom de är i exemplet. Kvadratrotskommandot sqrt finns i math-modulen.
Skriv ditt program här:
n. Algoritmen går igenom talen från det minsta till det största. Vid varje tal i markerar algoritmen multiplerna av talet 2*i, 3*i, 4*i osv. med ett kryss. Krysset betyder att det aktuella talet inte är ett primtal, eftersom det kan delas med talet i. När algoritmen är färdig identifieras primtalen genom att de inte har något kryss.
Vi kan till exempel kontrollera hur Eratosthenes såll fungerar, när n är 100. Då söker algoritmen alla primtal, som finns mellan 2...100. Detta är algoritmens utgångsläge:
Algoritmen kryssar först för multiplerna för talet 2, dvs. 4, 6, 8, osv.:
Sedan kryssar algoritmen för multiplerna för talet 3, dvs. 6, 9, 12, osv.:
Algoritmen fortsätter vidare på motsvarande sätt tills den har gått igenom alla talen mellan 2...100. Då är bokföringens innehåll följande:
Detta innebär att primtalen mellan 2...100 är:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
sall = [0]*(n+1)
Punkterna i listan är numrerade 0, 1, 2, ..., n, och varje punkt börjar med talet 0. Idén är att i punkt sall[x] finns information om talet x har kryssats för. Värdet 0 betyder att talet inte har kryssats för, och värdet 1 betyder att talet har kryssats för. Observera att vi inte använder punkterna 0 och 1 ur listan i algoritmen, eftersom vi behöver bokföring först från och med punkt 2.
Följande kod genomför Eratosthenes såll:
n = 100
sall = [0]*(n+1)
for i in range(2,n+1):
for j in range(2*i,n+1,i):
sall[j] = 1
Kodens yttre loop går igenom talen 2...n, och vid varje tal i markerar den kapslade loopen att talets multipler 2*i, 3*i, 4*i, osv., inte är primtal.
Därefter kan vi skriva ut de identifierade primtalen så här:
for i in range(2,n+1):
if sall[i] == 0:
print(i)
Till exempel när n är 100, är kodens utskrift följande:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Skriv ditt program här:
Skriv ditt program här:
3 5 5 7 11 13 17 19 29 31 41 43 59 61 71 73
Gör ett program som skriver ut primtalsparen mellan 1...1 000 på motsvarande sätt.
Skriv ditt program här: