Всегда писал Миллера-Рабина для чисел в пределах [1, 2 ^ 31 - 1]. И вчера на одном OJ попалась задача,где нужно писать вышеупомянутый тест на простоту для чисел [1, 2 ^ 63 - 1].Все отлично, но вот возводить в степень за log(n) не получается.При возведении промежуточные результаты выходят за пределы long long.Не подскажите ли, знающие люди, как ето можно сделать ?
кроме того, там ограничения на N до 2^63 - 1, такчто без длинной арифметики или её подобия не обойтись. есть тупой алгоритм бинарного деления, сложность та же что при использовании бинарного умножения (но оно тут не применимо в чистом виде, из-за ограничений)
Бинарное умножение по модулю. binmult(a,b,mod) {
if (b == 1) x == a; else { x = } return x; }
Бинарное умножение по модулю. Разделяй и властвуй) long long binmultmod(long long a, long long b, long long mod) { long long x; if (a == 0 || b == 0) return 0; if (b==1){ x=a; } else{ x=binmultmod(a, b/2, mod); x=(x+x)%mod; if (b%2==1) x=(x+a)%mod; } return x; }