Алгоритм Карацубы: умножение длинных чисел быстрее столбика

Когда мы умножаем два -значных числа в столбик, мы фактически делаем однозначных умножений и столько же сложений с переносами. Сложность - , и в 1956 году Колмогоров на семинаре заявил, что эту оценку улучшить нельзя. Через четыре года 23-летний студент Анатолий Карацуба придумал, как обойтись меньшим числом операций - и опустил оценку до . Это первое в истории улучшение «школьной» сложности умножения и отправная точка для всех современных быстрых алгоритмов длинной арифметики.
Идея уменьшить четыре умножения до трёх
Возьмём два -значных числа и (для простоты - степень двойки). Разрежем каждое пополам:
где , а - числа длиной примерно цифр. Если раскрыть скобки в произведении по-школьному, получится
Здесь честно четыре умножения -значных чисел: , , , . Подставив это в рекуррентное соотношение, мы получим всё ту же - никакого ускорения, потому что четыре подзадачи в два раза меньше дают ровно ту же работу.
Трюк Карацубы - заметить, что средний коэффициент можно достать из одного дополнительного произведения, а не из двух. Считаем:
Раскроем последнее выражение: , и после вычитания и остаётся ровно - то, что нам и нужно. Итоговая формула:
Три умножения -значных чисел вместо четырёх. Сложения и вычитания остаются - но их вклад линейный и в асимптотике задавлен умножениями.
Чтобы прогнать схему руками на длинных числах, проще не считать, а посмотреть на пошаговую трассировку - введите два многозначных числа ниже, и чат покажет разбиение, три подпроизведения и сборку ответа на двух уровнях рекурсии.
Рекурсивная схема и сложность
Каждое из трёх подпроизведений снова умножается алгоритмом Карацубы - это и есть рекурсия. На каждом уровне мы тратим линейное по время на сложения, вычитания и сдвиги. Получаем рекуррентное соотношение:
По мастер-теореме (случай , , , ) ответ:
Для сравнения: школьное умножение - . На числах в 1000 цифр школьный метод сделает порядка умножений, Карацуба - , то есть в 18 раз меньше. На 10000 цифр разрыв уже 180-кратный.
Мастер-теорема работает потому, что линейная стоимость "склейки" растёт медленнее, чем геометрическая прогрессия с фактором 3 в рекурсии. Если бы вместо $O(n)$ на склейке было $O(n^{1.585})$, ускорения бы не было.
Подробный пример
Умножим и методом Карацубы. Здесь , , основание .
Шаг 1. Разбиваем.
Шаг 2. Три подпроизведения.
- Для сначала суммы: Тогда и
Шаг 3. Собираем.
Считаем: Проверка школьным методом: - совпало.
На таком маленьком примере Карацуба, конечно, проигрывает столбику: разбиение и три умножения двузначных стоят дороже, чем 16 однозначных. Выигрыш появляется на больших , и каждое из трёх , в свою очередь, считается рекурсивно - пока числа не станут достаточно короткими.
Когда Карацуба выгоднее школьного
Асимптотика - это про предел. На практике у Карацубы есть порог переключения: на коротких числах накладные расходы (разбиение, три суммы, две вычитания, сдвиги) перевешивают экономию на одном умножении. Реальные библиотеки переключаются на школьный метод, когда длина операндов опускается ниже порога:
- GMP - порог около 20-30 «лимбов» (по 64 бита, то есть примерно 40-60 десятичных цифр).
- Python (CPython) - Карацуба включается с длины около 70 десятичных цифр.
- Java BigInteger - порог
KARATSUBA_THRESHOLD = 80(в 32-битных «цифрах»).
Точный порог зависит от архитектуры процессора, размера кэша и качества реализации школьного умножения. Если вы пишете свой длинную арифметику ради учебной задачи - не гонитесь за асимптотикой на 8-значных числах, Карацуба здесь медленнее.
Развитие идеи: Toom-Cook, Шёнхаге-Штрассен, Фюрер
Карацуба разбил число на 2 части и обошёлся 3 умножениями вместо 4. Логичный следующий шаг - разбить на больше частей. Это и есть семейство алгоритмов Toom-Cook (Тоом-Кук, 1963):
- Toom-3 делит число на 3 части, делает 5 умножений вместо 9, даёт
- Toom-4 - 7 умножений вместо 16,
Чем больше частей, тем лучше асимптотика, но тем больше констант на склейке и хуже численная устойчивость. На очень длинных числах побеждают алгоритмы, основанные на быстром преобразовании Фурье:
- Шёнхаге-Штрассен (1971) - , переход в кольцо целых по модулю числа Ферма и FFT.
- Алгоритм Фюрера (2007) - , ещё немного быстрее.
- Харви-ван дер Хувен (2019) - рекордные , достигнут теоретический минимум для умножения через FFT.
В реальных библиотеках это всё каскадом: на коротких числах - школьный метод, дальше Карацуба, дальше Toom-3/4, для гигантских чисел - Шёнхаге-Штрассен.
Где встречается
- Big-number библиотеки. GMP (GNU Multiple Precision), Python
int, JavaBigInteger, .NETBigInteger, Boost.Multiprecision - все используют Карацубу как промежуточную стадию. - Криптография. RSA, ECC, постквантовые схемы работают с числами в сотни-тысячи бит - там Карацуба и Toom-Cook ускоряют шифрование и подписи. В реализациях типа OpenSSL и mbedTLS они стандартно включены.
- Символьная математика. Mathematica, SymPy, Maple - длинные коэффициенты многочленов, факториалы, числа Бернулли.
- Конкурсное программирование. Когда задача требует умножения многочленов длины и больше - школьный метод не пройдёт по времени, а ручной Карацуба или FFT - пройдёт. В одном ряду с другими «обязательными» алгоритмами с нетривиальной асимптотикой - алгоритмом Кнута-Морриса-Пратта для строк и алгоритмом Кадане для подмассивов.
Частые ошибки
- Считают как новое разбиение пополам - нет, эти суммы могут оказаться на цифру длиннее , и их умножение запускает рекурсию на чуть больших аргументах. Аккуратные реализации это учитывают.
- Применяют Карацубу к коротким числам. На 4-8 цифрах столбик быстрее. Без порога переключения вы получите программу, которая на коротких числах медленнее наивной.
- Путают с . (показатель сложности), а - обратная величина, никак не связана.
- Думают, что три умножения работают только в системе по основанию 10. Нет, разбиение делается по любой степени основания - в реальных реализациях это или .
FAQ
Чем алгоритм Карацубы отличается от FFT-умножения? Карацуба - это «разделяй и властвуй» с тремя подзадачами, FFT - это перевод чисел в спектральную область, поточечное произведение и обратное преобразование. FFT асимптотически быстрее ( против ), но проигрывает по константам на числах короче нескольких тысяч цифр.
Можно ли применять Карацубу к умножению многочленов? Да, и это даже более естественно: многочлен - это последовательность коэффициентов, разбиение пополам и три подпроизведения работают там без переносов и сдвигов по основанию. Рекуррентность и сложность те же.
Кто такой Анатолий Карацуба? Советский математик (1937-2008), автор алгоритма в 23 года, специалист по аналитической теории чисел. Алгоритм впервые опубликован в 1962 году в «Докладах АН СССР» вместе с Юрием Офманом.
Коротко
Алгоритм Карацубы умножает два -значных числа за вместо школьных . Идея - разбить числа пополам и обойтись тремя умножениями половин вместо четырёх через тождество . Используется в bignum-библиотеках и криптографии на числах длиной от нескольких десятков цифр; для совсем гигантских чисел уступает место Toom-Cook и FFT-методам.
Читайте также

Алгоритм Прима - как построить остовное дерево по шагам
Разбираем, как алгоритм Прима шаг за шагом строит минимальное остовное дерево графа: идея жадного выбора, лемма о разрезе и трассировка на конкретном примере.

Алгоритм Эдмондса-Карпа: поиск максимального потока
Алгоритм Эдмондса-Карпа находит максимальный поток в сети: BFS ищет дополняющий путь, что даёт полиномиальную сложность. Разбираем идею, реализацию и оценку.

Алгоритм Куна: как найти максимальное паросочетание
Алгоритм Куна шаг за шагом: ищем увеличивающие цепи обычным DFS и находим максимальное паросочетание в двудольном графе за O(V·E), с разбором идеи и сложности.