密码学实验_2_欧几里得算法求乘法逆元(python 实现)

文章目录

效果

代码

import numpy as np

class euclid:
    def __init__(self, init_y=0):
        self.init_y = init_y
        
    # 获取商与余数
    def __get_Q_R(self, dividend: int, divisor: int)-> list:
        Q_R = []
        while(divisor != 0):
            r = dividend % divisor
            q = int((dividend - r) / divisor)
            dividend = divisor
            divisor = r
            Q_R.insert(0, [q, r])
        func = lambda x: list(x)
        Q, R = map(func, list(zip(*Q_R)))    
        return Q, R
    
    # 乘法逆元计算
    def __get_X_Y(self, init_y: int, q: list)-> list:
        matrix = np.ones(shape=(2,2), dtype=np.int32)
        ret = np.array([1, init_y]).reshape((2,1))
        for i in q:
            ret = np.array([[0, 1], [1, -i]]) @ ret
        return ret.T.reshape((2,))

    # 合法乘法逆元计算(正数)
    def get_valid_X_Y(self, dividend: int, divisor: int)-> list:
        Q, R = self.__get_Q_R(dividend, divisor)
        init_y = self.init_y
        X_Y = self.__get_X_Y(init_y=init_y, q=Q)
        while (X_Y[1] < 0):
            init_y += 1
            X_Y = self.__get_X_Y(init_y=init_y, q=Q)
        String = f'gcd({dividend}, {divisor}) = {X_Y[0]} * {dividend} + {X_Y[1]} * {divisor} = {R[1]}'
        return X_Y, String

if __name__=='__main__':
    dividend = 239
    divisor = 17
    euc = euclid(init_y=0)
    X_Y, String = euc.get_valid_X_Y(dividend, divisor)
    print(String)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值