Заслуженный участник |
|
20/08/14 11763 Россия, Москва
|
Последний раз редактировалось Dmitriy40 07.11.2022, 19:45, всего редактировалось 2 раз(а).
про квадратичный остаются вопросы почему тормозной PARI обгоняет Hugo, если конечно обгоняет, надо внимательно сверить Вот программа на PARI перебора только больших простых: Код: v=[45,2,1,12,49,50,363,32,1,18,5]; idx=3;\\Паттерн b1850 и какое место перебирать квадратично stop=1e22;\\Верхний предел проверки flog="M12n11_q.txt";\\Куда сохранить найденное
t0=getwalltime(); n1=0; pp=chinese(vector(#v,i,Mod(-i+1,v[i]))); pmax=floor(sqrt(stop/if(v[idx]==1, 13*17, v[idx]*13)));\\До какого числа надо перебрать простые (если место пустое, то перебираем меньше) pmin=ceil(sqrt(stop/pp.mod));\\С этого числа шаг становится больше stop и перебрать надо лишь одно начальное число w=strprintf("v=%d, p at v[%d] from %d to %d, check up to %0.3fe18",v,idx,pmin,pmax,stop/1e18); print(w); write(flog,w); {forprime(p=pmin,pmax, L=chinese(pp,Mod(-idx+1,v[idx]*p^2));\\Новый LCM и число if(lift(L)>=stop, next);\\Начальные числа больше предела пропускаем h=round(lift(L)/32); n1++;\\Число x в 32x и сколько их попало на проверку if(!ispseudoprime(h), next);\\Оно должно быть простым h*=32;\\Число 32x в цепочке if(numdiv(h-2)!=12 || numdiv(h-1)!=12 || numdiv(h+1)!=12 || numdiv(h+2)!=12, next);\\Все 5 чисел вокруг 32x должны быть правильными s=vector(15,d,numdiv(h+d-8)); k=#select(x->(x==12),s); w=strprintf("%d^2:%d:",p,h-7); foreach(s,d, w=strprintf("%s%3d,",w,d)); w=strprintf("%s valids=%d, maxlen=%d", w,k,t=0;maxlen=vecmax(vector(#s,d,if(s[d]==12,t++,t=0)))); if(maxlen>=1, print(w); write(flog,w);); )} w=strprintf("Checked %d primes, %0.3fs",n1,(getwalltime()-t0)/1e3); print(w); write(flog,w); Желающие могут поиграться с любыми паттернами и перебором по любому месту в них. Запуск её с показанными параметрами под PARI x64 записывает в лог (и на экран): v=[45,2,1,12,49,50,363,32,1,18,5], p at v[3] from 15305342 to 6726727939, check up to 10000.000e18
17959243^2:5703312417421106256345: 64, 16, 12, 96, 64, 12, 12, 12, 12, 12, 32, 48, 4, 64, 8, valids=6, maxlen=5
21193591^2:1857664413781973981145: 48, 8, 24, 96, 48, 12, 12, 12, 12, 12, 32,192, 8, 64, 8, valids=5, maxlen=5
35372723^2:8636290281640881197145: 32, 4, 24, 12, 24, 12, 12, 12, 12, 12, 16, 24, 32, 8, 4, valids=6, maxlen=5
Checked 875174 primes, 303.978s Т.е. хватило 5 минут проверить все большие простые, указано откуда и докуда. Проверка кандидата на делители довольно простая и не слишком быстрая, но и такой хватает, ведь она выполняется очень редко, меньше миллиона раз для указанных условий, что занимает всего несколько секунд, для проверки можно убрать весь код после n1++ и сравнить время без проверки вообще, только перебора простых с КТО, у меня оказалось 285с, т.е. на такую простую медленную проверку ушло суммарно всего 19с. Программа Hugo по моей оценке (хотите перепроверьте, это предложенный EUgeneUS паттерн b1850) затратит на такую проверку примерно 2800с (если будет перебирать по 3-у или 9-у месту, если по другому то в коде выше можно указать любое желаемое место). Почему в 9 раз дольше и так не быстрого PARI — это вопрос к Hugo. Дополнительно, запуск в самом медленном варианте, с idx=2, тоже под PARI x64: v=[45,2,1,12,49,50,363,32,1,18,5], p at v[2] from 15305342 to 19611613513, check up to 10000.000e18
190303199^2:8704204308324237465945: 48, 24, 48, 24,192, 12, 12, 12, 12, 12, 32, 12, 32, 8, 16, valids=6, maxlen=5
Checked 876056 primes, 922.258s Даже так, в самом медленном варианте, получается втрое быстрее моей оценки программы Hugo. Обращаю внимание что кроме изменения времени проверки ещё и нашлись разные цепочки! Кто хочет разложите найденные цепочки и проверьте почему они не нашлись в другом варианте перебора. -- 07.11.2022, 19:42 --That's great! -- 07.11.2022, 19:45 --А Дмитрий мог бы координировать счёт по своим программам. Не хочу, с этим прекрасно справится Hugo, ведь теперь есть способ преобразовать мой ID в его номер и обратно (сорри, пока не проверил, но всегда можно руками найти прямо по записи чисел паттерна).
|
|