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: