Так что тут всё вычисление короткое - и сложение-умножения в скобках, и деление результата с остатком на короткое простое из таблицы простых. Ну а деление 64-битных это как мне кажется слёзы по сравнению с isdseudoprime.
Ну да, я же об этом и сказал:
Пока что отказались лишь от длинной арифметики, но медленное деление (любые деления медленные по сравнению с умножением и сложением, в той или иной степени) осталось.
И не сказать чтобы слёзы, эти слёзы выполняются до

раз, а ispseudoprime лишь один раз.
Да, ну я в этих ваших AVX не понимаю -- это ваше поле :)
Про AVX забудем, ОК.
Функции в gmp глянул, там под x64 делений вообще нет, только умножения, молодцы. А под SSE есть, но кажется не в основном цикле.
Мне кажется так оно не работает, надо рабоче-крестьянским циклом менять каждый элемент последовательно.
Как раз этого и хотелось избежать и использовать быстрые встроенные функции работы с векторами. Так то пройтись циклом по вектору несложно:
for(j=1,#nmodp, nmodp[j]+=s[j]; if(nmodp[j]>=pr[j], nmodp[j]-=pr[j]); if(nmodp[j]>=#v, next); d=#v-nmodp[j]; p=pr[j]; ... );На месте ... вся проверка с d и p, только next там не должен обрывать цикл по j, а продолжать его.
Но тут явно не будет векторных операций, на что была надежда при использовании встроенных функций.
С другой стороны, тут сложение, сравнение, условное вычитание (все короткие, по модулю p же) - и это заменяет деление, что должно быть быстрее (на порядок). Фактически этот цикл по j заменяет собой цикл forprime, только обрывать это уже нельзя, ну так не будем делать его до 2^20, сделаем до 2^14 или ещё меньше, а что останется допроверим старым forprime.