c实现的求两个数的乘法逆元

定义:设ab的乘法逆元是x则可以记为a*x=1 mod b,即ax的积除以b的余数是1

 

乘法逆元常用算法是欧几里德算法:

 

//算法求d关于模f的乘法逆元d-1 ,即 d* d-1 mod f = 1

 

  1 (X1X2X3) := (10f) (Y1Y2Y3) := (01d)

  2 if (Y3=0) then return d-1 = null //无逆元

  3 if (Y3=1) then return d-1 = Y2 //Y2为逆元

  4 Q := X3 div Y3 //整除

  5 (T1T2T3) := (X1 - Q*Y1X2 - Q*Y2X3 - Q*Y3)

  6 (X1X2X3) := (Y1Y2Y3)

  7 (Y1Y2Y3) := (T1T2T3)

8 goto 2

 

常用于加密算法中,如仿射算法。

 

采用扩展欧几里德算法

 

首先,欧几里德算法又称辗转相除法,用于求最大公约数,算法如下:

int Gcd(int a, int b)

{

    if(b == 0)

        return a;

    return Gcd(b, a % b);

}

 

求一个数对另一个数的乘法逆元算法如下:

Typedef unsigned short int uint16

uint16 mulinv(uint16 buint16 a)      //求一个整数ba的乘法逆元

{

    int x1,x2,x3;

    int y1,y2,y3;

    int t1,t2,t3;

    x1=1;

    x2=0;

    x3=a;

    y1=0;

    y2=1;

    y3=b;

    int k;

    for(t3=x3%y3;t3!=0;t3=x3%y3){

        k=x3/y3;

        t2=x2-k*y2;

        t1=x1-k*y1;

        x1=y1;

        x2=y2;

        x3=y3;

        y1=t1;

        y2=t2;

        y3=t3;

    } 

    if(y2<0)

        y2+=a;

    if(y3==1)

        return (uint16)y2;

    else

        return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值