Таким образом, на каждую цепочку делаем не менее одной проверки на простоту. Предположительно, именно эта проверка и является основным потребителем времени.
Это несложно проверить: замените ispseudoprime на 1 (условие срабатывает всегда) и замерьте время. Оно будет чуть заниженным, но если в среднем одна ispseudoprime на цепочку, то не сильно. И сравните насколько тормозит проверка простоты вместе с делением в аргументе.
Участок кода, отсюда post1711836.html#p1711836 вот этот:
Смотрите, тут выполняется одно короткое деление при получении d (пока k<2^43 для pr около 2^20, т.е. <8трлн цепочек, а раз до 2^20 доходит редко, то и для ещё больших k) для каждой цепочки и для каждого простого 59..2^20 (пока не оборвётся), потом выполняется в общем почти всегда короткое умножение (переполнения nn[] сверх 2^64 нечасты) и потом длинное деление только вместе с ispseudoprime, которое уже можно смело не считать (проверка простоты на два порядка медленнее деления).
В итоге самое долгое кроме ispseudoprime - %pr[i] при вычислении d, остальное (включая и умножение там же) слёзы.
Ещё, раз код именно такой, то в нём оказывается нет "терапевтики" т.е. отброса цепочек в которых простые 3..53 попали внутрь цепочки и увеличили степень. Обычно это делается примерно так: после получения правильного длинного n выполняем
x=n+#v-1; if(x%3^6<#v, next); forprime(p=5,53, if(x%p^3<#v, next(2)); ); - всё, это отбросит цепочку если внутрь попали простые 3..53 (те что расставлены в паттерн, в данном случае в паттерне есть 3^5, остальные только в квадратах) и повысили свою степень (на чужие места они попасть не могут, только к себе же). Не знаю почему в Вашем коде этого нет, это прилично фильтрует неподходящие цепочки, ну или я не заметил.
Кажется, что при подсчётах переполненности делителями, надо использовать "настоящую" формулу количества делителей, с учётом степени простого множителя, а не предполагать свободу от квадратов.
Этим кажется Антон и занимается. Только смысла в этом немного: тесты показывали что степени выше первой встречаются где-то 1 на 10000 (отфильтровывались 10 цепочек из 191 из общего набора 100000), при том что квадрат вместо первой степени недопустим, только ещё высшие степени, которые ещё реже. Т.е. даже проверка на квадрат улучшит фильтрацию очень и очень незначительно, зато потребует (длинных) делений для
каждого найденного делителя. Так что тут выбор, или вероятность пропустить решение (если появится куб в разложении, это миллионные доли вероятности) или вероятность не отбросить цепочку и продолжить её проверку (если степень выше первой и не подходит, это сотые процента) - или же продолжить проверку дальше, зато быстрее. Мы дружно посчитали что такие малые вероятности не стоят замедления перебора. Такую проверку можно добавить где-то на 5-7 этапе (не знаю на каком, не помню их смысл, конкретно перед сложной факторизацией), когда цепочек уже мало и сделать ещё раз factor(n,2^20) уже не сильно тормозит проверку, но никак не на 1-3 этапе, где цепочек ещё слишком много.
-- 18.03.2026, 15:04 --Проверка какая степень у простого p в числе n+d-1: pows=valuation(n+d-1,p), даже без ручного цикла.