I’ve written out a couple of functions for doing expmod, that is, (x ** y) % n. These are both standard functions, I’ve checked and re-checked both but can’t find any silly errors.
Here’s the recursive one:
def expmod(x,y,m):
if y == 0: return 1
if y % 2 == 0:
return square(expmod(x,y/2,m)) % m # def square(x): return x*x
else:
return (x * expmod(x,y-1,m)) % m
…and here’s the non-recursive one:
def non_recursive_expmod(x,y,m):
x = x % m
y = y % m
result = 1
while y > 0:
if(y%2 == 1):
result = (result * x) % m
x = (x*x) % m
y = y/2
return result
They agree for small values:
>>> expmod(123,456,789) - non_recursive_expmod(123,456,789)
0
…but don’t for larger ones:
>>> expmod(24354321,5735275,654) - non_recursive_expmod(24354321,5735275,654)
-396L
What’s going on?
Your function
non_recursive_expmodhas some suspicious steps in it: Remove the%mforxandyat the beginning. Both are not needed.Additionally make sure that the division of
yis an integer division by usingy = y // 2.In total the function should look like this: