YadryaraНу я же специально прикладывал .gp файл с PARI программой, где ясно видно что и как надо делать чтобы использовать прилагаемый .exe. И выдаёт она не найденное число, а найденный индекс блока (шага, модуля) — на что надо домножить шаг/модуль и добавить начальное число чтобы получить искомое число.
Скачиваете и .exe и .gp, кладёте их в одну папку, заходите туда из консоли (команда в консоли
cd /d путь_к_папке), набираете
gp32.exe -q Yadryara.gp и получаете в консоли тот вывод что я уже показывал и даже записал в конец .gp файла:
Код:
T:\>gp32 -q Yadryara.gp
Mod(438957010505237256671215545, 440538835723387181869888800)
1710000000000000000000000000000000000000 - start
1730000000000000000000000000000000000000 - stop
1712084152981999171831531924917603912345: 12, 12, 6, 12, 12, 24, 12, 12, 12, 24, 12, 12, 12, 12, 24, len=11
1718475518460662821245608915647563585945: 12, 12, 24, 48, 24, 12, 12, 12, 12, 24, 12, 12, 12, 12, 48, len=10
1723647561535737193966646941181694393945: 12, 12, 24, 12, 12, 24, 12, 12, 48, 24, 12, 12, 12, 12, 24, len=10
1728525439430677205335450306830937157145: 12, 12, 24,192, 12, 96, 12, 12, 12, 48, 12, 12, 12, 12, 12, len=11
N=472842, 117.779s / 17.206s in PARI
После чего смотрите что я написал в этом .gp файле, правите его под свои нужды и снова запускаете из консоли.
Если хотите его запускать из уже работающего PARI, то удалите из .gp файла команду
quit и всё после неё.
Вот вам .gp файл ещё раз:
Код:
start=17100*10^35;\\Откуда начать счёт
stop=start+200*10^35;\\Где остановиться, можно указать много-много (но до 8.1265*10^45) и будет считать годами
\\ n+0 n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 n+10 n+11 n+12 n+13 n+14
v=[ 45, 722, 841, 12, 49, 50, 507, 32, 961, 18, 605, 28, 867, 1058, 1369 ];
pp=Mod(0,1); for(i=1,#v, pp=chinese(pp,Mod(-i+1,v[i]))); print(pp);\\Печать чисто для информации
print(start," - start");\\Тоже для информации
print(stop," - stop ");\\Тоже
t0=getwalltime(); gettime(); q=0;\\А это лишь для статистики скорости/времени работы и количества выданных в PARI индексов на дальнейшую проверку
{forstep(ii=floor(start/pp.mod),ceil(stop/pp.mod),10^8,\\Цикл по всему нужному диапазону с большим шагом (внутри которого перебирать будет внешняя прога)
printf("%0.2fe35%c",(lift(pp)+pp.mod*ii)/1e35,13);\\Вывод прогресса, можно убрать
vi=extern(Strexpand("Yadryara.exe ",ii," ",10^8)); q+=#vi;\\Вызов с передачей параметров в виде начального значения индекса и сколько индексов перебрать
if(#vi>0, foreach(vi,t,\\Если хоть что-то найдено, то цикл проверки всего что нашлось
n=lift(pp)+pp.mod*t;\\Пересчитать индекс в число начала цепочки
if(\\Перепроверка цепочки
!ispseudoprime((n+0)/v[1]) || !ispseudoprime((n+1)/v[2]) ||
\\! !ispseudoprime((n+3)/v[4]) || !ispseudoprime((n+5)/v[6]) ||
!ispseudoprime((n+6)/v[7]) || !ispseudoprime((n+7)/v[8]) ||
\\! !ispseudoprime((n+9)/v[10]) ||
!ispseudoprime((n+10)/v[11]) || !ispseudoprime((n+11)/v[12]) ||
!ispseudoprime((n+12)/v[13]) || !ispseudoprime((n+13)/v[14]) ||
0 \\Добавлено исключительно для удобства комментирования строк выше, никакой роли при работе не играет
,
next;\\Цепочка не подходит, пропустим и переход к проверке следующей
);
s=vector(15,d,numdiv(n+d-1)); k=#select(x->(x==12),s);\\Точный подсчёт количества делителей и сколько из них равны 12
if(k>=1, printf("%d:",n); foreach(s,d, printf("%3d,",d)); print(" len=",k); );\\Если их достаточно много (я себе ставлю порог 10-11), то вывести найденное
if(k==15, print("FOUND!!!"));\\Оптимистично
));
)}
printf("N=%d, %0.3fs / %0.3fs in PARI\t\t\t\n",q,(getwalltime()-t0)/1e3,gettime()/1e3);\\Вывод статистики работы
quit;
Что в нём непонятно то? В нём немало лишнего, но вроде ничего сложного или сверх хитрого нет. Добавил кучку комментариев. С ними работу не проверял, писал по живому прямо на форуме.
При записи вывода в файл стоит убрать вывод прогресса командой
printf сразу после начала цикла.
Текущая версия программы находит индекс, при котором все 11 чисел в паттерне точно не делятся на простые до 3584 (причины такого выбора уже объяснял). Остальные 4 числа в паттерне не делятся на простые до 40.
Например найденный Вами 0x38D7EA4C6B319=1000000000013081 означает что число начала цепочки равно
и её надо проверить подробнее на делители. Те два числа для вычисления сидят в
pp=Mod(438957010505237256671215545, 440538835723387181869888800), которое тоже выводится в консоль при старте .gp файла и получается прямо из паттерна в массиве v[].