Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Умножение по Карацубе на az + b и cz + d (в рамке), а также 1234 и 567. Пурпурные стрелки обозначают умножение, янтарный обозначает сложение, серебристый обозначает вычитание, а светло-голубой обозначает сдвиг влево. (A), (B) и (C) показывают рекурсию, используемую для получения промежуточных значений.

Алгоритм Карацуба является быстрым алгоритмом умножения . Он был открыт Анатолием Карацубой в 1960 году и опубликован в 1962 году. [1] [2] [3] Он сводит умножение двух n -значных чисел до не более чем однозначных умножений в целом (и именно тогда , когда n является степенью числа 2). Следовательно, он асимптотически быстрее, чем традиционный алгоритм, который требует однозначных произведений. Например, алгоритм Карацубы требует 3 10 = 59 049 однозначных умножений для умножения двух 1024-значных чисел ( n= 1024 = 2 10 ), тогда как традиционный алгоритм требует (2 10 ) 2 = 1048 576 (ускорение в 17,75 раза).

Алгоритм Карацубы был первым алгоритмом умножения, асимптотически более быстрым, чем квадратичный алгоритм «начальной школы». Алгоритм Тоого-Кук (1963) является более быстрым обобщением метода Карацубов, и алгоритм Шёнхага-Штрассен (1971) еще быстрее, при достаточно большом п .

История [ править ]

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

В 1960 году Колмогоров организовал семинар по математическим проблемам кибернетики в МГУ , где изложил гипотезу и другие проблемы сложности вычислений . В течение недели Карацуба, тогда еще 23-летний студент, нашел алгоритм (позже он был назван «разделяй и властвуй»), который умножает два n- значных числа наэлементарные шаги, тем самым опровергая гипотезу. Колмогоров был очень взволнован этим открытием; он сообщил об этом на следующем заседании семинара, которое затем было прекращено. Колмогоров прочитал несколько лекций по результату Карацубы на конференциях по всему миру (см., Например, «Труды Международного конгресса математиков 1962 г.», стр. 351–356, а также «6 лекций, прочитанных на Международном конгрессе математиков в г. Стокгольм, 1962 ») и опубликовал метод в 1962 году в Известиях АН СССР . Статья была написана Колмогоровым и содержала два результата по умножению, алгоритм Карацубы и отдельный результат Юрия Офмана.; в нем указаны «А. Карацуба и Ю. Офман». Карацуба узнал об этой газете только после того, как получил от издателя оттиски. [2]

Алгоритм [ править ]

Основной шаг [ править ]

Основным шагом алгоритма Карацубы является формула, которая позволяет вычислить произведение двух больших чисел и использовать три умножения меньших чисел, каждое из которых содержит примерно половину цифр, чем или , плюс некоторые сложения и сдвиги цифр. Этот базовый шаг, по сути, является обобщением аналогичного алгоритма комплексного умножения , где мнимая единица i заменяется степенью основания .

Пусть и будут представлены как -цифровые строки в некоторой базе . Для любого положительного целого числа меньше чем , можно записать два заданных числа как

где и меньше чем . Затем продукт

куда

Эти формулы требуют четырех умножений и были известны Чарльзу Бэббиджу . [4] Карацуба заметил, что можно вычислить всего за три умножения за счет нескольких дополнительных сложений. Как и раньше, можно заметить, что

Однако проблема, которая возникает при вычислении, заключается в том, что приведенное выше вычисление и может привести к переполнению (даст результат в диапазоне ), что требует множителя, имеющего один дополнительный бит. Этого можно избежать, отметив, что

Это вычисление и даст результат в диапазоне . Этот метод может выдавать отрицательные числа, для которых требуется один дополнительный бит для кодирования подписи, и все же потребуется один дополнительный бит для множителя. Однако один из способов избежать этого - записать знак, а затем использовать абсолютное значение и выполнить беззнаковое умножение, после чего результат может быть отменен, если оба знака изначально различались. Еще одно преимущество состоит в том, что, даже если оно может быть отрицательным, окончательное вычисление включает только добавления.

