Мотивация

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

Далее в нескольких статьях я опишу путь от основ абстрактной алгебры до изоморфизма конечных полей:

  • Галуа Ч.1: Классы вычетов и группы.

  • Галуа Ч.2: Кольца и поля. Конечные поля вида GF(p^n).

  • Галуа Ч.3: Конечные поля вида GF((p^n)^m). Изоморфизм конечных полей.

Почему мы сразу не рассматриваем конечные поля?

Основу современной криптографии составляют различные алгебраические стуктуры и методы, и каждая следующая структура строится на основе предыдущей. Поэтому довольно тяжело будет рассмотреть структуру конечных полей, предварительно не изучив свойства групп. Базовое понимание этих структур необходимо для освоения даже самых популярных протоколов таких, как RSA и обмен ключами Диффи-Хеллмана. В своем изложении я ограничусь только формулировкой необходимых определений и теорем, а также постараюсь пояснить сложные моменты и привести характерные для криптографии примеры.

Скрытый текст

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

  • Сагалович Ю.Л. Введение в алгебраические коды: учебное пособие / Ю. Л. Сагалович. М-во обра- зования и науки Российской Федерации, Учреждение Российской акад. наук Ин-т проблем передачи информ. им. А. А. Харкевича РАН. - 3-е изд., перераб. и доп. - Москва: ИППИ РАН, 2014. - 310 с.

  • Болотов А.А., Гашков С.Б., Фролов А.Б., Часовских А.А. Элементарное введение в эллиптическую криптографию: Алгебраические и алгоритмические основы. - М.: КомКнига, 2006. - 328с.

Структура статьи

Классы вычетов

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

Скрытый текст

Отношение эквивалентности на множествеX - это бинарное отношение ∼, которое удовлетворяет следующим условиям для любых элементов x, y, z ∈ X:

  • рефлексивность: x ∼ x

  • симметричность: если x ∼ y, то и y ∼ x

  • транзитивность: если x ∼ y и y ∼ z, то x ∼ z

Множество, на котором задано отношение эквивалентности, разбивается на классы эквивалентности. Классы эквивалентности обозначаются как [x] _∼, где x - представитель класса.

На множестве целых чисел \mathbb{Z} можно определить отношение эквивалентности

x \equiv y \pmod{m}

, где m - натуральное число. Это отношение называется отношением сравнимости ("равенства") по модулю m, а классы эквивалентности по этому отношению - классами вычетов по модулю m.

Скрытый текст

Говорят, что два целых числа x и y сравнимы по модулю m, если их разность x − y делится на m(иначе говоря, x и y дают при делении на m одинаковые остатки).

То есть в класс вычетов по модулю m входят все целые числа, у которых одинаковый остаток при делении m. Классы вычетов обозначают как [x]_m, где x - представитель класса. Обычно в качестве представителя класса вычетов удобно брать наименьшее неотрицательное число, принадлежащее данному классу.

Скрытый текст

Класс вычетов можно представить как множество [x]_m = \{ x + km, \: k \in \mathbb{Z} \}.

Пример. Рассмотрим класс вычетов по модулю 6 (m = 6). Так как 4 \equiv 10 \equiv -2 \: (\textrm{mod} \: 6)(4, 10 и -2 дают одинаковый остаток при делении по модулю 6 равный 4), то они принадлежат одному и тому же классу вычетов. Мы этот класс вычетов можем обозначить как [4] _ 6, [10]_6, [-2]_6, но для удобства будем всегда в качестве представителя брать наименьшее неотрицательное число из данного класса, т.е. [4] _ 6 для нашего примера.

Совокупность всех классов вычетов на множестве целых чисел \mathbb{Z} по модулю m обозначают \mathbb{Z}_m. Множество \mathbb{Z}_m содержит m элементов: m классов вычетов, так как при делении с остатком на число m, остаток может принимать значения из множества \{0, 1, . . . , m − 1\}.

