欧几里得扩展
来源:互联网 发布:华彩人生软件 编辑:程序博客网 时间:2024/06/08 03:32
拓展欧几里得:
当 gcd ( a , b )= d 时,求绝对值和最小的 x , y 使得 x * a + y * b = d ;
d = gcd ( a , b ) = gcd ( b , a mod b );
设:
x1 * a + y1 * b = d ; ①
x2 * b + y2 * ( a mod b ) = d ; ②
因为 a mod b = a - ( a / b )* b; ③(除法为整除)
将③代入①整理得:
y2 * a + ( x2 - ( a / b ) * y2 ) * b = d; ④
由①和④整理得:
x1 = y2 ;
y1 = x2 - ( a / b ) * y2;
将此结论代入递归函数既得。
#include<stdio.h>#define ll long longvoid gcd(ll a,ll b,ll& d,ll& x,ll& y){ if(!b){d=a;x=1;y=0;} else {gcd(b,a%b,d,y,x);y-=x*(a/b);}}int main(){ ll a,b,d,x,y; while(scanf("%lld%lld",&a,&b)!=EOF){ gcd(a,b,d,x,y); printf("%lld*%lld+%lld*%lld=%lld\n",a,x,b,y,d); } return 0;}
拓展欧几里得求逆元:
当 a 与 b 互素时有 gcd ( a , b ) = 1 ;
即得: a * x + b * y = 1;
a * x ≡ 1 ( mod b );
由于 a 与 b 互素,同余式两边可以同除 a ,得:
1 * x ≡ 1 / a (mod b);
因此 x 是 a mod b 的逆元;
#include<stdio.h>#define ll long longll gcd(ll a,ll b,ll &d,ll& x,ll& y){ if(!b){ d=a; x=1; y=0; return x; } else{ gcd(b,a%b,d,y,x); y-=x*(a/b); } return x;}int main(){ ll a,b,d,x,y; while(scanf("%lld%lld",&a,&b)!=EOF){ x=gcd(a,b,d,x,y); printf("a:%lld->x:%lld\n",a,x);// printf("a:%lld->x:%lld\nb:%lld->y:%lld\n",a,x,b,y); } return 0;}
阅读全文
0 0
- 【欧几里得&扩展欧几里得】
- 欧几里得和扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得&扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得与扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得 扩展欧几里得
- 欧几里得与扩展欧几里得
- 欧几里得 & 扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得与扩展欧几里得
- 扩展欧几里得
- 扩展欧几里得
- 扩展欧几里得
- 扩展欧几里得
- 1011
- 【from zero to zero】noip2017
- [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
- 树莓派Android Things物联网开发:按键中断及消抖
- Java关键字static和final
- 欧几里得扩展
- Java 8 新特性(二)流类库
- 1. Two Sum
- Python之读写文件
- 主席树(静态) 图文讲解让你一次就懂 hdu2665为例
- [数论 反演 && 莫队] hdu4676 . Sum Of Gcd
- DPDK(六):DPDK整体介绍
- poj 1144
- nyoj 58 最少步骤