2. Εύρεση Μέγιστου Κοινού Διαιρέτη
Το πρόβλημα:
• Δεδομένα: δύο ακέραιοι a και b
• Ζητούμενο: ο μέγιστος ακέραιος που διαιρεί και
τους δύο δοσμένους αριθμούς, γνωστός ως
Μέγιστος Κοινός Διαιρέτης τους (Greatest
Common Divisor – GCD)
3. Εύρεση Μέγιστου Κοινού Διαιρέτη
• Έστω a=27 και b=9
• Οι διαιρέτες του 27 είναι: 1,3,9,27
• Οι διαιρέτες του 9 είναι: 1,3,9
• Ο μεγαλύτερος διαιρέτης κοινός και στις 2 λίστες
είναι ο 9
• Επομένως, ο μέγιστος κοινός διαιρέτης (GCD)
των αριθμών 27 και 9 είναι ο 9
4. Εύρεση Μέγιστου Κοινού Διαιρέτη
• Ένας συστηματικός τρόπος για να υπολογίζουμε
το μέγιστο κοινό διαιρέτη δύο αριθμών είναι
– να αναλύσουμε τους δύο αριθμούς σε γινόμενο
πρώτων παραγόντων και
– να πολλαπλασιάσουμε τους κοινούς τους παράγοντες
ώστε να πάρουμε το μέγιστο κοινό διαιρέτη τους
• Έστω a=1035 και b=759
– 1035=32*5*23
– 759=3*11*23
– Μέγιστος κοινός διαιρέτης των 1035 και 759 είναι ο
3*23=69
5. Εύρεση Μέγιστου Κοινού Διαιρέτη
• Ένας συστηματικός τρόπος για να υπολογίζουμε
το μέγιστο κοινό διαιρέτη δύο αριθμών είναι
– να αναλύσουμε τους δύο αριθμούς σε γινόμενο
πρώτων παραγόντων και
– να πολλαπλασιάσουμε τους κοινούς τους παράγοντες
ώστε να πάρουμε το μέγιστο κοινό διαιρέτη τους
• Έστω a=1035 και b=759
– 1035=32*5*23
– 759=3*11*23
– Μέγιστος κοινός διαιρέτης των 1035 και 759 είναι ο
3*23=69
ΔΕΝ γνωρίζουμε τρόπο για να το κάνουμε αποδοτικά!!!!!!
6. Εύρεση Μέγιστου Κοινού Διαιρέτη
• Αποδοτικότερος τρόπος;;;;;;;;
• ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ ΕΥΚΛΕΙΔΗ
– Ανακαλύφθηκε από τον Έλληνα μαθηματικό
περισσότερο από 2000 χρόνια πριν…
7. Εύρεση Μέγιστου Κοινού Διαιρέτη
Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ ΕΥΚΛΕΙΔΗ ΓΙΑ ΤΗΝ ΕΥΡΕΣΗ ΤΟΥ ΜΕΓΙΣΤΟΥ ΚΟΙΝΟΥ ΔΙΑΙΡΕΤΗ
a mod b σημαίνει: το υπόλοιπο που αφήνει η διαίρεση του a με το b
Π.χ., 5 mod 3=2, 6 mod 3=0 κ.ο.κ.
8. Εύρεση Μέγιστου Κοινού Διαιρέτη
Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ ΕΥΚΛΕΙΔΗ ΓΙΑ ΤΗΝ ΕΥΡΕΣΗ ΤΟΥ ΜΕΓΙΣΤΟΥ ΚΟΙΝΟΥ ΔΙΑΙΡΕΤΗ
Παραδείγματα εκτέλεσης του αλγορίθμου:
GCD(18,9)=GCD(9,0) ⇒ GCD(18,9)=9
GCD(37,11)=GCD(11,4) ⇒ GCD(4,3)=GCD(3,1)=GCD(1,0) ⇒ GCD(37,11)=1
9. Εύρεση Μέγιστου Κοινού Διαιρέτη
Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ ΕΥΚΛΕΙΔΗ ΓΙΑ ΤΗΝ ΕΥΡΕΣΗ ΤΟΥ ΜΕΓΙΣΤΟΥ ΚΟΙΝΟΥ ΔΙΑΙΡΕΤΗ
Παραδείγματα εκτέλεσης του αλγορίθμου:
GCD(18,9)=GCD(9,0) ⇒ GCD(18,9)=9
GCD(37,11)=GCD(11,4) ⇒ GCD(4,3)=GCD(3,1)=GCD(1,0) ⇒ GCD(37,11)=1
Αριθμοί όπως οι 37 και 11,
που έχουν ΜΚΔ το 1
λέγονται σχετικά πρώτοι μεταξύ
τους.
10. Εύρεση Μέγιστου Κοινού Διαιρέτη
Ο ΑΛΓΟΡΙΘΜΟΣ ΤΟΥ ΕΥΚΛΕΙΔΗ ΓΙΑ ΤΗΝ ΕΥΡΕΣΗ ΤΟΥ ΜΕΓΙΣΤΟΥ ΚΟΙΝΟΥ ΔΙΑΙΡΕΤΗ
GCD(18,9)=GCD(9,0) ⇒ GCD(18,9)=9
GCD(37,11)=GCD(11,4) ⇒ GCD(4,3)=GCD(3,1)=GCD(1,0) ⇒ GCD(37,11)=1
*
11. Αλγόριθμος Ευκλείδη: ορθότητα
Ο αλγόριθμος υλοποιεί ακριβώς τον παρακάτω κανόνα:
• Αν x και y θετικοί ακέραιοι με x≥y, τότε gcd(x,y) = gcd(x mod y,y)
Γιατί ισχύει αυτό;
• Αρκεί να δείξουμε ότι gcd(x, y)=gcd(x-y, y) από όπου προκύπτει και
ο παραπάνω κανόνας αφαιρώντας συνεχώς τον y από τον x
– Αν ένας αριθμός διαιρεί τους x και y τότε διαιρεί και τον x-y
• Κάθε ακέραιος a που διαιρεί και τον x(=ka) και τον y(=ma) διαιρεί επίσης και
τον x-y(=ka-ma=(k-m)a), επομένως gcd(x,y)=gcd(x-y,y).
– Αντίστροφα, αν ένας αριθμός διαιρεί τους x-y και y τότε διαιρεί και τον x
• Όμοια, κάθε ακέραιος a που διαιρεί και τον x-y(=ka) και τον y(=ma) διαιρεί
επίσης και τον x(=(m+k)a) και τον y(=ma).
• Επομένως gcd(x,y)=gcd(x-y,y)
12. Αλγόριθμος Ευκλείδη: χρόνος
εκτέλεσης
• Για να υπολογίσουμε το χρόνο εκτέλεσης του
αλγορίθμου, πρέπει να δούμε πόσο γρήγορα
μειώνονται οι αριθμοί (a,b) σε κάθε αναδρομική
κλήση
• Σε κάθε γύρο, οι αριθμοί (a,b) γίνονται (b,a mod
b): η σειρά τους αλλάζει, και ο μεγαλύτερος από
αυτούς, δηλ. ο a, μειώνεται σε a mod b
• Αυτή είναι μια σημαντική μείωση
14. Αλγόριθμος Ευκλείδη: χρόνος
εκτέλεσης
Πόσο μικρότεροι γίνονται οι αριθμοί σε κάθε γύρο;
• Αν a≥b τότε a mod b<a/2
Απόδειξη
• Ισχύει είτε b≤a/2 είτε b>a/2
– Αν b≤a/2 τότε a mod b < b ≤ a/2
a
b
15. Αλγόριθμος Ευκλείδη: χρόνος
εκτέλεσης
Πόσο μικρότεροι γίνονται οι αριθμοί σε κάθε γύρο;
• Αν a≥b τότε a mod b<a/2
Απόδειξη
• Ισχύει είτε b≤a/2 είτε b>a/2
– Αν b>a/2 τότε a mod b=α-b<a/2
a
b
16. Αλγόριθμος Ευκλείδη: χρόνος
εκτέλεσης
• Αυτό σημαίνει ότι μετά από δύο διαδοχικούς
γύρους, και οι δύο αριθμοί, a και b, είναι
τουλάχιστον μισοί σε τιμή
– δηλ., το μήκος του καθενός μειώνεται τουλάχιστον
κατά 1 bit
• Αν αρχικά είναι n-bit ακέραιοι, τότε η βασική
περίπτωση επιτυγχάνεται μετά από 2n
αναδρομικές κλήσεις
• Και επειδή κάθε κλήση απαιτεί μία διαίρεση που
απαιτεί τετραγωνικό χρόνο, ο συνολικός χρόνος
εκτέλεσης είναι O(n3)
17. Αλγόριθμος Ευκλείδη: χρόνος
εκτέλεσης
• Αρχικά: gcd(a,b)
• Βήμα 1: gcd(b,a mod b)
• Βήμα 2: gcd(a mod b, b mod (a mod b))
• Έστω ότι οι αριθμοί a και b έχουν αρχικά n bits ο καθένας
• Σε 2 βήματα, ο πρώτος αριθμός (το ίδιο ισχύει και για το δεύτερο) έχει
μειωθεί στο μισό
– Μείωση στο μισό = έχει 1 bit λιγότερο
• Για να τερματίσει ο αλγόριθμος πρέπει ο δεύτερος αριθμός να γίνει 0 ⇒ να
χάσει n bits
– «κόβω» 1 bit σε 2 βήματα
– «κόβω» n bits σε πόσα βήματα;
– Σε 2*n βήματα, δηλ. σε πλήθος βημάτων της τάξης του n (ή O(n) βήματα)
• Μετά από 2 διαδοχικά βήματα μειώνω τον a σε a mod b, κάνοντας μία
διαίρεση που κοστίζει της τάξης του n2 βήματα (ή Ο(n2) βήματα)
• Οπότε, συνολικά απαιτούνται: O(n) * Ο(n2) = Ο(n3) βήματα