Intereting Posts
Открыть каталог с помощью C Чтение строки из файла на C, динамически записывать переменную ac, которая генерирует одно случайное число или пару случайных чисел, или триплет случайных чисел с учетом конкретных диапазонов Порядок выполнения логического ИЛИ в C Расчет контрольной суммы TCP не соответствует расчету проводов Различные соглашения для main () в C Почему sizeof (x ++) не увеличивает x? Создание 2D-массива char * заполняет его данными из sqlite в функции обратного вызова Два аргумента для calloc Как выполняется сна на уровне ОС? Как сделать fprintf () немедленно Подождите, пока нажмите enter в C внутри цикла while? Почему в стандартной библиотеке C нет функции realloc () без копирования данных? Как определить, вводит ли пользователь данные запятыми (в нужном формате) или нет? Отладка с VS2013 в программе без оптимизации, но в текущем контексте для локальных переменных нет символа

Модульное возведение в степень

В C / C ++ как я могу вычислить (a^b)%m где b не вписывается в 64 бита? Другими словами, существует ли способ вычисления вышеуказанного значения с использованием b%m вместо b ?

И есть ли какой-либо алгоритм, который может вычислить вышеупомянутый результат в O(log(b)) времени или O(log(b%m)) времени?

    Согласно теореме Эйлера , если a и m взаимно просты:

    a b mod m = a b mod phi(m) mod m

    поэтому, если b велико, вы можете использовать значение b % phi(m) вместо b . phi(m) – функция тоталя Эйлера , которую можно легко вычислить, если вы знаете простую факторизацию m .

    Как только вы уменьшили значение b таким образом, используйте Exponentiation, возведя квадрат, чтобы вычислить модульное возведение в степень O(log (b % phi(m))) .