Множення Карацуби

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Множення Карацуби — метод швидкого множення, який дозволяє перемножувати два n-значних числа зі складністю обчислення:

M(n)=O(nlog23),log231,5849

Цей підхід відкрив новий напрямок в обчислювальній математиці[1][2].

Історія

Проблема оцінки кількості бітових операцій, необхідних для обчислення добутку двох n-значних чисел, або Шаблон:Джерело?.

Множення двох n-значних цілих чисел звичайним (шкільним) методом «у стовпчик» зводиться, по суті, до додавання n n-значних чисел. Тому для складності цього «шкільного» або «наївного» методу є оцінка зверху:

M(n)=O(n2).

У 1956 р. А. М. Колмогоров сформулював гіпотезу, що нижня оцінка для M(n) при будь-якому методі множення є також величина порядку n2 (так звана «гіпотеза n2» Колмогорова). На правдоподібність гіпотези n2 вказував той факт, що метод множення «в стовпчик» відомий не менше чотирьох тисячоліть (наприклад, цим методом користувалися шумери), і якби існував швидший метод, то його, імовірно, уже б знайшли. Однак, 1960 року Анатолій Карацуба[3][4][5][6] знайшов новий метод множення двох n-значних чисел з оцінкою складності

M(n)=O(nlog23)

і тим самим спростував «гіпотезу n2».

Згодом метод Карацуби узагальнили до парадигми «розділяй і володарюй», іншими важливими прикладами якої є метод двійкового розбиття, двійковий пошук, метод бісекції тощо.

Нижче подано два варіанти множення Карацуби.

Опис методу

Перший варіант

Цей варіант заснований на формулі

(a+bx)2=a2+((a+b)2a2b2)x+b2x2.

Оскільки 4ab=(a+b)2(ab)2, то множення двох чисел a і b еквівалентне за складністю піднесенню до квадрата.

Нехай X є n-значним числом, тобто

X=e0+2e1++2n1en1,

де ej0,1,j=0,1,,n1.

Будемо вважати для простоти, що n=2m,m1;n=2k. Представляючи X у вигляді

X=X1+2kX2,

де

X1=e0+2e1++2k1ek1

і

X2=ek+2ek+1++2k1en1,

знаходимо:

X2=(X1+2kX2)2=X12+((X1+X2)2(X12+X22))2k+X222n.(1)

Числа X1іX2 є k-значними. Число X1+X2 може мати k+1 знаків. У цьому випадку представимо його у вигляді 2X3+X4, де X3 є k-значне число, X4 — однозначне число. Тоді

(X1+X2)2=4X32+4X3X4+X42.

Позначимо φ(n) - кількість операцій, достатня для піднесення n-значного числа в квадрат за формулою (1). З (1) випливає, що для φ(n) справедлива нерівність:

φ(n)3φ(n21)+cn,(2)

де c>0 є абсолютна константа. Справді, права частина (1) містить суму трьох квадратів k-значних чисел, k=n21, які для свого обчислення потребують 3φ(m)=3φ(n21) операцій. Усі інші обчислення в правій частині (1) (а саме: множення на 4,2k,2n, п'ять додавань і одне віднімання) не більше ніж 2n-значних чисел вимагають по порядку не більше n операцій. Звідси випливає (2). Застосовуючи (2) послідовно до

φ(n21),φ(n22),,φ(n2m+1)

і беручи до уваги, що

φ(n2m)=φ(1)=1,

отримуємо

φ(n)3(3φ(n22)+cn21)+cn=32φ(n22)+3c(n21)+cn
3mφ(n2m)+3m1c(n2m+1)+3m2c(n2m+2)++3c(n21)+cn=
=3m+cn((32)m1+(32)m2++(32)+1)=
=3m+2cn((32)m1)<3m(2c+1)=(2c+1)nlog23.

Таким чином для кількості φ(n) операцій, достатнього для зведення n-значного числа в квадрат за формулою (1) виконується оцінка:

φ(n)<(2c+1)nlog23,log23=1,5849

Якщо ж n не є ступенем двох, то визначаючи ціле число m нерівностями 2m1<n2m, представимо X як 2m-значне число, тобто вважаємо останні 2mn знаків рівними нулю:

En==e2m1=0.

Усі інші міркування залишаються в силі і для φ(n) виходить така ж верхня оцінка за порядком величини n.

Другий варіант

Це безпосереднє множення двох n-значних чисел, засноване на формулі

(a+bx)(c+dx)=ac+((a+b)(c+d)acbd)x+bdx2.

Нехай, як і раніше n=2m, n=2k, A і B - два n-значних числа. Представляючи A і B у вигляді

A=A1+2kA2,B=B1+2kB2,

де A1,A2,B1,B2k-значні числа, знаходимо:

AB=A1B1+2k((A1+A2)(B1+B2)(A1B1+A2B2))+2nA2B2.(3)

Таким чином, у цьому випадку формула (1) замінюється формулою (3). Якщо тепер позначити символом φ(n) кількість операцій, достатню для множення двох n-значних чисел за формулою (3), то для φ(n) виконується нерівність (2), і, отже, справедливою є нерівність:

φ(n)<(2c+1)nlog23,log23=1,5849

Приклад

Множимо 648*356. Візьмемо B=100.

Перший множник подамо як 6*100 + 48.
Другий множник подамо як 3*100 + 56.
За формулою Карацуби:
x*y = (x1*B + x0)*(y1*B + y0) = x1*y1*B2 + Z1*B + x0*y0,
де Z1 = (x1 + x0)*(y1 + y0) − x1*y1 − x0*y0,
а добутки x1*y1 та x0*y0 обчислюють лише один раз.
Маємо: 648*356=(6*100+48)*(3*100+56)=6*3*1002 + Z1*100 + 48*56.
Обчислюємо 6*3 =18; 48*56 = 2688;
Шаблон:Nobr.

У цілому:
Шаблон:Nobr.

  • Для множення пар чисел 54*59 та 48*56, можна застосувати формулу Карацуби рекурсивно, поклавши B=10.
  • Оскільки ЕОМ оперують двійковими числами, то для машинних розрахунків варто обрати B=2k.

Зауваження

Представлений вище перший спосіб множення можна трактувати як алгоритм обчислення з точністю до n знаків функції y=x2 в деякій точці x=x1.

Якщо розбивати X не на два, а на більшу кількість доданків, то можна отримати асимптотично кращі оцінки складності обчислення добутку (піднесення до квадрату). Зокрема, такий шлях застосовано в Шаблон:Нп.

Метод множення Шьонхаге — Штрассена має меншу асимптотичну складність, ніж алгоритм Карацуби, однак на практиці він має перевагу лише для великих значень n.

Примітки

Шаблон:Примітки

Посилання

Шаблон:Алгоритми теорії чисел