Важно, чтобы хотя бы в одном потоке заработало, а там хоть допотопным, хоть антипотопным способом
Вот такой сделали PerPat37.gp
Код:
write("begin.tmp","is begin");\\файл-метка, по нему смотрим когда начали
\\Перебор всех паттернов в каталогах от текущего и глубже
t0=getwalltime();
allocatemem(2^29);
start=1600*10^30;\\Откуда начать
stop=2000*10^30;\\Где закончить (не включая)
step= 200*10^30;\\Сколько отвести на каждый круг перебора паттернов
\\! kppat=0;kpop=0;
pat=externstr("dir /a-d /b /s *.pat");\\Получаем в вектор список всех паттернов в текущей папке и всех подпапках
if(#pat==0, print("Not found patterns!"); quit);
for(i=1,#pat, s=strsplit(pat[i],"."); pat[i]=strjoin(s[1..#s-1],"."));\\Отрезаем им всем расширение
ff=vector(#pat,i, s=strsplit(pat[i],"\\");s[#s-1..#s]);\\Отрезаем путь оставляя только последнее имя папки и имя файла
ff2=vector(#ff,i, ff[i][1]);\\Имя папки запомним отдельно, для заголовка окна
for(i=1,#ff, ff[i]=strjoin(ff[i],"-"));\\Объединим папку и файл в полное имя паттерна
step10=logint(step,10);\\Вынес из цикла для ускорения
{forstep(h=start,stop-1,step,\\Цикл по всему диапазону
for(g=1,#pat,\\Цикл по каждому паттерну
\\! kppat=kppat+1;print();print();print1(kppat," ",kpop," ");
system(strprintf("title %de%d:%s",h\10^step10,step10,ff2[g]));\\Меняем заголовок окна на 21e34:N2-36, это по желанию, на работу не влияет
read(concat(pat[g],".pat"));\\Читаем параметры паттерна
\\Теперь z=vector(#v,i,!issquare(v[i]));\\Сформируем вектор флагов squarefree в паттерне, какие места проверять
forstep(ii=floor(h/pp.mod),ceil((h+step-1)/pp.mod),ceil(step/pp.mod)+35000,\\Идём по интервалу
vi=extern(strexpand(pat[g],".exe ",ii," ",ceil(step/pp.mod)+35000," 2>nul"));\\Фильтруем цепочки
for(t=1,#vi,\\Все найденные на перепроверку
n=lift(pp)+pp.mod*vi[t];\\Получаем число начала цепочки из индекса
if(n<h || n>=h+step, next);\\Не допускаем дублирования цепочек найденных на границе шагов
\\! kpop=kpop+1;
if(
\\! (z[1]>0 && !ispseudoprime((n+0)/v[1])) ||
\\! (z[2]>0 && !ispseudoprime((n+1)/v[2])) ||
\\! (z[3]>0 && !ispseudoprime((n+2)/v[3])) ||
(z[4]>0 && !ispseudoprime((n+3)/v[4])) ||
(z[5]>0 && !ispseudoprime((n+4)/v[5])) ||
(z[6]>0 && !ispseudoprime((n+5)/v[6])) ||
(z[7]>0 && !ispseudoprime((n+6)/v[7])) ||
(z[8]>0 && !ispseudoprime((n+7)/v[8])) ||
(z[9]>0 && !ispseudoprime((n+8)/v[9])) ||
(z[10]>0 && !ispseudoprime((n+9)/v[10])) ||
(z[11]>0 && !ispseudoprime((n+10)/v[11])) ||
(z[12]>0 && !ispseudoprime((n+11)/v[12])) ||
\\! (z[13]>0 && !ispseudoprime((n+12)/v[13])) ||
\\! (z[14]>0 && !ispseudoprime((n+13)/v[14])) ||
\\! (z[15]>0 && !ispseudoprime((n+14)/v[15])) ||
0, next;
);
s=vector(15,d,numdiv(n+d-1)); k=#select(x->(x==12),s);
if(k>=10,\\С меньшим количеством совпадений не выводить
w=strprintf("%d:%s:",n,ff[g]); f=", ALL";
for(j=1,#v, if(v[j]>1 && s[j]!=12 && !issquare(v[j]), f=""; break));
if(k==#v, f=concat(f,", FOUND!!!"));
foreach(s,d, w=concat(w,strprintf("%3d,",d)));
w=concat(w,strprintf(" valids=%d%s", k,f));
print(w); write("Process.out",w);\\Печать на экран и сохранение в файл лога Process.out, который должен быть свой (или в своей папке) для каждого потока
if(k==14, write("..\FOUND14.txt",w));
if(k==15, write("..\PENTADECATHLON.txt",w));
);
);
);
);
)}
system("title All end.");\\Информируем что закончили
tob=getwalltime()-t0;
print();
printf("TIME = %0.0f seconds",tob/1000);
write("Process.out","TIME = ",(tob-tob%1000)/1000, " seconds");
write("Process.out","kolshag = ",ceil(step/pp.mod)+35000);
print();
write("end.tmp","is end");\\файл-метка, по нему смотрим когда закончили
quit;
Для других комплектов свои три строчки.
Для PerPat17.gp:
Код:
start=14000*10^30;\\Откуда начать
stop=20000*10^30;\\Где закончить (не включая)
step=1000*10^30;\\Сколько отвести на каждый круг перебора паттернов
Здесь огромный круг, но зато кратный 10-ти.
Для PerPat29.gp:
Код:
start=1500*10^30;\\Откуда начать
stop=2000*10^30;\\Где закончить (не включая)
step= 250*10^30;\\Сколько отвести на каждый круг перебора паттернов
Для PerPat31.gp:
Код:
start=2000*10^30;\\Откуда начать
stop=3000*10^30;\\Где закончить (не включая)
step= 200*10^30;\\Сколько отвести на каждый круг перебора паттернов