продукт без ручной клади из двух двоичные числа являются результатом умножения без переноса этих чисел. Эта операция концептуально работает как длинное умножение за исключением того факта, что перенос отбрасывается, а не применяется к более значимой позиции. Его можно использовать для моделирования операций над конечными полями, в частности, умножения полиномов из GF (2) [X], кольца полиномов над GF (2).
Эта операция также известна как умножение XOR, поскольку сложение с исключением переноса эквивалентно исключающему или.
Даны два числа и , где , обозначающий биты этих чисел. Тогда произведение этих двух чисел без остатка определяется как , где каждый бит вычисляется как исключающее или произведений битов из входных чисел следующим образом:
Рассмотрим a = 10100010 2 и b = 10010110 2, причем все числа указаны в двоичном формате. Тогда их умножение без переноса - это, по сути, то, что можно получить, выполняя длинное умножение, но игнорируя переносы.
1 0 1 0 0 0 1 0 = а --------------- | --- | ------- | - 1 0 0 1 0 1 1 0 | 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 | 0 0 0 0 0 1 0 0 1 0 1 1 0 | 0 -------------- ---------------- 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 ^ ^
Таким образом, произведение a и b без переноса будет быть c = 101100011101100 2. Для каждого бита, установленного в числе a, число b сдвигается влево на столько битов, сколько указано положением бита в a. Все эти сдвинутые версии затем объединяются с использованием исключающего или вместо обычного сложения, которое использовалось бы для обычного длинного умножения. Это можно увидеть в столбцах, обозначенных ^
, где обычное добавление приведет к переносу в столбец слева, чего здесь не происходит.
Произведение без переноса также можно рассматривать как умножение многочленов над полем GF (2). Это потому, что исключающее или соответствует добавлению в этом поле.
В приведенном выше примере числа a и b соответствуют многочленам
и их произведение
- то, что кодирует вычисленное выше число c. Обратите внимание, как и благодаря арифметике в GF (2). Это соответствует столбцам, помеченным ^
в примере.
Элементы GF (2), т. Е. конечное поле, порядок которого равен степени двойки, обычно представляются в виде полиномов в GF (2) [X]. Умножение двух таких элементов поля состоит из умножения соответствующих многочленов с последующим редукцией по отношению к некоторому неприводимому многочлену, взятому из построения поля. Если полиномы закодированы как двоичные числа, умножение без переноса можно использовать для выполнения первого шага этого вычисления.
Такие поля используются в криптографии и для некоторых алгоритмов контрольной суммы.
Последние процессоры x86 поддерживают набор инструкций CLMUL и, таким образом, предоставляют аппаратные инструкции для выполнения этой операции.
Для других целей можно реализовать вычисление выше как программный алгоритм, и многие библиотеки криптографии будут содержать реализацию как часть своих арифметических операций с конечным полем.
Определение произведения без переноса как результата длинного умножения, отбрасывающего перенос, легко применимо к базам, кроме 2. Но результат зависит от на основании, что, следовательно, является важной частью операции. Поскольку эта операция обычно используется на компьютерах, работающих в двоичном формате, на практике используется двоичная форма, описанная выше.
Полиномы над другими конечными полями простого порядка действительно имеют приложения, но обработка коэффициентов такого многочлена как разрядов одного числа довольно необычна, поэтому умножение таких многочленов не будет рассматриваться как перенос -бесконечное умножение чисел.