如何实现模幂代码
How to implement Modular Exponentiation Code
拜托,我正在学习 算法导论(第 31 章第 957 页) 这本书,并遇到了这个伪代码。该伪代码是我们如何实现模幂运算的方法。伪代码如下
MODULAR-EXPONENTIATION(a,b,n)
1 c = 0
2 d = 1
3 let <b_k,b_(k-i),....b_0> be the binary representation of b
4 for i = k downto 0
5 c = 2c
6 d = (d.d) mod n
7 if b_i == 1
8 c = c + 1
9 d = (d.a) mod n
10 return d
然后我尝试在python
中实现
def modExpn(a,b,n):
c = 0
d = 1
binary_of_b = f'{b:b}'
len_of_b = len(binary_of_b)
for i in range(len_of_b,0,-1):
val = i - 1
c = 2 * c
d = (d * d) % n
if binary_of_b[val] == '1':
c = c + 1
d = (d * a) % n
return d
但是当我尝试 运行 a = 7,b=560 和 n = 561 的函数 (modExpn) 时,我得到的输出是 415,但正确答案是 1。请问我哪里出错了?
您在将这些部分从伪代码转换为实际代码时搞砸了:
3 let <b_k,b_(k-i),....b_0> be the binary representation of b
4 for i = k **downto** 0
这些说明说你应该从二进制表示的 left-most 数字 (b_k) 迭代到 right-most (b_0) 因为你需要去从 k
下降到 0
。
例如,当您将 8
转换为二进制时,您会得到 "1000"
,而在 Python 中, left-most 数字的索引将是 0
而不是 len("1000") - 1
正如你所做的那样。
换句话说,如果你这样做:
for bin_digit in binary_of_b:
及以后:
if bin_digit == '1':
您的代码将起作用。
拜托,我正在学习 算法导论(第 31 章第 957 页) 这本书,并遇到了这个伪代码。该伪代码是我们如何实现模幂运算的方法。伪代码如下
MODULAR-EXPONENTIATION(a,b,n)
1 c = 0
2 d = 1
3 let <b_k,b_(k-i),....b_0> be the binary representation of b
4 for i = k downto 0
5 c = 2c
6 d = (d.d) mod n
7 if b_i == 1
8 c = c + 1
9 d = (d.a) mod n
10 return d
然后我尝试在python
中实现def modExpn(a,b,n):
c = 0
d = 1
binary_of_b = f'{b:b}'
len_of_b = len(binary_of_b)
for i in range(len_of_b,0,-1):
val = i - 1
c = 2 * c
d = (d * d) % n
if binary_of_b[val] == '1':
c = c + 1
d = (d * a) % n
return d
但是当我尝试 运行 a = 7,b=560 和 n = 561 的函数 (modExpn) 时,我得到的输出是 415,但正确答案是 1。请问我哪里出错了?
您在将这些部分从伪代码转换为实际代码时搞砸了:
3 let <b_k,b_(k-i),....b_0> be the binary representation of b
4 for i = k **downto** 0
这些说明说你应该从二进制表示的 left-most 数字 (b_k) 迭代到 right-most (b_0) 因为你需要去从 k
下降到 0
。
例如,当您将 8
转换为二进制时,您会得到 "1000"
,而在 Python 中, left-most 数字的索引将是 0
而不是 len("1000") - 1
正如你所做的那样。
换句话说,如果你这样做:
for bin_digit in binary_of_b:
及以后:
if bin_digit == '1':
您的代码将起作用。