欧几里得扩展
来源:互联网 发布:手机怎么打开index.php 编辑:程序博客网 时间:2024/05/18 03:34
源网址
欧几里得扩展证明(自我感觉最好懂得一种写法)
① ,当b = 0 时,gcd(a, b) = a , 此时 x = 1, y = 0;
② ,当 a * b <> 0 时,
设 a * x + b * y = gcd(a, b); (1)
b * x0 + (a % b) * y0 = gcd( b, a % b); (2)
由朴素的欧几里德公式; gcd(a, b) = gcd (b, a % b);
得(1),(2) a * x + b * y = b * x0 + (a % b) * y0
= b * x0 + (a – a / b * b) * y0 = a * y0 + ( x0 – a / b * y0 ) * b 所以 x = y0, y = x0 – a / b * y0;
由此可以得出扩展欧几里德的递归程序:
int extend_euild(int a, int b)//返回的是最大公约数{ if(b == 0) { t = 1; p = 0; c = a; } else { extend_euild(b, a%b); int temp = t; t = p; p = temp - a/b*p; }}
还可以这样写
#include<cstdio>typedef long long LL;void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){ if (!b) {d = a, x = 1, y = 0;} else{ extend_Eulid(b, a % b, y, x, d); y -= x * (a / b); }}int main(){ LL a, b, d, x, y; while(~scanf("%lld%lld", &a, &b)){ extend_Eulid(a, b, x, y, d); printf("%lld*a + %lld*b = %lld\n", x, y, d); }}
还可以这样
long long ext_gcd(long long a,long long b,LL &x,LL &y){ if(b==0) { x = 1,y = 0; return a; } LL m; m = ext_gcd(b,a%b,y,x); y -= a / b * x; return m;}
阅读全文
1 0
- 【欧几里得&扩展欧几里得】
- 欧几里得和扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得&扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得与扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得 扩展欧几里得
- 欧几里得与扩展欧几里得
- 欧几里得 & 扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得与扩展欧几里得
- 扩展欧几里得
- 扩展欧几里得
- 扩展欧几里得
- 扩展欧几里得
- 快速乘-模板
- TCP连接的同时打开和同时关闭
- java基础(2)
- ajax基本语法
- 使用github pages创建博客
- 欧几里得扩展
- 李白打酒
- 模拟实现strstr函数
- 证垂直
- 【linux is not Unix】linux账户管理和用户组管理
- 非递归方法前序遍历二叉树
- 高斯模糊
- 非递归方法中序遍历二叉树
- js中的闭包