На всякий случай скажу, что я не сдался. Продолжаю пытаться совместить короткую арифметику со своей рабочей программой, объявляя всё-что можно смолом.
Вот, кстати, вопрос.
Код:
my(v:vecsmall=Vecsmall([63, 3610, 3179, 12, 17797, 3362, 75, 392, 841, 18, 2209, 20, 1587, 242, 6727, 96, 14045, 338, 243, 68, 35131]));
Почему здесь уважаемый
wrest объявил смолом вектор, где куча чисел явно больше 255 ?
И вот всё равно при переходе к счёту по одному из своих паттернов получилось 4-кратное замедление. Пока не разобрался в чём дело:
Код:
fun ( potok:small, starti:small, koli:small, maxpredp:small ) = {
my(t0=getwalltime());
my(zama:vecsmall=Vecsmall([13]));
\\my(zamb:vecsmall=Vecsmall([61]));
my(kdel = 48, maxlen = 5):small;
my(bolv=[13,2,3,28,5,18,1,32,3,50,7,12,1,338,45,88,1,6,17,20,3,2]);
my(mkv:vecsmall=Vecsmall(Set(select(x->(numdiv(x)%3<>0),bolv,1))));
my(lenmkv = #mkv):small;
my(rkp:vecsmall = vectorsmall(lenmkv,x,0));
rkp[1] = nextprime(maxlen+1); for(j=2, lenmkv,
if(nextprime(rkp[j-1]+1)<>zama[1], rkp[j] = nextprime(rkp[j-1]+1),
rkp[j] = nextprime(nextprime(rkp[j-1]+1)+1) ));
\\rkp = setminus(rkp,zam1); rkp = concat(rkp,zam2);
my(rassprob:vecsmall=Vecsmall([1..lenmkv]));
my(v:vecsmall=Vecsmall([3757,242,1587,28,4205,
18,1369,32,5547,50,11767,12,40931,338,45,7688,361,4998,2809,20,6627,6962]));
my(ip = 17):small;
my(aa = 4998):small;
my(m=132115864604174642234399073835381356548570400):int;
my(n0=68182721761635739290794149646849536294407271):int;
my(maa=132115864604174642234399073835381356548570400*aa):int;
my(n0aa=68182721761635739290794149646849536294407271*aa):int;
my(nu:vecsmall=Vecsmall([3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 4, 1, 4, 3, 3, 3]));
my(lenv=#v):small;
my(predp:vecsmall = Vecsmall(primes( [67, maxpredp] )));
my(kolpredp = #predp):small;
my(ostmaa:vecsmall = vectorsmall(kolpredp, nompr, maa % predp[nompr] ));
my(ostn0aa:vecsmall = vectorsmall(kolpredp, nompr, n0aa % predp[nompr] ));
my(n):int;
my(mes):small;
my(kolfac:vecsmall=vectorsmall(lenv,mes,1));
my(pro:vec=vector(lenv,mes,1));
my(q=q1=best=valids=0):small;
print(starti," ", koli," ", maxpredp, " ",strtime(getwalltime()-t0), " ");
t0=getwalltime();
for(i:small=starti, starti + koli - 1,
kanp = n0 + m * i;
\\if(!ispseudoprime(kanp,1), next);
n = aa * kanp - ip;
\\n = aa * (n0 + m * i) - ip;
kolfac=vectorsmall(lenv,mes,1); pro=vector(lenv,mes,1);
for(nompr=1, kolpredp,
\\mes = lenv - (ostn0[nompr]+2*i*ostm[nompr]+lenv-1) % predp[nompr];
\\mes = lenv - (aa * (ostn0[nompr] + ostm[nompr]*i) - ip + lenv - 1) % predp[nompr];
mes = lenv - (ostn0aa[nompr] + ostmaa[nompr]*i - ip + lenv - 1) % predp[nompr];
if(mes<1, next); kolfac[mes]++; pro[mes] *= predp[nompr];
if( kolfac[mes] == nu[mes], q1++;
if(!ispseudoprime((n+mes-1)/(v[mes]*pro[mes]),1), next(2))));
for(mes=1,lenv,
if(kolfac[mes]<nu[mes],q1++;
if(ispseudoprime((n+mes-1)/(v[mes]*pro[mes]),1),next(2))));
q++;
print;
valids=0; for(mes=1,lenv,if(numdiv(n+mes-1)==48,valids++));
if(valids>=lenv-3,best++;print(n, " ", valids);print));
print("Potok ", potok, " ",best," ", q," ",q1," ", 1000*koli\(getwalltime()-t0)," ",strtime(getwalltime()-t0));
return(best);
}
/*
GP;default(threadsize,32M);
GP;default(debugmem,0);
GP;init_RabFun_66_7();
*/
{t0=getwalltime();print;
\\print1(" ");
parfor(i=0,5,fun(i,i*10^5,10^5,2^20));
print;
print(" ",
strtime(getwalltime()-t0));print;
}quit
Кстати, специально так заточено, чтоб он находил известное приближение с valids=19.