Jump to content

Алгоритм умножения

(Перенаправлено из алгоритма Харви-Хувена )

Алгоритм умножения — это алгоритм (или метод) умножения двух чисел. В зависимости от размера чисел разные алгоритмы более эффективны, чем другие. Известно множество алгоритмов, и по этой теме было проведено много исследований.

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

В 1960 году Анатолий Карацуба открыл умножение Карацубы , положив начало потоку исследований алгоритмов быстрого умножения. Этот метод использует три умножения, а не четыре для умножения двух двузначных чисел. (Вариант этого метода также можно использовать для умножения комплексных чисел быстрого .) При рекурсивном выполнении временная сложность равна . Разделение чисел более чем на две части приводит к умножению Тума-Кука ; например, использование трех частей приводит к алгоритму Тоом-3 . Использование многих частей может привести к тому, что показатель степени будет сколь угодно близок к 1, но постоянный коэффициент также вырастет, что делает это непрактичным.

В 1968 году был открыт алгоритм Шёнхаге-Штрассена , который использует преобразование Фурье по модулю . Имеет временную сложность . В 2007 году Мартин Фюрер предложил алгоритм сложности . В 2014 году Харви, Йорис ван дер Хувен и Лесерф предложили сложную модель. , что делает неявную константу явной; это было улучшено до в 2018 году. Наконец, в 2019 году Харви и ван дер Хувен придумали алгоритм со сложностью . Это соответствует предположению Шенхаге и Штрассена о том, что это будет оптимальная граница, хотя сегодня это остается гипотезой .

Алгоритмы целочисленного умножения также можно использовать для умножения многочленов с помощью метода замены Кронекера .

Длинное умножение

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

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

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

В этом примере используется длинное умножение для умножения 23 958 233 (множимое) на 5 830 (множитель) и получается результат (произведение) 139 676 498 390.

      23958233
×         5830
———————————————
      00000000 ( =  23,958,233 ×     0)
     71874699  ( =  23,958,233 ×    30)
   191665864   ( =  23,958,233 ×   800)
+ 119791165    ( =  23,958,233 × 5,000)
———————————————
  139676498390 ( = 139,676,498,390)

Другие обозначения

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

В некоторых странах, таких как Германия , указанное выше умножение изображается аналогичным образом, но исходное произведение остается горизонтальным, а вычисления начинаются с первой цифры множителя: [1]

23958233 · 5830
———————————————
   119791165
    191665864
      71874699
       00000000 
———————————————
   139676498390

Ниже псевдокод описывает процесс вышеуказанного умножения. Он сохраняет только одну строку для хранения суммы, которая в конечном итоге становится результатом. Обратите внимание, что оператор «+=» используется для обозначения суммы существующего значения и операции сохранения (аналогично таким языкам, как Java и C) для компактности.

multiply(a[1..p], b[1..q], base)                            // Operands containing rightmost digits at index 1
  product = [1..p+q]                                        // Allocate space for result
  for b_i = 1 to q                                          // for all digits in b
    carry = 0
    for a_i = 1 to p                                        // for all digits in a
      product[a_i + b_i - 1] += carry + a[a_i] * b[b_i]
      carry = product[a_i + b_i - 1] / base
      product[a_i + b_i - 1] = product[a_i + b_i - 1] mod base
    product[b_i + p] = carry                               // last digit comes from final carry
  return product

Использование в компьютерах

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

Некоторые микросхемы реализуют длинное умножение аппаратно или в микрокоде для различных размеров целых чисел и слов с плавающей запятой. В арифметике произвольной точности обычно используется длинное умножение с базовым набором 2. В , где w — количество бит в слове, для умножения относительно небольших чисел. Чтобы перемножить два числа с n цифрами этим методом, нужно около n 2 операции. Более формально, умножение двух n- значных чисел с использованием длинного умножения требует Θ ( n 2 ) однозначные операции (сложение и умножение).

