Usuari:Aniolgarcia/Algorisme de Karatsuba

De la Viquipèdia, l'enciclopèdia lliure

L'algorisme de Karatsuba és un procediment per multiplicar nombres grans de manera eficient, que va ser descobert per Anatoly Alexeevitch Karatsuba el 1960 i publicat per primer cop el 1962.[1][2][3] L'algorisme aconsegueix reduir la multiplicació de dos nombres de dígits a com a màxim multiplicacions d'un sol dígit (i a exactament multiplicacions quan és potència de 2). És, per tant, més ràpid que l'algorisme clàssic de multiplicació, que requereix productes d'un sol dígit. Per exemple, l'algorisme de Karatsuba necessita multiplicacions d'un sol dígit per tal de multiplicar dos nombres de dígits, mentre que l'algorisme clàssic n'utilitzaria .

L'algorisme de Karatsuba va ser el primer algorisme de multiplicació asimptòticament més ràpid que l'algorisme clàssic de multiplicació, que és de complexitat quadràtica. L'algorisme de Toom-Cook és una generalització més ràpida del de Karatsuba i, per a un suficientment gran, l'algorisme de Schönhage-Strassen és fins i tot més ràpid que l'algorisme de Karatsuba.

Història[modifica]

El procediment estàndard per multiplicar dos nombres de n dígits requereix un nombre d'operacions elementals proporcional a o en la Notació O gran. El 1952, Andrey Kolmogorov va intentar demostrar que l'algorisme clàssic era òptim asimptòticament, volent demostrar així que qualsevol algorisme per a aquesta tasca requeriria operacions elementals.

A la tardor de 1960, Kolmogorov va organitzar un seminari sobre problemes matemàtics de cibernètica a la Universitat Estatal de Moscou, on va plantejar la seva suposició de i altres problemes de complexitat computacional. En una setmana, Karatsuba, un estudiant de 25 anys, va trobar un algorisme de tipus "divideix i venceràs" que multiplicava dos nombres de n dígits en operacions elementals, refutant així la suposició inicial de Kolmogorov. Kolmogorov es va sentir molt desil·lusionat per tal descobriment, i ho va fer públic en la seva següent i última trobada del seminari.

El mètode va ser publicat l'any 1962, a la revista científica soviètica Proceedings of the USSR Academy of Sciences. L'article havia estat escrit per Kolmogorov, possiblement en col·laboració amb Yuri Ofman, però nomenava a "A. Karatsuba i Yu. Ofman" com els autors. Karatsuba només es va adonar de la publicació quan va rebre una còpia de l'article per part de l'editorial de la revista.

Algorisme[modifica]

El pas bàsic[modifica]

El pas bàsic de l'algorisme de Karatsuba consisteix en una fòrmula que permet calcular el producte de dos nombres grans i usant tres multiplicacions de nombres més petits, cadascun amb més o menys la meitat dels dígits de o , més algunes sumes i desplaçaments de dígits.

Suposem que i estan representats com a cadenes de dígits en alguna base . Per a qualsevol enter positiu menor que , un pot dividir els dos nombres donats de la manera següent:

,

on i són menors que . El producte és, llavors:

,

on

Aquestes fòrmules requereixen quatre multiplicacions, i ja eren conegudes per Charles Babbage.[4] Karatsuba va observar que es pot calcular en tan sols tres multiplicacions, pel cost d'unes sumes addicionals. Si agafem i tal com abans, podem calcular

ja que

.

Una implementació més eficient de la multiplicació de Karatsuba és [5]

, on .

Exemple[modifica]

Suposem que volem calcular el producte de 1234 i 5678. Triem la base 10 () i . Aleshores tenim:

1234 = 12 × 102 + 34
5678 = 56 × 102 + 78

Només amb tres multiplicacions, que operen amb nombres més petits, serà possible calcular els tres resultats parcials:

z2 = 12 × 56 = 672
z0 = 34 × 78 = 2652
z1 = (12 + 34)(56 + 78) − z2− z0 = 46 × 134 − 672 − 2652 = 2840

Ara tan sols cal tornar a unir els resultats parcials desplaçats correctament:

resultat = z2×B2m + z1×Bm + z0, en aquest cas
resultat = z2 × 102x2 + z1 × 102 + z0
resultat = 672 × 10000 + 2840 × 100 + 2652 = 7006652

Aplicació recursiva[modifica]

Si és quatre o major que quatre, les tres multiplicacions en del pas bàsic de Karatsuba suposen operands amb menys de dígits. Per tant, aquests productes poden ser calculats per crides recursives de l'algorisme de Karatsuba. La recursivitat pot ser aplicada fins que els nombres siguin tan petits que poden (o han de) ser calculats directament.

Anàlisi d'eficiència[modifica]

El pas bàsic de Karatsuba funciona per a qualsevol base B i qualsevol m. Però pel teorema Master sabem que l'algorisme recursiu és més eficient quan m és igual a n/2, arrodonit per excés. En particular, si n és 2k, per a un enter k, i la recursivitat para només quan n és 1, llavors el nombre de multiplicacions d'un sol dígit és 3k, és a dir, nc on c = log23.

Com que es pot ampliar qualsevol entrada amb dígits zero fins que la seva longitud sigui una potència de 2, el nombre de multiplicacions elementals, per a qualsevol n, és com a màxim .

Com que les sumes, restes, i desplaçaments de dígits (multiplicacions per potències de B) en el pas bàsic de Karatsuba requereixen temps proporcionals a n, el seu cost es fa insignificant a mesura que creix n. Concretament, si t(n) denota el nombre total d'operacions elementals que l'algorisme realitza quan es multipliquen dos nombres de n dígits, llavors podem escriure:

per a algunes constants c i d. Per a aquesta relació de recurrència, pel teorema Master obtenim la cota superior asimptòtica .

Així, per a un n suficientment gran, l'algorisme de Karatsuba realitzarà menys desplaçaments i sumes d'un sol dígit que la multiplicació feta a mà, fins i tot quan el seu pas bàsic utilitzi més sumes i desplaçaments que la fórmula senzilla. No obstant això, per a valors petits que n, els desplaçaments i operacions de suma poden fer que l'algorisme sigui més lent que el mètode a mà. Tot depèn de la plataforma de l'ordinador i del context. Per norma general, Karatsuba sol ser més ràpid quan els factors són de l'ordre de 320-640 bits.[6]

Referències[modifica]

  1. A. Karatsuba and Yu. Ofman «Multiplication of Many-Digital Numbers by Automatic Computers». Proceedings of the USSR Academy of Sciences, vol. 145, 1962, pàg. 293–294.
  2. A. A. Karatsuba «The Complexity of Computations». Proceedings of the Steklov Institute of Mathematics, vol. 211, 1995, pàg. 169–183.
  3. Knuth D.E. (1969) The Art of Computer Programming. v.2. Addison-Wesley Publ.Co., 724 pp.
  4. Charles Babbage, Chapter VIII – Of the Analytical Engine, Larger Numbers Treated, Passages from the Life of a Philosopher, Longman Green, London, 1864; page 125.
  5. 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.
  6. [1][2]