Надо уточнить что речь идёт о скорости PARI/GP, а не просто компа.
Ну так Вы разве можете это полноценно проверить на 64-м компе?
На вычислительных задачах - могу, почему нет: запускаю gp32 вместо gp64 для той же программы и всё. И пока он не обращается к ОС он будет работать в режиме x32. А разницей в скорости
редких системных вызовов (опрос очереди сообщений ОС, переключение задач) под x32 и x64 ОС можно просто пренебречь.
Вообще да, сама
ispseudoprime сильно тормозит, вот оставил в проверке только их и сравнил, 33с vs 177с, в 5.4 раза. Но у меня то ведь перед ними выполняется проверка просто по модулям, а там лишь одно деление (взятие остатка) и быстрый поиск в массиве, и тогда разница в скорости лишь 42с (да, как ни странно это в x64 в этот раз почему-то медленнее, хотя раньше было в 1.5 раза быстрее) vs 53с, в 1.26 раза. Это явная польза более простых тестов, не
ispseudoprime, а
setsearch([],x%p).
Так что сравнивать надо не просто комп или PARI/GP, а конкретную программу.
Ради интереса подправил Вашу
программу (убрал 29# оставив только 23#; сократил длину проверки до 10e9; убрал вывод найденных цепочек; добавил вывод времени этапов; чуть сократил вывод) и сравнил скорость:
Код:
x64:
552960/223092870, time: 1,745 ms
24330245/21, time: 1min, 7,701 ms
x32:
552960/223092870, time: 1,635 ms
24330245/21, time: 5min, 29,404 ms
Да, разница в 5 раз это именно разница в скорости
ispseudoprime. Стоит добавить более быструю предпроверку перед ними.
Например проверку начального числа по простым модулям 30-200 (сильно больше ставить уже нет смысла):
перед основным циклом добавить заполнение нового массива запрещённых остатков:
mm=vector(200,i,[]); forprime(p=30,#mm, mm[p]=Set(-v%p));в основном цикле перед проверкой
ispseudoprime добавить предпроверку по остаткам:
forprime(p=30,#mm, if(setsearch(mm[p], kan%p), next(2)));Это уменьшит время с 68.1с до 50.9с под x64 и с 330с до
71с под x32 (с основной таблицей лишь по 23#, 29# проверяйте сами). Новых Вам кэфов!