1.修改欧几里得算法
【实验目的】理解欧几里得算法求最大公因子的原理;通过编程实现gcd(a,b)算法。
【实验内容】编写函数Euclid(a,b),输入正整数a和b,输出最大公因子。
运行参考程序,得到如下结果(部分):
gcd(18,300)=6
gcd(55,22)=11
gcd(710,310)=10
gcd(1970, 1066)=2
gcd(1160718174,316258250)=1078
def Euclid(a, b):
#用欧几里得算法计算两个正整数的最大公因子(GCD)。
while b != 0:
a, b = b, a % b # 更新 a 和 b
return a
if __name__ == "__main__":
a = int(input("请输入第一个正整数 a: "))
b = int(input("请输入第二个正整数 b: "))
gcd = Euclid(a, b)
print(f"{a} 和 {b} 的最大公因子是: {gcd}")
2.扩展欧几里得算法
【实验目的】扩展欧几里得算法对于AES有限域中乘法逆元的计算以及RSA等密码算法非常重要。要求编程实现该算法Ex_Eculid。
【算法描述】能够实现:计算两个整数a、b的最大公因子d=gcd(a,b)。若d=gcd(a,b)=1,输出b模a的乘法逆元y。
【输入输出】
ab不互素的情况:输入a=42, b=30。输出最小的ax+by,即gcd(a,b)=6。
ab互素的情况:输入a=1759, b=550。输出gcd(a,b)=1,输出xi, yi。此时b=550关于模a=1759的乘法逆元是yi=355。
ab互素的情况:输入a=334, b=111。输出gcd(a,b)=1,输出xi, yi。此时b=111关于模a=334的乘法逆元是yi=-3。
def ex_euclid(a,b):
if b==0:
return a,1,0
else:
d,x,y=ex_euclid(b,a%b)
x,y=y,x-(a//b)*y
return d,x,y
def inverse_mod(a,b):
d,x,y=ex_euclid(a,b)
if d!=1:
return None
else:
return y%b
a = int(input("请输入第一个数a: "))
b = int(input("请输入第二个数b: "))
d1,x1,y1=ex_euclid(a,b)
if d1==1:
inv_mod=inverse_mod(b,a)
print(f"gcd({a},{b})={d1},x={x1},b模a的乘法逆元y={y1}")
else:
print("a和b不互素,无法计算乘法逆元。")
print(f"gcd({a},{b})={d1}")