Пример [ править ]

Чтобы вычислить произведение 12345 и 6789, где B = 10, выберите m = 3. Мы используем m сдвигов вправо для разложения входных операндов с использованием полученной базы ( B m = 1000 ), как:

12345 = 12 · 1000 + 345
6789 = 6 · 1000 + 789

Только три умножения, которые работают с меньшими целыми числами, используются для вычисления трех частичных результатов:

г 2 = 12 × 6 = 72
г 0 = 345 × 789 = 272205
z 1 = ( 12 + 345 ) × ( 6 + 789 ) - z 2 - z 0 = 357 × 795 - 72 - 272205 = 283815 - 72 - 272205 = 11538

Мы получаем результат, просто добавляя эти три частичных результата, сдвинутых соответствующим образом (и затем принимая во внимание, разлагая эти три ввода по базе 1000, как для входных операндов):

результат = z 2 · ( B m ) 2 + z 1 · ( B m ) 1 + z 0 · ( B m ) 0 , т.е.
результат = 72 · 1000 2 + 11538 · 1000 + 272205 = 83810205 .

Обратите внимание, что промежуточное третье умножение работает во входной области, которая меньше чем в два раза больше, чем для двух первых умножений, ее выходная область меньше, чем в четыре раза больше, и переносы по основанию 1000, вычисленные из первых двух умножений, должны быть приняты в учетную запись при вычислении этих двух вычитаний.

Рекурсивное приложение [ править ]

Если n равно четырем или более, три умножения на основном шаге Карацубы включают операнды с менее чем n цифрами. Следовательно, эти произведения могут быть вычислены рекурсивными вызовами алгоритма Карацубы. Рекурсия может применяться до тех пор, пока числа не станут настолько маленькими, что их можно (или нужно) вычислить напрямую.

Например, на компьютере с полным 32-битным умножителем на 32-битный можно выбрать B = 2 31 =2 147 483 648 и сохранить каждую цифру как отдельное 32-битное двоичное слово. Тогда для сумм x 1 + x 0 и y 1 + y 0 не потребуется дополнительное двоичное слово для хранения переходящей цифры (как в сумматоре с сохранением переноса ), и рекурсия Карацубы может применяться до тех пор, пока числа для умножения не станут только одна цифра.

Асимметричные формулы типа Карацубы [ править ]

Исходная формула Карацубы и другие обобщения сами по себе симметричны. Например, следующая формула вычисляет

с 6 умножениями в , где - поле Галуа с двумя элементами 0 и 1.

где и . Заметим, что сложение и вычитание одинаковы в полях характеристики 2.

Эта формула симметрична, а именно, она не меняется, если поменять местами и в и .

На основе второго обобщенных алгоритмов разделения , [5] Вентилятор и др. нашел следующую асимметричную формулу:

где и .

Он асимметричен, потому что мы можем получить следующую новую формулу, заменив и в и .

где и .

Анализ эффективности [ править ]

Основной шаг Карацубы работает для любой базы B и любого m , но рекурсивный алгоритм наиболее эффективен, когда m равно n / 2 с округлением в большую сторону . В частности, если n равно 2 k для некоторого целого числа k , и рекурсия останавливается только тогда, когда n равно 1, то количество однозначных умножений равно 3 k , то есть n c, где c = log 2 3.

Поскольку можно расширить любые входные данные нулевыми цифрами до тех пор, пока их длина не станет степенью двойки, отсюда следует, что количество элементарных умножений для любого n не больше .

Поскольку сложение, вычитание и сдвиг цифр (умножение на степень B ) в основном шаге Карацубы занимают время, пропорциональное n , их стоимость становится незначительной с увеличением n . Точнее, если t ( n ) обозначает общее количество элементарных операций, которые алгоритм выполняет при умножении двух n- значных чисел, то