Пример. Рассмотрим множество \mathbb{Z}_6 классов вычетов по модулю 6. Тогда \mathbb{Z}_6 = \{ [0]_6, [1]_6, [2]_6, [3]_6, [4]_6, [5]_6 \}.

На множестве \mathbb{Z}_m можно определить арифметическим операции. Сумму классов вычетов определяют следующим образом:

[x]_m + [y]_m = [x + y]_m

Если в качестве представителей классов [x]_m брать наименьшие неотрицательные числа x \: \textrm{mod} \: m, принадлежащие соответствующему классу, то формула принимает более удобный вид:

[x]_m + [y]_m = [(x + y) \: \textrm{mod} \: m]_m
Скрытый текст

Тогда [0]_m - нейтральный элемент по сложению, а -[x]_m = [m - x]_m - противоположный.

Аналогично вводится и операция умножения:

[x]_m \cdot [y]_m = [x \cdot y]_m = [(x \cdot y) \: \textrm{mod} \: m]_m
Скрытый текст

Тогда [1]_m- нейтральный элемент по умножению, а [x^{-1}]_m : x \cdot x^{-1} \: \textrm{mod} \: m = 1 - обратный. Обратите внимание, [x^{-1}]_m также является классом вычетов и, соответственно, его представители - целые числа.

Пример. Рассмотрим [4]_7. Тогда [4^{-1}]_7 = [2]_7, так как 4 \cdot 2 \: \textrm{mod} \: 7 = 1.

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

Пример. Рассмотрим множество \mathbb{Z}_6 = \{ [0]_6, [1]_6, [2]_6, [3]_6, [4]_6, [5]_6 \} классов вычетов по модулю 6.

[4]_6 + [5]_6 = [9]_6 = [9 \: \textrm{mod} \: 6]_6 = [3]_6[4]_6 \cdot [5]_6 = [20]_6 = [20 \: \textrm{mod} \: 6] = [2]_6

Используя наименьших неотрицательных представителей классов, можно представить множество \mathbb{Z}_6 как \{ 0, 1, 2, 3, 4, 5 \}. Тогда

4 + 5 = 9 \equiv 3 \: (\textrm{mod} \: 6)4 \cdot 5 = 20 \equiv 2 \: (\textrm{mod} \: 6)

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

Группы

Группа G - это непустое множество элементов, на котором задана операция  *, результат которой также принадлежит этой группе. Элементы группы обладают большинством свойств, к которым мы привыкли при работе с "обычными" (вещественными) числами, за одним важным исключением: без дополнительных оговорок порядок элементов в операции важен, от перемены мест слагаемых результат может измениться. Если результат операции в группе не зависит от порядка элементов, такая группа называется коммутативной (или абелевой).

Скрытый текст

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

Скрытый текст

Пусть G - непустое множество, на котором задана бинарная операция (x, y) \rightarrow x*y, результат которой также принадлежит группе (*: G \times G \rightarrow G, говорят, что группа замкнута относительно данной операции).

Это множество называется группой, если оно обладает следующими свойствами:

  1. Для любых трех элементов x, y, z \in G выполняется равенство: x * (y * z) = (x * y) * z. В этом случае говорят, что операция обладает свойством ассоциативности.

  2. Существует нейтральный элемент (единица группы) e \in G такой, что для любого элемента x \in G выполняется равенство: e * x = x = x * e

  3. Для любого элемента x \in G существует единственный элемент y \in G такой, что: x * y = e = y * x. Элемент y называется обратным к элементу x.

  4. Если, кроме того, множество G обладает 4 свойством: x * y = y * x для любых x, y \in G, тогда группа называется коммутативной (или абелевой).

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

Обычно, в  качестве операции * используются привычные операции умножения и суммирования. В случае суммы операция обозначается привычным знаком +, обратный элемент к элементу x обозначается как -x и называется противоположным, а нейтральным элементом является 0. Тогда требования к группе можно записать в следующем виде:

  1. для любых x, y, z \in G x + (y + z) = (x + y) + z (можем раскрывать, менять и добавлять скобки по привычным нам правилам)

  2. существует элемент 0 \in G такой, что x + 0 = x = 0 + x (прибавление нейтрального элемента - нуля - не изменяет элемент x)

  3. для любого x \in G существует элемент -x такой, что x + (-x) = 0 = (-x) + x (существует противоположный элемент, аналог отрицательного числа)

