Мне хочется продолжить свои изыски, чтобы в итоге “отвелосипедить” функцию Эйлера; я статью в Вики про неё ещё не читал, и пока даже не просмотрел внимательно ответы в теме.
Переписал алгоритм и думал что он должен ускориться, но нет – чуть даже замедлился. Попробовал немного провести “среднеуровневую оптимизацию” (поварьировал размеры динамических массивов и пр.) – не помогло. Тогда я упростил код, убрав дополнительные массивы – стало чуть быстрее и заодно уменьшилась потребность в памяти. Итого новый алгоритм всего на 20% быстрее считает график выше, и ясно что без функции Эйлера тут никак.
В новом алгоритме изначально быстрее стал заполнятся массив со списком простых чисел для каждого перебираемого числа, но это ничего не изменило, поскольку лимитирующей стадией является перебор N*N пар чисел. Для каждой итерации этого перебора, разные алгоритмы ещё запускали один цикл или два вложенных цикла (по спискам простых делителей), но особой разницы не было. Если мы считаем P(100000), то итераций будет 10 миллиардов и на моём компьютере всё это считается примерно 5 минут.
Вот код который считает очень быстро, код очень простой, одна строчка на pari/gp:
Как-то уж очень просто. Как я понимаю, вы с вашими высокоуровневыми языками программирования можете найти готовую библиотеку для чего угодно, а я привык изобретать велосипеды со своим Delphi. И вдруг я когда-то довелосипедируюсь до того, что придумаю что-то новое, чего в ваших библиотеках нет?