CINTA作业六
1、运用\(CRT\)求解:
\[x \equiv 8 \pmod {11}
\]
\[x \equiv 3 \pmod {19}
\]
解:
\(11\bmod 19\)的乘法逆元为\(7\),\(19\bmod 11\)的乘法逆元也为7。根据中国剩余定理可得方程的解为:
\[x \equiv {(8\times19\times7+3\times11\times7)} \pmod {19\times11}
\]
\[x\equiv41\pmod{209}
\]
2、运用\(CRT\)求解:
\[x \equiv 1 \pmod {5}
\]
\[x \equiv 2 \pmod {7}
\]
\[x \equiv 3 \pmod {9}
\]
\[x \equiv 4 \pmod {11}
\]
解:
依据中国剩余定理的推广版:
\(M=5\times7\times\times9\times11=3465\)
\(b_1=M/m_1=3465/5=693\),\(693\pmod5\)的乘法逆元为\(2\)。
\(b_2=M/m_2=3465/7=495\),\(495\pmod7\)的乘法逆元为\(3\)。
\(b_3=M/m_3=3465/9=385\),\(385\pmod9\)的乘法逆元为\(4\)。
\(b_4=M/m_4=3465/11=315\),\(315\pmod{11}\)的乘法逆元为\(8\)。
\(x\equiv(1\times693\times2+2\times495\times3+3\times385\times4+4\times315\times8)\pmod M\)
即方程的解为:
\[x\equiv1731\pmod{3465}
\]
3、手动计算\(2000^{2019}\pmod{221}\),不允许使用电脑或者其他电子设备。[提示:这是一 道看上去与中国剩余定理无关的计算题。]
解:
\[221=13\times17
\]
定义\(Z_{221}\)到\(Z_{13}\times Z_{17}\)的映射\(\phi\)为
\[\phi(x)=([x \bmod 13],[x \bmod 17])
\]
根据费尔马小定理可得
\[2000^{2019}\pmod{13}
\]
\[=2000^{12\times168+3}\pmod{13}
\]
\[=2000^{3}\pmod{13}
\]
\[=(2000\pmod{13})^3\pmod{13}
\]
\[=7^3\pmod{13}=5
\]
同理:
\[2000^{2019}\pmod{17}
\]
\[=2000^{16\times126+3}\pmod{17}
\]
\[=2000^{3}\pmod{17}
\]
\[=(2000\pmod{17})^3\pmod{17}
\]
\[=11^3\pmod{17}=5
\]
所以:
\[\phi(2000^{2019})=(5,5)
\]
因为
\[(5,5)\leftrightarrow5
\]
所以:
\[2000^{2019}\pmod{221}=5
\]
7、实现一个利用\(CRT\)求解同余方程的程序(\(Python\)或者 C 语言都可以)。
代码如下:
//求乘法逆元
struct RS
{
int d;//最大公因子
int r;//a的Bezout系数
int s;//m的Bezout系数
};
int Mul_Inverse(int a, int m)
{
int temp, tempx, tempy;
int tempm = m;
int r0 = 1, s0 = 0, r1 = 0, s1 = 1;
RS rs;
while (m)
{
int p = a / m;
temp = m;
m = a % m;
a = temp;
int tempr0 = r0, temps0 = s0;
r0 = r1, s0 = s1;
r1 = tempr0 - p * r1;
s1 = temps0 - p * s1;
}
rs.r = r0, rs.s = s0, rs.d = a;
while (rs.r < 0)
rs.r += tempm;
if (rs.d == 1)
return rs.r;
else
return -1;
}
void CRT()
{
cout << "请输入同余方程的个数" << endl;
int n;
cin >> n;
cout << "请输入" << n << "个同余方程 x = a (mod m)的a,m" << endl;
int a[1000], m[1000];
long long M = 1;
for (int i = 0; i < n; i++)
{
cin >> a[i] >> m[i];
M *= m[i];
}
int tempx = 0;
int bi = 0, b_i = 0;
for (int i = 0; i < n; i++)
{
bi = M / m[i];
b_i = Mul_Inverse(bi, m[i]);
tempx += a[i] * bi * b_i;
tempx = tempx % M;
}
cout << "方程的解为 x = " << tempx << " (mod " << M << ")" << endl;
}