CINTA第六次作业

第十章第1、2、3、7 

1、运用CRT求解:  x ≡ 8(mod 11)

                                 x ≡ 3(mod 19)

解:易知11和19互素,记 a=8,b=3,p=11,q=19,所以 n=pq=209

        由pp^{-1}\equiv 1mod\left ( modq\right )和 qq^{-1}\equiv 1mod\left ( modp\right )得:p^{-1}= 7,q^{-1}= 7

        所以 x = aqq^{-1}+bpp^{-1}\left ( modn \right ) = 41


2、运用CRT求解: x ≡ 1(mod 5)

                                x ≡ 2(mod 7)

                                x ≡ 3(mod 9)

                                x ≡ 4(mod 11)

解:设m_{0}=5,m_{1}=7,m_{2}=9,m_{3}=11,则 M = 5×7×9×11=3465 ,

记 b_{0} = M / m_{0} =693,b_{1} = M / m_{1} =495,b_{2} = M / m_{2} =385,b _{3} = M / m_{3} =315

b_{i}b_{i}^{-1}\equiv 1mod\left ( modm_{i}\right )得:{b_{0}}^{-1}= 2,{b_{1}}^{-1}= 3,{b_{2}}^{-1}= 4,{b_{3}}^{-1}= 8

因为 a_{0} = 1,a_{1} = 1,a_{2} = 2,a_{3} = 3

根据中国剩余定理推广版x=\sum_{i=0}^{n-1}a_{i}b_{i}{b_{i}}^{-1}(modM),得 x = 1731


3、手动计算2000^{2019}(mod221),不允许使用电脑或者其他电子设备。[提示:这是一道看上去与中国剩余定理无关的计算题。]

解:因为 221 = 13 *17,13 和 17 互素 ;

2000\leftrightarrow (11,11),所以 2000^{2019}\leftrightarrow (11,11)^{2019},所以(11,11)^{2019}=([11^{2019}mod13],[11^{2019}mod17])

11^{2019}mod17=11^{(16*126+3)}mod1711^{2019}mod13=11^{(12*168+3)}mod13

由费马小定理得:11^{3} ≡ 5 mod 17、11^{3} ≡ 5 mod 13

所以2000^{2019}(mod221) = 5


7、实现一个利用CRT求解同余方程的程序(Python或者C语言都可以) 

 

#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();
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值