Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/91: Рейтинг темы: голосов - 91, средняя оценка - 4.87
1 / 1 / 1
Регистрация: 09.11.2014
Сообщений: 26

Быстрое возведение в степень по модулю

12.11.2016, 12:58. Показов 19188. Ответов 7

Студворк — интернет-сервис помощи студентам
Пытаюсь реализовать схему быстрого возведения в степень. Степень представляеться в двоичном виде, дальше по формуле.
Python
1
2
3
4
5
6
7
8
9
def pow_h(base, degree, module):
    degree = bin(degree)[2:]
    r = 1
 
    for i in range(len(degree) - 1, -1, -1):
        r = (r ** 2) % module
        r = (r * base ** int(degree[i])) % module
 
    return r
Но функция работает неверно, где же ошибка?
Миниатюры
Быстрое возведение в степень по модулю  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2016, 12:58
Ответы с готовыми решениями:

Быстрое возведение в степень
Тестирующая система выводит "Time Limit Exceeded", помогите пожалйста. Задача: Возводить в степень можно гораздо быстрее, чем за n...

Быстрое возведение в степень
def fast_exp(num, deg): if 0 == num: return 0 if 0 == deg: return 1 if deg % 2 == 0: return...

Быстрое возведение в степень
Задание простое, но никак от runtime error уйти не могу в 20 тесте... А так все же работает. Подскажите в чем проблема? Возводить в...

7
1 / 1 / 1
Регистрация: 09.11.2014
Сообщений: 26
14.11.2016, 02:17  [ТС]
Разобрался, правильные действия в цикле:
Python
1
2
 r = (r * base ** int(degree[i])) % module
 base = (base ** 2) % module
0
0 / 0 / 0
Регистрация: 22.01.2021
Сообщений: 63
19.06.2021, 10:18
Моя реализация этой функции:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def power_mod(x:int, pow:int, mod:int):
    assert type(x) is int
    assert type(pow) is int and pow >= 0
    assert type(mod) is int
    res = 1
    pow_res = 0
    while pow_res < pow:
        pow_res_1 = 2
        res1 = x
        while pow_res + pow_res_1 <= pow:
            res1 = (res1 * res1) % mod
            pow_res_1 *= 2
        pow_res_1 //= 2
        res = (res * res1) % mod
        pow_res += pow_res_1
    return res % mod
0
2 / 2 / 0
Регистрация: 03.02.2022
Сообщений: 10
07.02.2022, 04:34
В питоне эта задача реализована в виде функции pow()
И боюсь быстрее и лучше уже не выйдет
Python
1
2
base, exp, mod = map(int, input().split())
pow(base, exp, mod)
0
0 / 0 / 0
Регистрация: 22.01.2021
Сообщений: 63
07.02.2022, 10:49
Ого, не знал, что такая есть.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
07.02.2022, 11:43
Цитата Сообщение от O_o- Посмотреть сообщение
И боюсь быстрее и лучше уже не выйдет
Выйдет: math.pow.
0
0 / 0 / 0
Регистрация: 22.01.2021
Сообщений: 63
07.02.2022, 18:11
Выйдет: math.pow.
Речь о БЫСТРОМ ВОЗВЕДЕНИИ В СТЕПЕНЬ ПО МОДУЛЮ ЦЕЛЫХ ЧИСЕЛ.
А что написано про math.pow:

Use ** or the built-in pow() function for computing exact integer powers.
0
0 / 0 / 0
Регистрация: 03.03.2023
Сообщений: 1
03.03.2023, 19:21
Столкнулся с похожей проблему, не нашёл подходящего или рабочего варианта, поэтому написал сам
P.S. Ввод степеней в десятичной форме по потребностям можете под себя настроить:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def fast_exp_mod(number, exp, n):
    i = 1
    result = number
    while 2 * i < exp:
        result = (result ** 2) % n
        i = i * 2
    while i:
        result_1 = number
        exp = exp - i
        i = 1
        while 2 * i < exp:
            result_1 = (result_1 ** 2) % n
            i = i * 2
        result = (result * result_1) % n
        if i == 1:
            break
    return result
Добавлено через 3 часа 15 минут
P.S.2. Не правильно считало возведение в степень, если само по себе степень была степень двойки (8, 32, 128 и т. п.)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def fast_exp_mod(number, exp, n):   
    i = 1
    exp = int(exp)
    result = number
    while 2 * i < exp:
        result = (result ** 2) % n
        i = i * 2
    while i:
        if exp == 2 * i:
            result = (result ** 2) % n
            break
        result_1 = number
        exp = exp - i
        i = 1
        while 2 * i <= exp:
            result_1 = (result_1 ** 2) % n
            i = i * 2
        result = (result * result_1) % n
        if i == 1:
            break
    return result
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2023, 19:21
Помогаю со студенческими работами здесь

Быстрое возведение в степень
Программа принимает действительное положительное число x и целое отрицательное число y. Необходимо выполнить возведение числа x в степень...

Быстрое возведение в степень
Помогите пожалуйста переписать код на Python #include &lt;iostream&gt; using namespace std; double fun (double a, int n); int...

Быстрое возведение в степень
Возводить в степень можно гораздо быстрее, чем за n умножений! Для этого нужно воспользоваться следующими рекуррентными соотношениями:...

Быстрое возведение в степень матрицы
В общем, у меня не получается провести возведение матрицы в степень. Сделала перемножение матрицы(возведение во вторую степень) и перевод в...

Быстрое возведение в степень итерацией
Здравствуйте) Честно говоря, зашла в тупик, пытаясь придумать как реализоват этот алгоритм итерацией. С рекурсией все намного проще... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru