Нулевой фактор действительно ускорил в 2.6 раза.
Но вот то, что уменьшение кандидатов в 2 с лишним раза не влияет на скорость, поверить не мог и стал проверять. Взял те самые 48 из 210 вместо 105 из 210. Дважды провёл сравнение на пустом компе.
Не-е, ускорение всё-таки есть. Причём регулярное. Но да, почему-то крошечное. Менее 2%.
Код:
8 131593 413 492 92 0 509 ms
9 131596 364 495 133 4 599 ms
10 131591 330 487 169 11 728 ms
11 131587 299 479 198 21 913 ms
12 131575 277 464 222 33 1,234 ms
13 131586 253 457 242 44 1,802 ms
14 131610 236 442 257 57 2,598 ms
15 131577 220 431 273 68 3,249 ms
16 131611 206 419 283 80 4,324 ms
17 131604 193 407 293 91 5,650 ms
18 131579 182 397 301 101 6,988 ms
19 131593 174 387 304 111 10,261 ms
20 131590 166 375 310 120 15,919 ms
21 131597 157 366 315 128 20,012 ms
22 131580 151 355 318 138 25,810 ms
23 131588 144 349 319 143 33,423 ms
24 131572 138 341 322 151 39,577 ms
25 131573 135 329 323 159 47,103 ms
3min, 40,700 ms
8 131597 413 492 92 0 479 ms
9 131595 364 495 133 4 565 ms
10 131593 330 487 169 11 692 ms
11 131589 299 479 198 21 871 ms
12 131579 277 464 222 33 1,192 ms
13 131590 253 457 242 44 1,770 ms
14 131613 236 442 257 57 2,575 ms
15 131573 220 431 273 68 3,211 ms
16 131616 206 419 283 80 4,282 ms
17 131608 193 407 293 91 5,601 ms
18 131588 182 397 301 101 6,927 ms
19 131597 174 387 304 111 10,209 ms
20 131591 166 375 310 120 15,723 ms
21 131604 157 366 315 128 19,720 ms
22 131585 151 354 318 138 25,526 ms
23 131589 144 349 319 143 32,789 ms
24 131576 138 341 322 151 38,688 ms
25 131577 135 329 323 159 45,958 ms
3min, 36,783 ms
Программу модифицировал вот так:
(PARI)
Код:
{t0=getwalltime();print;
maxp = 7; per = 210; m = vector(maxp,i,[1..i-1]); dob = vector(2*4*6);
\\print;print("m = ",m," ");print;
foreach(m[7],m7,
foreach(m[5],m5,
foreach(m[3],m3,
foreach(m[2],m2,
chi = chinese([ Mod(m2,2), Mod(m3,3), Mod(m5,5),Mod(m7,7) ]);
kdob++; dob[kdob] = lift(chi);
))));
dob = Set(dob);
kolper = 4762;
ogrp = 67;
for (ste = 8, 25,
t1=getwalltime(); kol = vector(4); kpod = 0;
mnoper = floor(10^ste / per) - kolper;
for( i = 0, kolper-1,
for( j = 1, kdob,
n = per * (mnoper + i) + dob[j];
if(factor(n,ogrp)[1,1] < ogrp, next);
fac = factor(n); kunp = matsize(fac)[1];
if(fac[1,1] >= ogrp,
kpod++; kdel = 1;
for(i = 1, kunp, kdel *= fac[i,2] + 1);
if(kdel == 8, kol[3]++;next);
if(kdel == 4, kol[2]++;next);
if(kdel == 16, kol[4]++;next);
if(kdel == 2, kol[1]++);
)));
print1(" ", ste," ", kpod," ");
for(i=1,4,print1(round(kol[i]/kpod*1000)," "));
print(," ", strtime(getwalltime()-t1));
);
print;print(strtime(getwalltime()-t0));print;
}quit