Хорошо, попытка не пытка. В реализации идеи обрывания сейчас пока использую алгоритм Полларда. Но не всегда памяти хватает почему-то.
А версию с таймером пока отложу. Тем более что при прерывании всех потоков, она вроде и не очень нужна и может запутать.
Итак, вот цикл на PARI/gp. Как мне его сделать многопоточным? То есть нужно как-то корректно заменить for на parfor?
Оставшихся мест довольно много, обычно больше чем мои 12 потоков. Так что в не более чем 12 потоках надо проверять только места, где выполнится условие
if(nu[ostmes[j]] - kolfac[ostmes[j]] == 1, . Получается, надо заранее этот список составить? И назвать его ostmes1. И цикл делать уже от 1 до #ostmes1.
Но что делать если длина #ostmes1 всё-таки превысит 12?
Квен мне предложил через parvector делать...
Код:
for(j = 1, #ostmes,
if(nu[ostmes[j]] - kolfac[ostmes[j]] == 1,
t3=getwalltime();
my(res = pollardRho( cha = (n+ostmes[j]-1)/(v[ostmes[j]]*pro[ostmes[j]]) ) );
my(cofac = cha/res);
\\print;print(res, " ", cofac," ", cha);print;
if (!ispseudoprime(cofac,1),
print(ostmes[j], ". Потрачено ", strtime(getwalltime()-t3), " Факторов слишком много ");
print(res, " ", cofac," ", cha);
next(2)
,
hormes = concat( hormes, ostmes[j]);
);
));