Как умножать модуль на модуль – Модули. Применение геометрического смысла модуля при решений уравнений и неравенств

Быстрое индексное умножение по модулю / Habr

Введение


Обычно данный материал приводится с обилием формул и рассчитан больше на математиков. Я постараюсь расписать его наиболее доступно на простых численных примерах с точки зрения применения этого метода в микроэлектронике на аппаратном уровне. В численных примерах для наглядности будет использоваться значение p = 11.

Постановка задачи


Положим, что нам требуется выполнить умножение следующего вида: res = (a*b) mod p, где
0 <= a < p
0 <= b < p
p – простое число.
mod p – операция нахождения остатка по модулю.
И выполнить его надо на низком уровне, где нет как таковой операции умножения и операции взятия остатка от деления или же они реализуются достаточно сложно (например, в электронном устройстве).

Простейшие методы решения


  1. Первое что приходит в голову: умножить, потом разделить и взять остаток. Этот подход имеет право на существование, но чрезвычайно затратен по количеству операций и довольно сложен для реализации.
  2. Второе, что можно придумать, это реализовать эту операцию двумерной таблицей умножения размера
    p
    на p. Что имеет смысл если p мало, однако при росте значения p квадратично растут затраты на хранение таблицы (рис. 1).


Рисунок 1. Таблица умножения по модулю p для p = 11.

Умножитель на базе индексного метода


Однако существует метод, который требует одной (или для удобства двух) таблиц размерности p. Метод основан на замене умножения сложением. И может быть схематично проиллюстрирован следующим рисунком (рис. 2):

Рисунок 2. Индексное умножение.

Поясним, почему это возможно. Индексное представление числа основывается на понятии первообразного корня по простому модулю p [1]. Первообразным корнем w является целое число, возведение которого в степень 0, 1, 2, …, (p-2) дает неповторяющиеся вычеты по модулю p. Первообразный корень всегда существует для любого простого

p (доказано Гауссом в 1801 году). В этом случае каждому целому числу q из промежутка (0; p) можно поставить в соответствие число i такое что: q = (wi) mod p. И таким образом получить следующее соответствие:
(a*b) mod p <-> w^((ia+ib) mod (p-1)) [2].

Рассмотрим пример для модуля p = 11. Первообразный корень w для этого значения модуля равен 2. Как несложно убедиться возведение w в степень 0, 1, … 9 дает неповторяющиеся результаты:

  • (20) mod 11 = 1 mod 11 = 1
  • (21) mod 11 = 2 mod 11 = 2
  • (22) mod 11 = 4 mod 11 = 4
  • (23) mod 11 = 8 mod 11 = 8
  • (24) mod 11 = 16 mod 11 = 5
  • (25) mod 11 = 32 mod 11 = 10
  • (26) mod 11 = 64 mod 11 = 9
  • (27) mod 11 = 128 mod 11 = 7
  • (28) mod 11 = 256 mod 11 = 3
  • (29) mod 11 = 512 mod 11 = 6

Для получения таблицы преобразования между обычным {q} и индексным {i} представлением необходимо отсортировать полученные пары значений в порядке возрастания. Таким образом, таблица прямого преобразования для модуля p = 11 будет выглядеть следующим образом:
q 1 2 3 4 5 6 7 8 9 10
i 0 1 8 2 4 9 7 3 6 5
А таблица обратного преобразования для модуля p = 11 будет выглядеть так:
i 0 1 2 3 4 5 6 7 8 9
q 1 2 4 8 5 10 9 7 3 6

Найдем значение выражения (3*5) mod 11. Числа 3 и 5 имеют соответствующие индексы 8 и 4 (см. таблицу 1). Просуммировав эти индексы по модулю (11-1) = 10 получим результат (8+4) mod 10 = 12 mod 10 = 2. Из таблицы 2 находим, что обратное преобразование для индекса 2 дает конечный результат, равный 4.

Структурную схему индексного умножителя по модулю m=11 для рассмотренного примера можно посмотреть на следующем рисунке (рис 3):

Рисунок 3. Схема индексного умножителя для p = 11.

Нулевые значения для входов


Если внимательно посмотреть на таблицы, то видно, что там не присутствуют нулевые значения для входных данных. Это связано с тем, что wi != 0 ни при каких значениях i. Этот случай обрабатывается отдельно (либо вводится понятие сингулярности со специальными правилами её обработки). Если на одном из входов умножителя появляется 0, то на выходе тоже будет 0, что непосредственно следует из правил умножения.

Распараллеливание умножителя


Оказывается умножение можно сделать ещё быстрее. Если число (p-1) можно разбить на попарно взаимнопростые множители p-1 = m1*m2*…*mr, то операция сложения может быть разбита на r операций сложений меньшей размерности. В этом случае индекс преобразуется в вектор длины
r
, по следующей формуле: (i mod m1, i mod m2, …, i mod mr). А суммирование производится независимо по каждому элементу вектора.

