关闭

扩展的欧几里德算法

1581人阅读 评论(0) 收藏 举报
/*
参考书籍:<密码编码学与网络安全>-电子工业出版社-刘玉珍等译
         <数论基础>-福建科学技术出版社-王杰官
扩展的欧几里德算法:
  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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:23889次
    • 积分:379
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论