Ну а вот прога, которая это посчитала, то есть из vc[] для 5 разных паттернов длиной
простым сложением получила cg[] для паттерна длиной
.
Вроде почистил получше:
Код:
allocatemem(2^30);
{print();
pfin=31; pn=nextprime(pfin+1);cg=vector(21);
for (o=1,5,
v=[0, 12, 30, 42, 54, 72, 2*pn, 90, 102, 114, 132, 144];
v[7]=v[o]+2*pn;
a=setminus(vector(v[#v]/2,i,i*2),v);
ww=vector(v[#v]/2+3-#v,i,Map()); mapput(ww[#ww],2^#a-1,1);
forprime(p=2, pfin,
tz0=getwalltime();
m=setminus(vector(p,i,i-1),Set(-v%p));
am=vecextract(vector(p-1,i,fromdigits(Vecrev(apply(t->(t+i)%p>0,a)),2)),m);
for(k=1,#ww,
rr=Map();
foreach(ww[k],m,
b=m[1][1]; qq=m[1][2]; qn=0;
foreach(am,x,
y=bitand(x,b);
if(y==b, qn+=qq; next);
hy=hammingweight(y)+2; nn=0;
if(mapisdefined(ww[hy],y,&nn), nn+=qq , nn=qq);
mapput(ww[hy],y,nn);
);
if(qn>0, mapput(rr,b,qn); );
);
ww[k]=rr;
);
vc=vector(#ww); for(k=1,#ww, foreach(ww[k],x, vc[k]+=x[1][2]; ); );
vcmax=#vc; while(vcmax>1&&vc[vcmax]==0, vcmax--);
if(p==31, print("o = ",o," --> ",nextprime(p+1),"# : ",strjoin(2*vc[1..vcmax],", "),", sum = ",2*vecsum(vc),", time: ",strtime(getwalltime()-tz0));
);
);
for(ll=1,#cg,cg[ll]+=2*vc[vcmax-#cg+ll]);
print();print();
);
print();print(#cg," cg = ",cg, " ",vecsum(cg));
print();print();
}quit;
Пока самым примитивным способом: все 5 паттернов обсчитаны с нуля.
Можно ведь и g2[] и g0[] тоже считать через vc[] для более длинных паттернов. И, в каких-то случаях, это тоже может быть быстрее.
И да, с таким паттерном программа работает примерно вчетверо быстрее, наверняка за час справится.
Небось за 40-45 минут справилась. Но ещё её результат проверить надо. У Вас все цифры есть.