线性丢番图方程的C++实现
来源:互联网 发布:网络邻接权 编辑:程序博客网 时间:2024/06/05 08:42
阅读《密码学与网络安全》这本书,看到线性丢番图方程,就结合之前看到的一些算法,写了一个得到解的程序,加深理解。
也就把代码贴在这里:
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 gcd(int x,int y){return y == 0 ? x : gcd(y,x%y); } int main(){int a,b,c;printf("请依次输入ax + by = c中的参数a,b,c!\n");scanf("%d %d %d",&a,&b,&c); //首先求出gcd(a,b),利用朴素欧几里得算法 int gcd_a_b = gcd(a,b);if(c % gcd_a_b != 0){printf("c不能整出gcd(a,b),该方程无整数解!\n");return 0; }else{ //会有无穷多个解 int a1 = a / gcd_a_b;int b1 = b / gcd_a_b;//这个时候a1和b1肯定互质了 int c1 = c / gcd_a_b;//变成解方程 a1 * x + b1 * y = c1//利用扩展的欧几里得算法求 a1 * s + b1 * t = 1(注意:1是a1和b1的gcd) int s,t;exEuclidean(a1,b1,s,t); //因为传引用,s和t得到解了//得到特解int x0 = c / gcd_a_b * s , y0 = c / gcd_a_b * t;printf("得到特解:%d 和 %d\n",x0,y0);printf("通解是 x = %d + k * %d 和 y = %d - k * %d,(k为任意整数)\n",x0,b1,y0,a1);}}
阅读全文
0 0
- 线性丢番图方程的C++实现
- 单变量线性同余方程的C++实现
- C Looooops(poj2115线性同余方程)
- tensorflow 实现 正规方程求解线性回归
- 一元线性回归方程的建立
- 多元线性回归方程的建立
- 线性递推数列的特征方程
- 一元线性回归方程的建立
- 解线性同余方程的应用
- 线性电阻电路方程的建立方法
- 线性同余方程的求解
- 一元线性同余方程的概述
- 高斯消元法解方程Ax=b的C源代码实现
- [C++] 一般线性链表类的C++实现
- 线性查找算法的C语言实现
- 线性表的顺序实现(C语言)
- 线性表的顺序实现(C++)
- 线性表的顺序实现(c语言)
- JavaSE 详解ThreadLocal关键字
- UVa10391
- 【图示】30张图看懂中国金融体系
- PHP通配符问题
- Couldn't load this key(unable to open file)
- 线性丢番图方程的C++实现
- CRegKey操作注册表
- Add and Search Word
- FFMPEG视音频编解码学习笔记
- JDK1.8新特性测试☞排序
- 数据库性能问题诊断与分析
- Redis 发布与订阅(五)
- 极限学习机(ELM)的使用
- [leetcode]40. Combination Sum II(Java)