Код:
for(i = 1, #allowed_mod11, if(p % 11 == allowed_mod11[i], ok11 = 1; break));
Смотрите, тут выражение p%11 будет вычисляться каждый раз, для каждого значения i, хотя оно от смены i никак не меняется и значит его можно вычислить заранее и внутри цикла лишь сравнивать:
Код:
m11=p%11; for(i = 1, #allowed_mod11, if(m11 == allowed_mod11[i], ok11 = 1; break));
Далее, от цикла можно совсем отказаться, в PARI есть команда поиска в сортированном массиве:
Код:
ok11=setsearch(allowed_mod11, p%11)>0;
Тут p%11 будет выполнено один раз, потом быстро-быстро (двоичным поиском, он быстр даже для столь коротких массивов) поищет в массиве результат.
Аналогично поменять и цикл по 13.
Далее:
Код:
if(isprime(p) && isprime(p+30) && isprime(p+60) && isprime(p+90) && isprime(p+120) && isprime(p+150),
Зачем здесь проверять простоту p, оно же и так гарантированно простое. Первая isprime лишняя.
Код:
if(is_true_CPAP_6_CLASSIC_IMPROVED(p),
В этой функции простите даже разбираться не буду, аж три вложенных цикла какие-то ... Достаточно же проверить лишь что между p и p+30 (и аналогично между другими) нет простых чисел, что делается простой командой
Код:
if(nextprime(p+1)==p+30,
Аналогично и для остальных интервалов, собираем их все в кучу аналогично проверке isprime:
Код:
if(nextprime(p+1)==p+30 && nextprime(p+31)==p+60 & nextprime(p+61)==p+90 && nextprime(p+91)==p+120 && nextprime(p+121)==p+150,
Да, это не самая быстрая проверка, но наверняка быстрее непонятных трёх вложенных циклов.
И хотя она перепроверяет и предыдущие isprime, но от них отказываться не стоит - isprime существенно быстрее nextprime, потому если кортеж не подходит, то пусть отбросится как можно быстрее, по isprime.
Ещё можно все isprime заменить на более быструю ispseudoprime (во всяком случае для чисел длиннее 19 цифр, для более коротких разницы в скорости может и не быть).
На первый взгляд всё.
Ещё можно перед isprime сделать проверку допустимости остатка по модулю малых простых (например из interval_sieve_primes[], хотя до 100 маловато, лучше 300-500-800, а больше 1000 эффекта обычно уже не добавляют), но это слишком много переделывать.
Дальше можно увеличивать шаг перебора p делая не просто nextprime(p+1), а сформировать (любым образом, например по КТО (Китайской Теореме об Остатках) или перебором) список допустимых остатков (смещений) от базового числа и проверять лишь те варианты смещений/остатков, которые могут дать кортеж, таковых будет заметно меньше полного числа (например сами видели что по модулю 7 допустим лишь один остаток 2, т.е. можно перебирать лишь каждое 7-е число, а точнее даже каждое 14-е так как каждое второе будет чётным и на роль p не подходит).
Конечно 14 слишком мало, можно взять например 2*3*7*11*13*17*19=1939938, это всего 10010 вариантов проверять из почти 2 миллионов чисел, всего лишь почти 0.5%, это выгодно вплоть до чисел из 80+ цифр.
PS. Вообще-то подчищать код за ИИ - дело неблагодарное, проще посмотреть на его и написать самому. Так что эта акция разовая.
-- добавлено через 6 минут --Ещё никак не пойму - почему один и тот же код в консоли выполняется за разное время.
Есть два кода, хотела сравнить их по эффективности, но время скачет у обоих раза в три примерно.
Хотя никакие процессы больше не запускала.
Это что-то в настройках компа странное. В части электропитания или профиля производительности.
Одинаковый код должен выполняться примерно одинаково (с точностью до 1% или до секунды, смотря что больше).
Если код некорректный, то первый запуск может быть дольше, из-за инициализации таблиц, но все последующие всё равно должны быть примерно одинаковыми.