Переделал с векторов на битовые маски, но особо не оптимизировал, ускорение получилось (старое время / новое = ускорение):
C3: 3.60с/1.17с=3.1х
C4: 33.6с/10.4с=3.2х
C5: 5м/1.2м=4.2х
C6: 25м/6.3м=4х
Что-то до порядка не дотянуло.
Код:
Код:
v=[0,6,12,30,42,72,90,96,120,126,132,156,162,180,210,222,240,246,252]; print("v=",v);
BC=vector(#v+10,k, prodeulerrat(( p^k - k*p^(k-1) )/(p-1)^k, 1, nextprime(k+1)) );
MC=vector(#v+10,k, x=1.0;forprime(p=3,k,x/=p*(1-1.0/p)^k);forprime(p=k+1,v[#v]/2,x/=p-k);x );
CC=vector(#v+10,k, 2^(k-1) * MC[k] * BC[k]);
dd=setminus(vector(v[#v]/2,i,i*2),v); C1=C2=C3=C4=C5=C6=C7=C8=C9=C10=0; nn=vector(10);
v0=vector(v[#v]/2,p, if(p>2&&isprime(p),setminus(vector(p,i,i-1),Set(-v%p)),[]));
m0=vector(#v0,p, t=0;foreach(v0[p],x, t=bitor(t,2^x););t);
C=CC[#v]; forprime(p=3,#m0, C*=hammingweight(m0[p]); ); printf("C =%f\n",C);
for(a=1,#dd,
forprime(p=3,#v+1, if(m0[p]==2^(-dd[a]%p), next(2)); );
m1=m0; t=CC[#v+1]; forprime(p=3,#m1, m1[p]=bitnegimply(m1[p],2^(-dd[a]%p)); t*=hammingweight(m1[p]); ); C1 += t; nn[1]++;
for(b=1,a-1,
forprime(p=3,#v+2, if(m1[p]==2^(-dd[b]%p), next(2)); );
m2=m1; t=CC[#v+2]; forprime(p=3,#m2, m2[p]=bitnegimply(m2[p],2^(-dd[b]%p)); t*=hammingweight(m2[p]); ); C2 += t; nn[2]++;
for(d=1,b-1,
forprime(p=3,#v+3, if(m2[p]==2^(-dd[d]%p), next(2)); );
m3=m2; t=CC[#v+3]; forprime(p=3,#m3, m3[p]=bitnegimply(m3[p],2^(-dd[d]%p)); t*=hammingweight(m3[p]); ); C3 += t; nn[3]++;
for(e=1,d-1,
forprime(p=3,#v+4, if(m3[p]==2^(-dd[e]%p), next(2)); );
m4=m3; t=CC[#v+4]; forprime(p=3,#m4, m4[p]=bitnegimply(m4[p],2^(-dd[e]%p)); t*=hammingweight(m4[p]); ); C4 += t; nn[4]++;
););););
print("C1=",C1); print("C2=",C2); print("C3=",C3); print("C4=",C4); print(concat(1,nn));
Думаю логика добавления вложенных циклов понятна, приводить все не буду.