В этом случае группа называется аддитивной или группой по сложению.

Определим еще одну важную операцию - скалярное умножение элемента x аддитивной группы G на натуральное число n:

n \cdot x = \underbrace{x + x + \dots + x}_{n}

Тогда

-n \cdot x = \underbrace{(-x) + (-x) + \dots + (-x)}_{n} = -1 \cdot (n \cdot x) = n \cdot (-x)0 \cdot x = 0 = x \cdot 0

И, соответственно, для любых целых чисел

m \cdot x + n \cdot x = (m + n) \cdot x
Скрытый текст

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

В случае произведения операцию обозначают через \cdot, * или знак операции не пишут вовсе, обратный элемент обозначается как x^{-1}, а нейтральным элементом является 1. Требования к группе можно записать в следующем виде:

  1. для любых x, y, z \in G x \cdot (y \cdot z) = (x \cdot y) \cdot z

  2. существует элемент 1 \in Gтакой, что x \cdot 1 = x = 1 \cdot x

  3. для любого x \in G существует элемент x^{-1} такой, что x \cdot x^{-1} = 1 = x^{-1} \cdot x

В этом случае группа называется мультипликативной или группой по умножению.

Определим возведение в натуральную степень nэлемента x мультипликативной группы G следующим образом:

x^n = \underbrace{x \cdot x \cdot \, \dots \, \cdot x}_{n}

Тогда

x^{-n} = \underbrace{x^{-1} \cdot x^{-1} \cdot \, \dots \, \cdot x^{-1}}_{n} = (x^n)^{-1} = (x^{-1})^nx^0 = 1

И, соответственно, для любых целых чисел m, n:

x^m \cdot x^n = x^{m + n}
Скрытый текст

Пример. Различные примеры групп всем знакомы со школы:

  • Множество целых чисел \mathbb{Z} является группой по сложению. Это легко проверить, все привыкли пользоваться свойствами группы, для целых чисел они кажутся естественными. Более того, целые числа являются абелевой группой. Однако это множество не является группой по умножению, так как только два элемента среди целых чисел имеют обратные: \pm 1. Чтобы различать группы по сложению и умножению относительно одного и того же множества, мы будем указывать рассматриваемую операцию справа сверху от символа множества, например, \mathbb{Z}^+ - группа целых чисел по сложению, \mathbb{Z}^*- группа целых чисел по умножению. Тогда \mathbb{Z}^+ = \mathbb{Z}, \mathbb{Z}^* = \{ \pm 1 \}.

  • Множество натуральных чисел \mathbb{N} не является группой по сложению, так как для элементов не существует противоположных.

  • Все ненулевые элементы множества рациональных чисел образуют группу по умножению \mathbb{Q}^* = \mathbb{Q} \backslash \{ 0 \}.

  • Все ненулевые элементы множества вещественных чисел образуют группу по умножению \mathbb{R}^* = \mathbb{R} \backslash \{ 0 \}.

  • Все четные числа образуют группу по сложению. Множество четных числе можно представить как \{ 2n | \: n \in \mathbb{Z} \}. Тогда ноль входит в эту группу и является нейтральным элементом, сумма четных чисел четна, а противоположным к элементу 2n является элемент -2n. В общем случае, любое подмножество целых чисел, представимое в виде m\mathbb{Z} = \{m \cdot n | \: n \in \mathbb{Z}\}, образует группу по сложению.

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

Подмножество элементов группы G называется подгруппой группы G, если оно само является группой.

Скрытый текст

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

Пример. Рассмотрим группу целых чисел относительно сложения \mathbb{Z}^+. Возьмем ее подмножество \mathbb{N} - множество всех натуральных чисел. Это подмножество не является группой по сложению, так как, как минимум, оно не содержит обратных элементов.

