ΟΛΛΑΛΑΣΙΑΣΜΟΣ
ολλαπλασιασμός: αλγόριθμος Για να πολλαπλασιάσουμε δύο αριθμούς x και κατασκευάζουμε έναν πίνακα από ενδιάμεσα αθροίσματα, κάθε ένα από τα οποία προκύπτει ως γινόμενο του x με ένα ψηφίο του Οι τιμές αυτές μετατοπίζονται κατάλληλα προς τα αριστερά και μετά αθροίζονται Υποθέστε ότι θέλουμε να πολλαπλασιάσουμε το 13 με το 11, ή σε δυαδική αναπαράσταση, x 1101 και 1011
ολλαπλασιασμός: παράδειγμα 1101 επί 1 1101 επί 1, μετατόπιση κατά μία θέση 1101 επί 0, μετατόπιση κατά δύο θέσεις 1101 επί 1, μετατόπιση κατά τρεις θέσεις δυαδικός
ολλαπλασιασμός: χρόνος εκτέλεσης αλγορίθμου Με δυαδική αναπαράσταση, κάθε ενδιάμεση γραμμή είναι είτε 0 είτε το ίδιο το x, μετατοπισμένο κατά τα αριστερά κατάλληλο πλήθος φορών αρατηρήστε ότι η μετατόπιση προς τα αριστερά είναι ένας σύντομος τρόπος για να πολλαπλασιάσουμε με τη βάση, δηλ., το 2 Αν οι x και έχουν και οι δύο από n bits, τότε υπάρχουν n ενδιάμεσες σειρές, με μήκος το πολύ 2n bits η κάθε μία (λαμβάνοντας υπόψη και τη μετατόπιση) Επομένως, ο συνολικός χρόνος που απαιτείται για να αθροιστούν αυτές οι γραμμές, προσθέτοντας δύο αριθμούς τη φορά είναι:
ολλαπλασιασμός: χρόνος εκτέλεσης αλγορίθμου ροκύπτουν n ενδιάμεσες γραμμές κάθε μία με μήκος το πολύ 2n, οπότε για να αθροιστούν (αθροίζοντας 2 από αυτές κάθε φορά) απαιτείται χρόνος: φορές Είναι της τάξης του O(n 2 ), δηλ., τετραγωνικός ως προς το μέγεθος των εισόδων: παραμένει πολυωνυμικός αλλά μεγαλύτερος από τον αντίστοιχο χρόνο που απαιτείται για την πρόσθεση
ολλαπλασιασμός: αλγόριθμος του Al Khwarizmi Για να πολλαπλασιάσουμε δύο δεκαδικούς αριθμούς x και, τους γράφουμε τον έναν δίπλα στον άλλον Τότε επαναλαμβάνουμε τα ακόλουθα: Διαιρούμε τον πρώτο αριθμό με το 2, στρογγυλοποιώντας προς τα κάτω το αποτέλεσμα (δηλ., διώχνουμε το,5 αν ο αριθμός είναι περιττός), και Διπλασιάζουμε το δεύτερο αριθμό Συνεχίζουμε μέχρι ο πρώτος αριθμός να γίνει 1 Τότε σβήνουμε όλες τις γραμμές στις οποίες ο πρώτος αριθμός είναι άρτιος και αθροίζουμε τους αριθμούς που έχουν μείνει στη δεύτερη στήλη
ολλαπλασιασμός: αλγόριθμος του Al Khwarizmi η απάντηση
ολλαπλασιασμός: αλγόριθμος του Al Khwarizmi Συγκρίνοντας τους δύο αλγόριθμους, για δυαδικό πολλαπλασιασμό και πολλαπλασιασμό με επαναληπτικές διαιρέσεις του πολλαπλασιαστή με 2, παρατηρούμε ότι κάνουν ακριβώς το ίδιο πράγμα! Οι 3 αριθμοί που αθροίζονται στο δεύτερο αλγόριθμο είναι ακριβώς τα πολλαπλάσια του 13 με δυνάμεις του 2 ανάλογα με αυτούς που αθροίζονταν στη δυαδική μέθοδο Μόνο που το 11 δε δόθηκε ρητά σε δυαδική μορφή και έπρεπε μόνοι μας να εξάγουμε τη δυαδική του αναπαράσταση ελέγχοντας την ισοτιμία των αριθμών που προέκυπταν από τις διαδοχικές του διαιρέσεις με 2 Ο δεύτερος αλγόριθμος του Al Khwarizmi είναι μια εντυπωσιακή μείξη δεκαδικής και δυαδικής αναπαράστασης!
Οι δύο μέθοδοι κάνουν το ίδιο! Λύση 1 Οι αριθμοί μετατρέπονται σε δυαδικούς: 111010112 131011012 1101 x 1011 1101 13 11010 26 000000 0 1101000 104 10001111 143 Λύση 2 11 13 11/25,5 5 26 13*2 5/22,5 2 52 26*2 2/21 1 104 52 143
Οι δύο μέθοδοι κάνουν το ίδιο! Λύση 1 Οι αριθμοί μετατρέπονται σε δυαδικούς: 111010112 131011012 1101 x 1011 1101 13 11010 26 000000 0 1101000 104 10001111 143 Λύση 2 11 13 11/25,5 5 26 13*2 5/22,5 2 52 26*2 2/21 1 104 52 143
Οι δύο μέθοδοι κάνουν το ίδιο! Λύση 1 Οι αριθμοί μετατρέπονται σε δυαδικούς: 111010112 131011012 1101 x 1011 1101 13 11010 26 000000 0 1101000 104 10001111 143 Ο(n 2 ) Λύση 2 11 13 11/25,5 5 26 13*2 5/22,5 2 52 26*2 2/21 1 104 52 Ο(n 2 ) 143
ολλαπλασιασμός: άλλος αλγόριθμος ΓΑΛΛΙΚΟΣ ΟΛΛΑΛΑΣΙΑΣΜΟΣ
ολλαπλασιασμός: άλλος αλγόριθμος Αν ο είναι άρτιος Αν ο είναι περιττός
ολλαπλασιασμός: άλλος αλγόριθμος Αν ο είναι άρτιος Αν ο είναι περιττός x z x x x x ό z x x x ά Α Α 2 * 1) 2 *( * ) 2 * ( ) 2 *( * ς περιττ ν ρτιος ν
), ( * * ), (, ), ( : 11 6 2 11 2 1113 6 2 0 13 1113 1 Κ z x ό ή ς περιττ ση λ (11,3) (11,6) 3 2 0, 6 (11,6) 2 : Κ z ά ή ρτιος ση λ (11,1) 11 (11,3) 1 2 0, 3 (11,3) 3: Κ z x ό ή ς περιττ ση λ (11,0) 11 (11,1) 0 2 0, 1 (11,1) 4 : Κ z x ό ή ς περιττ ση λ 143 66 11 (11,6) 11 (11,13) 66 33 (11,3) (11,6) 33 11 11 (11,1) 11 (11,3) 11 0 11 (11,0) 11 (11,1) 0 (11,0) 0 (11,0) 5 : Κ z x z z x z x λήση Α Ρ Α Δ Ε Ι Γ Μ Α
ολλαπλασιασμός: άλλος αλγόριθμος Ορθότητα: Ο προηγούμενος αναδρομικός κανόνας είναι σωστός και ο αλγόριθμος μιμείται ακριβώς αυτόν τον κανόνα και χειρίζεται σωστά την αρχική περίπτωση ( 0) Χρόνος εκτέλεσης: Ο αλγόριθμος τερματίζει μετά από n αναδρομικές κλήσεις, αφού σε κάθε κλήση το γίνεται μισό δηλ., ο αριθμός των bits του μειώνεται κατά 1 Κάθε αναδρομική κλήση απαιτεί συνολικά O(n) bit λειτουργίες: Διαίρεση με το 2 (ολίσθηση προς τα δεξιά) Έλεγχο για το αν ο αριθμός είναι άρτιος/περιττός (κοιτάμε το τελευταίο bit) ολλαπλασιασμό με το 2 (ολίσθηση προς τα αριστερά) Ίσως, μία πρόσθεση Επομένως, συνολικός χρόνος εκτέλεσης: O(n 2 ), όπως και για τους προηγούμενους αλγόριθμους
ολλαπλασιασμός: μπορούμε καλύτερα; Διαισθητικά, επειδή ο πολλαπλασιασμός φαίνεται να απαιτεί άθροιση περίπου n πολλαπλασίων μιας από τις εισόδους, και δεδομένου ότι κάθε πρόσθεση απαιτεί γραμμικό χρόνο, φαίνεται οι n 2 bit λειτουργίες να μη γίνεται να μειωθούν αραδόξως: μπορούμε να κάνουμε πολύ καλύτερα!
ολλαπλασιασμός: βελτιωμένος αλγόριθμος Χρησιμοποιούμε (1) την τεχνική διαίρει και βασίλευε (divide and conquer) 1. Σπάμε το πρόβλημα σε υποπροβλήματα που αποτελούν μικρότερου μεγέθους στιγμιότυπα του δοσμένου προβλήματος 2. Αναδρομικά λύνουμε τα υποπροβλήματα 3. Συνδυάζουμε κατάλληλα τις λύσεις τους για να πάρουμε τη λύση του αρχικού προβλήματος Φανταστείτε ότι έχω να πλύνω μια στολή που αποτελείται από πουκάμισο, γιλέκο και παντελόνι και (2) το θεώρημα του Gauss bc ad (a b)(c d)-ac-bd
ολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, και ζητείται το x* Χωρίζουμε τους x, στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Τότε:
ολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, και ζητείται το x* Χωρίζουμε τους x, στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x 10110110 τότε xl 1011 και xr 0110 και x 1011*2 4 0110 Τότε:
ολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, και ζητείται το x* Χωρίζουμε τους x, στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x 10110110 τότε xl 1011 και xr 0110 και x 1011*2 4 0110 Τότε: Γραμμικός χρόνος: Ο(n)
ολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, και ζητείται το x* Χωρίζουμε τους x, στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x 10110110 τότε τότε xl 1011 και και xr xr 0110 0110 και x 1011*2 4 4 0110 Τότε: Γραμμικός χρόνος: Ο(n) Xρόνος: 4*T(n/2) Συνολικός χρόνος: 4*Τ(n/2)O(n)O(n 2 ) με τη γνωστή τεχνική πολλαπλασιασμού
ολλαπλασιασμός: βελτιωμένος αλγόριθμος Δίνονται n-bit ακέραιοι αριθμοί x, και ζητείται το x* Χωρίζουμε τους x, στο αριστερό και δεξί τους τμήμα (το καθένα έχει n/2 bits) Αν x 10110110 τότε xl 1011 και xr 0110 και x 1011*2 4 0110 Τότε: Γραμμικός χρόνος: Ο(n) Xρόνος: 3*T(n/2) Συνολικός χρόνος: 3*Τ(n/2)O(n) O(n 1.59 ) με χρήση της τεχνικής του Gauss
ολλαπλασιασμός: βελτιωμένος αλγόριθμος ΑΛΓΟΡΙΘΜΟΣ ΓΙΑ ΟΛΛΑΛΑΣΙΑΣΜΟ ΜΕ ΧΡΗΣΗ ΤΗΣ ΤΕΧΝΙΚΗΣ ΔΙΑΙΡΕΙ ΚΑΙ ΒΑΣΙΛΕΥΕ
Κάθε πρόβλημα διαιρείται σε 3 υποπροβλήματα Η αναδρομική διαδικασία k0 klogn Τελικά: 3 k υποπροβλήματα, μεγέθους το καθένα n/2 k : χρόνος 3 k *Ο(n/2 k ) (3/2) k *O(n)
ολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Δεδομένα: 2 ακέραιοι a και b με n ψηφία ο καθένας Ζητούμενο: γινόμενο a επί b αράδειγμα: 1980 a x 2315 b ---------------- 9900 1980 5940 3960 ---------------- 4583700 a x b Με βάση τον αλγόριθμο για πολλαπλασιασμό που είδαμε ήδη και απαιτεί χρόνο O(n 2 )
ολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: *10 4 *10 2 *10 0 Ο αλγόριθμος πρέπει να υπολογίσει τα 4 γινόμενα και μετά να τα αθροίσει, δηλ., 15*80(15*1923*80)*10 2 23*19*10 4 120021250043700004583700 Απαιτούμενος χρόνος: T(n) 4*T(n / 2) O(n) T(n) O(n 2 )
ολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: Χωρίζουμε τους ακεραίους στα δύο τους μισά: Με λίγη εξυπνάδα ο αλγόριθμος μπορεί να υπολογίσει μόνο 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 *10 4 *10 2 *10 0 Αλγόριθμος Karatsuba Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*10 4 (x3 - x1 x2)*10 2 x2 437*10 4 (3762-437 1200)*10 2 1200 437*10 4 2125*10 2 12004583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) O(n) T(n) O(n 1.59 )
ολλαπλασιασμός: βελτιωμένος αλγόριθμος (τεχνική διαίρει και βασίλευε) Διαιρούμε το πρόβλημα: (alar)*(blbr)al*blal*b*rar*blar*br al*b*rar*bl(alar)*(blbr)-al*bl-ar*br al*b*rar*blx3-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 *10 4 *10 2 *10 0 Αλγόριθμος Karatsuba Τώρα ο αλγόριθμος πρέπει να υπολογίσει 3 γινόμενα: x1, x2, και x3, να υπολογίσει το x3 - x1 - x2, και να αθροίσει: x1*10 4 (x3 - x1 x2)*10 2 x2 437*10 4 (3762-437 1200)*10 2 1200 437*10 4 2125*10 2 12004583700 Απαιτούμενος χρόνος: T(n) 3*T(n / 2) O(n) T(n) O(n 1.59 )