Ещё ускорил код, за счёт отказа от primepi() и замены её на предвычисляемый массив.
Надо добавить в начало строки:
Код:
default(parisize,2300*10^6);\\2.3ГБ, 2ГБ на массив и чуть запаса
pr=vectorsmall(250*10^6); n=0; pp=1; forprime(p=1,#pr, for(i=pp+1,p-1, pr[i]=n); pp=p; pr[p]=n++;); for(i=pp,#pr, pr[i]=n);
Они у меня выполняются за 21с.
Странно что PARI при этом занимает 4.7ГБ памяти вместо затребованных 2.3ГБ (массив при этом занимает ровно 2ГБ), почему непонятно.
Строку
Код:
if(t>1e8, z=extern(strexpand("primecount.exe ",t)), z=primepi(t));
заменить на строку
Код:
if(t>#pr, z=extern(strexpand("primecount.exe ",t)), z=pr[t]);
После этого считается ещё на порядок быстрее:
Код:
*** Warning: new stack size = 2300000000 (2193.451 Mbytes).
10^12: n=55732807965, time: 6,258 ms
10^13: n=525488451294, time: 35,923 ms
10^14: n=4973844834423, time: 4min, 42,351 ms
15-ю степень посчитать никак не получается, primecount почему-то подвисает, в разные моменты времени. Возможно из-за запущенных других вычислений.
Дальше оптимизировать надо цикл по q, он наверное до 90% объёма в конце перебирает впустую, там или 0 простых, или 1, это явно можно оптимизировать и сократить перебор уменьшением верхней границы.
Вычисление с p=2 занимает 40%-50% общего времени и ещё половину от него занимает p=3.
-- 15.09.2022, 16:24 --Оказалось при запуске primecount с ключом -t=1 (в один поток) она не подвисает, так что удалось посчитать и (время чуть меньше расчётного из-за увеличения массива pr до 300млн):
Код:
10^15: n=47239478725006, time: 28min, 18,826 ms