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

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

扩展欧几里得即求方程 ax + by = gcd(a,b) 的整数解的算法。常用来求解逆元,即 ax = 1(mod b)  -> ax % b = 1  -> ax - by = 1; 令b = -b,即

ax + by = 1,当a,b互质时有 ax + by = gcd(a,b);

求解过程:

根据欧几里得算法,当b!=0时,gcd(a,b) == gcd(b,a%b);

所以 ax + by = gcd(b,a%b); -> bx` + (a%b)y` = gcd(b,a%b);

联立方程 ax + by = (a%b)*y` + bx`;

ax + by = (a - a/b*b) * y` + bx`;

ax + by = ay` - a/b*b * y` + bx`;

ax + by = ay` + b(x`- a/b * y`);

对应项的 x = y`,y = (x` - a/b * y`);

令A = b,B = a%b; Ax`` + By`` = gcd(A,B);

由此不断递推,直到B = 0;则Ax = gcd(A,0) = A;

x`` = 1;y``为任意值,这里我们赋为0;

则可根据x = y`,y = (x` - a/b * y`),得到上层解从而解得方程

 

#include 
#include
using namespace std;long long extend_gcd(long long a,long long b,long long &x,long long &y){ if(a ==0 && b == 0)return -1; if(b == 0){x = 1;y = 0;return a;} long long d = extend_gcd(b,a%b,y,x);// d 表示 a,b的gcd; 现在的y = x`,x = y`; y -= a/b*x; return d;}long long mod_reverse(long long a,long long n){ long long x,y; long long d =extend_gcd(a,n,x,y); if(d == 1)return (x%n+n)%n; // 保证最小正整数解; else return -1; }int main(){ long long a,n; while(cin>>a>>n){ cout << mod_reverse(a,n) << endl; } return 0;}

 

转载于:https://www.cnblogs.com/HBZAcmer/p/10683647.html

你可能感兴趣的文章
MD5密钥的加密,解密 生成密钥
查看>>
curl 查看一个web站点的响应时间
查看>>
DC综合简单总结(1)
查看>>
责任链模式
查看>>
chown 详解
查看>>
anysis中fluent 与 VS2015 编译 环境配置
查看>>
暴力破解算法,基本实现
查看>>
关于oceanbase中存储过程的设计与实现
查看>>
写给 Node.js 学徒的 7 个建议(转)
查看>>
HTML.9视频和音频
查看>>
JavaScript&jQuery.whiledo循环
查看>>
一个巧妙的数组去重代码
查看>>
luogu3295 萌萌哒 (并查集+ST表)
查看>>
蓝牙学习 (6) - Play with TI sensorTag (1)
查看>>
linux 网络配置
查看>>
[BZOJ 3622]已经没有什么好害怕的了
查看>>
微信JSAPI支付
查看>>
孙鑫MFC学习笔记18:ActiveX
查看>>
一个Stream的封装——WrapStream
查看>>
使用VS Code远程开发
查看>>