Числа Мерсенна и Ферма — различия между версиями

Материал из Модулярная арифметики
Перейти к: навигация, поиск
Строка 88: Строка 88:
  
 
где <math>N = 2^{e_j}</math> и <math>0 \le a_j < 2^{e_j}</math> при <math>0 \le k \le t </math>.
 
где <math>N = 2^{e_j}</math> и <math>0 \le a_j < 2^{e_j}</math> при <math>0 \le k \le t </math>.
 +
 +
Тогда <math>A \equiv {(a_t + a_{t-1} + \ldots + a_1 + a_0)} \pmod {2^{e_j}-1}</math>, поскольку <math>N \equiv 1 \pmod{2^{e_j}-1}</math>.
 +
 +
Поэтому <math>{\alpha}_j</math> вычисляются путём сложения <math>e_j</math>-битовых чисел <math>{a_t \oplus a_{t-1} \oplus \ldots \oplus a_1 \oplus a_0} \pmod{2^{e_j}-1}</math>.
 +
 +
3. Обратное преобразование для чисел Мерсенна. Метод Гарнера.
 +
 +
Обратный переход от СОК к позиционной системе счисления несколько сложнее. Как мы видели при доказательстве китайской теоремы об остатках, при вычислении обратных мультипликативных элементов требуется уметь вычислять значение функции Эйлера, которое в общем случае требует факторизации, т.е. разложения чисел <math>p_j</math> на простые множители. Даже это обстоятельство показывает, что обратное преобразование чисел из СОК в позиционную систему счисления в соответствии сэтим алгоритмом требует большого числа вычислительных операций с высокой точностью, а именно этого хотелось бы избежать.
 +
Метод перехода от <math>{\alpha}_1, {\alpha}_2, \cdots, {\alpha}_n</math> к <math>A</math>, пригодный для практического применения, основан на другом доказательстве китайской теоремы об остатках. Такое доказательство предложено в 1958 г. Х. Л. Гарнером. Оно основано на использовании <math>{C_n}_k</math> констант <math>c_{i,j} (1 \le i \le j \le k)</math>, где
 +
:<math>c_{i,j} \equiv 1 \pmod{p_j}</math>. (3)

Версия 14:03, 25 декабря 2014

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


Определение

Числа Мерсенна — числа вида M_n = 2^n - 1, где n — натуральное число. Названы в честь французского математика Марена Мерсенна.

Иногда числами Мерсенна называют только числа M_n с нечетными или простыми индексами n.

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

При простых значениях n = p число может оказаться простым, но может быть составным. Например, при p = 2, 3, 5, 7, 13, 17, 19 мы получаем простые числа Мерсенна: 3, 7, 31, 127, 8191, 131071, а при p = 11, 23, 29 числа 2^p - 1 - составные.

Свойства чисел Мерсенна

  • Если M_n является простым, то число n также простое. Обратное в общем случае неверно, наименьшим контрпримером является M_{11} = 2047 = 23\cdot 89.
  • Любой делитель числа M_p для простого p имеет вид 2pk+1, где k — натуральное число (следствие малой теоремы Ферма).


Числа Мерсенна получили известность в связи с эффективным тестом простоты Люка — Лемера, благодаря которому простые числа Мерсенна давно удерживают лидерство как самые большие известные простые числа.


Определение

Числа Ферма — числа вида F_n=2^{2^n}+1, где n — неотрицательное целое число.


При n = 0, 1, 2, 3, 4 числа Ферма простые: 3, 5, 17, 257, 65537.

Все числа Мерсенна и Ферма – взаимно простые.


Необходимо отметить, что значения чисел Мерсенна и Ферма быстро растут. Это не позволяет только такими числами в качестве модулей СОК.


Операции над числами Мерсенна и Ферма

1. Если в качестве модулей p_j выбраны числа Мерсенна, т.е. числа вида p_j = 2^{e_j} - 1, для которых значение модуля на единицу меньше очередной степени двойки, это зачастую упрощает выполнение основных арифметических операций, так как выполнять вычисления с числами в таком представлении несколько проще, чем с числами, представленными в обратном коде.

При таком выборе модулей полезно несколько ослабить условие 0 \le {\alpha} < p_i и потребовать только чтобы

0 \le {\alpha}_j < 2^{e_j}, a_i \equiv A \pmod{{e_j}-1} . (1)

Таким образом, значение {\alpha}_j = p_j = 2^{e_j}-1 принимается в качестве оптимального вместо {\alpha}_j = 0, поскольку это, с одной стороны, не влияет на справедливость китайской теоремы об остатках, а с другой означает, что math>{\alpha}_j</math> может быть любым math>{\alpha}_j</math>- битовым двоичным числом. При таком допущении, операции сложения и вычитания по модулю p_j выполняются следующим образом:


