Интересно, что для доказательства правильности вашего алгоритма требуется довольно глубокая математическая теорема. Теорема такова: «Для каждого n ≥ 2 существует простое число между n и n ^ 2». Я знаю, что это было доказано, и гораздо более строгие границы доказаны, но я должен признать, что я не знаю, как доказать это сам. И если эта теорема не верна, то цикл в am_i_prime может выйти за границы массива.
Число простых чисел ≤ k равно O (k / log k) - это опять-таки очень глубокая математическая теорема. Опять за меня доказать.
Но в любом случае, существует около n / log n простых чисел до n, и для этих простых чисел цикл будет перебирать все простые числа до n ^ (1/2), и есть O (n ^ (1/2) ) / журнал п) из них.
Таким образом, для одних простых чисел время выполнения, следовательно, равно O (n ^ 1,5 / log ^ 2 n), так что это нижняя граница. Приложив некоторые усилия, можно доказать, что для всех чисел время выполнения асимптотически одинаково.
O (n ^ 1,5 / log n), очевидно, является верхней границей, но экспериментально число делений для нахождения всех простых чисел ≤ n представляется равным ≤ 2 n ^ 1,5 / log ^ 2 n, где log - натуральный логарифм .