3100 mod 15 如何快速计算
先将十进制的100转换为二进制
参考:二进制与十进制互相转换https://www.yuofyou.cn/20200906/1244.html
100(10)=1100100(2)
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
现在要来计算3n mod 15
n取2的倍数 并且把它们全部计算出来
n取1:
表格中直接写3,这作为基础
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 |
n取2:因为对应的二进制是1 所以这里直接把上一个数平方,再乘以基础3
(31)2 mod 15 = 9 mod 15 = 9 把上一个数平方
9×3 mod 15 = 27 mod 15 =12 再乘以基础3
表格中写12
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 | 12 |
n取4:因为对应的二进制是0 所以这里直接把上一个数平方
122 mod 15 = 9
直接写9
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 | 12 | 9 |
n取8:因为对应的二进制是0 所以这里直接把上一个数平方
92 mod 15 = 6
表格写6
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 | 12 | 9 | 6 |
n取16:因为对应的二进制是1 所以这里直接把上一个数平方,再乘以基础3
62 mod 15 = 6
6 × 3 mod 15 = 3
表格写3
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 | 12 | 9 | 6 | 3 |
n取32:因为对应的二进制是0 所以这里直接把上一个数平方
3 × 3 mod 15 = 9
表格写9
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 | 12 | 9 | 6 | 3 | 9 |
n取64:因为对应的二进制是0 所以这里直接把上一个数平方
9 × 9 mod 15 = 81 mod 15 = 6
表格写6
1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
1次方 | 2次方 | 4次方 | 8次方 | 16次方 | 32次方 | 64次方 |
3 | 12 | 9 | 6 | 3 | 9 | 6 |
到这里表格已经被我们完成了,而这道题的最终答案也就是表格中最后填写的这个数6
3100 mod 15 = 6
python代码
def int_to_bin(num):
return list(bin(num))[2:]
"""
Modular exponentiation
returns a ^ b mod n
"""
def exp(a, b, n):
c = 0
f = 1
bin_b = int_to_bin(b) # 转换二进制
k = len(bin_b) #取二进制长度看看循环多少次
for i in range(k): # Fill this part.
c = 2*c
f = f*f % n
if bin_b[i] == '1':
c = c+1
f = f*a % n
return f