python代码实现快速模幂运算、扩展欧几里得、中国剩余定理等公钥密码算法所需要的数学基础运算的心得体会
时间: 2023-08-11 18:07:38 浏览: 185
部分基础算法个人学习笔记和心得
快速模幂运算:
在实现快速模幂运算时,需要注意到一个简单的公式:
a ^ b % m = (a % m) ^ b % m
这个公式可以极大地减少计算量,加快计算速度。具体实现时,可以通过不断将指数b除以2,并将底数a平方,直到指数b为0,最后将结果对模数m取余即可得到快速幂结果。代码实现如下:
```python
def fast_power(base, exponent, mod):
result = 1
base = base % mod
while exponent > 0:
if exponent % 2 == 1:
result = (result * base) % mod
exponent = exponent // 2
base = (base * base) % mod
return result
```
扩展欧几里得:
扩展欧几里得算法是用于求解两个整数a和b的最大公约数gcd以及一组满足 ax+by=gcd 的整数解x和y。在实现该算法时,需要注意到以下性质:
- gcd(a, b) = gcd(b, a % b)
- 若ax+by=gcd(a,b),则bx'+(a%b)y'=gcd(b,a%b),其中 x'=y, y'=x-(a//b)y
从而可以递归调用该算法,直到b=0为止。最后返回gcd以及最后一次迭代中求得的x和y即可。代码实现如下:
```python
def extended_euclidean_algorithm(a, b):
if b == 0:
return a, 1, 0
else:
gcd, x, y = extended_euclidean_algorithm(b, a % b)
return gcd, y, x - (a // b) * y
```
中国剩余定理:
中国剩余定理是用于求解一组同余方程组的解。在实现该算法时,需要注意到以下性质:
- 若m1,m2互质,则同余方程组x≡a1(mod m1),x≡a2(mod m2)的解为x=(a1m2M2+a2m1M1)(mod M),其中M=m1m2,M1=M/m1,M2=M/m2,且M1x1≡1(mod m1),M2x2≡1(mod m2)
- 若m1,m2不互质,则同余方程组x≡a1(mod m1),x≡a2(mod m2)无解
可以逐个求解每个同余方程,最后通过合并得到一个更小的同余方程组来求解。具体实现时,可以使用扩展欧几里得算法求解M1和M2的乘法逆元,从而计算出x1和x2,再代入上述公式即可得到最终解。代码实现如下:
```python
def chinese_remainder_theorem(a, m):
M = 1
for mi in m:
M *= mi
result = 0
for i in range(len(a)):
Mi = M // m[i]
gcd, x, y = extended_euclidean_algorithm(Mi, m[i])
result += a[i] * Mi * x
result %= M
return result
```
阅读全文