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