Если же говорить серьезно, я пока не понял, как браковать числа, делящиеся на малые простые, если проверяемое число не обязано быть простым.
Те простые что размещены в паттерне (2-19 или 2-53) - браковать как и обычно, чтобы остаток от на 1 большей степени не равнялся остатку от наибольшей размещённой степени (т.е. чтобы степень не повышалась). Так игнорируются цепочки с высокими степенями простых, но их слишком мало чтобы всерьёз на них рассчитывать.
Простые больше 53 - никак не забраковать, они имеют право встретиться на любых местах (кроме p если таковые есть).
Можно поделить на малые простые (скажем 59-1000) и проверить что остаток является простым. Это Ваша проверка по nu[] с factor(,300000). Которую лучше растроить с разными порогами (я обычно беру 2^14, 2^18, 2^24).
А больше собственно ничего и не сделать.
Эффективнее искать НОД с произведением многих простых. Эта идея?
Разница мизерна, скорее даже в пределах погрешности:
Код:
? n=0; m=2*3*5*7*11*13*17*19; for(i=1,1e8, n+=(gcd(i,m)==1)); n
time = 1min, 279 ms.
%1 = 17102401
? n=0; for(i=1,1e7, n+=(i%2<>0 && i%3<>0 && i%5<>0 && i%7<>0 && i%11<>0 && i%13<>0 && i%17<>0 && i%19<>0)); n
time = 1min, 311 ms.
%2 = 17102401