公钥算法的基本数论知识
包含内容
欧几里得算法、扩展的欧几里得算法、
欧拉函数、费马小定理、欧拉定理
http://www.huangjihao.com/index.php/archives/625
一、欧几里得算法(Euclidean Algorithm)
1、简介
欧几里德算法又称辗转相除法,是指用于计算两个正整数 a,b 的最大公约数。应用领域有数学和计算机两个方面。
计算公式 𝑔𝑐𝑑(𝑎,𝑏)=𝑔𝑐𝑑(𝑏,𝑎𝑚𝑜𝑑𝑏)
二、例子
𝑟0=973 , 𝑟1=301,计算它们的最大公约数
三、代码实现
Python实现:
# 欧几里得算法
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
r0 = int(input("请输入第一个正整数:"))
r1 = int(input("请输入第二个正整数:"))
print("最大公约数是:", gcd(r0, r1))
C语言实现:
#include <stdio.h>
int gcd(int a,int b)
{
if (b==0) {
return a;
}
else{
return gcd(b, a%b);
}
}
int main()
{
int r0,r1;
int result;
printf("请输入两个正整数:\n");
scanf("%d%d",&r0,&r1);
result = gcd(r0, r1);
printf("%d\n",result);
}
二、扩展的欧几里得算法(Extended Euclidean algorithm)
1、简介
扩展的欧几里得算法是欧几里得算法的一个扩展。
通过扩展的欧几里得算法,我们不仅可以求出 𝑎 和 𝑏 的最大公约数,还可用找到整数 𝑥 和 𝑦,使得 𝑔𝑐𝑑(𝑎,𝑏)=𝑎𝑥+𝑏𝑦
2、原理
有两个数 𝑎,𝑏,对它们进行辗转相除法,可得它们的最大公约数。
此时欧几里得算法已经递归到了终点,𝑔𝑐𝑑(𝑎,𝑏)中的 𝑏 此时为 0。
也就是 𝑎∗1+𝑏∗0=𝑎
此时的 𝑥=1,𝑦=0
那么我们可以反推上去,求得要解的 𝑥 和 𝑦
3、代码实现
Python实现:
def ext_gcd(a, b):
if b == 0:
x1 = 1
y1 = 0
x = x1
y = y1
r = a
return r, x, y
else:
r, x1, y1 = ext_gcd(b, a % b)
x = y1
y = x1 - a // b * y1
return r, x, y
print("请输入两个正整数,且第一个数大于第二个数"<