Количество элементов в группе называется порядком группы и обозначается через|G|.

Группа называется конечной, если она содержит конечное количество элементов (|G| < \infty), иначе группа называется бесконечной (|G| = \infty).

Далее будем рассматривать только конечные группы. Пусть G - конечная мультипликативная группа, g - элемент группы G. Рассмотрим последовательность элементов 1, g, g^2, g^3, g^4, \dots Так как группа конечна, то очевидно, что, начиная с некоторой степени, элементы начнут повторяться. Следовательно, существует натуральное число n такое, что g^n = 1.

Скрытый текст

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

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

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

И именно к решению этой задачи мы, в том числе, совсем скоро и придём в нашем повествовании

Группа, все элементы которой являются степенями какого-то элемента g \in G называется циклической подгруппой группы G и обозначается \langle g \rangle. Говорят, что циклическая подгруппа\langle g \rangle = \{ g^n | \: n \in \mathbb{Z} \} порождена элементом g, g - образующий элемент (генератор) этой циклической подгруппы. Группа G называется циклической, если существует элемент g такой, что \langle g \rangle = G. Все циклические группы абелевы. Наименьшее натуральное число n такое, что g^n = 1, называется порядком элемента g и обозначается \textrm{ord}(g) = n (\textrm{ord}(g) = \infty, если такого n не существует).

Циклическая подгруппа.
Циклическая подгруппа.
Скрытый текст

Пример. Вернемся к рассмотренным раннее классам вычетов. Важным примером конечной циклической группы, которая активно используется в криптографии, является группа классов вычетов \mathbb{Z}_n по модулю натурального числа n. Множество \mathbb{Z}_n является группой по сложению, нейтральным элементов является класс вычетов [0], а образующим элементом - [1].

Легко проверить, что множество классов вычетов обладает всеми свойствами группы по сложению. Однако множество \mathbb{Z}_n не является группой по умножению. В группу по умножению \mathbb{Z}_n^* входят все обратимые элементы множества \mathbb{Z}_n. Элемент [0] не имеет обратного для любого натурального числаn, поэтому его надо исключить из группы по умножению. Более того, не при любых значенияхnвсе остальные элементы множества \mathbb{Z}_n будут иметь обратные. Забегая вперед, скажем, что все ненулевые элементы множества \mathbb{Z}_n являются элементами группы \mathbb{Z}_n^* тогда и только тогда, когда n - простое число.

Теорема. Пусть G = \langle g \rangle - циклическая группа. Тогда любая подгруппа группы G тоже циклическая.

Теорема (Лагранжа). Порядок и индекс подгруппы делят порядок группы.

Мы не будем вдаваться в подробности и определять понятие индекса подгруппы. Для нас будут больше важны следствия из этой теоремы:

  • Порядок любого элемента конечной группы делит порядок группы.

  • Для любого элемента a конечной группы порядкаnимеет место равенство: a^n = 1.

  • Если d - порядок элемента a \in G, |G| = n, то a^n = 1 тогда и только тогда, когда d делит n.

Теорема. Пусть G - группа (не обязательно циклическая), g \in G, \mathrm{ord}(g) = n. Тогда,

\mathrm{ord}(g^m) = \frac{n}{\text{НОД}(n, m)}

, где m, n \in \mathbb{Z}, НОД(n, m) - наибольший общий делитель чисел m и n.

Пусть G = \langle g \rangle - циклическая группа, |G| = \textrm{ord}(g) = |\langle g \rangle| = n. Сколько элементов g^m таких, что \langle g^m \rangle = G, где m - целое число? (Сколько образующих у конечной циклической группы порядка n?)

Так как g^m \in G:

|\langle g \rangle| = \textrm{ord}(g^m) = \frac{n}{\textrm{НОД}(n, m)}

Тогда если \langle g^m \rangle = G, то:

\frac{n}{\textrm{НОД}(n, m)} = n \Leftrightarrow \textrm{НОД}(n, m) = 1

