博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展欧几里得算法
阅读量:6567 次
发布时间:2019-06-24

本文共 1494 字,大约阅读时间需要 4 分钟。

扩展欧几里得算法用于:
1.求不定方程
2.求解模的逆元

3.求解同余方程

/* * 扩展欧几里得算法(extended Euclidean algorithm) * 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: * ax+by = gcd(a, b) = d(解一定存在,根据数论中的相关定理)。 * 扩展欧几里德常用在求解模线性方程及方程组中。 * */#include 
// 递归法实现扩展欧几里德算法long exgcd1(long a, long b, long *x, long *y){ if(b==0) { *x=1; *y=0; return a; } long r = exgcd1(b, a%b, x, y); long t = *x; *x = *y; *y = t - a / b * *y; return r;}// 递推法实现扩展欧几里德算法(正解)long exgcd2(long a, long b, long *x, long *y){ long x0=1, y0=0, x1=0, y1=1; long r, q; *x=0; *y=1; r = a % b; q = (a - r) / b; while(r) { *x = x0 - q * x1; *y = y0 - q * y1; x0 = x1; y0 = y1; x1 = *x; y1 = *y; a = b; b = r; r = a % b; q = (a - r) / b; } return b;}int main(void){ long x, y; printf("a=%d, b=%d, x=%ld, y=%ld exgcd=%ld\n", 42, 70, x, y, exgcd1(42, 70, &x, &y)); printf("a=%d, b=%d, x=%ld, y=%ld exgcd=%ld\n", 42, 70, x, y, exgcd2(42, 70, &x, &y)); return 0;}

关键代码(正解):

// 递推法实现扩展欧几里德算法(正解)long exgcd2(long a, long b, long *x, long *y){    long x0=1, y0=0, x1=0, y1=1;    long r, q;    *x=0;    *y=1;    r = a % b;    q = (a - r) / b;    while(r)    {        *x = x0 - q * x1;        *y = y0 - q * y1;        x0 = x1;        y0 = y1;        x1 = *x;        y1 = *y;        a = b;        b = r;        r = a % b;        q = (a - r) / b;    }    return b;}

转载于:https://www.cnblogs.com/tigerisland/p/7564953.html

你可能感兴趣的文章
2019 -2-15 复习
查看>>
vim锁定屏幕
查看>>
实用的 JavaScript 调试小技巧
查看>>
027移除元素
查看>>
Linux下清理内存和Cache方法
查看>>
CodeVS 1018 单词接龙(DFS)
查看>>
我的博客园的CSS和html设置
查看>>
工作中简单的kettle使用
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
06- Linux下sublime下载与使用
查看>>
前端文摘:Web 开发模式演变历史和趋势
查看>>
将图片序列转化为视频文件
查看>>
jQuery的文档操作***
查看>>
js 小数取整,js 小数向上取整,js小数向下取整
查看>>
vue-cli3.0
查看>>
window.location.replace vs window.location.href
查看>>
CVPR 2018:阿里提出应用 LocalizedGAN 进行半监督训练
查看>>
被劫持的wordpress.com账户被用来感染站点
查看>>
分享一下最近看的东西
查看>>