Это не официальный сайт wikipedia.org 01.01.2023

Алгоритм Карацубы — Википедия

Алгоритм Карацубы

(перенаправлено с «Умножение Карацубы»)

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

T ( n ) = O ( n log 2 3 ) , log 2 3 = 1,584 9 .

Изобретён Анатолием Карацубой в 1960 году. Является исторически первым алгоритмом умножения, превосходящим тривиальный по асимптотической сложности[1][2][3][4].

ИсторияПравить

В 1960 году Андрей Колмогоров проводил семинар, посвящённый математическим задачам кибернетики. Одной из рассматриваемых на семинаре задач стало умножение двух n  -разрядных целых чисел. Основным известным методом умножения в то время было умножение «в столбик», которое при алгоритмической реализации требовало O ( n 2 )   элементарных операций (сложений или умножений одноразрядных чисел). Колмогоров выдвинул гипотезу, что умножение «в столбик» является оптимальным алгоритмом умножения двух чисел в том смысле, что время работы любого метода умножения не меньше n 2   по порядку величины. На правдоподобность «гипотезы n 2  » указывало то, что метод умножения «в столбик» известен не менее четырёх тысячелетий, и если бы был более быстрый метод умножения, то он, вероятно, уже был бы найден. Однако, через неделю 23-летний Анатолий Карацуба[5][6][7][8] предложил новый метод умножения двух n  -значных чисел с оценкой времени работы O ( n log 2 3 )   и тем самым опроверг «гипотезу n 2  ».

Метод Карацубы относится к алгоритмам вида «разделяй и властвуй», наравне с такими алгоритмами как двоичный поиск, быстрая сортировка и др. Формулы рекурсивного сведения, используемые в методе Карацубы, были известны ещё Чарльзу Бэббиджу, который, однако, не обратил внимания на возможность использования лишь трёх рекурсивных умножений вместо четырёх[9].

Описание методаПравить

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

Два n  -битовых числа можно представить в виде a x + b  , c x + d  , где x = 2 n / 2  ; a , b , c , d < 2 n / 2  .

Умножение на 2 n / 2   (битовый сдвиг) и сложение делаются за постоянное время O ( 1 )  . Поэтому задача умножения сводится к вычислению коэффициентов многочлена ( a x + b ) ( c x + d )  . Используя тождество

( a + b ) ( c + d ) = a c + ( a d + b c ) + b d   ,  

этот многочлен можно представить в виде

( a x + b ) ( c x + d ) = a c x 2 + ( a d + b c ) x + b d =  
= a c x 2 + ( ( a + b ) ( c + d ) a c b d ) x + b d   .  

В последнем выражении участвуют три произведения ( n 2 + 1 )  -значных чисел. Если вычислять каждое из них по той же схеме, получится алгоритм с рекуррентной оценкой времени работы

T ( n ) = 3 T ( n 2 ) + O ( n ) = O ( n log 2 3 )   .  

Для сравнения, аналогичный алгоритм, производящий отдельно все четыре умножения a c  , a d  , b c  , b d  , требовал бы обычного времени

T ( n ) = 4 T ( n 2 ) + O ( n ) = O ( n log 2 4 ) = O ( n 2 )   .  

ПримерыПравить

 
Графическая иллюстрация другого примера: умножения 1234 на 567 по алгоритму Карацубы. Сначала выполняются нижние шаги ( A ) ,   ( B ) ,   ( C )  , а потом их результаты подставляются в верхнюю схему.

Для удобства изложения будем использовать десятичную систему, то есть аргументы многочлена вида x = 10 k   вместо x = 2 k  . Цветовая разметка цифр не связана с предыдущим разделом, а обозначает лишь, из какого числа вычленяется та или иная часть.

Вычислим 1213 2311  :

  • заметим, что 12 + 13 = 25 ,   23 + 11 = 34   и вычислим 25 34  :
    • заметим, что 2 + 5 = 7 ,   3 + 4 = 7   и вычислим 7 7 = 49  
    • вычислим 2 3 = 6  
    • вычислим 5 4 = 20  
    • складывая результаты, получим, что 25 34 = 6 10 2 + ( 49 6 20 ) 10 + 20 = 850  
  • вычислим 12 23   как 12 23  :
    • заметим, что 1 + 2 = 3 ,   2 + 3 = 5   и вычислим 3 5 = 15  
    • вычислим 1 2 = 2  
    • вычислим 2 3 = 6  
    • складывая результаты, получим, что 12 23 = 2 10 2 + ( 15 2 6 ) 10 + 6 = 276  
  • вычислим 13 11   как 13 11  :
    • заметим, что 1 + 3 = 4 ,   1 + 1 = 2   и вычислим 4 2 = 8  
    • вычислим 1 1 = 1  
    • вычислим 3 1 = 3  
    • складывая результаты, получим, что 13 11 = 1 10 2 + ( 8 1 3 ) 10 + 3 = 143  
  • складывая результаты, получим, что 1213 2311 = 276 10 4 + ( 850 276 143 ) 10 2 + 143 = 2803243  

ПримечанияПравить

  1. На практике алгоритм становится эффективнее обычного умножения при умножении чисел длиной порядка сотен двоичных (десятков десятичных) разрядов, на числах меньшей длины алгоритм не даёт существенного преимущества из-за большего, чем в наивном алгоритме, числа требуемых сложений, вычитаний и сдвигов.
  2. С. А. Гриценко, Е. А. Карацуба, М. А. Королёв, И. С. Резвякова, Д. И. Толев, М. Е. Чанга. Научные достижения Анатолия Алексеевича Карацубы // Математика и информатика, 1, К 75-летию со дня рождения Анатолия Алексеевича Карацубы, Совр. пробл. матем., 16, МИАН, М., 2012, 7–30.
  3. Карацуба Е. А. Быстрые алгоритмы и метод БВЕ Архивная копия от 4 ноября 2012 на Wayback Machine, 2008.
  4. Алексеев В. Б. От метода Карацубы для быстрого умножения чисел к быстрым алгоритмам для дискретных функций // Тр. МИАН. — 1997. — Т. 218. — С. 20–27.
  5. Карацуба А., Офман Ю. Умножение многозначных чисел на автоматах // Доклады Академии Наук СССР. — 1962. — Т. 145, № 2.
  6. Karacuba A. Berechnungen und die Kompliziertheit von Beziehungen (нем.) // Elektronische Informationsverarbeitung und Kybernetik. — 1975. — Bd. 11.
  7. Карацуба А. А. Сложность вычислений // Тр. МИАН. — 1995. — Т. 211. — С. 186–202.
  8. Кнут Д. Искусство программирования. — 3-е изд. — М.: Вильямс, 2007. — Т. 2. Получисленные алгоритмы. — 832 с. — ISBN 0-201-89684-2.
  9. А. Шень. Gauss multiplication trick? (рус.) // Математическое Просвещение. — 2019. — Т. 24.

СсылкиПравить