title | tags | |||
---|---|---|---|---|
03. 欧几里得算法 |
|
这一讲,我们将学习最大公约数和计算它的欧几里得算法,它们在密码学中有广泛的应用。
最大公约数(GCD)是能够同时整除两个整数的最大正整数,例如
对于自然数
-
交换律:
$\gcd(a, b)=\gcd(b,a)$ -
$a$ 和$b$ 的最大公约数同时也是$b$ 和$a$ 除以$b$ 的余数 的最大公约数:$\gcd(a, b) = \gcd(b, a \bmod b)$ -
$a$ 和$0$ 的最大公约数为$a$ :$\gcd(a,0)=a$ -
如果
$a$ 能被$b$ 整除(记为$b \mid a$ ),则有$\gcd(a,b)=b$
大家可以尝试推导一下这些性质。
我们常用两个方法计算最大公约数:质数分解和欧几里得算法。这里我们先介绍质数分解法,它主要有三步:
-
质因数分解: 对于两个整数
$a$ 和$b$ ,分别进行质因数分解。 -
找出相同的质因数: 比较两个数的质因数,找出它们共有的部分。
-
相乘得到最大公约数: 将这些共有的质因数相乘,得到的结果即为最大公约数。
举个例子,计算
共有部分为
但是大数的质数分解非常困难,欧几里得算法是计算最大公约数更有效率的算法。
欧几里得算法(也称辗转相除法)是我们用于计算两个整数的最大公约数的常用算法。
设两个整数为
,其中
根据最大公约数的性质(章节1.2的第2条),有
迭代过程中,最大公因数有如下关系:
又因为
当
因此,最大公约数
- 令
$r$ 为$a$ 除以$b$ 的余数,即$r = a \mod b$ 。 - 如果
$r$ 不为零,则用$b$ 替换$a$ ,$r$ 替换$b$ ,并返回第一步。 - 如果
$r$ 为零,则$b$ 即为最大公约数。
下面我们计算
-
第一步:运用欧几里得除法,得到
$30 = 1 \cdot 24 + 6$ -
第二步:余数
$r=6$ 不为零,用$b$ 替换$a$ ,$r$ 替换$b$ ,继续运用运用欧几里得除法,得到$24 = 4 \cdot 6 + 0$ -
第三步:上一步余数
$r=0$ 为零,停止迭代,得到最大公约数$\gcd(30,24)=6$ 。
假如我们有一块长为
首先,我们尝试使用
我们可以使用python实现欧几里得算法,只需要6行代码:
def euclidean_algorithm(a, b):
if a < b:
a, b = b, a
while b:
a, b = b, a % b
return a
# 示例
num1 = 30
num2 = 24
gcd_result = euclidean_algorithm(num1, num2)
print(f'{num1} 和 {num2} 的最大公约数是 {gcd_result}')
# 输出: 30 和 24 的最大公约数是 6
最大公约数在密码学中非常重要,而欧几里得算法是解决整数的最大公约数的常用算法。通过了解这一算法,我们为后续深入学习零知识证明和密码学打下了基础。