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

Простые числа вида 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 для таких чисел. Но это значит, что список п для таких чисел нужно составить по другой программе, решающей фактически ту же задачу, "решением которой мы сейчас как раз и заняты.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.