При программной реализации длинные алгоритмы умножения должны иметь дело с переполнением во время сложения, что может быть дорогостоящим. Типичное решение — представить число по небольшой базе b , например, 8 b — представимое машинное целое число. Затем можно выполнить несколько добавлений, прежде чем произойдет переполнение. Когда число становится слишком большим, мы добавляем его часть к результату или переносим и отображаем оставшуюся часть обратно в число, меньшее b . Этот процесс называется нормализацией . Ричард Брент использовал этот подход в своем пакете MP для Фортрана. [2]

Первоначально компьютеры использовали алгоритм, очень похожий на длинное умножение по основанию 2, но современные процессоры оптимизировали схему для быстрого умножения с использованием более эффективных алгоритмов ценой более сложной аппаратной реализации. [ нужна ссылка ] В системе счисления два длинные умножения иногда называют «сдвигом и сложением» , поскольку алгоритм упрощается и состоит всего лишь из сдвига влево (умножения на степени двойки) и сложения. Большинство доступных в настоящее время микропроцессоров реализуют этот или другие подобные алгоритмы (например, кодирование Бута ) для различных целых чисел и размеров с плавающей запятой в аппаратных множителях или в микрокоде . [ нужна ссылка ]

На доступных в настоящее время процессорах команда побитового сдвига обычно (но не всегда) быстрее, чем инструкция умножения, и может использоваться для умножения (сдвига влево) и деления (сдвига вправо) на степени двойки. Умножение на константу и деление на константу можно реализовать с помощью последовательности сдвигов и сложений или вычитаний. Например, есть несколько способов умножения на 10, используя только побитовый сдвиг и сложение.

 ((x << 2) + x) << 1 # Here 10*x is computed as (x*2^2 + x)*2
 (x << 3) + (x << 1) # Here 10*x is computed as x*2^3 + x*2

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

Алгоритмы умножения вручную

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

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

Сетчатый метод

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

Метод сетки (или метод коробки) — это вводный метод многозначного умножения, который часто преподается ученикам начальной или начальной школы . С конца 1990-х годов это стандартная часть национальной учебной программы по математике в начальной школе в Англии и Уэльсе. [3]

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

Например, расчет 34 × 13 можно выполнить с использованием сетки:

  300
   40
   90
 + 12
 ————
  442
× 30 4
10 300 40
3 90 12

с последующим сложением до получения 442 либо в одной сумме (см. справа), либо путем формирования построчных сумм (300 + 40) + (90 + 12) = 340 + 102 = 442.

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

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

Решётчатое умножение

[ редактировать ]
Сначала настройте сетку, отметив ее строки и столбцы числами, которые необходимо умножить. Затем заполните поля с цифрами десятков в верхних треугольниках и цифрами единиц внизу.
Наконец, просуммируйте по диагональным участкам и перенесите по мере необходимости, чтобы получить ответ.

Решётчатое или решетчатое умножение алгоритмически эквивалентно длинному умножению. Для этого требуется подготовить решетку (сетку, нарисованную на бумаге), которая будет служить ориентиром для вычислений и отделять все умножения от сложений . В Европе он был представлен в 1202 году в Фибоначчи » «Liber Abaci . Фибоначчи описал эту операцию как мысленную, используя правую и левую руки для выполнения промежуточных вычислений. Матракчи Насух ​​представил 6 различных вариантов этого метода в книге XVI века «Умдет-уль-Хисаб». Он широко использовался в школах Эндеруна по всей Османской империи. [4] Кости Непера или стержни Непьера также использовали этот метод, как было опубликовано Нейпиром в 1617 году, в год его смерти.

Как показано в примере, множимое и множитель записываются выше и справа от решетки или сита. Он встречается в «Арифметике» Мухаммада ибн Мусы аль-Хорезми , одном из источников Леонардо, упомянутом Сиглером, автором «Liber Abaci Фибоначчи», 2002. [ нужна ссылка ]

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