Рассмотрим это на примере. Для p = 11 значение p-1 = 10 и оно может быть разбито на взаимнопростые множители единственным образом: 10 = 2*5 (m1 = 2, m2 = 5). В этом случае таблица 1 может быть расписана следующим образом:

q 1 2 3 4 5 6 7 8 9 10
i 0 1 8 2 4 9 7 3 6 5
(i mod 2, i mod 5) (0, 0) (1, 1) (0, 3) (0, 2) (0, 4) (1, 4) (1, 2) (1, 3) (0, 1) (1, 0)
А таблица обратного преобразования соответственно так:
(i mod 2, i mod 5) (0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (1, 0) (1, 1) (1, 2) (1, 3) (1, 4)
q 1 9 4 3 5 10 2 7 8 6

Найдем, как и в прошлом примере, значение (3*5) mod 11. Сначала ищем соответствующие вектора в таблице: 3 -> (0, 3), 5 –> (0, 4). Затем поэлементно складываем ((0 + 0)
mod
2, (3 + 4) mod 5) = (0, 2). Из таблицы обратного преобразования находим ответ: (0, 2) -> 4. Схема параллельного умножителя приведена ниже (рис. 4):

Рисунок 4. Схема параллельного индексного умножителя для p = 11.

Как искать первообразный корень?


Если честно не задавался этим вопросом. Я использую полный перебор, начиная с 2 до p. Либо можно использовать готовую последовательность: oeis.org/A046145. Если есть более эффективный метод пишите в комментах.

Как проектировать сумматор по модулю (p-1)?


Из-за особенностей входных данных сумматора по модулю (p-1), а именно, что на оба входа приходит число меньше, чем p-1, а значит их сумма меньше чем 2*(p-1). Из этого следует, что можно использовать любой из стандартных сумматоров, выход которого корректируется по следующему алгоритму: если значение больше или равно
(p-1)
, то вычесть из результата (p-1), иначе оставить без изменений.

Verilog-генератор


На досуге я написал он-лайн генератор Verilog’а для реализации индексного умножителя по модулю. Там же рисуется схема его работы.
Verilog для умножения по модулю 11
Verilog для умножения по модулю 31
Генератор Verilog для произвольного числа до 1000

Литература


[1] ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B2%D0%BE%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D1%8C_%28%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%87%D0%B8%D1%81%D0%B5%D0%BB%29
[2] www.researchgate.net/publication/224735018_A_fast_RNS_Galois_field_multiplier

От автора


Если у вас есть дополнения по статье буду рад их увидеть в комментариях. И ещё статья получилась бедной на ссылочки с подробностями, если у кого что есть кидайте. =)

что это такое и где применяется

В математике модульная арифметика представляет собой систему расчета для целых чисел, при помощи которой они «переворачиваются» при достижении определенного значения — модуля (или множественного числа оных). Современный подход к этому виду науки был развит Карлом Фридрихом Гауссом в его книге Disquisitiones Arithmeticae, опубликованной в 1801 году. Этим методом очень любят пользоваться специалисты по информатике, поскольку это очень интересно и открывает определенные новые возможности в операциях с числами.

Визуализация модульной арифметики.

Суть

Поскольку число часов начинается заново после того, как оно достигает 12, это арифметическое по модулю 12. Согласно приведенному ниже определению 12 соответствует не только 12, но и 0, поэтому можно также назвать время, называемое «12:00». «0:00». Ведь 12 совпадает с 0 по модулю 12.

Модульная арифметика может обрабатываться математически, путем введения конгруэнтного отношения к целым числам, которое совместимо с операциями над целыми числами: сложение, вычитание и умножение. Для положительного целого числа n два числа a и b называются конгруэнтными по модулю n, если их разность a — b кратна n (то есть, если существует целое число k такое, что a — b = kn).

Модульные числа.

Вычеты

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

Практика

Очень практичным применением является вычисление контрольных сумм в идентификаторах серийных номеров. Например некоторые общепринятые стандарты книг используют арифметику по модулю 11 (если выпущена до 1 января 2007 г.) или по модулю 10 (если выпущена до или после 1 января 2007 г.). Аналогичным образом, например, в Международных номерах банковских счетов (IBAN). Здесь используется арифметика по модулю 97 для выявления ошибок ввода пользователем в номерах банковских счетов.

В химии последняя цифра регистрационного номера CAS (уникальный идентификационный номер для каждого химического соединения) является контрольной цифрой. Она рассчитывается путем взятия последней цифры из первых двух частей регистрационного номера CAS, умноженной на 1, предыдущую цифру 2 раза, предыдущая цифра 3 раза и т. д., складывая все это и вычисляя сумму по модулю 10.

