Убыстряет на 20-30%, обычно не больше (не в разы), так что эта овчинка, кмк, выделки особо не стоит.
Спасибо, тогда это вообще ни о чём — ровно на этой же задаче я получал скорость более чем в сотню раз выше, 1.47с вместо 226с. Правда там asm+AVX2.
Единственно, если вы, скажем, не умеете параллелить, а PARI/GP собрана под многопоточность, и использовать parfor, то дополнительно будет выигрыш некоторый у PARI/GP по сравнению с ней же однопоточной, но все равно конечно недостаточный. Там на многопоточность как я понял неслабые оверхеды, то есть время просто на количество потоков не поделить.
Я где-то не так давно это проверял, получилось вместо 4х всего лишь 3х, при 100% загрузке всех 4-х ядер. Если запустить 4 отдельных потока, то скорость как и положено 4х.
Я там не вчитывался о чем у вас эта тема, но если вы хотите определить, является ли 11 наименьшим простым делителем, я б делал не так, а поделил бы сперва на 2,3,7 (с немедленным уходом из цикла если делится).
Я именно так и делал, когда нужны были большие простые делители. И да, выигрыш был явный. А вот для малых простых делителей, когда они гарантированно не больше пары-тройки десятков (если больше то считаем число неподходящим), этот подход выигрыша почти не даёт, как и замена
factor(x,p+1) на
gcd(x,p#), скорости примерно одинаковы:
Код:
? forstep(x=23^2,10^9,46, if(factor(x)[1,1]==23, cnt++););
time = 26,785 ms.
? forstep(x=23^2,10^9,46, if(x%3>0 && x%5>0 && x%7>0 && x%11>0 && factor(x)[1,1]==23, cnt++););
time = 19,923 ms.
? forstep(x=23^2,10^9,46, if(factor(x,24)[1,1]==23, cnt++););
time = 11,451 ms.
? forstep(x=23^2,10^9,46, if(x%3>0 && x%5>0 && x%7>0 && x%11>0 && factor(x,24)[1,1]==23, cnt++););
time = 11,654 ms.
? pp=vecprod(primes([1,23]));
? forstep(x=23^2,10^9,46, if(gcd(x,pp)==23, cnt++););
time = 9,563 ms.
И это ещё числа маленькие, а вот если взять скажем
, то разница будет уже весьма заметна:
Код:
? forstep(x=23^14,23^14+10^9,46, if(factor(x)[1,1]==23, cnt++););
time = 6943,600 ms.
? forstep(x=23^14,23^14+10^9,46, if(x%3>0 && x%5>0 && x%7>0 && x%11>0 && factor(x)[1,1]==23, cnt++););
time = 3455,600 ms.
? forstep(x=23^14,23^14+10^9,46, if(factor(x,24)[1,1]==23, cnt++););
time = 29,625 ms.
? forstep(x=23^14,23^14+10^9,46, if(x%3>0 && x%5>0 && x%7>0 && x%11>0 && factor(x,24)[1,1]==23, cnt++););
time = 19,859 ms.
? pp=vecprod(primes([1,23]));
? forstep(x=23^14,23^14+10^9,46, if(gcd(x,pp)==23, cnt++););
time = 10,093 ms.