Professional Documents
Culture Documents
Κόσκινο του Ερατοσθένη
Κόσκινο του Ερατοσθένη
Πίνακας περιεχομένων
1Αλγόριθμος
o 1.1Παράδειγμα
2Πολυπλοκότητα αλγορίθμου και υλοποίηση
3Το Κόσκινο του Όιλερ
4Δείτε επίσης
5Παραπομπές
6Εξωτερικοί σύνδεσμοι
Αλγόριθμος[Επεξεργασία | επεξεργασία κώδικα]
Ένας πρώτος αριθμός είναι ένας φυσικός αριθμός που έχει ακριβώς δύο διαφορετικούς
διαιρέτες: το 1 και τον εαυτό του.
Η εύρεση όλων των πρώτων αριθμών που είναι μικρότεροι ή ίσοι από έναν ακέραιο n,
σύμφωνα με τη μέθοδο του Ερατοσθένη, γίνεται ως εξής:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
28 29 30
2 3 5 7 9 11 13 15 17 19 21 23 25 27
29
Ο 1ος αριθμός στη λίστα μετά το 2 είναι το 3 και διαγράφουμε τα πολλαπλάσια του 3
από τη λίστα με αποτέλεσμα:
2 3 5 7 11 13 17 19 23 25
29
Ο 1ος αριθμός στη λίστα μετά το 3 είναι το 5 και διαγράφουμε τα πολλαπλάσια του 5
από τη λίστα με αποτέλεσμα:
2 3 5 7 11 13 17 19 23
29
Ο 1ος αριθμός στη λίστα μετά το 5 είναι το 7 αλλά το τετράγωνο του 7 είναι 49 που είναι
μεγαλύτερο από το 30, επομένως η διαδικασία τελείωσε. Η τελική λίστα αποτελείται από
όλους τους πρώτους αριθμούς που είναι μικρότεροι ή ίσοι από 30.
Το 2008, η Μελίσα Ο'Νιλ (Melissa O'Neill) έδειξε ότι η πολυπλοκότητα του αλγορίθμου
του Turner είναι σημαντικά χειρότερη από την πολυπλοκότητα των
κλασικών προστακτικών εκδόσεων του κόσκινου.[7] Η Ο'Νιλ έδειξε μια έκδοση του
κόσκινου του Ερατοσθένη σε Haskell με τη χρήση ουρών προτεραιότητας (priority
queues) που έχει πολυπλοκότητα παρόμοια με αυτή των κλασικών προστακτικών
υλοποιήσεων.
Α) Αρχίζουμε με όλους τους φυσικούς αριθμούς εκτός από το '1' που δεν είναι
πρώτος αριθμός:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 ...
^
(4 6 8 10 12 14 16 18 20 22 24 26 28 30 ... )
Διαγράφονται:
4 6 8 10 12 14 16 18 20 22 24 26 28
30
Παραμένουν:
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29
...
^
(9 15 21 27 33 39 45 51 57 63 69 75 81 87
...)
Αφαιρούνται:
9 15 21 27
Παραμένουν:
2 3 5 7 11 13 17 19 23 25 29
...
^
Σε Python:
def euler_sieve(n):
# δημιουργεί έναν πίνακα από περιττούς αριθμούς.
num_tab = range(1,n,2)
# ο πίνακας είναι ο 1,3,5,7,... αλλάζουμε το 1ο στοιχείο
# στον πρώτο αριθμό, 2
num_tab[0] = 2
i = 1
# ο μεγαλύτερος αριθμός στον πίνακα
highestval = num_tab[-1]
while True:
# βρες τον 1ο τελεστή στο κόσκινο
cx = num_tab[i]
# αν τιμή που δε δουλεύει, προχώρησε στην επόμενη
if cx == False:
i += 1
continue
# η 1η τιμή που περνάει από το κόσκινο είναι πάντα ο
# τρέχων αριθμός * τον εαυτό του. όλοι οι άλλοι αριθμοί
# στο κόσκινο θα είναι μεγαλύτεροι.
if cx**2 > n:
break
# διαγράφει - κόσκινο
tostrike = []
for j in xrange(i,len(num_tab)):
# βρίσκει τον 2ο τελεστή στο κόσκινο
cy = num_tab[j]
# αν τιμή που δε δουλεύει, αγνόησε τα υπόλοιπα
if cy == False:
continue
cut = cx*cy
# εκτός των ορίων του κόσκινου
if cut > highestval:
break
# προσθέτει στο κόσκινο
tostrike.append(cut)
# περνάει από το κόσκινο τις τιμές από τον πίνακα των αριθμών μας
for d in tostrike:
ind = (d - 1)/2
num_tab[ind] = False
# βρίσκει τη μεγαλύτερη τιμή στον πίνακα που δεν
# έχει περάσει από το κόσκινο
hiind = -1
while num_tab[hiind] == False:
hiind -= 1
highestval = num_tab[hiind]
i += 1
return num_tab
...
Στον αλγόριθμο αυτό, σε σύγκριση με τον αλγόριθμο που χρησιμοποιεί ο Όιλερ στην
απόδειξή του, οι πρώτοι αριθμοί αριστερά του δείκτη αντιστοιχούν σε παράγοντες του
αριστερού μέλους της εξίσωσης σε κάθε στάδιο του κόσκινου, ενώ η ακολουθία στα
δεξιά, μαζί με τη θέση του δείκτη, αντιστοιχεί στη σειρά του δεξιού μέλους της εξίσωσης
σε κάθε στάδιο (εκτός από το αρχικό).
Όταν παράγουμε μια πεπερασμένη λίστα πρώτων, όταν ξεπεράσουμε το τετράγωνο
του άνω ορίου του εύρους μας, έχουμε την επιθυμητή ακολουθία πρώτων αριθμών. Στο
παραπάνω παράδειγμα, αυτό συμβαίνει όταν εντοπίζουμε τον πρώτο αριθμό 7, για να
βρούμε τη λίστα όλων των πρώτων αριθμών μέχρι το 30.