python数据结构与算法基础 第十二课
tags:
- python
- 路飞学院
categories:
- python
- 欧几里得
- RSA算法
文章目录
第一节 欧几里得算法
1. 欧几里得算法的介绍
- 约数:如果整数a能被整数b整除,那么a叫做b的倍数,b叫做a的约数。
- 给定两个整数a,b,两个数的所有公共约数中的最大值即为最大公约数(Greatest Common Divisor, GCD)。例: 12与16的最大公约数是4
- 如何计算两个数的最大公约数:
- 欧几里得:辗转相除法(欧几里得算法)
- 《九章算术》:更相减损术
- 这两个本质一样的
- 欧几里得算法: gcd(a, b) = gcd(b, a mod b) a mod b 是a除b的余数
- 例: gcd(60, 21) = gcd(21, 18) = gcd(18, 3)= gcd(3, 0)= 3
# 递归写法
# 这是一个伪递归,和循环效率一样
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
def gcd_no_rec(a, b):
while b > 0:
r = a % b
a = b
b = r
return a
print(gcd(12, 16))
print(gcd_no_rec(12, 16))
2. 欧几里得算法应用
- 利用欧几里得算法实现一个分数类,支持分数的四则运算。
class Fraction:
def __init__(self, a, b):
self.a = a
self.b = b
x = self.gcd_no_rec(a, b)
self.a /= x
self.b /= x
@classmethod
def gcd_no_rec(cls, a, b):
# 最大公约数
while b > 0:
r = a % b
a = b
b = r
return a
@classmethod
def zgs(cls, a, b):
# 最小公倍数
x = cls.gcd_no_rec(a, b)
return a * b / x
def __str__(self):
return "%d/%d" % (self.a, self.b)
# 运算符重载函数__add__
def __add__(self, other):
# 3/5 + 2/7
a = self.a
b = self.b
c = other.a
d = other.b
# 算出最小公倍数
denom = self.zgs(b, d) # 分母
molecule = a * (denom / b) + c * (denom / d) # 分子
return Fraction(molecule, denom)
f = Fraction(30, 16)
print(f)
a = Fraction(1, 3)
b = Fraction(1, 2)
print(a+b)
第二节 RSA加密算法
1. RSA加密算法介绍
- 传统密码:加密算法是秘密的
- 现代密码系统:加密算法是公开的,密钥是秘密的
- 对称加密
- 非对称加密
- RSA非对称加密系统:
- 公钥:用来加密,是公开的
- 私钥:用来解密,是私有的
- 在密码学中,我们认知的设定的密码叫做口令
2. RSA加密算法加密过程
- 随机选取两个质数p和q
- 计算n=pq
- 选取一个与φ(n)互质的小奇数e,φ(n)=(p-1)(q-1)
- 对模φ(n),计算e的乘法逆元d(数学上有很多方法可以求,这里我们不做详解),即满足(e*d) mod φ(n) = 1
- 公钥(e, n), 私钥(d, n)
- 加密过程:C=(m^e)modn
- 解密过程: m = (c^d) mod n