Кстати, стоит ли показать как на PARI вычислить константы для длинного if и для T[]?
Конечно. Раньше ведь chinese был в самой проге. Это облегчит ту самую адаптацию.
Вот что получилось на примере выложенной M48n21:
Код:
\\ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20
\\ 2 11 3 2 3 2^3*13 2 5 7 3 2 3*5 2 7 5 2*3*19
\\ 43^2 19^2 2^2 7^2 5^2 41^2 59^2 23^2 3^2 31^2 2^2 37^2 11^2 29^2 2^5 17^2 47^2 3^2 2^2 13^2 53^2
\\ pqr pqr pqr pqrs pqr pqr p pqrs pqr pqr pqrs pqr pqr pqrs p pqrs pqr pqr pqrs pqr p
v=[ 3698, 3971, 12, 49, 50, 5043, 362024, 529, 18, 4805, 28, 4107, 242, 841, 480, 289, 4418, 63, 4, 845, 320226 ];
nd=48;\\Количество делителей
pr2=primes([5,59]);\\Эти квадраты размещены
P=primes([61,523]);\\По этим простым будем проверять
ip=20;\\Перебирать будем по месту +20
vp=v[ip+1];
print("m= ",m=lcm(v)*6/vp);
print("p1=",p1=(lift((chinese([Mod(-j+1, v[j]) | j<-[1..#v]])))+ip)/vp+5/6*m+54*m);
print("P= ",P);
plt=select(x->numdiv(x)==nd/2,v,1);
print("T= ",[Set([((lift(Mod(ip-(plt[k]-1), P[j]))/vp-p1)/m)%P[j] | k<-[1..#plt]]) | j<-[1..#P]]);
print("if(",strjoin([strprintf("i%%%u!=%u", pr2[j], ((lift(Mod(ip-(select(x->x%pr2[j]^2==0,v,1)[1]-1), pr2[j]^3))/vp-p1)/m)%pr2[j]) | j<-[1..#pr2]]," && "),",");
Есть проблема: никак не соображу как автоматически вычислить 5/6*m для p1, т.е. когда он нужен именно 5%6, а когда 1%6. Вроде откуда берётся понятно, но вот формулой задать дял произвольного v[] что-то не получается, позабыл уже всё ...
Ещё непонятно почему не меняются T и if при смене ip (перебираемого места), вроде должны же (ip в формулы входит), ан нет ... Или я где-то ошибся, или формулы можно упростить исключив ip.
И мелкая неясность почему пропускаются первые 54 значения i (в p1 стоит +54*m), вероятно они были проверены отдельно. Это можно безопасно грохнуть, правда константы могут измениться.