Так я-то думал что их там просто не может быть

Вот потому я и спрашивал про какой конкретно код речь, у меня и у Антона их быть не может, цепочки с ними исключаются ещё до попыток факторизации. А у Вас оказывается нет.
Тут сейчас назревает вопрос: а нифиг нам вообще знать из какого паттерна собрана цепочка...
Просто считать делители, да и всё.
Да, разумеется можно и так. Только придётся подсчитать и простые начиная с 2, а это типа лишняя работа уже проведённая при составлении паттерна.
Плюс паттерн нам нужен для получения n0 и m и потом из них n цепочки. Не для факторизации - если не обращать внимания что простые 2..53 из чисел цепочки уже исключены (кроме высших степеней) как раз паттерном.
После проверки переполнения по таблице простых, я сейчас проверяю нет ли чисел, у которых делителей заведомо нехватит. Таких чисел, по всей видимости, очень много. По крайней мере фильтр проходят очень мало.
Так это тоже требует вызова ispseudoprime, причём уже без второго аргумента, ибо ошибка тут уже недопустима! И немало таких вызовов будет впустую, она вернёт 0 и придётся копить делители дальше и снова вызывать её же. Фактически должно получиться что ispseudoprime вызывается не раз на цепочку, а для каждого найденного делителя для любого места в цепочке - чтобы проверить точную недостаточность делителей. Т.е. в разы больше раз на цепочку. А ispseudoprime как раз самая медленная из всех использованных и Вы хотите её вызывать чаще ...

Т.е. фильтровать то будет наверное лучше, это да, но зато сильно тормознее.
Только недавно написал, что у меня она есть.
А я комментировал не Ваш код, а
wrest-а по его ссылке.