[密码学]扩展欧几里得算法求最大公因数以及乘法逆元(C语言实现)

扩展的欧几里得算法

椰汁笔记,欢迎指正。

算法原理:

[密码学]扩展欧几里得算法求最大公因数以及乘法逆元(C语言实现)_第1张图片

C实现:

/*  *  定义扩展欧几里得数据结构 */
typedef struct{    
	int d; //最大公因数    
	int y; //b乘法逆元    
	int x; //a乘法逆元
} Euclid;
/*  *  整数求逆 */
Euclid *get_gcd_inverse(int a, int b)
{    
	int x, y, d, x1, x2, y1, y2, q, r;    
	Euclid *e = (Euclid *)malloc(sizeof(Euclid));    i
	f (b == 0)   
	 {       
	  	d = a;        
	  	x = 1;        
	  	y = 0;       
	  	e->d = d;        
	  	e->y = y;        
	  	e->x = x;        
	  	return e;    
	  }    
	  x2 = y1 = 1;    
	  x1 = y2 = 0;    
	  while (b > 0)    
	  {        
		  q = a / b;        
		  r = a - q * b;        
		  x = x2 - q * x1;       
		  y = y2 - q * y1;
		  a = b;        
		  b = r;        
		  x2 = x1;        
		  x1 = x;        
		  y2 = y1;        
		  y1 = y;        
		  d = a;        
		  x = x;        
		  y = y2;    
	  }    
	  d = a;    
	  x = x2;    
	  y = y2;    
	  e->d = d;    
	  e->y = y;    
	  e->x = x;    
	  return e;
}

利用结构体实现返回数据更加方便。

你可能感兴趣的:([密码学]扩展欧几里得算法求最大公因数以及乘法逆元(C语言实现))