Простые числа вида k * 2 n +1
Как видите, менее чем за 5 секунд удалось отбраковать более 66% чисел! Давайте попробуем увеличить таблицу.
t
=
Sort[DeleteCases[Array[f3.
25.3
],Null]]
{{
3.1
},{
4.3
},{
10.7
),{
12.2
},{
18.14
),{
28.9
},{
36.28
),{
39.29
},
{
48.5
},{
51.4
2
},{
52.9
},{
58.37
},{
60.24
},{
66.60
},{
82.51
},{
100.81
}}
Опять считаем процент отбракованных чисел и замеряем время.
prog
//Timing
Yes
=
25645
; No
=
74355
{
7.188
Second, Null}
Время отбраковки возросло чуть более чем на 2 секунды, а отбраковали мы более 74% чисел! Значит, таблицу стоит увеличить.
t
=
Sort[DeleteCases[Array[f3.
100.3
], Null]];
Опять измеряем время.
prog
//Timing
Yes
=
21055
; No
=
78945
{
14.765
Second, Null}
Как видим, таблицу увеличивать стоило! Время отбраковки, конечно, возросло, притом более чем вдвое, но 15 секунд по сравнению с часами счета роли не играют. Так что увеличение таблицы окупает себя! Увеличиваем таблицу еще.
t
=
Sort[DeleteCases[Array[f3.
1000.3
],Null]];
Теперь снова измеряем время и процент отбраковки.
prog
//Timing
Yes
=
15388
; No
=
84612
{
84.64
Second, Null}
Конечно, время возросло: теперь отбраковка занимает более одной минуты. Но проверять по-настоящему придется чуть более 15% чисел! Потратив дополнительно на предварительную отбраковку немногим более одной минуты, мы почти в 8 раз уменьшим количество чисел, которые надо будет проверить на простоту. Так что увеличение таблицы оправдало себя и на этот раз. Поэтому еще раз увеличиваем таблицу.
t
=
Sort[DeleteCasestArray[f3,
10000.3
],Null]];
//Timing
{
90.703
Second, Null}
На этот раз сама генерация таблицы занимает более полутора минут. Но и это время окупается.
prog
//Timing
Yes
=
12123
; No
=
87877
{
630.734
Second, Null}
Количество чисел, которые подлежат проверке на простоту, мы уменьшили более чем в 8 раз! Может быть, стоит увеличить таблицу еще? Ну, на этот раз, во всяком случае, уж точно не в 10 раз. Ведь ждать генерации таблицы несколько часов – занятие весьма неприятное! Поэтому лучше сначала попытаться увеличить таблицу, скажем, в 2.5 раза.
t
=
Sort[DeleteCases[Array[f3.
25000.3
],Null]];
//Timing
{
629.781
Second, Null}
На генерацию таблицы понадобилось почти десять с половиной минут. Заметно, что время генерации таблицы растет нелинейно с ростом таблицы. Наверное, нужно проверить, не пора ли остановиться.
prog
//Timing
Yes
=
11129
; No
=
88871
{
1405.2
Second, Null}
На отбраковку потрачено почти двадцать четыре минуты. Это существенно больше, чем в предыдущем случае. Несмотря на это, дополнительно отбраковать удалось чуть более одного процента чисел. Кажется, пора остановиться. (Конечно, это довольно грубый и притом субъективный критерий останова.)
Теперь можем приступить к написанию программы. Пусть ее заголовок (имя и список параметров) будет М3n[n_]. (Параметр n – верхний конец диапазона, в котором происходит перебор.) Прежде всего нужно решить следующий вопрос: как использовать таблицу так, чтобы не пропустить ни одного простого числа вида 3*2n +1 даже в том случае, если оно использовалось при построении таблицы. Конечно, можно заблаговременно составить список n для таких чисел. Но это значит, что список п для таких чисел нужно составить по другой программе, решающей фактически ту же задачу, "решением которой мы сейчас как раз и заняты.