На рисунках справа показано, как вычислить 345 × 12 с помощью решеточного умножения. В качестве более сложного примера рассмотрим рисунок ниже, на котором показано вычисление 23 958 233, умноженного на 5 830 (множитель); результат — 139 676 498 390. Обратите внимание, что 23 958 233 находится в верхней части решетки, а 5 830 — в правой части. Продукты заполняют решетку, а сумма этих продуктов (по диагонали) находится вдоль левой и нижней сторон. Затем эти суммы суммируются, как показано.

     2   3   9   5   8   2   3   3
   +---+---+---+---+---+---+---+---+-
   |1 /|1 /|4 /|2 /|4 /|1 /|1 /|1 /|
   | / | / | / | / | / | / | / | / | 5
 01|/ 0|/ 5|/ 5|/ 5|/ 0|/ 0|/ 5|/ 5|
   +---+---+---+---+---+---+---+---+-
   |1 /|2 /|7 /|4 /|6 /|1 /|2 /|2 /|
   | / | / | / | / | / | / | / | / | 8
 02|/ 6|/ 4|/ 2|/ 0|/ 4|/ 6|/ 4|/ 4|
   +---+---+---+---+---+---+---+---+-
   |0 /|0 /|2 /|1 /|2 /|0 /|0 /|0 /|
   | / | / | / | / | / | / | / | / | 3
 17|/ 6|/ 9|/ 7|/ 5|/ 4|/ 6|/ 9|/ 9|
   +---+---+---+---+---+---+---+---+-
   |0 /|0 /|0 /|0 /|0 /|0 /|0 /|0 /|
   | / | / | / | / | / | / | / | / | 0
 24|/ 0|/ 0|/ 0|/ 0|/ 0|/ 0|/ 0|/ 0|
   +---+---+---+---+---+---+---+---+-
     26  15  13  18  17  13  09  00
 01
 002
 0017
 00024
 000026
 0000015
 00000013
 000000018
 0000000017
 00000000013
 000000000009
 0000000000000
 —————————————
  139676498390
= 139,676,498,390

Русское крестьянское умножение

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

Бинарный метод также известен как крестьянское умножение, поскольку он широко использовался людьми, которые относятся к крестьянам и поэтому не запомнили таблицы умножения, необходимые для длительного умножения. [5] [ не удалось пройти проверку ] Алгоритм использовался в Древнем Египте. [6] Его основные преимущества заключаются в том, что ему можно быстро научиться, он не требует запоминания и может выполняться с использованием жетонов, таких как покерные фишки , если бумага и карандаш недоступны. Недостатком является то, что оно требует больше шагов, чем длинное умножение, поэтому для больших чисел оно может оказаться громоздким.

Описание

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

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

В этом примере крестьянское умножение используется для умножения 11 на 3 и получения результата 33.

Decimal:     Binary:
11   3       1011  11
5    6       101  110
2   12       10  1100
1   24       1  11000
    ——         ——————
    33         100001

Подробное описание шагов:

  • 11 и 3 написаны вверху.
  • 11 уменьшается вдвое (5,5), а 3 удваивается (6). Дробная часть отбрасывается (5,5 становится 5).
  • 5 уменьшается вдвое (2,5), а 6 удваивается (12). Дробная часть отбрасывается (2,5 становится 2). Цифра в левом столбце (2) четная , поэтому цифра в правом столбце (12) отбрасывается.
  • 2 делится пополам (1), а 12 удваивается (24).
  • Все невычеркнутые значения суммируются: 3+6+24=33.

Этот метод работает, поскольку умножение является распределительным , поэтому:

Более сложный пример с использованием цифр из предыдущих примеров (23 958 233 и 5 830):

Decimal:             Binary:
5830  23958233       1011011000110  1011011011001001011011001
2915  47916466       101101100011  10110110110010010110110010
1457  95832932       10110110001  101101101100100101101100100
728  191665864       1011011000  1011011011001001011011001000
364  383331728       101101100  10110110110010010110110010000
182  766663456       10110110  101101101100100101101100100000
91  1533326912       1011011  1011011011001001011011001000000
45  3066653824       101101  10110110110010010110110010000000
22  6133307648       10110  101101101100100101101100100000000
11 12266615296       1011  1011011011001001011011001000000000
5  24533230592       101  10110110110010010110110010000000000
2  49066461184       10  101101101100100101101100100000000000
1  98132922368       1  1011011011001001011011001000000000000
  ————————————          1022143253354344244353353243222210110 (before carry)
  139676498390         10000010000101010111100011100111010110

