Saltar al contenido principal

Karatsuba

El algoritmo de Karatsuba es un método rápido para multiplicar números grandes. Normalmente, multiplicar dos números de nn dígitos usando el método tradicional cuesta O(n2)O(n^2) operaciones. Karatsuba reduce esto a aproximadamente O(nlog23)O(n1.585)O(n^{\log_2 3}) \approx O(n^{1.585}), usando una técnica de divide y vencerás.

La idea clave es dividir los números en partes y multiplicarlas inteligentemente para reducir la cantidad de multiplicaciones necesarias.

Cómo funciona

Supongamos que queremos multiplicar dos números xx y yy, ambos con nn dígitos.

  1. Dividimos cada número en dos partes:

    x=a10m+bx = a \cdot 10^{m} + b y=c10m+dy = c \cdot 10^{m} + d

    donde:

    • aa y cc son las partes altas (los dígitos más significativos).
    • bb y dd son las partes bajas (los dígitos menos significativos).
    • mm es aproximadamente la mitad del número de dígitos.
  2. Multiplicamos tres combinaciones:

ac,bd,(a+b)(c+d)ac, \quad bd, \quad (a+b)(c+d)
  1. Calculamos la parte cruzada usando:
ad+bc=(a+b)(c+d)acbdad + bc = (a+b)(c+d) - ac - bd
  1. Combinamos los resultados:
xy=ac102m+(ad+bc)10m+bdx \cdot y = ac \cdot 10^{2m} + (ad + bc) \cdot 10^{m} + bd

Sólo usamos 3 multiplicaciones grandes en vez de 4.

Ejemplo sencillo

Multipliquemos x=12x = 12 y y=34y = 34 usando Karatsuba:

  1. Dividimos los números en partes:
x=12a=1,b=2x = 12 \Rightarrow a = 1, b = 2 y=34c=3,d=4y = 34 \Rightarrow c = 3, d = 4
  1. Multiplicamos las combinaciones:
ac=13=3ac = 1 \cdot 3 = 3 bd=24=8bd = 2 \cdot 4 = 8 (a+b)(c+d)=(1+2)(3+4)=37=21(a+b)(c+d) = (1+2)(3+4) = 3 \cdot 7 = 21
  1. Calculamos la parte cruzada:
ad+bc=2138=10ad + bc = 21 - 3 - 8 = 10
  1. Combinamos:
xy=ac100+(ad+bc)10+bdx \cdot y = ac \cdot 100 + (ad+bc) \cdot 10 + bd xy=3100+1010+8=300+100+8=408x \cdot y = 3 \cdot 100 + 10 \cdot 10 + 8 = 300 + 100 + 8 = 408

Y efectivamente, 1234=40812 \cdot 34 = 408.

Ejemplo más complejo

Perfecto, vamos a hacer un ejemplo de Karatsuba con los números:

x=146123,y=352120x = 146123, \quad y = 352120

Para simplificar, vamos a dividir los números en mitades iguales de 3 dígitos (ya que tienen 6 dígitos cada uno):

x=146123a=146,b=123x = 146123 \Rightarrow a = 146, \, b = 123 y=352120c=352,d=120y = 352120 \Rightarrow c = 352, \, d = 120

Paso 1: Multiplicaciones principales

  1. ac=146352ac = 146 \cdot 352 Para hacerlo más simple, lo calculamos:
146352=51392146 \cdot 352 = 51392
  1. bd=123120=14760bd = 123 \cdot 120 = 14760

  2. (a+b)(c+d)=(146+123)(352+120)=269472=126968(a+b)(c+d) = (146+123)(352+120) = 269 \cdot 472 = 126968

Paso 2: Calculamos la parte cruzada

ad+bc=(a+b)(c+d)acbdad + bc = (a+b)(c+d) - ac - bd ad+bc=1269685139214760=60816ad + bc = 126968 - 51392 - 14760 = 60816

Paso 3: Combinamos los resultados

xy=ac106+(ad+bc)103+bdx \cdot y = ac \cdot 10^{6} + (ad+bc) \cdot 10^{3} + bd
  • ac106=51392000000=51392000000ac \cdot 10^6 = 51392 \,000000 = 51\,392\,000\,000
  • (ad+bc)103=60816000=60816000(ad+bc) \cdot 10^3 = 60816\,000 = 60\,816\,000
  • bd=14760bd = 14760
xy=51392000000+60816000+14760=51452830760x \cdot y = 51\,392\,000\,000 + 60\,816\,000 + 14\,760 = 51\,452\,830\,760

Por lo tanto:

146123352120=51452830760146123 \cdot 352120 = 51\,452\,830\,760