2013-07-22 2 views
1

Я пишу программу на python, которая включает в себя повышение числа до чрезвычайно высокого показателя. Для этого я пытаюсь реализовать метод последовательных квадратов, чтобы уменьшить время вычисления и устранить риск ошибки переполнения.Последовательные квадраты в Python

Последовательные квадратов означает делать то же самое, как base**exponent % modulo и текущая функция Я написал это:

def ssp(b, m, n): 
    ssp = 1 
    while n>0: 
     if n % 2 == 1: 
      ssp = b*ssp % m 
     b = b**2 % m 
     n = n // 2 
    return ssp 

Когда я проверить функцию с ssp(7, 13, 93) я получаю ответ 8, когда оно должно быть 19. Может кто-нибудь дать намек на то, что я сделал неправильно?

+4

Я не уверен, в чем проблема с вашей функцией, но вы считали, что используете встроенную 'pow'? Он делает то же самое. http://docs.python.org/2/library/functions.html#pow – recursive

+0

У вас есть основания полагать, что встроенная функция 'pow' не менее эффективна? – recursive

ответ

4

Вы делаете pow(7, 93, 13) =>8 но то, что вы хотите pow(7, 13, 93) =>19

своп вашей функцией второй и третий аргумент.

>>> def ssp(b, n, m): 
...  ssp = 1 
...  while n>0: 
...   if n % 2 == 1: 
...    ssp = b*ssp % m 
...   b = b**2 % m 
...   n = n // 2 
...  return ssp 
... 
>>> ssp(7, 13, 93) 
19 
+0

СПАСИБО! Я фактически преобразовал это из своего кода MATLAB, поэтому я был немного отрывочным, какая переменная была в конце: P – Killasin

1

Я думаю, что вы просто получили порядок аргументов. Третий аргумент - показатель степени; второй - модуль. Вероятно, это не то, что вы хотели.

Смежные вопросы