VALЯ взял для теста
значений
i начиная с
(потому что там есть цепочка с ss=9, проходящая даже фильтр с 30млн, а основные тормоза как раз из-за numdiv на вероятных цепочках), для значений параметра 30млн, 10млн, 3млн, 1млн, 300тыс, 100тыс, 30тыс, 10тыс, 3тыс получились времена (везде с округлением до секунд):
104с, 70с,
57с, 54с, 55с, 59с, 64с, 71с, 86с (жирным - текущее значение).
Как прекрасно видно при ухудшении фильтрации в factor тормозить начинает numdiv. И текущее значение близко к оптимальному
для одного фильтра.
А теперь те же варианты (без последних двух, только по 30тыс), но с предварительным циклом до 10тыс:
55с, 52с, 51с, 51с, 54с, 59с, 64с.
И теперь варианты размера предварительного фильтра 10млн, 3млн, 1млн, 300тыс, 100тыс, 30тыс, 10тыс, 3тыс, 1тыс при постоянном размере основного в 30млн:
70с, 58с, 54с, 53с, 54с, 54с, 55с, 57с, 63с.
Т.е. достаточно много вариантов отсекается даже относительно плохими
но быстрыми фильтрами. А остальное можно допроверить и большим и не слишком тормозным. И оптимальной будет комбинация 10тыс плюс 10-3-1млн, дающая времена 52-51-51с (я бы взял большее значение в расчёте на увеличение чисел при счёте).
PS. Почти вдвое у меня время уменьшалось в другой программе, с ускорителем, с 15с на круг до 8с, это я перепутал.
PPS. Кстати статистика по фильтрации моей программой: на том же интервале 46-56e6 программа вернула в PARI 157180 цепочки, из них проверку на простоту трёх проверяемых чисел прошли 953, после проверок по MM[] осталось 258, после первого factor(,1e4) осталось 19, после второго factor(,3e6) осталась 1, numdiv она прошла. Время работы 6.4с, (вместо 51с без ускорителя), из которых на мою программу пришлось 0.7с, даже 8х получилось, но это интервал маленький, на больших чуть упадёт. Если первый factor(,1e4) убрать, то время станет 10с.
О, как! Шестикратное ускорение уже незначительно!?
По сравнению с тысячекратным — да.
Тут штука в том, что не только олловские цепочки правильно считаются, но и, например, непрерывные 14-ки.
А чтобы любые 14-ки правильно считались надо большой иф убирать. Чего не хочется делать, чтобы ещё сильнее не снижать и так маленькую скорость обсчёта.
Нет, часть непрерывных 14-ок мы упустили потому что они не дали в
проверяемом месте ровно 12 делителей меньше порога проверки простых в моей программе (но дали в
непроверяемом месте). Я же про это уже говорил, когда первая такая нашлась (которую тоже должны были упустить).
И дело не только в большом if, а и в фильтрации моей программой. Для их нахождения надо вообще никак не проверять концы в моей программе, т.е. уменьшать количество проверяемых чисел до 10 (к счастью удаление 45 на шаг паттернов не влияет), убирать их проверку в if и оставлять их проверку только уже в numdiv.
В 6 раз это уже более чем на полпорядка
Ну, полпорядка это всё же
, а тут вдвое больше, так что
порядка.