для некоторых констант c и d . Для этого рекуррентного соотношения , то мастер теорема для разделяй и властвуй рецидивами дает асимптотику связанный .

Отсюда следует, что для достаточно большого n алгоритм Карацубы будет выполнять меньше сдвигов и однозначных сложений, чем обычное умножение, даже если его базовый шаг использует больше сложений и сдвигов, чем простая формула. Однако для малых значений n дополнительные операции сдвига и сложения могут сделать его медленнее, чем стандартный метод. Точка положительного возврата зависит от компьютерной платформы и контекста. Как показывает опыт, метод Карацубы обычно быстрее, когда множимые длиннее 320–640 бит. [6]

Псевдокод [ править ]

Вот псевдокод этого алгоритма с использованием чисел, представленных в десятичной системе координат. Для двоичного представления целых чисел достаточно заменить всюду 10 на 2. [7]

Второй аргумент функции split_at указывает количество цифр, которые нужно извлечь справа : например, split_at ("12345", 3) извлечет 3 последние цифры, давая: high = "12", low = "345".

Процедура  Карацуба ( num1 ,  пит2 ) ,  если  ( num1  <  10 )  или  ( пит2  <  10 )  возврата  num1  ×  пит2  / * Вычисляет размер чисел. * /  М  =  мин ( size_base10 ( num1 ),  size_base10 ( пит2 ))  м2  =  пол ( м  /  2 )  / * м2 = CEIL (м / 2) также будет работать * /  / * Разделить последовательность цифр посередине. * /  HIGH1 ,  LOW1  =  split_at ( num1 ,  м2 )  HIGH2 ,  Low2  =  split_at ( пит2 ,  м2 )  / * 3 вызова на номера примерно в два раза меньше. * /  z0  =  карацуба ( low1 ,  low2 )  z1  =  karatsuba (( low1  +  high1 ),  ( low2  +  high2 ))  z2  =  karatsuba ( high1 ,  high2 )  return  ( z2  ×  10  ^  ( m2  ×  2 ))  +  (( z1  -  z2  -  z0 )  ×  10  ^  m2 )  +  z0

Ссылки [ править ]

  1. ^ А. Карацуба и Ю. Офмана (1962). «Умножение многоцифровых чисел автоматами». Известия АН СССР . 145 : 293–294. Перевод в академическом журнале Физика-Доклады , 7 (1963), стр. 595–596.
  2. ^ а б А. А. Карацуба (1995). «Сложность вычислений» (PDF) . Труды Математического института им . В. А. Стеклова . 211 : 169–183. Перевод из Труды Матем. Inst. МИАН, 211, 186–202 (1995)
  3. ^ Knuth DE (1969) Искусство программирования . v.2. Addison-Wesley Publ.Co., 724 стр.
  4. Чарльз Бэббидж, Глава VIII - Об аналитической машине, Обработка больших чисел, Отрывки из жизни философа , Longman Green, Лондон, 1864; стр.125.
  5. ^ Хейнинг Вентилятор, Мин Гу, Jiaguang ВС, Квок-Ян Лам, «Получение Больше Карацуба-Like Формулы над бинарным полем», МТВ информация Vol безопасности. 6 No 1 с. 14-19, 2012.
  6. ^ "Умножение Карацуба" . www.cburch.com .
  7. Перейти ↑ Weiss, Mark A. (2005). Структуры данных и анализ алгоритмов в C ++ . Эддисон-Уэсли. п. 480. ISBN 0321375319.

Внешние ссылки [ править ]

  • Алгоритм Карацубы умножения многочленов
  • Вайсштейн, Эрик В. "Умножение Карацубы" . MathWorld .
  • Бернштейн, Д. Д., " Многозначное умножение для математиков ". Охватывает Карацубу и многие другие алгоритмы умножения.