312
ГЛАВА 7. ЦИКЛИЧЕСКИЕ ВЫЧИСЛЕНИЯ
Надежность программы можно (и нужно!) повысить путем встраивания
дополнительной проверки того, что N не превосходит размера массива
a
.
Но это не избавит от необходимости учета того, что размер ячейки может
оказаться недостаточным для хранения очередного простого числа. А если
воспользоваться типом
double int
для массива
a
, то это удвоит потребность
в памяти. Таким образом, размеры массива должны быть согласованы с раз-
мерами хранимых в нем значений.
Сократить потребности в памяти при решении запоминать ранее найден-
ные простые числа можно, если хранить не сами числа, а разности соседних
простых чисел. Разности требуют существенно меньше места, чем сами чи-
сла. Это видно уже из сопоставления указанных величин для начала после-
довательности простых чисел
:
1 - 7 2 19 2 37 6 53 6 71 4 89 6 107 4
2 1 11 4 23 4 41 4 59 4 73 2 97 8 109 2
3 1 13 2 29 6 43 2 61 2 79 6 101 4 113 4
5 2 17 4 31 2 47 4 67 6 83 4 103 2 127 14
Разумеется, таких наблюдений недостаточно, требуется математическая
проработка вопроса, чтобы определить, насколько оправдан переход к разно-
стям, когда и как скажется эффект разницы роста скоростей двух последова-
тельностей и т. д. При этом надо помнить и о том, что хранение разностей
потребует дополнительно разработать алгоритм перехода от разностей к са-
мим простым числам (чуть ниже будет показано, что можно согласовать ра-
боту этого алгоритма с организацией проверки простоты очередного числа).
Еще один важный вопрос, в связи с программой
Prime_Numbers_2
, о том,
почему выбрана проверка простоты числа i в данном порядке.Исходные усло-
вия для организации проверки минимальны: наличие множества найденных
простых чисел, не превосходящих i. Никаких предположений об упорядо-
ченности этого множества нет. Да и не нужны они, если речь идет о матема-
тической задаче. Способ порождения этого множества таков, что его элемен-
ты появляются в соответствии с последовательностью простых чисел. Если
бы явно требовался другой порядок, его нужно было бы построить. Если же
не требуется никакой порядок, то, в частности, можно остановиться на по-
рядке порождения, как целесообразно для решаемой задачи, поскольку ве-
роятность делимости числа на малые числа выше, чем на большие. Это на-
блюдение использовано в программе
Prime_Numbers_2
при выборе порядка
итераций проверочного цикла:
for( j=2, Prime = true; Prime && a[j]<=sqrt(i); j++)