Karacubin algoritam

S Vikipedije, slobodne enciklopedije

Karacubin algoritam je algoritam za brzo množenje. Otkrio ga je Anatolji Karacuba 1960 i objavio 1962. Smanjuje množenje dva n- tocifrena broja na najviše jednocifreno množenje (i tačno gde je n stepen 2). Zato je brži od klasičnog algoritma množenja, koji zahteva n² jednocifren proizvoda. Na primer, Karacubin algoritam zahteva 310 = 59,049 jednocifrenih množenja za množenje dva 1024-cifrena broja (n = 1024 = 210), dok klasičan algoritam zahteva (210)² = 1,048,576.

Karacubin algoritam je prvi algoritam množenja koji je asimptotički brži od kvadratnog "školskog" algoritma množenja. "Toom–Cook" algoritam je brža generalizacija Karacubinog algoritma, dok je "Schönhage–Strassen" algoritam još brži, za dovoljno veliko n.

Istorija[uredi | uredi izvor]

Standardna procedura množenja dva n-tocifrena broja zahteva broj elementarnih operacija proporcionalan , ili u za veliko O. Andrej Kolomogrov je 1952 pretpostavio da je klasičan algoritam bio asimptotski optimalan, tj. da bi svaki algoritam zahtevao elementarnih operacija.

Kolomogorov je, 1960 u moskovskom državnom univerzitetu, organizovao matematički seminar na temu problema u kibernetici, kada je izjavio da su sa zasnovani i ostali problemi u teoriji kompleksnosti. Nedelju dana kasnije, Karacuba, 23-godišnjni student, napravio je algoritam (kasnije nazvan "podeli pa vladaj") koji množi dva n-tocifrena brojeva u elementarnih koraka, i time oborio pretpostavku. Kolomogorov je bio vidno potrešen otkrićem; on je saopštio otkriće na sledećem seminaru, koji je bio zatim prekinut. Kolomogorov je predavao neke lekcije na temu Karacubinih rezultata na konferencijama širom sveta (pogledati, na primer, "Proceedings of the international congress of mathematicians 1962". str. 351--356, i takođe "6 Lectures delivered at the International Congress of Mathematicians in Stockholm, 1962") i objavio algoritam 1962, u naučnim novinama ("Proceedings of the USSR Academy of Sciences"). Članak je napisao Kolomogorov i sadržao je dva rezultata množenja, Karacubin algoritam i odvojene rezultate Jurija Petroviča Ofmana; članak je imao naslov "A. Karacuba i Ju. Ofman" kao i autore teksta. Karacuba je saznao za tekst tek kada je dobio kopiju od izdavača.

Algoritam[uredi | uredi izvor]

Osnovni koraci[uredi | uredi izvor]

Osnovni korak Karacubinog algoritma je formula koja omogućava izračunavanje proizvoda dva velika broja and koristeći tri množenja malih brojeva, svaki sa oko pola cifara kao ili , i još neka sabiranja i pomeranje (šiftovanje) cifara.

Neka i budu prikazani kao -tocifrenih stringova u nekoj bazi . Za bilo koji pozitivan ceo broj manji od , mogu se zapisati dva data broja kao:

,

gde i su manjni od . Proizvod je onda

,

gde

.

Ove formule zahtevaju množenje, i poznate se po Čarls Bebidžu. Karacuba je pretpostavio da mogu biti izračunati u samo tri množenja, sa cenom nekoliko dodatnih sabiranja. Sa i kao i pre može se izračunati

koji ima

.

Efikasnija implementacija Karacubinog algoritma množenja se može predstaviti kao [1] , where .

Primer[uredi | uredi izvor]

Da bismo izračunali proizvod 12345 i 6789, izabraćemo da je B = 10 i m = 3. Onda razlažemo ulazne operande koristeći dobijenu bazu (Bm = 1000), kao:

12345 = 12 · 1000 + 345
6789 = 6 · 1000 + 789

Samo tri množenja, koja se odvijaju na malim celim brojevima, se koriste za izračunavanje tri delimična tj. partitivna rezultata:

z2 = 12 × 6 = 72
z0 = 345 × 789 = 272205
z1 = (12 + 345) × (6 + 789) − z2z0 = 357 × 795 − 72 − 272205 = 283815 − 72 − 272205 = 11538

Reѕultat dobijamo samo sabirajući ova tri delimična rezultata, pomeramo ih prema (i zatim razlažemo ova tri ulaza u bazu 1000 kao za ulazne operande):

