欧几里得(Euclid)算法

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}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值