Следовательно, n и m должны быть взаимно простыми. Т.е. у конечной циклической группы порядка n столько образующих элементов, сколько чисел 1 \leq m \leq n - 1 таких, что\textrm{НОД}(n, m) = 1.

Скрытый текст

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

И тут нам окажется крайне полезна функция Эйлера.

Функция Эйлера \varphi(n) - функция, значение которой равно количеству натуральных чисел, которые меньше n и взаимно просты с ним.

Таким образом, конечная циклическая группа порядка n содержит ровно \varphi(n) образующих. Кроме того, если целое число d делит порядок группы n, то в группе существует единственная подгруппа порядка d.

Функция эйлера обладает свойством мультипликативности: \varphi(mn) = \varphi(m) \cdot \varphi(n).

Если число p - простое, то все числа меньше p взаимно просты с ним, следовательно\varphi(p) = p - 1. Рассмотрим число p^n, где p - простое, n - натуральное. Тогда среди натуральных чисел, меньших p^n - 1, не взаимно просты с p^n только числа, кратные p, т.е.  p, 2p, 3p, \dots, p^{n-1}p. Всего таких чисел p^{n - 1}. Следовательно, \varphi(p^n) = p^n - p^{n - 1}.

Теорема (Основная теорема арифметики). Любое натуральное число n > 1представимо единственным образом в виде n = p_1^{d_1} \cdot p_2^{d_2} \cdot \: \dots \: \cdot p_k^{d_k}, где p_1 < p_2 < \dots < p_k - простые числа, d_i - натуральные, i = 1, \dots, k. Такое представление числа n называется каноническим разложением на простые сомножители.

Тогда, используя свойство мультипликативности функции Эйлера и основную теорему арифметики, для произвольного натурального числа n > 1

\varphi(n) = n \prod_{p | n} \bigg( 1 - \frac{1}{p} \bigg)

, где p - простое число, которое принимает все значения из разложения n на простые сомножители.

Теорема (Эйлера). Для любого натурального n и любого натурального a такого, что НОД(a, n) = 1, справедливо отношение

a^{\varphi(n)} \equiv 1 \: (\mathrm{mod} \: n)

Частным случаем теоремы Эйлера является малая теорема Ферма.

Теорема (Малая теорема Ферма). Для любого простого числа p и для любого целого числа a, не кратного p, справедливо отношение

a^{p - 1} \equiv 1 \: (\mathrm{mod} \: p)

Таким образом, возведение в большую степень n элемента g конечной циклической группы G, \textrm{ord}(g) = m, можно упростить:

g^n = g^{n \: \textrm{mod} \: m}

Поэтому представлять элементы в виде степеней образующего элемента группы довольно удобно. Теорема Эйлера активно используется в криптографии. Пусть x, y \in \{ 1, \dots, m - 1 \} такие, что x \cdot y = 1 \: (\textrm{mod} \: m). И пусть h = g^k, k \in \{ 0, 1, \dots, m - 1 \}. Тогда

(h^x)^y = h^{xy} \equiv h^1 = h

Найти числа x, y можно также по теореме Эйлера:

x \cdot y = 1 \: (\textrm{mod} \: m) \implies y = x^{-1} \equiv x^{\varphi(m) - 1} \: (\textrm{mod} \: m)

Таким образом, образующие элементы активно используются на практике, особенно в криптографии.

Скрытый текст

Осталось потерпеть совсем немного - с основной теорией мы почти закончили и уже совсем скоро перейдём к практике.

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

Алгоритм.

Вход: порядок n циклической мультипликативной группы G, разложение на простые сомножители n = p_1^{d_1} \cdot p_2^{d_2} \cdot \: \dots \: \cdot p_k^{d_k}, где p_i - разные простые числа, d_i - натуральные, i = 1, \dots, k;

Выход: образующий элемент g \in G;

  1. выбрать случайный элемент g \in G

  2. для i \leftarrow 1 до k:

    1. b \leftarrow g^{n / p_i}

    2. если b = 1, то перейти к 1

  3. вернуть g