rešenje= z2 · B2m + z1 · Bm + z0, i.e.
rešenje = 72 · 1000² + 11538 · 1000 + 272205 = 83810205.

Primetite da srednje treće množenje operiše na ulaznom domenu koji je dvaput manji od prva dva množenja , njegov izlazni domen je četiri puta manji, i baza -1000 koja sadrži prva dva množenja koja se moraju uzeti u obzir prilikom oduzimanja; takođe primetite da ovo partitivno rešenje z1 ne može biti negativno: da bismo izračunali ova oduzimanja, koristićemo sabiranje sa komplementom 1000² koji se takođe može koristiti, čuvajući samo poslednje 2 baze -1000 cifara za svaki broj:

z1 = 283815 − 72 − 272205 = (283815 + 999928 + 727795) mod 1000² = 2011538 mod 1000² = 11538.

Rekurzivna aplikacija[uredi | uredi izvor]

Ako je n četiri ili više, množenje u tri koraka u osnovi Karacubinog algoritma je da uključi operande sa više od n cifara. Zato, ovi proizvodi mogu biti izračunati rekurzivnim pozivom. Rekurzija će se ponavljati sve dok brojevi ne budu toliko mali da tada moraju da budu direktno pomnoženi.

Na računaru sa 32-bita, na primer, može se izabrati B = 231 = 2,147,483,648 or B = 109 = 1,000,000,000, i smestiti svaka cifra kao odvojena 32-bitna binarna reč. Onda suma x1 + x0 i y1 + y0 neće zahtevati dodatnu binarnu reč za smeštanje prenete cifre, i Karacubina rekurzija može biti primenjena sve dok brojevi koji se množe su dužine jedne cifre..

Analiza efikasnosti[uredi | uredi izvor]

Karacubin osnovni korak radi za bilo koju bazu B i bilo koje m, ali rekurzivni algoritam je najefikasniji kada je m jednako n/2, zaokruženo. Naročito, ako n je 2k, za neki ceo broj k, i rekurzija staje samo kada n postane 1, onda broj jednocifrenic množenja je 3k, što je nc gde je c = log23.

Pošto se može povećati bilo koji ulaz sa nula cifara sve dok dužina ne postane stepen dvojke , iz toga sledi da broj elementarnih množenja , za bilo koje n, je najviše .

Pošto se sabiranje, oduzimanje, i pomeranje cifara (množenje bazom B) u Karacubinom osnovnom koraku uzima vreme proporcionalno n, ta cena postajae zanemarljiva za n koje raste. Preciznije, ako t(n) označava ukupan brroj elementarnih operacija koij algoritam izvodi prilikom množenja dva n-tocifrena broja, onda

za neke konstante c and d. Za ovu diferencnu relaciju, master teorema daje asimptotsku granicu .

Iz toga sledi, za dovoljno veliko n, Karacubinalgoritam će izvesti nekoliko pomeranja i jednocifrenih sabiranja onda dukačko množenje, iako osnovni korak koristi više sabiranja i pomeranja nego formula. Za male vrednosti n, kako god, dodatno pomeranje i sabiranje mogu usporiti u odnosu na duhačku metodu množenja. Poenta pozitivnog povratka zavisi od platforme i konteksta. Kao neko pravilo, Karacubin algoritam je brži kada su množenik i množilac duži od 320–640 bitova.[2]

Pseudokod[uredi | uredi izvor]

procedure karatsuba(num1, num2)
  if (num1 < 10) or (num2 < 10)
    return num1*num2
  /* рачуна величину бројева */
  m = max(size_base10(num1), size_base10(num2))
  m2 = m/2
  /* дели на пола секвенце цифара */
  high1, low1 = split_at(num1, m2)
  high2, low2 = split_at(num2, m2)
  /* 3 позива направи за отприлике половину величине бројева */
  z0 = karatsuba(low1,low2)
  z1 = karatsuba((low1+high1),(low2+high2))
  z2 = karatsuba(high1,high2)
  return (z2*10^(2*m2))+((z1-z2-z0)*10^(m2))+(z0)

Reference[uredi | uredi izvor]

  1. ^ Torbjörn Granlund and the GMP development team, The GNU Multiple Precision Arithmetic Library Manual, version 6.0.0, Free Software Foundation, Inc., March 2014.
  2. ^ [1][2] Arhivirano na sajtu Wayback Machine (13. mart 2016)

Spoljašnje veze[uredi | uredi izvor]