заводим вектор флагов s[] что число цепочки точно не подходит или разложено полностью;
в простых фильтрах указываем какие числа полностью разложились чтобы не раскладывать повторно;
после простых фильтров запускаем разложение каждого недоразложенного числа на секунду (меньше нельзя) командой alarm() и проверяем разложилось ли оно;
если разложилось и не дало нужное количество делителей или и не может уже дать - тоже выставляем флаг;
если набралось много недопустимых чисел (т.е. valids точно мал и такие не интересны) - обрываем проверку;
повторяем разложение оставшихся чисел уже с ограничением на 3 секунды;
повторяем разложение оставшихся чисел уже с ограничением на 15 секунд;
повторяем разложение оставшихся чисел уже с ограничением на 90 секунд;
если valids оказался достаточно большим - запускаем полное разложение оставшихся чисел.
Спасибо. Ну, вы видели: актуальные числа нынче 62-значные. И очень вряд ли надо лезть выше. И это итоговые числа цепочки, а недоразложенные-то обычно на 3-5 порядков меньше.
А вообще код стал довольно сложным и видимо лучше в этой теме, где код уже показывал. То есть удобней плясать от готового кода и править его потихоньку.
f=factor(n+d-1,2^15); fn=matsize(f)[1];\\Не успело, проверим все ли делители найдены, до 2^15 проверяется очень быстро
Ну вот этим кодом очень здорово проверяется делимость на все предвычисленные простые до 2^(19-20). Так что в этой части вроде ничего не ускорить.
Счётчики успеха пока оставил.
Код:
for(i:small = starti, starti + koli - 1,
for(j = 1, #prter, if( bo[j] == i % prter[j], next(2)));
\\usp[1]++;
for(j = 1, #T, if( T[j] == i % dopp[j] , next(2)));
\\usp[2]++;
kanp = n0 + m * i;
if(!ispseudoprime(kanp,1), next);
n = v[ip+1] * kanp - ip;
\\usp[3]++;
ostmes = ostmesbig;
kolfac=vectorsmall(lenv,mes,1); pro=vector(lenv,mes,1);
for(nompr=1, kolpredp,
mes = lenv - (ostn0a[nompr] + ostma[nompr]*i - ip + lenv - 1) % predp[nompr];
if(mes<1, next); kolfac[mes]++; pro[mes] *= predp[nompr];
\\usp[4]++;
if( kolfac[mes] == nu[mes],
\\usp[5]++;
if(!ispseudoprime((n+mes-1)/(v[mes]*pro[mes]),1), next(2),
ostmes = setminus( ostmes, [mes] ))));
\\usp[6]++;
for(j=1, #ostmes, if(ispseudoprime((n+ostmes[j]-1)/(v[ostmes[j]]*pro[ostmes[j]])),next(2)));
hormes = [];
for(j = 1, #ostmes,
if(nu[ostmes[j]] - kolfac[ostmes[j]] == 1,
if( #factor( (n+ostmes[j]-1)/(v[ostmes[j]]*pro[ostmes[j]]) )[2] > 2, next(2),
hormes = concat( hormes, ostmes[j]);
\\print(hormes, " ", #hormes);
)));
ostmes = setminus( ostmes, hormes );
print1(#ostmes, " " );
for(j = 1, #ostmes,
if(nu[ostmes[j]] - kolfac[ostmes[j]] == 3,
matfac = factor( (n+ostmes[j]-1)/(v[ostmes[j]]*pro[ostmes[j]]) );
fac2 = #matfac[2];
if( fac2 < 4 && vecprod(matfac[2]) == 1, nedobor++;print("nedobor = ",nedobor); next(2));
if( fac2 > 4, prev++;print("prev = ",prev); next(2))));
И дальше уже идёт проверка на valids по всему полю и показ найденных цепочек.