Пояснение к алгоритму. Порядок любого элемента группы делит порядок группы, поэтому перебираем делители порядка группы n вида n / p_i . Если g^{n / p_i} = 1, то существует числоm \in \{ 1, 2, \dots, d_i \} такое, что g^{n / p_i^m} = 1. Так как n / p_i^m делит n / p_i, то

g^{n / p_i} = (g^{n / p_i^m})^{p_i^{m-1}} = 1^{p_i^{m-1}} = 1

И наоборот, если g^{n / p_i} \neq 1, то g^{n / p_i^m} \neq 1 для любого m \in \{ 1, 2, \dots, d_i \}.

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

\frac{\varphi(n)}{n} > \frac{1}{e^{\gamma} \ln \ln n + 2.50637 / \ln \ln n }

для n \geq 3, где \gamma - постоянная Эйлера. Более того, если взять в качестве n большое простое число, это отношение будет близко к единице.

Скрытый текст

Соотношение выше было взято из Rosser J.B., Schoenfeld L. Approximate formulas for some functions of prime numbers. 1962. Illinois J. Math. 6 (1): 64–94. Theorem 15.

Если алгоритм используется в мультипликативной группе вычетов по модулю простого числа \mathbb{Z}_p^*, то его эффективность можно повысить. Для этого необходимо выбрать число p = qr + 1, где p, q - простые числа, r - относительно небольшое натуральное число. Числа вида p = qr + 1 называются безопасными простыми числами (обычно, r = 2). При таком выборе числа p разложение на простые сомножители порядка группы | \mathbb{Z}_p^* | = p - 1 является тривиальной задачей: p - 1 = qr. При r = 2

\varphi(p - 1) = \varphi(rq) = \varphi(2) \cdot \varphi(q) = \varphi(q) = q - 1

Тогда вероятность того, что случайно выбранный элемент g \in \mathbb{Z}_p^* является образующим элементом, равна

\frac{\varphi(n)}{n} = \frac{q - 1}{2q} \approx \frac{1}{2}
Скрытый текст

Почитать про безопасные простые числа можно в T. Agoh. On Sophie Germain primes, Tatra Mt. Math. Publ. 20(65) (2000), pp. 65-73.

Автоматизация вычисления с помощью SageMath

Скрытый текст

SageMath - это свободная математическая программная система с открытым исходным кодом, распространяемая по лицензии GPL.

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

Для этого здесь и в последующих статьях я буду использовать SageMath. Вы можете установить данное ПО локально по инструкции либо использовать платформу CoCalc. Я воспользовался вторым вариантом, так как на платформе CoCalc есть возможность создать Jupyter Notebook и использовать его бесплатно без доступа в интернет. Нам доступ в интернет и не понадобится.

Реализация вероятностного алгоритма поиска образующего элемента циклической группы:

from sage.all import *

# выбираем простое число
prime = 6053
# создаем группу классов вычетов Zp
G = Integers(prime)

# вероятностный алгоритм поиска образующего элемента группы
def find_primitive_element(G):
    # вычисляем порядок группы по умножению
    multiplicative_order = euler_phi(G.order())
    
    # получаем простые делители порядка мультипликативной группы
    divisors = prime_divisors(multiplicative_order)
    while True:
        g = G.random_element()
        if g == 0:
            continue

        for d in divisors:
            if g**(multiplicative_order / d) == 1:
                break
        else:
            return g

g = find_primitive_element(G)
print(g)
assert g.multiplicative_order() == euler_phi(prime) # prime - 1

И что вам делать с этой информацией?

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

В следующей статье мы перейдём к понятиям кольца и поля, а затем начнём работать уже непосредственно с конечными полями. Рассмотрим поля вида GF(p^m) в общем случае, а также подробно разберём поля GF(2) и GF(2^4). Построим их вручную, выполним основные вычисления и посмотрим, как автоматизировать всю эту работу с помощью SageMath.

Спасибо за уделённое время! Если тема оказалась вам интересна - следите за выходом следующих статей.