Viimeinen jakaja $3$ on suurin yhteinen tekijä. Prosessia voi havainnollistaa myös seuraavasti:

%.
Ohjelman tulee tulostaa vain vastaus.
Kirjoita ohjelma tähän:
def onko_alkuluku(luku):
if luku < 2:
return False
for jakaja in range(2, luku):
if luku % jakaja == 0:
return False
return True
print(onko_alkuluku(137))
Tulostus:
TrueEdellä esitetyn algoritmin nopeutta voi testata käyttämällä moduulin
time funktiota time.
Valitaan sopivan suuri alkuluku ja testataan:
from time import time
def onko_alkuluku(luku):
if luku < 2:
return False
for jakaja in range(2, luku):
if luku % jakaja == 0:
return False
return True
n = 30000001
alkuaika = time()
print(onko_alkuluku(n))
loppuaika = time()
print("Aikaa kului sekunteina:")
print(loppuaika-alkuaika)
Tämän ohjelman suoritus kestää kauan.
Tästä seuraa, että jos luku $n$ ei ole alkuku, sillä on ykköstä suurempi tekijä, jonka suuruus on korkeintaan $\sqrt{n}$. Alkulukutestauksessa riittää siis siis tarkistaa jakajat $2$, $3$, ..., $\sqrt{n}$.
Kopioi edellisen esimerkin koodi ja paranna onko_alkuluku-funktiota edellä mainitulla tavalla.
Jätä ohjelman tulosteet samanlaisiksi kuin esimerkissä. Neliöjuurikomento sqrt löytyy math-moduulista. Voit pyöristää neliöjuuren tuloksen alaspäin kokonaisluvuksi funktiolla int.
Kirjoita ohjelma tähän:
n.
Algoritmi käy läpi luvut pienimmästä suurimpaan.
Jokaisen luvun i kohdalla
algoritmi merkitsee rastin luvun moninkertojen
2*i, 3*i, 4*i jne.
kohdalle.
Rasti tarkoittaa, että kyseinen luku ei ole alkuluku,
koska se on jaollinen luvulla i.
Kun algoritmi päättyy, alkuluvut tunnistaa siitä,
että niiden kohdalla ei ole rastia.
Tarkastellaan esimerkkinä Eratostheneen seulan
toimintaa, kun n on 100.
Tällöin algoritmi etsii kaikki alkuluvut,
jotka ovat välillä 2...100.
Tässä on algoritmin aloitustilanne:
Algoritmi rastittaa ensin luvun 2 moninkerrat 4, 6, 8, jne.:
Sitten algoritmi rastittaa luvun 3 moninkerrat 6, 9, 12, jne.:
Algoritmi jatkaa vastaavalla tavalla eteenpäin, kunnes se on käynyt läpi kaikki välin 2...100 luvut. Tällöin kirjanpidon sisältö on seuraava:
Tämä tarkoittaa, että alkuluvut välillä 2...100 ovat:
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
seula = [0]*(n+1)
Tämän listan kohdat on numeroitu 0, 1, 2, ..., n,
ja jokaisessa kohdassa on aluksi luku 0.
Ideana on, että kohdassa seula[x]
on tieto, onko luku x rastitettu.
Arvo 0 tarkoittaa, että lukua ei ole rastitettu,
ja arvo 1 tarkoittaa, että luku on rastitettu.
Huomaa, että emme käytä listan kohtia 0 ja 1 algoritmin aikana,
koska tarvitsemme kirjanpitoa vasta kohdasta 2 alkaen.
Seuraava koodi toteuttaa Eratostheneen seulan:
n = 100
seula = [0]*(n+1)
for i in range(2,n+1):
for j in range(2*i,n+1,i):
seula[j] = 1
Koodin pääsilmukka käy läpi luvut 2...n,
ja kunkin luvun i kohdalla sisäsilmukka merkitsee,
että luvun moninkerrat 2*i,
3*i, 4*i, jne. eivät ole alkulukuja.
Tämän jälkeen voimme tulostaa löytyneet alkuluvut näin:
for i in range(2,n+1):
if seula[i] == 0:
print(i)
Esimerkiksi kun n on 100, koodin tulostus on seuraava:
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
Kirjoita ohjelma tähän:
Kirjoita ohjelma tähän:
3 5 5 7 11 13 17 19 29 31 41 43 59 61 71 73
Tee ohjelma, joka tulostaa vastaavalla tavalla välin 1...1000 alkulukuparit.
Kirjoita ohjelma tähän: