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=",lcm(v));
{n0=lift(chinese([Mod(-j+1, v[j]) | j<-[1..#v]]));
mm=3;\\По какому модулю проверяем
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);\\Считаем количество запрещённых остатков
);}
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].
Для модуля 6 условие
t==0 в последнем select надо заменить на
(t%2==0||t%3==0) или
(t<>1&&t<>5) - все такие остатки по модулю 6 недопустимы для простых.
-- 14.10.2025, 17:32 --EUgeneUSПричина аномалии с 3 в том что чисел в паттерне слишком много (больше одного), 3шт (проверяемых, с простыми), вот и не все p-1 остатков получаются допустимыми как было бы для единственного простого. С n19d252 (19 симметрично расположенных простых в интервале [0..252]) даже по модулю 17 было всего 2 допустимых остатка, остальные запрещались по одному или нескольким простым.