Умножение четверти квадрата

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

В некоторых случаях можно использовать эту формулу, чтобы облегчить выполнение задач умножения:

В случае, когда и являются целыми числами, у нас есть это

потому что и либо оба четные, либо оба нечетные. Это означает, что

и достаточно (предварительно) вычислить целую часть квадратов, разделенную на 4, как в следующем примере.

Ниже приведена таблица поиска четвертей квадратов, в которой остаток отброшен для цифр от 0 до 18; это позволяет умножать числа до 9×9 .

н      0   1   2   3   4   5   6 7 8 9 10 11 12 13 14 15 16 17 18
n 2 /4⌋ 0 0 1 2 4 6 9 12 16 20 25 30 36 42 49 56 64 72 81

Если, например, вы захотели умножить 9 на 3, вы заметили, что сумма и разность равны 12 и 6 соответственно. Просмотр обоих этих значений в таблице дает 36 и 9, разница которых равна 27, что является произведением 9 и 3.

История умножения четверти квадрата

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

В доисторические времена умножение на четверть квадрата включало функцию пола ; что некоторые источники [7] [8] отнести к вавилонской математике (2000–1600 гг. до н. э.).

Антуан Вуазен опубликовал таблицу четвертей квадратов от 1 до 1000 в 1817 году в качестве вспомогательного средства при умножении. Более крупная таблица четвертей квадратов от 1 до 100 000 была опубликована Сэмюэлем Лаунди в 1856 году. [9] и таблица от 1 до 200 000 Йозефа Блатера в 1888 году. [10]

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

В 1980 году Эверетт Л. Джонсон предложил использовать метод четверти квадрата в цифровом умножителе. [11] Например, чтобы получить произведение двух 8-битных целых чисел, цифровое устройство формирует сумму и разность, ищет обе величины в таблице квадратов, берет разницу результатов и делит на четыре, сдвигая два бита в сторону числа. верно. Для 8-битных целых чисел таблица четвертей квадратов будет иметь 2 9 −1=511 записей (одна запись для всего диапазона возможных сумм от 0 до 510, для разностей используются только первые 256 записей в диапазоне от 0 до 255) или 2 9 −1 = 511 записей (для отрицательных разностей используется техника 2-дополнительных дополнений и 9-битной маскировки, которая позволяет избежать проверки знака различий), каждая запись имеет ширину 16 бит (значения записи взяты из (0²/4) = От 0 до (510²/4)=65025).

Метод четвертьквадратного умножителя принес пользу 8-битным системам, которые не поддерживают аппаратный умножитель. Чарльз Путни реализовал это для 6502 . [12]

Вычислительная сложность умножения

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

Нерешенная задача в информатике :
Какой самый быстрый алгоритм умножения двух -значные числа?

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

В настоящее время алгоритмом с наилучшей вычислительной сложностью является алгоритм Дэвида Харви и Йориса ван дер Хувена 2019 года , который использует стратегии использования теоретико-числовых преобразований, представленных в алгоритме Шенхаге – Штрассена, для умножения целых чисел, используя только операции. [13] Предполагается, что это наилучший алгоритм, но нижние границы не известны.

Умножение Карацубы

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

Умножение Карацубы — это O( n войти 2 3 ) ≈ O( n 1.585 ) алгоритм «разделяй и властвуй», который использует рекурсию для объединения подвычислений.

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

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

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

где

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


Из-за накладных расходов на рекурсию умножение Карацубы происходит медленнее, чем длинное умножение для малых значений n ; поэтому типичные реализации переключаются на длинное умножение для малых значений n .

Общий случай с умножением N чисел

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

Изучая закономерности после расширения, можно увидеть следующее:





Каждому слагаемому соответствует уникальное двоичное число от 0 до , например и т. д. Кроме того; B приводится к числу 1 в этой двоичной строке, умноженному на m.

