"""
Created on Mon Feb 25 15:51:30 2019
@author: Administrator
先介绍两个公式:
1.(A * B) mod k = (A mod K) * (B mod K) mod K;
2.对于任何一个自然数p,若P为奇数有p=(p\2)*2+ 1,若P为偶数,则p=(p\2)*2+0
以p=19为例,B^19=B^(2*9+1)=B * B^9 * B^9
利用公式1则B^19 mod K=(B mod k)*( B^9 * B^9 mod k) mod k,
依次类推,再拆分指数9,直到指数为0.
表达式如下: 19=2*9+1=2*(2*4+1)+......=2*(2*(2*(2*(2*0+1)+0>+0)+1)+1.
表达式即为十进制与二进制转换的一种方式,即19D= 10011B,
故19次幂就变成5位二进制数幂的运算。
"""
#递归法求b^p
def fun(x, n):
if n == 1:
return x
t = fun(x, n//2)
if n % 2 == 1:
return x * t * t
else:
return t * t
#迭代法求b^p
def fun2(x, n):
b = []
while n > 0:
b.append(n % 2)
n //= 2
r = 1
for i in b[::-1]:
r *= r
if i == 1:
r *= x
return r
#递归法求b^p % k
def fmod(x, n, k):
if n == 1:
return x % k
t = fmod(x, n//2, k)
if n % 2 == 1:
return (x % k) * (t * t % k) % k
else:
return t * t % k
#迭代法求b^p % k
def fmod2(x, n, k):
b = []
while n > 0:
b.append(n % 2)
n //= 2
r = 1
for i in b[::-1]:
r = r * r % k
if i == 1:
r = (x % k) * r % k
return r
for i in range(1, 31):
print(fun(3, i), fun2(3, i), fmod(3, i, 100), fmod2(3, i, 100))