密码学学习之旅--欧几里得算法

在用欧几里得算法以前先得说说整除,最小公倍数,最大公因数
1.整除:a=bq,则称b整除a,或者a能被b整除。记为: b|a 。若b 不能被a整除则:b|/a(这里的|/是穿过那一竖的,因为某些原因不能打出来)
2.最大公因数:a1,a2,a3…an为n个不全为0 的整数,d是其中每个数的因数,则称d为a1,a2,a3,…,an的公因数所有公因数中最大的称为最大公因数。记为:gcd(a1,a2,a3,…an),或者(a1,a2,a3,…an)。
3,最小公倍数:所有公倍数中最小的正整数成为最小公倍数。记为:lcm(a1,a2,a3,…,an)或者[a1,a2,a3,…an]。

欧几里得算法又成为辗转相除法

反复使用带余算法求最大公约数。
例:r0=a,r1=b,反复运用欧几里得:
r0=r1q1+r2
r1=r2q2+r3

rn-1=rnqn+rn+1;rn+1=0;
这时的rn 就是a,b的最大公因数。
举例:
计算(93991,102757):
102757 = 93991
1 + 8766
93991 = 876611 - 2435
8766 = 2435
4 - 974
2435 = 9742 + 487
974 = 487
2+0
所以(93997,102757)=487
这样就求出最大共因数,要想求出最小公倍数可以用a/gcd(a,b) * b
我们用C语言来进行试试叭。

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

int gcd(int a,int b)
{
 int c;
 c= a % b;
 while(c>0)
 {
  a=b;
  b=c;
  c= a % b;
  } 
  return b;
}

int main()
{
 int a,b,d;
 long lcm;
 printf("请输入a,b 的值:\n");
 scanf("%d %d",&a,&b);
 a = abs(a);
 b = abs(b);
 d = gcd(a,b);
 lcm = a / d * b;
 printf("a,b的最大公因数为:%d,最小公倍数为:%ld",&d,&lcm);
 return 0;
 } 

二元一次方程求解

ax+by=c 有整数解时:gcd(a,b)|c。
通解为:x=x0+bt/(a,b);
y=y0-at/(a,b)
例如:求方程243x+198y=909的整数解
243=198+45 9=(243-198)9-1982=2439-19811
198=454+18 9=45-(198-454)2=459-19811
45=18
2+9 9=45-182
18=9
2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值