Если выразить это в меньшем количестве терминов, мы получим:

, где означает цифру номера i в позиции j. Обратите внимание, что



Алгоритм Карацубы был первым известным алгоритмом умножения, который асимптотически быстрее, чем длинное умножение. [15] и, таким образом, его можно рассматривать как отправную точку теории быстрых умножений.

Другой метод умножения называется Тум-Кук или Тум-3. Метод Тума-Кука разбивает каждое число, подлежащее умножению, на несколько частей. Метод Тума-Кука является одним из обобщений метода Карацубы. Трехходовой алгоритм Тума-Кука может выполнить умножение размера 3N за стоимость пяти размера N. умножений Это ускоряет операцию в 9/5 раз, тогда как метод Карацубы ускоряет ее в 4/3.

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

Улицы Шенхаге

[ редактировать ]
Демонстрация умножения 1234 × 5678 = 7006652 с использованием быстрого преобразования Фурье (БПФ). теоретико-числовые преобразования Используются целых чисел по модулю 337, выбирая 85 как корень восьмой степени из единицы. Вместо основания 2 используется основание 10. В для иллюстративных целей.


Любое число по основанию B можно записать в виде многочлена:

Более того, умножение двух чисел можно рассматривать как произведение двух многочленов:

Потому что для : , у нас есть свертка.

Используя БПФ (быстрое преобразование Фурье) с правилом свертки, мы можем получить

. То есть; , где – соответствующий коэффициент в пространстве Фурье. Это также можно записать как: fft(a * b) = fft(a) ● fft(b).


Мы имеем тот же коэффициент из-за линейности при преобразовании Фурье, а также потому, что эти полиномы состоят только из одного уникального термина на коэффициент:

и


Правило свертки:


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

Находя ifft (полиномиальную интерполяцию) для каждого , получаем искомые коэффициенты.

Алгоритм использует стратегию «разделяй и властвуй», чтобы разделить проблему на подзадачи.

Его временная сложность составляет O( n log( n ) log(log( n ))).

Алгоритм был изобретен Штрассеном (1968). Это было сделано на практике, а теоретические гарантии были предоставлены в 1971 году Шенхаге и Штрассеном, что привело к созданию алгоритма Шёнхаге-Штрассена . [16]

Дальнейшие улучшения

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

В 2007 году асимптотическая сложность умножения целых чисел была улучшена швейцарским математиком Мартином Фюрером из Университета штата Пенсильвания до n log( n ) 2. Θ( логарифм * ( н )) использование преобразований Фурье над комплексными числами , [17] где журнал * обозначает повторный логарифм . Аниндья Де, Чандан Саха, Пиюш Курур и Рампрасад Саптариши предложили аналогичный алгоритм с использованием модульной арифметики в 2008 году, достигнув того же времени работы. [18] В контексте приведенного выше материала последние авторы обнаружили, что N намного меньше 2. 3 тыс. + 1, так что Z / NZ имеет корень (2 m )-й степени из единицы. Это ускоряет вычисления и снижает временную сложность. Однако эти последние алгоритмы быстрее, чем Шенхаге – Штрассен, только для непрактично больших входных данных.

В 2014 году Харви, Йорис ван дер Хувен и Лесерф [19] дал новый алгоритм, который обеспечивает время работы , делая явным подразумеваемую константу в показатель. Они также предложили вариант своего алгоритма, который обеспечивает но чья достоверность основана на стандартных гипотезах о распределении простых чисел Мерсенна . В 2016 году Кованов и Томе предложили алгоритм целочисленного умножения, основанный на обобщении простых чисел Ферма , который предположительно достигает границы сложности . Это соответствует условному результату Харви, ван дер Хувена и Лесерфа 2015 года, но использует другой алгоритм и основывается на другой гипотезе. [20] В 2018 году Харви и ван дер Хувен использовали подход, основанный на существовании коротких векторов решетки, гарантированных теоремой Минковского, для доказательства безусловной границы сложности . [21]

