Сейчас функция проверки конкретного паттерна у меня выглядит вот так:
Код:
fun ( starti:small, kolpop:small, v:vecsmall, maxpredp:small, nu:vecsmall, ip:small, predp:vecsmall, kolpredp:small, bo:vecsmall, T:vecsmall) = {
my(lenv=#v):small;
my(ma=m*v[ip+1]):int; my(n0a=n0*v[ip+1]):int;
my(ostma:vecsmall = vectorsmall(kolpredp, nompr, ma % predp[nompr] ));
my(ostn0a:vecsmall = vectorsmall(kolpredp, nompr, n0a % predp[nompr] ));
my(n):int; my(mes):small;
my(kolfac:vecsmall=vectorsmall(lenv,mes,1));
my(pro:vec=vector(lenv,mes,1));
my(k48=0):small;
my(kanp):int;
for(i:small = starti, starti + koli - 1,
for(j = 1, #prter, if( bo[j] == i % prter[j], next(2)));
for(j = 1, #T, if( T[j] == i % dopp[j] , next(2)));
kanp = n0 + m * i;
if(!ispseudoprime(kanp,1), next);
n = v[ip+1] * kanp - ip;
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];
if( kolfac[mes] == nu[mes],
if(!ispseudoprime((n+mes-1)/(v[mes]*pro[mes]),1), next(2))));
for(mes=1,lenv,
if(kolfac[mes]<nu[mes],
if( ispseudoprime((n+mes-1)/(v[mes]*pro[mes]),1), next(2))));
for(nom = 1, #pq, if(numdiv(n+pq[nom]-1) <> kdel, next(2)));
for(nom = 1, #pqrs, if(numdiv(n+pqrs[nom]-1) <> kdel, next(2)));
for(kan = n, n + 15, if(kan % 32 == 0, sta = kan - 15));
print1(n," ");
for(kan = sta, sta + 30,
if(numdiv(kan) == kdel, k48 ++ ; print1("1"), print1(" ") ));
print(" ",k48); \\ ," ",strtime(getwalltime()-t0));
write(log_name2, n," ", k48 ); k48 = 0; \\ ," ", n / i + .);
);return();
}
Потому что в паттерне имеется ровно одно простое. И прога под него заточена.