Модульная арифметика для доказательств с нулевым разглашением

Illy’s Web3 blog
5 min readSep 21, 2023

--

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

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

Что ж, давайте начнем изучать эту увлекательную тему с основ модульной арифметики.

Что такое модульная арифметика

Когда мы делим два целых числа, уравнение выглядит примерно так:

A/B = Q * R

где R — остаток, а Q — частное.

Чаще всего нас интересует частное (Q). Однако, если вы ищете остаток (R), модульная арифметика приходит на помощь.

Мы используем оператор “модуль” или “mod” в качестве сокращения, когда хотим получить остаток от деления двух чисел.

Вот как это выглядит на практике:

A mod B = R

Допустим, A равно 10, а B равно 3. В этом случае 10 mod 3 равно 1.

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

Например, для модуля 5 возможные остатки — это 0, 1, 2, 3 и 4. Предположим, у нас есть набор целых чисел [0, 1, 4, 6, 9, 10, 12, 18], и мы применяем к ним mod 5. Благодаря этому свойству мы знаем, что результатом будут значения [0, 1, 4, 1, 4, 0, 2, 3] — каждое значение попадает в диапазон от 0 до 4.”

Конгруэнция

Мы скоро узнаем, как выполнять модульные вычисления, но сначала нам нужно изучить важное обозначение: оператор ≡.

Оператор ≡ называется оператором “конгруэнции”. Это НЕ то же самое, что оператор равенства =, который нам всем знаком. Вместо этого ≡ имеет 3 переменные и означает, что если у нас есть два положительных целых числа, a и b, то a и b “конгруэнтны по модулю n”, если остаток при делении на n одинаков.

Пример 1:

48 ≡ 13 (mod 5)

48 деленное на 5 дает остаток 3. Точно так же 13 деленное на 5 дает остаток 3. Следовательно, 48 и 13 конгруэнтны по модулю 5.

Пример 2:

93 ≡ 6 (mod 3)

93 деленное на 3 дает остаток 0. Точно так же 6 деленное на 3 дает остаток 0. Следовательно, 93 и 6 конгруэнтны по модулю 3.

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

Сложение

Сложение в модульной арифметике — это просто. Мы складываем два числа как обычно, а затем берем остаток при делении на модуль.

Например, 2 + 4 = 6 в обычной арифметике. Но если мы хотим 2 + 4 (mod 5), то получим 1 в качестве остатка. Таким образом, мы говорим:

2 + 4 ≡ 1 (mod 5)

Обратите внимание, как мы использовали оператор конгруэнции.

Вычитание

Вычитание в модульной арифметике следует той же логике. Мы просто вычитаем два числа как обычно, а затем берем модуль результата. Например, 4–2 (mod 5) это 2 (mod 5), что равно 2. Таким образом, мы можем записать это как:

4 − 2 ≡ 2 (mod 5)

Однако, если мы вычитаем два числа и получаем отрицательное число, то мы добавляем модуль к результату, пока не получим неотрицательный ответ, который меньше модуля.

Например, что такое:

2 − 4 (mod 5) ?

2–4 равно -2, но у нас не может быть отрицательных чисел. Поэтому мы добавляем к нему 5 и получаем 3. 3 — это неотрицательное число и наш окончательный ответ.

Таким образом, мы говорим:

2 − 4 ≡ 3 (mod 5)

Умножение

Теперь поговорим об умножении в модульной арифметике. Просто умножьте два числа как обычно, а затем возьмите остаток при делении на модуль. Например, 2 × 4 = 8, но в модульной арифметике с модулем 5 остаток от 8 при делении на 5 равен 3, поэтому мы говорим:

2 × 4 ≡ 3 (mod 5)

Деление

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

[знак “^” означает возведение в степень]

Модульное обратное для A (mod C) — это A^-1

Таким образом, A × A^-1 ≡ 1 (mod C)

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

Например:

10/5 = 10 * 1/5

Таким образом, мы можем по сути “делить” некоторое число “X” на другое число “A” в модульной математике, сначала найдя мультипликативное обратное для A, а затем умножив X на это мультипликативное обратное:

X/A * (mod C) = X * A^-1(mod C)

Важно отметить, что не все числа будут иметь модульное обратное. Только числа, взаимно простые с C (числа, не имеющие общих простых делителей с C), имеют модульное обратное (mod C).

Три причины использовать модульную арифметику в ZKP

Итак, теперь, когда вы понимаете основы модульной математики, вы, возможно, задаетесь вопросом, как она полезна для ZKP. Давайте посмотрим!

Модульная арифметика хорошо работает с большими числами

Когда мы выполняем арифметические операции с использованием модульной арифметики, результат операции всегда находится между 0 и n-1 (где n — это модуль). Это дает нам красивый, чистый конечный набор чисел для работы. Это здорово, потому что, когда нам нужно работать с большими числами, нам не нужно беспокоиться о проблемах переполнения.

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

Гомоморфные свойства

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

Кстати, можете поискать в моем блоге статью о полностью гомоморфном шифровании ;) Она была написана не так давно.

Вычислительная эффективность

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

Заключение

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

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

--

--

No responses yet