Простые числа вида 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
}}