EUgeneUSПо модулю 3 разрешён только один остаток, вот и никакой магии:
Код:
v=[ 3698, 3971, 12, 49, 50, 5043, 362024, 529, 18, 4805, 28, 4107, 242, 841, 480, 289, 4418, 63, 4, 845, 320226 ];
print("v=",v);
print("lcm=",m=lcm(v));
{n0=lift(chinese([Mod(-j+1, v[j]) | j<-[1..#v]]));
mm=3;
print("Check by ",mm);
for(d=0,mm-1,
n=n0+d*m;
print1("d=",d,": ",y=[((n+j-1)/v[j])%mm | j<-[1..#v]]);
if(#select(t->t==0,y)==0, print(" OK") , print);\\Для проверки по одиночным простым mm
\\if(#select(t->(t<>1&&t<>5),y)==0, print(" OK") , print);\\Для проверки по mm=6
);}
v=[3698, 3971, 12, 49, 50, 5043, 362024, 529, 18, 4805, 28, 4107, 242, 841, 480, 289, 4418, 63, 4, 845, 320226]
lcm=29576058913001203166152762296391472723719200
d=0: [2, 1, 1, 1, 1, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2]
d=1: [2, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 0, 1, 1, 2]
d=2: [2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2] OK
Здесь расчёт в пространстве n, где сами цепочки, без всяких делений на коэффициент на месте перебираемого простого.
Для его использования надо n0 модифицировать в соответствии с d=2 и mm=3: n1=n0+d*lcm(v) и перебирать потом уже с шагом mm*lcm(v). Пересчёт из n1 в p1 для перебора по простым банален: p1=(n1+ip)/v[ip], m=lcm(v)*mm/v[ip].
-- 14.10.2025, 17:32 --EUgeneUSПричина аномалии с 3 в том что чисел в паттерне слишком много (больше одного), 3шт (проверяемых, с простыми), вот и не все p-1 остатков получаются допустимыми как было бы для единственного простого. С n19d252 (19 симметрично расположенных простых в интервале [0..252]) даже по модулю 17 было всего 2 допустимых остатка, остальные запрещались по одному или нескольким простым.