|
Последний раз редактировалось Yadryara 14.07.2026, 16:25, всего редактировалось 1 раз.
Что-то я опять утомился с ИИ пытаться. Вот дал ему медленную программу. 5 циклов без рекурсии. (PARI)
Код: {print; t0=getwalltime();
v=[0, 210]; print("v = ",v);print;
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]);
a=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);
C0=CC[#v]; forprime(p=3,#m0, C0*=hammingweight(m0[p]); ); printf("C0 = %0.3f\n",C0);
for(i1=1,#a, forprime(p=3,#v+1, if(m0[p]==2^(-a[i1]%p), next(2)); ); m1=m0; t=CC[#v+1]; forprime(p=3,#m1, m1[p]=bitnegimply(m1[p],2^(-a[i1]%p)); t*=hammingweight(m1[p]); ); C1 += t; nn[1]++;
for(i2=1,i1-1, forprime(p=3,#v+2, if(m1[p]==2^(-a[i2]%p), next(2)); ); m2=m1; t=CC[#v+2]; forprime(p=3,#m2, m2[p]=bitnegimply(m2[p],2^(-a[i2]%p)); t*=hammingweight(m2[p]); ); C2 += t; nn[2]++;
for(i3=1,i2-1, forprime(p=3,#v+3, if(m2[p]==2^(-a[i3]%p), next(2)); ); m3=m2; t=CC[#v+3]; forprime(p=3,#m3, m3[p]=bitnegimply(m3[p],2^(-a[i3]%p)); t*=hammingweight(m3[p]); ); C3 += t; nn[3]++;
for(i4=1,i3-1, forprime(p=3,#v+4, if(m3[p]==2^(-a[i4]%p), next(2)); ); m4=m3; t=CC[#v+4]; forprime(p=3,#m4, m4[p]=bitnegimply(m4[p],2^(-a[i4]%p)); t*=hammingweight(m4[p]); ); C4 += t; nn[4]++;
for(i5=1,i4-1, forprime(p=3,#v+5, if(m4[p]==2^(-a[i5]%p), next(2)); ); m5=m4; t=CC[#v+5]; forprime(p=3,#m5, m5[p]=bitnegimply(m5[p],2^(-a[i5]%p)); t*=hammingweight(m5[p]); ); C5 += t; nn[5]++;
)))));
printf("C1 = %0.3f\n",C1); printf("C2 = %0.3f\n",C2); printf("C3 = %0.3f\n",C3); printf("C4 = %0.3f\n",C4); printf("C5 = %0.3f\n",C5);
/* printf("C6=%0.3f\n",C6); printf("C7=%0.3f\n",C7); printf("C8=%0.3f\n",C8); printf("C9=%0.3f\n",C9); */
print; \\print(binomial(48)[1..10]);print(); \\obr=[1, 48, 667, 4766, 21826, 71186, 174310, 328658, 482192, 551548, 0]; \\print; \\print(obr); print(concat(1,nn)); print();
print();print(strtime(getwalltime()-t0));
print; } quit;
Затем дал уже свой вариант, с двукратным уменьшением перебора, тоже 5 циклов и ещё 4 цикла в Поправке: (PARI)
Код: for(i1=1,#a/2, forprime(p=3,#v+1, if(m0[p]==2^(-a[i1]%p), next(2)); ); m1=m0; t=CC[#v+1]; forprime(p=3,#m1, m1[p]=bitnegimply(m1[p],2^(-a[i1]%p)); t*=hammingweight(m1[p]); ); C1 +=t*2; nn[1]++;
for(i2=i1+1,#a-i1, forprime(p=3,#v+2, if(m1[p]==2^(-a[i2]%p), next(2)); ); m2=m1; t=CC[#v+2]; forprime(p=3,#m2, m2[p]=bitnegimply(m2[p],2^(-a[i2]%p)); t*=hammingweight(m2[p]); ); C2 +=t*2; nn[2]++;
for(i3=i2+1,#a-i1, forprime(p=3,#v+3, if(m2[p]==2^(-a[i3]%p), next(2)); ); m3=m2; t=CC[#v+3]; forprime(p=3,#m3, m3[p]=bitnegimply(m3[p],2^(-a[i3]%p)); t*=hammingweight(m3[p]); ); C3 +=t*2; nn[3]++;
for(i4=i3+1,#a-i1, \\ovc++; forprime(p=3,#v+4, if(m3[p]==2^(-a[i4]%p), next(2)); ); m4=m3; t=CC[#v+4]; forprime(p=3,#m4, m4[p]=bitnegimply(m4[p],2^(-a[i4]%p)); t*=hammingweight(m4[p]); ); C4 +=t*2; nn[4]++;
for(i5=i4+1,#a-i1, forprime(p=3,#v+5, if(m4[p]==2^(-a[i5]%p), next(2)); ); m5=m4; t=CC[#v+5]; forprime(p=3,#m5, m5[p]=bitnegimply(m5[p],2^(-a[i5]%p)); t*=hammingweight(m5[p]); ); C5 += t*2; nn[5]++;
)))));
nn*=2;
\\ Popravka
for(i1=1,#a/2, forprime(p=3,#v+1, if(m0[p]==2^(-a[i1]%p), next(2)); ); m1=m0; t=CC[#v+1]; forprime(p=3,#m1, m1[p]=bitnegimply(m1[p],2^(-a[i1]%p)); t*=hammingweight(m1[p]); );
i2=#a+1-i1; forprime(p=3,#v+2, if(m1[p]==2^(-a[i2]%p), next(2)); ); m2=m1; t=CC[#v+2]; forprime(p=3,#m2, m2[p]=bitnegimply(m2[p],2^(-a[i2]%p)); t*=hammingweight(m2[p]); ); C2 +=t; nn[2]++;
for(i3=i1+1,#a-i1, forprime(p=3,#v+3, if(m2[p]==2^(-a[i3]%p), next(2)); ); m3=m2; t=CC[#v+3]; forprime(p=3,#m3, m3[p]=bitnegimply(m3[p],2^(-a[i3]%p)); t*=hammingweight(m3[p]); ); C3 += t; nn[3]++;
for(i4=i3+1,#a-i1, forprime(p=3,#v+4, if(m3[p]==2^(-a[i4]%p), next(2)); ); m4=m3; t=CC[#v+4]; forprime(p=3,#m4, m4[p]=bitnegimply(m4[p],2^(-a[i4]%p)); t*=hammingweight(m4[p]); ); C4 += t; nn[4]++;
for(i5=i4+1,#a-i1, forprime(p=3,#v+5, if(m4[p]==2^(-a[i5]%p), next(2)); ); m5=m4; t=CC[#v+5]; forprime(p=3,#m5, m5[p]=bitnegimply(m5[p],2^(-a[i5]%p)); t*=hammingweight(m5[p]); ); C5 += t; nn[5]++;
))));
ИИ понятно за счёт чего перебор уменьшается почти вдвое, но он всё равно не может ускорить программу Дмитрия на асме ни на йоту!
|