Карта → событие

Москва 1960

Карацуба: быстрее, чем учили в школе

Искусство счёта Дискретная математика

Гипотеза $n^2$

Осенью 1960 года Андрей Николаевич КолмогоровАндрей Николаевич Колмогороврусский и советский математик · 1903–1987Дал вероятности аксиомы, турбулентности — закон, сложности — определение, а школьной математике в СССР — программу, по которой учились миллионы. вёл на механико-математическом факультете МГУ семинар по математической логике и кибернетике. Его занимал вопрос, который тогда почти никто не считал вопросом: сколько операций нужно, чтобы перемножить два числа?

Способ «в столбик», которому учат в школе и который в неизменном виде дошёл до нас от аль-Хорезми, требует умножить каждую цифру на каждую — это $n^{2}$ операций для $n$-значных чисел. Колмогоров высказал гипотезу, что лучше нельзя: любой алгоритм умножения требует порядка $n^{2}$ операций.

Гипотеза выглядела очевидной. Чтобы получить результат, надо ведь так или иначе учесть все $n^{2}$ пар цифр.

Неделя

Анатолий Алексеевич Карацуба
Анатолий Алексеевич КарацубаAliceNovak · CC BY-SA 3.0

Через неделю студент пятого курса Анатолий Карацуба принёс на семинар алгоритм, работающий быстрее.

Идея занимает три строки. Разрежем каждое число пополам:

$$x = x_1 B^{m} + x_0,\qquad y = y_1 B^{m} + y_0,$$

где $B$ — основание, $m$ — половина длины. Обычное перемножение

$$xy = x_1y_1 B^{2m} + (x_1y_0 + x_0y_1)B^{m} + x_0y_0$$

требует четырёх умножений половинок. Карацуба заметил, что достаточно трёх:

$$z_2 = x_1y_1,\qquad z_0 = x_0y_0,\qquad z_1 = (x_1+x_0)(y_1+y_0) - z_2 - z_0 .$$

Раскроем скобки в $z_1$: $(x_1+x_0)(y_1+y_0) = x_1y_1 + x_1y_0 + x_0y_1 + x_0y_0$, и после вычитания $z_2$ и $z_0$ остаётся ровно $x_1y_0 + x_0y_1$ — то, что нужно. Одно умножение заменено двумя сложениями и двумя вычитаниями, а сложение стоит несравненно дешевле.

Посмотрим на числах: $1234\times5678$. Берём $B=100$, $m=1$; $x_1=12$, $x_0=34$, $y_1=56$, $y_0=78$.

$$z_2 = 12\cdot56 = 672,\qquad z_0 = 34\cdot78 = 2652,$$
$$z_1 = (12+34)(56+78) - 672 - 2652 = 46\cdot134 - 3324 = 6164 - 3324 = 2840 .$$

Собираем: $672\cdot10^{4} + 2840\cdot10^{2} + 2652 = 6\,720\,000 + 284\,000 + 2652 = 7\,006\,652$. Верно.

Оценка

Пусть $T(n)$ — число операций. Применяя приём рекурсивно, получаем

$$T(n) = 3\,T(n/2) + O(n).$$

Разрежем оба числа пополам
$x=x_1B^{m}+x_0,\ \ y=y_1B^{m}+y_0$
В лоб нужно четыре умножения половинок:
$x_1y_1,\ \ x_1y_0,\ \ x_0y_1,\ \ x_0y_0$
Карацуба заметил, что хватает трёх:
$z_2=x_1y_1,\ \ z_0=x_0y_0$
$z_1=(x_1{+}x_0)(y_1{+}y_0)-z_2-z_0$
Среднее слагаемое получено вычитанием — а сложениестоит несравнимо дешевле умножения.Сколько умножений цифрnв столбикпо Карацубе644 09672925665 5366 5611 0241 048 57659 0494 09616 777 216531 441
$T(n)=3T(n/2)=O(n^{\log_2 3})$
показатель log₂3 = 1,58496Колмогоров предполагал, что быстрее, чем за n², умножать нельзя. Опровержение заняло неделю —и с него началась привычка спрашивать, сколько стоит вычисление
Три умножения вместо четырёх — и во что это обходится при росте числа цифрMathLocus · построено для этого сайта

Три задачи вдвое меньшего размера плюс линейная работа на сложения. Разворачивая рекуррентность, получаем

$$T(n) = O\!\left(n^{\log_2 3}\right) = O\!\left(n^{1{,}585\ldots}\right).$$

Показатель $\log_2 3$ появляется потому, что на каждом уровне рекурсии задач становится втрое больше, а размер уменьшается вдвое. Для тысячезначных чисел это разница между миллионом операций и пятьюдесятью шестью тысячами — почти в двадцать раз.

Гипотеза Колмогорова была опровергнута.

Статью написал Колмогоров

Дальше произошло то, что стоит рассказать отдельно, потому что так почти никогда не бывает.

Колмогоров, узнав результат, сам написал статью и сам отправил её в «Доклады Академии наук» — от имени учеников. Работа вышла в 1962 году: А. А. Карацуба, Ю. П. Офман, «Умножение многозначных чисел на автоматах», ДАН СССР, том 145, две страницы. Юрий Офман был вторым участником семинара, получившим смежный результат — о глубине схем, — и Колмогоров объединил обе заметки в одну публикацию.

Сам Карацуба узнал о выходе статьи, когда получил оттиск. Он потом писал об этом спокойно и без обиды: научный руководитель распорядился результатом так, как считал правильным.

Ещё одна подробность, которая ставит всё на место: Карацуба был теоретико-числовиком. Его настоящая работа — метод тригонометрических сумм, оценки характерных сумм, теория дзета-функции РиманаБернхард Риманнемецкий математик · 1826–1866Прожил тридцать девять лет и оставил около десяти работ — из которых выросли современная геометрия, теория функций комплексного переменного и главная нерешённая задача математики.; этому он посвятил сорок лет в Математическом институте имени Стеклова. Алгоритм умножения он считал пустяком, потраченной неделей. Это самый цитируемый его результат.

Что было дальше

Приём оказался началом целого направления — «разделяй и властвуй» с экономией умножений.

Параллельно тот же вопрос был задан про матрицы, и ответ оказался таким же: Штрассен в 1969 году показал, что перемножить две матрицы $2\times2$ можно семью умножениями вместо восьми — и школьный алгоритм снова оказался неоптимальным.

Почему это важнее, чем кажется

До 1960 года вопроса «сколько стоит вычисление» в математике по существу не было. Считалось, что задача либо решается, либо нет; способ — дело техники.

Карацуба показал, что способ — это содержание. Если самый очевидный алгоритм для самой простой операции оказался не лучшим, то и про всё остальное надо спрашивать заново. Через одиннадцать лет из этого вопроса вырастет теория сложности и самая знаменитая открытая задача современности.

Задача. Сколько умножений однозначных чисел потребует школьный способ и способ Карацубы для двух восьмизначных чисел?
(Ответ: в столбик — $8^{2}=64$. У Карацубы рекурсия делит длину пополам трижды: $8\to4\to2\to1$, и на каждом шаге число подзадач умножается на три, то есть $3^{3}=27$. Выигрыш уже здесь больше чем вдвое, а с ростом длины он растёт неограниченно.)

Соседние точки: аль-Хорезми (столбик) → Карацуба (1960) → БПФ (1965) → Штрассен (1969).

Открыть на карте