Я пока не вник, дайте весь код пож-ста целиком (аналогичный эталону, то есть с той же генерацией n и заменой проверяющей части), я скомпилирую и запущу.
Возьмите код эталона, вот эти строки
Код:
\\Здесь начинается проверка конкретного n
foreach([1..#v],d, g=factor((n+d-1)/v[d],2^12); nf=matsize(g)[1]; if(nf>nu[d], next(2)); if(nf==nu[d] && !ispseudoprime(g[nf,1],1), next(2)); );
foreach([1..#v],d, g=factor((n+d-1)/v[d],2^14); nf=matsize(g)[1]; if(nf>nu[d], next(2)); if(nf==nu[d] && !ispseudoprime(g[nf,1],1), next(2)); );
foreach([1..#v],d, g=factor((n+d-1)/v[d],2^17); nf=matsize(g)[1]; if(nf>nu[d], next(2)); if(nf==nu[d] && !ispseudoprime(g[nf,1],1), next(2)); );
foreach([1..#v],d, g=factor((n+d-1)/v[d],2^20); nf=matsize(g)[1]; if(nf>nu[d], next(2)); if(nf==nu[d] && !ispseudoprime(g[nf,1],1), next(2)); );
\\Проверка закончена, что осталось то осталось, подсчитаем сколько их и выведем в консоль для проверки
замените на вот эти:
Код:
\\Здесь начинается проверка конкретного n
nf=vector(#v,d,1); nn=vector(#v,d,1);\\Вектор количества делителей (omega) и вектор накопления их для каждой позиции
x=n+#v-1;\\Чуточку ускоряет
forprime(p=59,2^20,\\Проверяем делимость только на такие простые
d=#v-x%p; if(d<1, next); nf[d]++; nn[d]*=p;\\Получение остатка, проверка что он (и простое p) попадает в кортеж, накопление числа и самих делителей
if(nf[d]>nu[d], next(2));\\Если уже перебор, то отбрасываем
if(x%p^2<#v, next(2));\\Проверка на степени выше первой, такие n сразу отбрасываем
if(nf[d]==nu[d] && !ispseudoprime((n+d-1)/v[d]/nn[d],1), next(2));\\Если ровно сколько нужно проверим закончена ли факторизация и если нет - тоже отбрасываем
);
foreach([1..#v],d, if(nf[d]<nu[d] && ispseudoprime((n+d-1)/v[d]/nn[d]), next(2)); );\\Проверка что разложение закончено, а делителей меньше требуемого
\\Проверка закончена, что осталось то осталось, подсчитаем сколько их и выведем в консоль для проверки
Последнего цикла проверок в эталоне с factor нет, можете и тут его закомментировать, именно он кардинально снижает количество цепочек с 22 (185) до 1.
Но результат эталону не равен в точности:
100000/22, time: 5,085 ms
Осталось 22 вместо 20, это не ошибка, в двух из них попалось лишнее простое меньше 59 (точнее оно оказалось в неправильной степени чем есть в v[]), factor это обнаружил и кортеж отбросили, эта проверка этого не обнаружила и посчитала в 22.