Иллюстрированный самоучитель по Mathematica 5

Простые числа вида k * 2 n +1

Теперь с помощью этой функции можно сгенерировать таблицу остатков и соответствующих им модулей.

Иллюстрированный самоучитель по Mathematica 5 › Модулярная арифметика: деление с остатком, вычеты, сравнения и китайская теорема об остатках › Простые числа вида k * 2 n +1

Чтобы в таблице сначала шли меньшие модули 5 (они помогают отбраковать больше кандидатов), таблицу пришлось отсортировать, предварительно вычеркнув из нее элементы NULL, которые соответствуют тем простым модулям q, для которых сравнение 5*2n +1 = 0 (mod q) неразрешимо.

Каждая пара в этой таблице описывает арифметическую профессию из показателей, для которых выполняется некоторое тождественное сравнение. Пусть, например, в таблице имеется пара (s, .t). Она была получена для некоторого простого числа q.

Ее наличие в таблице означает, что 5*2n +1 + 1 = 0 (mod q) для любых натуральных k.

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

fx[n_,t_] :=
Block!(1= Length[t],i=1,c=(i<=1)}, While[c,
{s,r}=t[[i]];answer=(Mod[n,s]!=r); i + +;
c=(i<=1)&&answer];answer]

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

prog :=
Block[fnn=200000,Yes=0,No=0, j=1}, While[j<=nn,
if[fx[j,t],Yes++,No++]; J+-2]; Print ["Yes = ", Yes, "; No=",No]]

Конечно, количество отбракованных чисел и время отбраковки зависят от размера таблицы t. Сначала давайте возьмем совсем небольшую таблицу.

t=Sort[DeleteCases [Array [f, 10.4],Null]]
{{3.2},{10.1},{11.5},{12.9),(18.11),{20.3},{28.20},{36.31}}

Теперь запускаем программу.

prog //Timing 
Yes= 27274; No= 72726
{5.188 Second, Null}

Как видите, за 5 секунд удалось отбраковать более 72% чисел! Давайте попробуем увеличить таблицу.

t=Sort[DeleteCases[Array[f,25.4],Null]]
{{3.2}, {10.1}, {11.5},{12.9},{18.11},{20.3},{23.14},
{28.20},{36.31},{51.22},{52.31},{58.23},
{60.8},{66.18},{82.14},{100.26},{106.6}}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.