ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ
Πολλαπλασιασμός: αλγόριθμος Για να πολλαπλασιάσουμε δύο αριθμούς x και y κατασκευάζουμε έναν πίνακα από ενδιάμεσα αθροίσματα, κάθε ένα από τα οποία προκύπτει ως γινόμενο του x με ένα ψηφίο του y Οι τιμές αυτές μετατοπίζονται κατάλληλα προς τα αριστερά και μετά αθροίζονται Υποθέστε ότι θέλουμε να πολλαπλασιάσουμε το 13 με το 11, ή σε δυαδική αναπαράσταση, x = 1101 και y = 1011
Πολλαπλασιασμός: παράδειγμα 1101 επί 1 1101 επί 1, μετατόπιση κατά μία θέση 1101 επί 0, μετατόπιση κατά δύο θέσεις 1101 επί 1, μετατόπιση κατά τρεις θέσεις δυαδικός
Πολλαπλασιασμός: χρόνος εκτέλεσης αλγορίθμου Με δυαδική αναπαράσταση, κάθε ενδιάμεση γραμμή είναι είτε 0 είτε το ίδιο το x, μετατοπισμένο κατά τα αριστερά κατάλληλο πλήθος φορών Παρατηρήστε ότι η μετατόπιση προς τα αριστερά είναι ένας σύντομος τρόπος για να πολλαπλασιάσουμε με τη βάση, δηλ., το 2 Αν οι x και y έχουν και οι δύο από n bits, τότε υπάρχουν n ενδιάμεσες σειρές, με μήκος το πολύ 2n bits η κάθε μία (λαμβάνοντας υπόψη και τη μετατόπιση) Επομένως, ο συνολικός χρόνος που απαιτείται για να αθροιστούν αυτές οι γραμμές, προσθέτοντας δύο αριθμούς τη φορά είναι:
Πολλαπλασιασμός: χρόνος εκτέλεσης αλγορίθμου Προκύπτουν n ενδιάμεσες γραμμές κάθε μία με μήκος το πολύ 2n, οπότε για να αθροιστούν (αθροίζοντας 2 από αυτές κάθε φορά) απαιτείται χρόνος: φορές Είναι της τάξης του O(n2), δηλ., τετραγωνικός ως προς το μέγεθος των εισόδων: παραμένει πολυωνυμικός αλλά μεγαλύτερος από τον αντίστοιχο χρόνο που απαιτείται για την πρόσθεση
Πολλαπλασιασμός: αλγόριθμος του Al Khwarizmi Για να πολλαπλασιάσουμε δύο δεκαδικούς αριθμούς x και y, τους γράφουμε τον έναν δίπλα στον άλλον Τότε επαναλαμβάνουμε τα ακόλουθα: Διαιρούμε τον πρώτο αριθμό με το 2, στρογγυλοποιώντας προς τα κάτω το αποτέλεσμα (δηλ., διώχνουμε το ,5 αν ο αριθμός είναι περιττός), και Διπλασιάζουμε το δεύτερο αριθμό Συνεχίζουμε μέχρι ο πρώτος αριθμός να γίνει 1 Τότε σβήνουμε όλες τις γραμμές στις οποίες ο πρώτος αριθμός είναι άρτιος και αθροίζουμε τους αριθμούς που έχουν μείνει στη δεύτερη στήλη
Πολλαπλασιασμός: αλγόριθμος του Al Khwarizmi η απάντηση
Πολλαπλασιασμός: αλγόριθμος του Al Khwarizmi Συγκρίνοντας τους δύο αλγόριθμους, για δυαδικό πολλαπλασιασμό και πολλαπλασιασμό με επαναληπτικές διαιρέσεις του πολλαπλασιαστή με 2, παρατηρούμε ότι κάνουν ακριβώς το ίδιο πράγμα! Οι 3 αριθμοί που αθροίζονται στο δεύτερο αλγόριθμο είναι ακριβώς τα πολλαπλάσια του 13 με δυνάμεις του 2 ανάλογα με αυτούς που αθροίζονταν στη δυαδική μέθοδο Μόνο που το 11 δε δόθηκε ρητά σε δυαδική μορφή και έπρεπε μόνοι μας να εξάγουμε τη δυαδική του αναπαράσταση ελέγχοντας την ισοτιμία των αριθμών που προέκυπταν από τις διαδοχικές του διαιρέσεις με 2 Ο δεύτερος αλγόριθμος του Al Khwarizmi είναι μια εντυπωσιακή μείξη δεκαδικής και δυαδικής αναπαράστασης!
Οι δύο μέθοδοι κάνουν το ίδιο…! Λύση 1 Οι αριθμοί μετατρέπονται σε δυαδικούς: 1110=10112 1310=11012 1101 x 1011 ________________ 1101 13 11010 26 000000 0 1101000 104 10001111 143 Λύση 2 11 13 11/2=5,5 5 26 =13*2 5/2=2,5 2 52 =26*2 2/2=1 1 104 =52*2 ___________________________ + 143
Οι δύο μέθοδοι κάνουν το ίδιο…! Λύση 1 Οι αριθμοί μετατρέπονται σε δυαδικούς: 1110=10112 1310=11012 1101 x 1011 ________________ 1101 13 11010 26 000000 0 1101000 104 10001111 143 Λύση 2 11 13 11/2=5,5 5 26 =13*2 5/2=2,5 2 52 =26*2 2/2=1 1 104 =52*2 ___________________________ + 143
Οι δύο μέθοδοι κάνουν το ίδιο…! Λύση 1 Οι αριθμοί μετατρέπονται σε δυαδικούς: 1110=10112 1310=11012 1101 x 1011 ________________ 1101 13 11010 26 000000 0 1101000 104 10001111 143 Λύση 2 11 13 11/2=5,5 5 26 =13*2 5/2=2,5 2 52 =26*2 2/2=1 1 104 =52*2 ___________________________ + 143 Ο(n2) Ο(n2)
Πολλαπλασιασμός: άλλος αλγόριθμος ΓΑΛΛΙΚΟΣ ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ
Πολλαπλασιασμός: άλλος αλγόριθμος Αν ο y είναι άρτιος Αν ο y είναι περιττός
Πολλαπλασιασμός: άλλος αλγόριθμος Αν ο y είναι άρτιος Αν ο y είναι περιττός
Π Α Ρ Α Δ Ε Ι Γ Μ Α
Πολλαπλασιασμός: άλλος αλγόριθμος Ορθότητα: Ο προηγούμενος αναδρομικός κανόνας είναι σωστός και ο αλγόριθμος μιμείται ακριβώς αυτόν τον κανόνα και χειρίζεται σωστά την αρχική περίπτωση (y = 0) Χρόνος εκτέλεσης: Ο αλγόριθμος τερματίζει μετά από n αναδρομικές κλήσεις, αφού σε κάθε κλήση το y γίνεται μισό δηλ., ο αριθμός των bits του μειώνεται κατά 1 Κάθε αναδρομική κλήση απαιτεί συνολικά O(n) bit λειτουργίες: Διαίρεση με το 2 (ολίσθηση προς τα δεξιά) Έλεγχο για το αν ο αριθμός είναι άρτιος/περιττός (κοιτάμε το τελευταίο bit) Πολλαπλασιασμό με το 2 (ολίσθηση προς τα αριστερά) Ίσως, μία πρόσθεση Επομένως, συνολικός χρόνος εκτέλεσης: O(n2), όπως και για τους προηγούμενους αλγόριθμους
Πολλαπλασιασμός: μπορούμε καλύτερα; Διαισθητικά, επειδή ο πολλαπλασιασμός φαίνεται να απαιτεί άθροιση περίπου n πολλαπλασίων μιας από τις εισόδους, και δεδομένου ότι κάθε πρόσθεση απαιτεί γραμμικό χρόνο, φαίνεται οι n2 bit λειτουργίες να μη γίνεται να μειωθούν Παραδόξως: μπορούμε να κάνουμε πολύ καλύτερα!
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Χρησιμοποιούμε (1) την τεχνική διαίρει και βασίλευε (divide and conquer) 1. Σπάμε το πρόβλημα σε υποπροβλήματα που αποτελούν μικρότερου μεγέθους στιγμιότυπα του δοσμένου προβλήματος 2. Αναδρομικά λύνουμε τα υποπροβλήματα 3. Συνδυάζουμε κατάλληλα τις λύσεις τους για να πάρουμε τη λύση του αρχικού προβλήματος Φανταστείτε ότι έχω να πλύνω μια στολή που αποτελείται από πουκάμισο, γιλέκο και παντελόνι… και (2) το θεώρημα του Gauss bc + ad = (a + b)(c + d)-ac-bd
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε:
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Γραμμικός χρόνος: Ο(n)
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Γραμμικός χρόνος: Ο(n) Xρόνος: 4*T(n/2) Συνολικός χρόνος: 4*Τ(n/2)+O(n)=O(n2) με τη γνωστή τεχνική πολλαπλασιασμού…
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, y και ζητείται το x*y Χωρίζουμε τους x, y στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε: Αν x = 10110110 τότε xL = 1011 και xR = 0110 και x = 1011*24 + 0110 Γραμμικός χρόνος: Ο(n) Xρόνος: 3*T(n/2) Συνολικός χρόνος: 3*Τ(n/2)+O(n)O(n1.59) με χρήση της τεχνικής του Gauss…
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος ΑΛΓΟΡΙΘΜΟΣ ΓΙΑ ΠΟΛΛΑΠΛΑΣΙΑΣΜΟ ΜΕ ΧΡΗΣΗ ΤΗΣ ΤΕΧΝΙΚΗΣ ΔΙΑΙΡΕΙ ΚΑΙ ΒΑΣΙΛΕΥΕ
Κάθε πρόβλημα διαιρείται σε 3 υποπροβλήματα Η αναδρομική διαδικασία k=0 k=logn Τελικά: 3k υποπροβλήματα, μεγέθους το καθένα n/2k: χρόνος 3k *Ο(n/2k)= (3/2)k*O(n)
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Δεδομένα: 2 ακέραιοι a και b με n ψηφία ο καθένας Ζητούμενο: γινόμενο a επί b Παράδειγμα: Με βάση τον αλγόριθμο για πολλαπλασιασμό που είδαμε ήδη και απαιτεί χρόνο O(n2) 1980 = a x 2315 = b ---------------- 9900 1980 5940 + 3960 4583700 = a x b
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Ο αλγόριθμος πρέπει να υπολογίσει τα 4 γινόμενα και μετά να τα αθροίσει, δηλ., 15*80+(15*19+23*80)*102+23*19*104= 1200+212500+4370000=4583700 Απαιτούμενος χρόνος: T(n) 4*T(n / 2) + O(n) T(n) = O(n2) *104 *102 *100
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Με λίγη εξυπνάδα… ο αλγόριθμος μπορεί να υπολογίσει μόνο 3 γινόμενα: x1 = aL*bL, x2 = aR*bR και x3 = (aL + aR)*(bL + bR) Αφού: aL aR x bL bR ------------------------------------------- aL bL aL bR + aR bL aR bR x1 x3 - x1 - x2 x2 Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*104 + (x3 - x1 – x2)*102 + x2 = 437*104 + (3762 - 437 – 1200)*102 + 1200= 437*104 + 2125*102 + 1200=4583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) + O(n) T(n) O(n1.59) *104 *102 *100 Αλγόριθμος Karatsuba
Πολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) (aL+aR)*(bL+bR)=aL*bL+aL*b*R+aR*bL+aR*bR aL*b*R+aR*bL=(aL+aR)*(bL+bR)-aL*bL-aR*bR aL*b*R+aR*bL=x3-x1-x2 Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Με λίγη εξυπνάδα… ο αλγόριθμος μπορεί να υπολογίσει μόνο 3 γινόμενα: x1 = aL*bL, x2 = aR*bR και x3 = (aL + aR)*(bL + bR) Αφού: aL aR x bL bR ------------------------------------------- aL bL aL bR + aR bL aR bR x1 x3 - x1 - x2 x2 Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*104 + (x3 - x1 – x2)*102 + x2 = 437*104 + (3762 - 437 – 1200)*102 + 1200= 437*104 + 2125*102 + 1200=4583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) + O(n) T(n) O(n1.59) *104 *102 *100 Αλγόριθμος Karatsuba