{\alpha}_j \oplus {\beta}_j  = (({\alpha}_j + {\beta}_j) \pmod{e_j}) + \lfloor ({\alpha}_j + {\beta}_j) \ge 2^{e_j} \rfloor,
{\alpha}_j \otimes {\beta}_j  = ({\alpha}_j \cdot {\beta}_j \pmod{e_j}) \oplus \lfloor ({\alpha}_j \cdot {\beta}_j) / 2^{e_j} \rfloor.

Здесь  \oplus и  \otimes указывают на действия, которые с учётом условия (1) должны быть выполнены с отдельными компонентами кортежей {\alpha}_1, {\alpha}_2, \cdots, {\alpha}_n и {\beta}_1, {\beta}_2, \cdots, {\beta}_n при сложении или умножении соответственно. При вычитании можно пользоваться и соотношением:

{\alpha}_j \ominus {\beta}_j  = ({\alpha}_j - {\beta}_j \pmod{e_j}) - \left[ {\alpha}_j < {\beta}_j \right].

Эти операции могут быть эффективно выполнены, даже если 2^{e_j} больше машинного слова компьютера, так как совсем просто вычислить остаток положительного числа по модулю степени 2 или разложить число по степеням 2. Для работы с модулями вида 2^{e_j}-1 необходимо знать, при каких условиях число 2^{e_j}-1 является взаимно простым с числом 2^{\beta}-1. Для этого существует простое правило:

(2^e-1,2^{\beta}-1) = 2^{e,\beta}-1. (2)

Формула (2) утверждает, в частности, что

(2^e-1,2^{\beta}-1) = 1 \Leftrightarrow (e,\beta) = 1.

Уравнение (2) следует из алгоритма Евклида и тождества

{(2^e-1)} \pmod {2^{\beta}-1} = 2^{e \pmod {b}} - 1.

Поэтому на компьютере с длиной слова 2^{32} можно выбрать

p_1 = 2^{32} - 1, p_2 = 2^{31} - 1, p_3 = 2^{29} - 1, p_4 = 2^{27} - 1, p_5 = 2^{25} - 1,

что обеспечивает эффективность сложения, вычитания и умножения целых чисел в интервале вплоть до p_1 \cdot p_2 \cdot p_3 \cdot p_4 \cdot p_5 > 2^{143}.

2. Прямое преобразование для чисел Мерсенна

Модулярное представление ({\alpha}_1, {\alpha}_2, \ldots, {\alpha}_n) для заданного числа A может быть получено посредством деления A на (p_1, p_2, \ldots, p_n) с запоминанием остатков. В случае, когда A = {({\nu}_k, {\nu}_{k-1}, \ldots, {\nu}_0)}_b, возможно применение более подходящего способа, который состоит в том, чтобы, используя СОК, вычислить полином

(\ldots ({\nu}_k \cdot b + {\nu}_{k-1}) \cdot b + \ldots ) b + {\nu}_0).

Если основание b = 2 и модули p_j имеют вид 2^{e_j}-1, оба подхода сводятся к совсем простому способу.

Рассмотрим двоичные представления числа A с блоками по {e_j} бит:

A = a_t \cdot N^t + a_{t-1} \cdot N^{t-1} + \ldots + a_1 \cdot N + a_0,

где N = 2^{e_j} и 0 \le a_j < 2^{e_j} при 0 \le k \le t .

Тогда A \equiv {(a_t + a_{t-1} + \ldots + a_1 + a_0)} \pmod {2^{e_j}-1}, поскольку N \equiv 1 \pmod{2^{e_j}-1}.

Поэтому {\alpha}_j вычисляются путём сложения e_j-битовых чисел {a_t \oplus a_{t-1} \oplus \ldots \oplus a_1 \oplus a_0} \pmod{2^{e_j}-1}.

3. Обратное преобразование для чисел Мерсенна. Метод Гарнера.

Обратный переход от СОК к позиционной системе счисления несколько сложнее. Как мы видели при доказательстве китайской теоремы об остатках, при вычислении обратных мультипликативных элементов требуется уметь вычислять значение функции Эйлера, которое в общем случае требует факторизации, т.е. разложения чисел p_j на простые множители. Даже это обстоятельство показывает, что обратное преобразование чисел из СОК в позиционную систему счисления в соответствии сэтим алгоритмом требует большого числа вычислительных операций с высокой точностью, а именно этого хотелось бы избежать. Метод перехода от {\alpha}_1, {\alpha}_2, \cdots, {\alpha}_n к A, пригодный для практического применения, основан на другом доказательстве китайской теоремы об остатках. Такое доказательство предложено в 1958 г. Х. Л. Гарнером. Оно основано на использовании {C_n}_k констант c_{i,j} (1 \le i \le j \le k), где

c_{i,j} \equiv 1 \pmod{p_j}. (3)