中国剩余定理——C++实现

编程入门 行业动态 更新时间:2024-10-04 21:17:04

中国剩余<a href=https://www.elefans.com/category/jswz/34/1769765.html style=定理——C++实现"/>

中国剩余定理——C++实现

1.程序说明

输入:同余方程的个数n,各方程的参数

输出:同余方程组的解

运行结果:

与课本例题对比:

2.实现思路

  • 求x模m的逆元

采用拓展欧几里得算法计算x模m的逆元,代码如下:

int ni(int x, int m) {int r[100], s[100], t[100], q[100];r[0] = x;r[1] = m;s[0] = 1;t[0] = 0;s[1] = 0;t[1] = 1;int i = 1;while (r[i] != 0) {q[i] = r[i - 1] / r[i];s[i + 1] = s[i - 1] - q[i] * s[i];t[i + 1] = t[i - 1] - q[i] * t[i];r[i + 1] = r[i - 1] % r[i];i++;}while (s[i - 1] < 0) {s[i - 1] += m;}return s[i - 1];
}//求x模m的逆元
  • 中国剩余定理

获取方程组的个数以及同余方程的各个参数后,按照中国剩余定理的方式依次求出来Mi及其逆元,完成求解。

3.完整代码

#include<iostream>
using namespace std;
int ni(int x, int m) {int r[100], s[100], t[100], q[100];r[0] = x;r[1] = m;s[0] = 1;t[0] = 0;s[1] = 0;t[1] = 1;int i = 1;while (r[i] != 0) {q[i] = r[i - 1] / r[i];s[i + 1] = s[i - 1] - q[i] * s[i];t[i + 1] = t[i - 1] - q[i] * t[i];r[i + 1] = r[i - 1] % r[i];i++;}while (s[i - 1] < 0) {s[i - 1] += m;}return s[i - 1];
}//求x模m的逆元int main() {cout << "请输入方程的个数" << endl;int n;cin >> n;int* b = new int[n];int* m = new int[n];int* M = new int[n];int* x = new int[n];//存放逆元int i = 0;int sum = 1;//这里sum代表了m的值cout << "请依次输入各方程的参数" << endl;cout << "格式参考:x≡b(mod m)" << endl;for (i = 0; i < n; i++) {cout << "请输入第" << i+1 << "个方程的参数(先输入b,后输入m)" << endl;cin >> b[i] >> m[i];sum *= m[i];M[i] = 1;}for (i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i != j) {M[i] *= m[j];}}}for (i = 0; i < n; i++) {x[i] = ni(M[i], m[i]);}int ans = 0;for (i = 0; i < n; i++) {ans += x[i] * M[i] * b[i];}while (ans - sum >= 0) {ans -= sum;}cout << "该方程组的解为x≡" << ans << "(mod " << sum << ")" << endl;cin.get();cin.get();
}

更多推荐

中国剩余定理——C++实现

本文发布于:2024-02-19 15:54:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1764390.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:定理   中国   剩余

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!