В марте 2019 года Дэвид Харви и Йорис ван дер Хувен объявили об открытии алгоритма умножения O ( n log n ) . [22] Он был опубликован в Annals of Mathematics в 2021 году. [23] Поскольку Шёнхаге и Штрассен предсказали, что n log( n ) является «наилучшим возможным» результатом, Харви сказал: «…   ожидается, что наша работа станет концом пути к решению этой проблемы, хотя мы пока не знаем, как ее решить». докажите это строго». [24]

Нижние границы

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

Существует тривиальная нижняя оценка Ω ( n ) для умножения двух n -битных чисел на одном процессоре; не известен ни алгоритм сопоставления (на обычных машинах, то есть на машинах, эквивалентных Тьюрингу), ни какая-либо более точная нижняя граница. Умножение лежит вне AC 0 [ p ] для любого простого p , что означает, что не существует семейства схем полиномиального (или даже субэкспоненциального) размера постоянной глубины, использующих вентили AND, OR, NOT и MOD p, которые могут вычислить произведение. Это следует из приведения MOD q к умножению с постоянной глубиной. [25] Нижние оценки умножения известны также для некоторых классов ветвящихся программ . [26]

Умножение комплексных чисел

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

Комплексное умножение обычно включает четыре умножения и два сложения.

Или

Как заметил Питер Унгар в 1963 году, можно уменьшить количество умножений до трех, используя по существу те же вычисления, что и алгоритм Карацубы . [27] Произведение ( a + bi ) · ( c + di ) можно вычислить следующим образом.

k 1 знак равно c · ( а + б )
k 2 знак равно а · ( d - c )
k 3 знак равно б · ( c + d )
Действительная часть = k 1 k 3
Мнимая часть знак равно k 1 + k 2 .

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

Для быстрых преобразований Фурье (БПФ) (или любого линейного преобразования ) комплексные умножения производятся на постоянные коэффициенты c + di (называемые коэффициентами поворота в БПФ), и в этом случае два сложения ( d c и c + d ) могут быть вычислены заранее. . Следовательно, требуются только три умножения и три сложения. [28] Однако такой способ замены умножения на сложение может оказаться бесполезным для современных модулей с плавающей запятой . [29]

Полиномиальное умножение

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

Все приведенные выше алгоритмы умножения также можно расширить для умножения многочленов . В качестве альтернативы можно использовать технику замены Кронекера для преобразования задачи умножения многочленов в одно двоичное умножение. [30]

Методы длинного умножения можно обобщить, чтобы можно было умножать алгебраические формулы:

 14ac - 3ab + 2 multiplied by ac - ab + 1
 14ac  -3ab   2
   ac   -ab   1
 ————————————————————
 14a2c2  -3a2bc   2ac
        -14a2bc         3 a2b2  -2ab
                 14ac           -3ab   2
 ———————————————————————————————————————
 14a2c2 -17a2bc   16ac  3a2b2    -5ab  +2
 =======================================[31]

В качестве еще одного примера умножения на основе столбцов рассмотрим умножение 23 длинных тонн (т), 12 центнеров (центнеров) и 2 четвертей (кварта) на 47. В этом примере используются меры эвердюпуа : 1 т = 20 центнеров, 1 центнер = 4 квартеры.

    t    cwt  qtr
   23     12    2
               47 x
 ————————————————
  141     94   94
  940    470
   29     23
 ————————————————
 1110    587   94
 ————————————————
 1110      7    2
 =================  Answer: 1110 ton 7 cwt 2 qtr

Сначала умножаем четверти на 47, результат 94 записывается в первую рабочую область. Затем умножьте cwt 12*47 = (2 + 10)*47, но пока не складывайте частичные результаты (94, 470). Аналогичным образом умножьте 23 на 47, получив (141, 940). В столбце четвертей суммируется результат, и результат помещается во вторую рабочую область (в данном случае это тривиальный ход). 94 четверти — это 23 центнера и 2 четверти, поэтому поставьте 2 в ответ, а 23 — в следующий столбец слева. Теперь сложите три записи в столбце cwt и получите 587. Это 29 t 7 cwt, поэтому впишите 7 в ответ и 29 в столбец слева. Теперь сложите столбец тонн. Никакой настройки не требуется, поэтому результат просто копируется.

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