Что такое криптография? Дело в том, что она имеет весьма сильную связь с обсуждаемой темой. В криптографии законы модульной арифметики, непосредственно, лежат в основе систем с открытым ключом, таких как RSA и Диффи-Хелльман. Здесь она предоставляет конечные поля, которые лежат в основе эллиптических кривых. Используется в различных алгоритмах симметричного ключа, включая Advanced Encryption Standard (AES), Международный алгоритм шифрования данных и RC4.

Элементарная арифметика.

Применение

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

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

В музыке арифметика по модулю 12 используется при рассмотрении системы равного темперамента из двенадцати тонов, в которой происходит эквивалентность октавы и энгармоники. Иными словами, тональности в соотношении 1-2 или 2-1 эквивалентны. В музыке и других гуманитарных дисциплинах арифметика играет довольно значимую роль, но в учебниках информатики об этом обычно не пишут.

Детская арифметика.

Метод приведения девяток

Метод приведения девяток предлагает быструю проверку десятичных арифметических вычислений, выполненных вручную. Он основан на модульной арифметике по модулю 9 и, в частности, на решающем свойстве 10 10 1.

существуют и другие примеры. Арифметическое по модулю 7 используется в алгоритмах, которые определяют день недели для конкретной даты. В частности, конгруэнтность Целлера и алгоритм «Судного дня» интенсивно используют арифметику по модулю 7.

Иные области применения

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

Проект подсчитывания.

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

Конгруэнция

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

Примеры

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

Вскоре после обнаружения целых чисел (1, 2, 3, 4, 5 …) становится очевидным, что они делятся на две группы:

  • Четный: делится на 2 (0, 2, 4, 6 ..).
  • Нечетное: не делится на 2 (1, 3, 5, 7…).

Почему это различие важно? Это начало абстракции. Мы замечаем свойства числа (например, четное или нечетное), а не только само число («37»).

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

Счет на пальцах.

Свойства числа

Быть «тройкой» — это просто еще одно свойство числа. Возможно, не так сразу полезно, как четное/нечетное, но оно есть. Мы можем создать правила типа «тринадцать х три вена = тринадцать» и так далее. Но это сводит с ума. Мы не можем делать новые слова все время.

Операция по модулю (сокращенно mod или «%» во многих языках программирования) является остатком при делении. Например, «5 mod 3 = 2», что означает 2 — остаток, когда вы делите 5 на 3.

При преобразовании повседневных терминов в математику «четное число» — это то, где оно равно «0 mod 2», то есть остаток равен 0 при делении на 2. Нечетное число равно «1 mod 2» (имеет остаток 1).

Приспособления для счета.

Четные и нечетные числа

Что такое четный х четный х нечетный х нечетный? Ну, это 0 x 0 x 1 x 1 = 0. На самом деле, вы можете видеть, умножается ли где-либо четное число, где весь результат будет равен нулю.

Хитрость модульной математики в том, что мы уже использовали ее для хранения времени — иногда ее называют «арифметикой часов».

Например: 7:00 (утра/вечера — не имеет значения). Где будет часовая стрелка через 7 часов?

Модуляции

