Потому что small это всё, что меньше 2^64 на 64-разрядных версиях pari.
"Маленькие" числа это такие, которые помещаются в регистр процессора - тогда вычисления с ними максимально быстрые.
В Си- нотации это long (на 64битных системах соответственно 64 бита) или ulongc Там есть некоторая путаница, но для вас безопасно считать что pari-шный small это от -2^63 до 2^63
Ну вот почему-то прокатывает объявление смолом даже таких заведомо гораздо более огромных чисел:
Код:
aa = v[ip+1]:small; m = 6*lcm(v)/aa:small;
n0 = (lift(chinese([chinese([Mod(-j+1, v[j]) | j<-[1..#v]]),
Mod(32-m32+1, 64), Mod(9-m9+1, 27)])) + ip) / aa:small;
print("aa = ", aa, " m = ", m, " n0 = ", n0); print;
Порядок у них такой:
Код:
aa = 1352
m = 78081320236795167622169713442947824600
n0 = 52904976929196173102351960114260184299
И считает программа вроде правильно, цепочки находит. Ведь если хоть что-то хоть где-то не разделилось нацело или не тот тип, то обычно страшная ругань 3-хэтажным millerrabin-ом или сегментацией или ещё чем. Нет, нормально работает. C-код не смотрел.
Вполне может быть, что gp2c переобъявляет. Тогда может и не объявлять вообще...