单变量线性同余方程的C++实现
来源:互联网 发布:淘宝卖家订单险多少钱 编辑:程序博客网 时间:2024/06/05 10:12
在这里要注意一点的就是乘法逆的求法:
求a关于n的乘法逆的方法就是利用扩展的欧几里得算法求解:
s * n + a * t = 1 (gcd(n,a) = 1才存在乘法逆)
实现代码如下:
int gcd(int x,int y){ return y == 0 ? x : gcd(y,x%y); } void exEuclidean(int a,int b,int &s,int &t){ int r1 = a, r2 = b , s1 = 1, s2 = 0, t1 = 0, t2 = 1;//初始化 int q,r; while(r2 > 0) { q = r1 / r2; r = r1 - q * r2; //也就是r = r1%r2; r1 = r2; r2 = r; s = s1 - q * s2; s1 = s2; s2 = s; t = t1 - q * t2; t1 = t2; t2 = t; } //gcd(a,b) = r1; s = s1; t = t1; } int main(){int a,n,b;printf("请依次输入ax %% n = b方程中的系数 a , n ,b!\n");//其实就是ax = kn + b ,也就是 ax + nk = b-------线性丢番图方程 scanf("%d %d %d",&a,&n,&b);int gcd_a_n = gcd(a,n);if(b%gcd_a_n != 0){//根据线性丢番图方程 ax + by = c中如果gcd(a,b)不能整除c的话,无解 printf("gcd(a,n)不能整出b,该方程无解\n");}else{ //有解 //(1)除以gcd_a_n,简化方程 a /= gcd_a_n;n /= gcd_a_n;b /= gcd_a_n; //(2)乘以a的乘法逆,找出方程特解x0//利用扩展的欧几里得算法求 n * s + a * t = 1(注意:1是n和a的gcd) int s,t; exEuclidean(n,a,s,t); //因为传引用,s和t得到解了 int a_ = (t >= 0) ? (t % n) : ((t-t*n)%n); //乘法逆就是t映射于n的值 int x0 = (b*a_)%n; printf("特解是%d\n",x0); //(3)得到所有的通解 printf("通解是 x0 + k * %d , 0 <= k < %d\n",n,gcd_a_n);printf("所有的通解为:\n");vector<int> ans;for(int i = 0 ; i < gcd_a_n; i++){ans.push_back(x0 + i * n);printf("%d ",ans[i]);}printf("\n");}}
运行结果如下:
阅读全文
0 0
- 单变量线性同余方程的C++实现
- 单变量线性同余方程
- C Looooops(poj2115线性同余方程)
- 线性同余方程
- 线性同余方程
- 线性同余方程
- 线性同余方程
- 线性同余方程
- 解线性同余方程的应用
- 线性同余方程的求解
- 一元线性同余方程的概述
- 高斯消元借模线性同余方程
- 解 线性同余方程
- bzoj3122 线性同余方程
- 【专题】线性同余方程
- POJ2115 C looooops 【求解线性同余方程】
- 线性同余方程:poj 2115 C Looooops
- 【线性同余方程】toj2297&poj2115 C Looooops
- WEBBASIC Unit03 CSS声明
- LVS NAT模式
- Web.Config错误页配置
- EL表达式、Servle
- Java 爬虫模拟知乎登陆
- 单变量线性同余方程的C++实现
- Opencv的格式化输出风格
- gerrit操作小记
- js 好用的工具库
- iOS开发——完整项目实战Swift篇&百思不得姐Swift版总结(三)
- 日常运维经验分享
- ThinkPHP常用正则表达式
- JavaWeb 之Servlet
- Linux文件权限