(7 + 7) mod 12 = (14) mod 12 = 2 mod 12 [2 — это остаток, когда 14 делится на 12. Уравнение 14 mod 12 = 2 mod 12 означает, что 14 часов и 2 часа выглядят одинаково на 12-часовых часах. Они являются конгруэнтными, обозначенными знаком тройного равенства: 14 ≡ 2 mod 12.

Другой пример: сейчас 8:00. Где будет большая стрелка через 25 часов?

Вместо добавления 25 к 8, вы можете понять, что 25 часов — это просто «1 день + 1 час». Ответ прост. Итак, часы закончатся на 1 час вперед — в 9:00.

(8 + 25) мод 12 ≡ (8) мод 12 + (25) мод 12 ≡ (8) мод 12 + (1) мод 12 ≡ 9 мод 12. Вы интуитивно конвертировали 25 в 1 и добавили это к 8.

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

Сила цифр и формул.

Сложение/Вычитание

Допустим, два раза выглядят одинаково на наших часах («2:00» и «14:00»). Если мы добавим одинаковые х часов к обоим, что произойдет? Ну, они меняются на ту же сумму на часах! 2:00 + 5 часов ≡ 14:00 + 5 часов — оба покажут 7:00.

Зачем? Мы можем просто добавить 5 к 2 остаткам, которые оба имеют, и они продвигаются одинаково. Для всех конгруэнтных чисел (2 и 14) сложение и вычитание имеют одинаковый результат.

Труднее понять, остается ли умножение таким же. Если 14 ≡ 2 (мод 12), можем ли мы умножить оба числа и получить одинаковый результат? Давайте посмотрим, что произойдет, когда мы умножим на 3.

Ну, 2:00 * 3 × 6:00. Но что такое 14:00 * 3?

Помните, 14 = 12 + 2. Итак, мы можем сказать,

14 * 3 = (12 + 2) * 3 = (12 * 3) + (2 * 3)

Первую часть (12 * 3) можно игнорировать! Переполнение 12 часов, которое несет 14, просто повторяется несколько раз. Но кого это волнует? В любом случае мы игнорируем переполнение.

Арифметические приспособления.

Умножение

При умножении имеет значение только остаток, то есть те же 2 часа для 14:00 и 2:00. Интуитивно понятно, что именно так я вижу, что умножение не меняет отношения с модульной математикой (вы можете умножить обе стороны модульного отношения и получить один и тот же результат).

Мы делаем это интуитивно, но приятно дать ему имя. У вас есть рейс, прибывающий в 3 часа дня. Он задерживается на 14 часов. Во сколько он приземлится?

14 ≡ 2 мод 12. Так что, стоит думать об этом как 2 часа, поэтому самолет приземлиться 5 часов утра. Решение простое: 3 + 2 = 5 утра. Это немного сложнее, чем простая операция по модулю, но принцип тот же.

Напишите пожалуйста правило раскрытия модуля.

Каждое число имеет две характеристики: абсолютное значение числа, и его знак. Например, число +5, или просто 5 имеет знак «+» и абсолютное значение 5. Число -5 имеет знак «-» и абсолютное значение 5. Абсолютные значения чисел 5 и -5 равны 5. Абсолютное значение числа х называется модулем числа и обозначается |x|. Как мы видим, модуль числа равен самому числу, если это число больше или равно нуля, и этому числу с противоположным знаком, если это число отрицательно. Это же касается любых выражений, которые стоят под знаком модуля. Правило раскрытия модуля выглядит так: |f(x)|= f(x), если f(x) &#8805; 0, и |f(x)|= – f(x), если f(x) &lt; 0 Например |x-3|=x-3, если x-3&#8805;0 и |x-3|=-(x-3)=3-x, если x-3&lt;0. Чтобы решить уравнение, содержащее выражение, стоящее под знаком модуля, нужно сначала раскрыть модуль по правилу раскрытия модуля. Тогда наше уравнение или неравенство преобразуется в два различных уравнения, существующих на двух различных числовых промежутках. Одно уравнение существует на числовом промежутке, на котором выражение, стоящее под знаком модуля неотрицательно. А второе уравнение существует на промежутке, на котором выражение, стоящее под знаком модуля отрицательно. Рассмотрим простой пример. Решим уравнение: |x-3|=-x2+4x-3 1. Раскроем модуль. |x-3|=x-3, если x-3&#8805;0, т. е. если х&#8805;3 |x-3|=-(x-3)=3-x, если x-3&lt;0, т. е. если х&lt;3 2. Мы получили два числовых промежутка: х&#8805;3 и х&lt;3. Рассмотрим, в какие уравнения преобразуется исходное уравнение на каждом промежутке: А) При х&#8805;3 |x-3|=x-3, и наше уранение имеет вид: x-3=-x2+4x-3 Внимание! Это уравнение существует только на промежутке х&#8805;3! Раскроем скобки, приведем подобные члены: x2 -3х=0 и решим это уравнение. Это уравнение имеет корни: х1=0, х2=3 Внимание! поскольку уравнение x-3=-x2+4x-3 существует только на промежутке х&#8805;3, нас интересуют только те корни, которые принадлежат этому промежутку. Этому условию удовлетворяет только х2=3. Б) При x&lt;0 |x-3|=-(x-3) = 3-x, и наше уравнение приобретает вид: 3-x=-x2+4x-3 Внимание! Это уравнение существует только на промежутке х&lt;3! Раскроем скобки, приведем подобные члены. Получим уравнение: x2-5х+6=0 х1=2, х2=3 Внимание! поскольку уравнение 3-х=-x2+4x-3 существует только на промежутке x&lt;3, нас интересуют только те корни, которые принадлежат этому промежутку. Этому условию удовлетворяет только х1=2. Итак: из первого промежутка мы берем только корень х=3, из второго – корень х=2. Ответ: х=3, х=2

Под знаком модуля должно быть всегда положительное или равное нулю число. Поэтому если выражение под знаком модуля положительное, то открываем без смены знака. Если же оно отрицательное, то открываем со знаком «минус» . Например: |-8|=8 |-15,87|=15,87 |56|=56 |x^2-2x+4|=x^2+2x+4 (так как выражение под знаком модуля всегда больше или равно нулю при х=2) |x+9| =&gt; x+9 если х&gt;=-9 или -(x+9) если x&lt;-9.

Как решить уравнение с несколькими модулями?

Отправить ответ

avatar
  Подписаться  
Уведомление о