See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Algorytm Karatsuby - Wikipedia, wolna encyklopedia

Algorytm Karatsuby

Z Wikipedii

Algorytm Karatsuby - algorytm szybkiego mnożenia dużych liczb całkowitych, opracowany przez A. Karatsubę w 1960 i opublikowany razem z Yu. Ofmanem w 1962 roku. Jego złożoność obliczeniowa wynosi Θ(n^{\log_23}). Jest to lepszy rezultat od algorytmu klasycznego Θ(n2), chociaż dla niewielkich liczb jest mniej praktyczny.

Spis treści

[edytuj] Algorytm

Do pomnożenia dwóch n-cyfrowych liczb x i y przy podstawie B, gdzie n=2m (jeśli n jest nieparzyste, albo x ma różną liczbę cyfr niż y, można to naprawić dodając zera po lewej stronie tych liczb), rozpisujemy je jako:

x = x1 Bm + x2
y = y1 Bm + y2

gdzie x2 i y2 są mniejsze niż Bm. Wynik mnożenia wynosi wtedy:

xy = (x1Bm + x2)(y1Bm + y2)
= x1y1B2m + (x1y2 + x2y1)Bm + x2y2

Standardową metodą byłoby pomnożenie czterech czynników osobno i dodanie ich po odpowiednim przesunięciu. Daje to algorytm działający w czasie O(n2). Karatsuba zauważył że możemy ten sam wynik uzyskać wykonując tylko trzy mnożenia:

X = x1y1
Y = x2y2
Z = (x1 + x2)(y1 + y2) - X - Y

Dostajemy wtedy

Z = (x1y1 + x1y2 + x2y1 + x2y2) - x1y1 - x2y2
= x1y2 + x2y1

A zatem xy = X B2m + Y + Z Bm; tym samym kosztem kilku dodawań i odejmowań zmniejszyliśmy liczbę mnożeń z czterech do trzech.

Każde z tych mnożeń m-cyfrowych liczb możemy znów wykonać za pomocą algorytmu Karatsuby, wykorzystując rekurencję.

[edytuj] Przykład

Chcemy policzyć iloczyn liczb 1234 i 5678. W tym wypadku B = 10 i m = 2. Mamy

12 34 = 12 ⋅ 102 + 34
56 78 = 56 ⋅ 102 + 78
X = 12 ⋅ 56 = 672
Y = 34 ⋅ 78 = 2652
Z = (12 + 34)(56 + 78) - X - Y = 46 ⋅ 134 - 672 - 2652 = 2840
X 102⋅2 + Y + Z 102 = 672 0000 + 2652 + 2840 00 = 7006652 = 1234 ⋅ 5678

[edytuj] Złożoność

Niech T(n) oznacza liczbę operacji potrzebnych do pomnożenia dwóch n-cyfrowych liczb za pomocą algorytmu Karatsuby. Dostajemy równanie rekurencyjne:

T(n) = 3 T(n/2) + cn + d

dla pewnych stałych c i d. Jego rozwiązaniem jest funkcja rzędu Θ(nlog(3)/log(2)).

log(3)/log(2) wynosi w przybliżeniu 1.585, a więc dla dużych n funkcja ta ma mniejszą wartość od funkcji kwadratowej. Z powodu kosztów wywołań rekurencyjnych algorytm ten nie jest opłacalny dla małych n. Zwykle przyjmuje się że zaczyna być on opłacalny dla liczb kilkusetbitowych.

Pomysł dzielenia czynników na mniejsze części można uogólnić. Dzieląc każdy z czynników na 3 fragmenty, można zamiast 9 mnożeń wykonać 5, osiągając algorytm o złożoności Θ(nlog(5)/log(3)). Dalsze zwiększanie liczby części również daje pewien zysk (kosztem znacznego skomplikowania algorytmu), ale jeszcze lepsze wyniki można uzyskać wykorzystując szybką transformatę Fouriera. Daje to najszybszy znany algorytm mnożenia - algorytm Schönhage-Strassena, który jest stosowany do mnożenia liczb złożonych z dziesiątek tysięcy bitów.

[edytuj] Przypisy

  • A. Karatsuba and Yu Ofman, "Multiplication of Many-Digital Numbers by Automatic Computers." Doklady Akad. Nauk SSSR Vol. 145 (1962), pp. 293–294. Translation in Physics-Doklady 7 (1963), pp. 595–596.
  • Karacuba A. A. Berechnungen und die Kompliziertheit von Beziehungen (German) // Elektron. Informationsverarb. Kybernetik, 11, 603–606 (1975).
  • Karatsuba A. A. The complexity of computations // Proc. Steklov Inst. Math., 211, 169–183 (1995); translation from Trudy Mat. Inst. Steklova, 211, 186–202 (1995).
  • Knuth D. E. The Art of Computer Programming. v.2 Addison-Wesley Publ.Co., 724 pp., Reading (1969).
  • Karatsuba Multiplication on MathWorld
  • Bernstein, D. J., "Multidigit multiplication for mathematicians". Covers Karatsuba and many other multiplication algorithms.
  • Karatsuba Multiplication on Fast Algorithms and the FEE

[edytuj] Linki zewnętrzne


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -