~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 464B18BC775678BFA3233140FAD49F38__1702627020 ✰
Заголовок документа оригинал.:
✰ Karatsuba algorithm - Wikipedia ✰
Заголовок документа перевод.:
✰ Алгоритм Карацубы — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Karatsuba_algorithm ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/46/38/464b18bc775678bfa3233140fad49f38.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/46/38/464b18bc775678bfa3233140fad49f38__translat.html ✰
Дата и время сохранения документа:
✰ 09.06.2024 02:53:31 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 15 December 2023, at 10:57 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

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

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

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

Алгоритм Карацубы — это быстрый алгоритм умножения . Он был открыт Анатолием Карацубой в 1960 году и опубликован в 1962 году. [1] [2] [3] Это алгоритм «разделяй и властвуй» , который сводит умножение двух n -значных чисел к трем умножениям n /2-значных чисел и, повторяя это сокращение, не более чем к трем умножениям n/2-значных чисел. однозначное умножение. Следовательно, он асимптотически быстрее, чем традиционный алгоритм, который выполняет однозначные продукты.

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

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

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

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

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

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

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

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

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

где

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

Таким образом, для вычисления требуется всего три умножения. и

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

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

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

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

z2 = = 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 м ) 2 + z 1 · ( Б м ) 1 + z 0 · ( Б м ) 0 , то есть
результат = 72 · 1000 2 + 11538 · 1000 + 272205 = 83810205 .

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

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

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

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

временной Анализ сложности

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

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

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

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

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

Реализация [ править ]

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

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

функция   карацуба  (  num1  ,   num2  ) 
     if   (  num1   <   10   или   num2   <   10  ) 
         возвращает   num1   ×   num2   /* возврат к традиционному умножению */ 
    
     /* Вычисляет размер чисел.   */ 
     m   =   max  (  size_base10  (  num1  ),   size_base10  (  num2  )) 
     m2   =   Floor  (  m   /   2  )  
     /* m2 = ceil (m / 2) также будет работать */ 
    
     /* Разделение последовательности цифр посередине.   */ 
     high1  ,   low1   =   Split_at  (  num1  ,   m2  ) 
     high2  ,   low2   =   Split_at  (  num2  ,   m2  ) 
    
     /* 3 рекурсивных вызова выполняются для чисел примерно вдвое меньшего размера.   */ 
     z0   =   карацуба  (  low1  ,   low2  ) 
     z1   =   карацуба  (  low1   +   high1  ,   low2   +   high2  ) 
     z2   =   карацуба  (  high1  ,   high2  ) 
    
     return   (  z2   ×   10   ^   (  m2   ×   2  ))   +   ((  z1   -   z2   -   z0  )   ×   10   ^   м2  )   +   z0 

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

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

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

  1. ^ А. Карацуба и Ю. Офман (1962). «Умножение многозначных чисел на автоматических вычислительных машинах» . Известия Академии наук СССР . 145 : 293–294. Перевод в академическом журнале «Физика-Доклады» , 7 (1963), стр. 595–596. {{cite journal}}: CS1 maint: постскриптум ( ссылка )
  2. ^ Перейти обратно: а б А.А. Карацуба (1995). «Сложность вычислений» (PDF) . Известия Математического института им. Стеклова . 211 : 169–183. Перевод из Труды Мат. Инст. Стеклова, 211, 186–202 (1995). {{cite journal}}: CS1 maint: постскриптум ( ссылка )
  3. ^ Кнут Д.Е. (1969) Искусство компьютерного программирования . т.2. Addison-Wesley Publ.Co., 724 стр.
  4. ^ Чарльз Бэббидж, Глава VIII - Об аналитической машине, обработка больших чисел, отрывки из жизни философа , Лонгман Грин, Лондон, 1864; стр. 125.
  5. ^ Вайс, Марк А. (2005). Структуры данных и алгоритмический анализ в C++ . Аддисон-Уэсли. п. 480. ИСБН  0321375319 .

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

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 464B18BC775678BFA3233140FAD49F38__1702627020
URL1:https://en.wikipedia.org/wiki/Karatsuba_algorithm
Заголовок, (Title) документа по адресу, URL1:
Karatsuba algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)