См. также

[ редактировать ]
  1. ^ «Умножение» . www.mathematische-basteleien.de . Проверено 15 марта 2022 г.
  2. ^ Брент, Ричард П. (март 1978 г.). «Арифметический пакет множественной точности на Фортране». Транзакции ACM в математическом программном обеспечении . 4 : 57–70. CiteSeerX   10.1.1.117.8425 . дои : 10.1145/355769.355775 . S2CID   8875817 .
  3. ^ Исон, Гэри (13 февраля 2000 г.). «Снова в школу для родителей» . Новости Би-би-си .
    Истауэй, Роб (10 сентября 2010 г.). «Почему родители сегодня не могут заниматься математикой» . Новости Би-би-си.
  4. ^ Чорлу, М.С.; Берлбоу, LM; Капраро, РМ; Корлу, Массачусетс; Хан, С. (2010). «Школа Османского дворца Эндерун и человек с множеством талантов, Матракчи Насух» . Журнал Корейского общества математического образования, серия D: Исследования в области математического образования . 14 (1): 19–31.
  5. ^ Богомольный, Александр . «Крестьянское умножение» . www.cut-the-knot.org . Проверено 4 ноября 2017 г.
  6. ^ Уэллс, Д. (1987). Словарь любопытных и интересных чисел Penguin . Книги о пингвинах. п. 44. ИСБН  978-0-14-008029-2 .
  7. ^ Макфарланд, Дэвид (2007), Возвращение к четвертным таблицам: ранние таблицы, разделение труда при построении таблиц и более поздние реализации в аналоговых компьютерах , стр. 1
  8. ^ Робсон, Элеонора (2008). Математика в древнем Ираке: социальная история . Издательство Принстонского университета. п. 227. ИСБН  978-0691201405 .
  9. ^ «Обзоры» , Журнал инженера-строителя и архитектора : 54–55, 1857 г.
  10. ^ Холмс, Невилл (2003), «Умножение на четверти квадратов», The Mathematical Gazette , 87 (509): 296–299, doi : 10.1017/S0025557200172778 , JSTOR   3621048 , S2CID   125040256 .
  11. ^ Эверетт Л., Джонсон (март 1980 г.), «Цифровой множитель на четверть квадрата», IEEE Transactions on Computers , vol. С-29, нет. 3, Вашингтон, округ Колумбия, США: Компьютерное общество IEEE, стр. 258–261, doi : 10.1109/TC.1980.1675558 , ISSN   0018-9340 , S2CID   24813486.
  12. ^ Путни, Чарльз (март 1986 г.). «Самое быстрое умножение 6502» . Сборочная линия Apple . 6 (6).
  13. ^ Харви, Дэвид; ван дер Хувен, Йорис (2021). «Целое умножение за время / (PDF) . Анналы математики . Вторая серия. 193 (2): 563–617. : 10.4007 annals.2021.193.2.4 . MR   4224716. . S2CID   109934776 doi
  14. ^ Чарльз Бэббидж, Глава VIII - Об аналитической машине, обработка больших чисел, отрывки из жизни философа , Лонгман Грин, Лондон, 1864; стр. 125.
  15. ^ Д. Кнут, Искусство компьютерного программирования , том. 2, сек. 4.3.3 (1998)
  16. ^ Шёнхаге, А.; Штрассен, В. (1971). «Быстрое умножение больших чисел» . Вычисление . 7 (3–4): 281–292. дои : 10.1007/BF02242355 . S2CID   9738629 .
  17. ^ Фюрер, М. (2007). «Быстрое умножение целых чисел» (PDF) . Материалы тридцать девятого ежегодного симпозиума ACM по теории вычислений, 11–13 июня 2007 г., Сан-Диего, Калифорния, США . стр. 57–66. дои : 10.1145/1250790.1250800 . ISBN  978-1-59593-631-8 . S2CID   8437794 .
  18. ^ ДЭА.; Саха, К.; Курур, П.; Саптариши, Р. (2008). «Быстрое умножение целых чисел с использованием модульной арифметики». Материалы 40-го ежегодного симпозиума ACM по теории вычислений (STOC) . стр. 499–506. arXiv : 0801.1416 . дои : 10.1145/1374376.1374447 . ISBN  978-1-60558-047-0 . S2CID   3264828 .
  19. ^ Харви, Дэвид; ван дер Хувен, Йорис; Лесерф, Грегуар (2016). «Еще быстрее целочисленное умножение». Журнал сложности . 36 : 1–30. arXiv : 1407.3360 . дои : 10.1016/j.jco.2016.03.001 . МР   3530637 .
  20. ^ Кованов, Святослав; Томе, Эммануэль (2019). «Быстрое умножение целых чисел с использованием обобщенных простых чисел Ферма». Математика. Комп. 88 (317): 1449–1477. arXiv : 1502.02800 . дои : 10.1090/mcom/3367 . S2CID   67790860 .
  21. ^ Харви, Д.; ван дер Хувен, Дж. (2019). «Быстрое умножение целых чисел с использованием коротких векторов решетки». Серия «Открытая книга» . 2 : 293–310. arXiv : 1802.07932 . дои : 10.2140/obs.2019.2.293 . S2CID   3464567 .
  22. ^ Хартнетт, Кевин (11 апреля 2019 г.). «Математики открыли идеальный способ умножения» . Журнал Кванта . Проверено 3 мая 2019 г.
  23. ^ Харви, Дэвид; ван дер Хувен, Йорис (2021). «Целое умножение за время / (PDF) . Анналы математики . Вторая серия. 193 (2): 563–617. : 10.4007 annals.2021.193.2.4 . MR   4224716. . S2CID   109934776 doi
  24. ^ Гилберт, Лахлан (04 апреля 2019 г.). «Математический гений решил 48-летнюю задачу на умножение» . УНЮУ . Проверено 18 апреля 2019 г.
  25. ^ Арора, Санджив; Барак, Вооз (2009). Вычислительная сложность: современный подход . Издательство Кембриджского университета. ISBN  978-0-521-42426-4 .
  26. ^ Аблаев Ф.; Карпински, М. (2003). «Нижняя граница умножения целых чисел в рандомизированных упорядоченных ветвящихся программах с однократным чтением» (PDF) . Информация и вычисления . 186 (1): 78–89. дои : 10.1016/S0890-5401(03)00118-4 .
  27. ^ Кнут, Дональд Э. (1988), Искусство компьютерного программирования, том 2: Получисловые алгоритмы , Аддисон-Уэсли , стр. 519, 706.
  28. ^ Дюамель, П.; Веттерли, М. (1990). «Быстрое преобразование Фурье: обзор учебного пособия и современное состояние» (PDF) . Обработка сигналов . 19 (4): 259–299 См. раздел 4.1. дои : 10.1016/0165-1684(90)90158-У .
  29. ^ Джонсон, СГ; Фриго, М. (2007). «Модифицированное БПФ с разделением системы счисления с меньшим количеством арифметических операций» (PDF) . IEEE Транс. Сигнальный процесс . 55 (1): 111–9 См. раздел IV. Бибкод : 2007ITSP...55..111J . дои : 10.1109/TSP.2006.882087 . S2CID   14772428 .
  30. ^ фон цур Гатен, Иоахим ; Герхард, Юрген (1999), Современная компьютерная алгебра , издательство Кембриджского университета, стр. 243–244, ISBN  978-0-521-64176-0 .
  31. ^ Касл, Фрэнк (1900). Практикум Математика . Лондон: MacMillan and Co. p. 74 .

Дальнейшее чтение

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

Основная арифметика

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

Расширенные алгоритмы

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: be67f9272a03e5f7036eb215d787fc31__1721867580
URL1:https://arc.ask3.ru/arc/aa/be/31/be67f9272a03e5f7036eb215d787fc31.html
Заголовок, (Title) документа по адресу, URL1:
Multiplication algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)