WTF zk教程第3讲:欧几里得算法
这一讲,我们将学习最大公约数和计算它的欧几里得算法,它们在密码学中有广泛的应用。
1. 最大公约数
1.1 定义
最大公约数(GCD)是能够同时整除两个整数的最大正整数,例如 和 的最大公约数是 ,可以写为:
1.2 最大公约数的性质
对于自然数 和 (假设 ) ,它们的最大公约数有以下性质:
交换律:
和 的最大公约数同时也是 和 除以 的余数 的最大公约数:
和 的最大公约数为 :
如果 能被 整除(记为 ),则有
大家可以尝试推导一下这些性质。
1.3 如何计算最大公约数
我们常用两个方法计算最大公约数:质数分解和欧几里得算法。这里我们先介绍质数分解法,它主要有三步:
质因数分解: 对于两个整数 和 ,分别进行质因数分解。
找出相同的质因数: 比较两个数的质因数,找出它们共有的部分。
相乘得到最大公约数: 将这些共有的质因数相乘,得到的结果即为最大公约数。
举个例子,计算 和 的最大公因数,首先先对它们进行质数分解:
共有部分为 ,因此它们的最大公约数为 。
但是大数的质数分解非常困难,欧几里得算法是计算最大公约数更有效率的算法。
2. 欧几里得算法
欧几里得算法(也称辗转相除法)是我们用于计算两个整数的最大公约数的常用算法。
2.1 基本思想
设两个整数为 和 ,其中 ,使用欧几里得除法,有
,其中 和 为自然数,且 。
根据最大公约数的性质(章节1.2的第2条),有 ,而 ,我们将两个大数之间的求公约数的问题转换为了两个较小数的相同。当 时,我们可以不断地将 和 替换为 和 并运用欧几里得除法:
迭代过程中,最大公因数有如下关系:
又因为 ,每次迭代 都会变小,直到 。
当 时,根据最大公约数的性质(章节1.2第3条),有:
因此,最大公约数 。
2.2 算法步骤
- 令 为 除以 的余数,即 。
- 如果 不为零,则用 替换 , 替换 ,并返回第一步。
- 如果 为零,则 即为最大公约数。
2.3 例子
下面我们计算 和 的最大公约数:
第一步:运用欧几里得除法,得到
第二步:余数 不为零,用 替换 , 替换 ,继续运用运用欧几里得除法,得到
第三步:上一步余数 为零,停止迭代,得到最大公约数 。
2.4 直观理解
假如我们有一块长为 ,宽为 的长方形房间,它希望用正方形瓷砖平铺这个房间,并且瓷砖的边长尽可能大。其实这个瓷砖最大边长就是最大公约数 ,而欧几里得方法可以让我们找到它:
首先,我们尝试使用 方形瓷砖来平铺矩形;然而,这会留下一个 剩余矩形,其中 。然后,我们尝试用 方形图块来平铺剩余矩形,这留下了第二个残差矩形 。接下来,我们尝试使用 方形图块对其进行平铺,依此类推。当没有剩余矩形时,即当正方形图块完全覆盖先前的剩余矩形时,序列结束。最小正方形瓷砖的边长就是 。
2.5 代码实现
我们可以使用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
3. 总结
最大公约数在密码学中非常重要,而欧几里得算法是解决整数的最大公约数的常用算法。通过了解这一算法,我们为后续深入学习零知识证明和密码学打下了基础。