扩展的欧几里德算法

/*
参考书籍:<密码编码学与网络安全>-电子工业出版社-刘玉珍等译
         <数论基础>-福建科学技术出版社-王杰官
扩展的欧几里德算法:
  gcd(m,B_)=1 => B_是GF(m)中的一个元素,并且在GF(m)中存在B_的乘法逆元.
  m.B1+B_.B2=B3

  m.B1+b.B2=1时
  b.B2=1-m.B1 =>B_.B2=1 mod m =>B2为B_的模m乘法逆元

例于:
  Q   A1    A2   A3   B1    B2  B3
  -   1     0   1759   0    1   550
  3   0     1    550   1    -3   109
  21  -5    16    5    106  -339  4
  1   106   -339  4   -111   355  1

 在本程序中,A1,B1不必用到

 正好查到一个数学上做出解释的链接:
 http://B_log.vckB_ase.com/arong/archive/2004/06/10/429.aspx
 */

#define P printf

#include<stdio.h>
#include<math.h>

void main()
{
    int m,b;
    int A_2,A_3,B_2,B_3,Q;
    int temp;
    scanf("%d",&m);
    scanf("%d",&b);
 
    A_2=0,A_3=m,B_2=1,B_3=b;
    while(B_3!=0&&B_3!=1)
    {
        Q=A_3/B_3;
   
        temp=B_3;
      
        B_3=A_3-Q*B_3;
   
        A_3=temp;
 
        temp=B_2;
      
        B_2=A_2-B_2*Q;
  
        A_2=temp;
     
 
    }


    if(B_3==0)
        printf("no multiplicative inverse/n");
    if(B_3==1)
    {
        B_2=(B_2+(abs(B_2/m)+1)*m)%m;  /*转换为Zm内的数*/
        printf("the multiplicative inverse of %d mod %d is %d/n",b,m,B_2);
    }
   
    getchar();
    getchar();
   
}


   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值