Tämän luvun tavoitteemme on tehdä ohjelma,
joka etsii alkulukuja.
Käytämme tähän algoritmia, joka tunnetaan nimellä
Eratostheneen seula.
Se etsii kaikki alkuluvut,
jotka ovat välillä 2...n
,
missä n
on haluttu yläraja.
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:
0 0 1 0 2 3 3 0 4 0 5 1 6 0 7 2 8 0 9 0
Esimerkiksi kolmannella rivillä lukee 2 3
,
koska tarvitset 3 kappaletta numeroa 2.
Tee ohjelma, joka tulostaa vastaavan tilaston, kun kirjoitat luvun 999999.
Kirjoita ohjelma tähän:
n
pelaajaa,
jotka on numeroitu myötäpäivään 1, 2, 3, ..., n
.
Vuoro kiertää piirissä pelaajasta 1 alkaen myötäpäivään
ja joka toinen pelaaja poistuu piiristä, kunnes piiri on tyhjä.
Esimerkiksi kun n
on 7, pelaajat poistuvat
seuraavassa järjestyksessä:
2 4 6 1 5 3 7
Tee ohjelma, joka tulostaa vastaavalla tavalla,
missä järjestyksessä pelaajat poistuvat, kun n
on 1000.
Kirjoita ohjelma tähän:
1 1 2 2 3 2 4 3 5 2 6 4 7 2 8 4 9 3 10 4
Esimerkiksi viimeinen rivi on 10 4
,
koska luvulla 10 on 4 jakajaa: 1, 2, 5 ja 10.
Tee ohjelma, joka tulostaa vastaavan tilaston luvuille 1...1000.
Kirjoita ohjelma tähän: