1.
19
模
11
的乘法逆元是
7
,
19
∗
7
≡
1
m
o
d
11
19模11的乘法逆元是7,19*7\equiv1\mod 11
19模11的乘法逆元是7,19∗7≡1mod11
11
模
19
的乘法逆元是
7
,
11
∗
7
≡
1
m
o
d
19
11模19的乘法逆元是7,11*7\equiv1\mod 19
11模19的乘法逆元是7,11∗7≡1mod19
x=(8 * 7 * 19+3 * 7 * 11)%11*19=41
2.
693
模
5
的乘法逆元是
2
,
693
∗
2
≡
1
m
o
d
5
693模5的乘法逆元是2,693*2\equiv1\mod 5
693模5的乘法逆元是2,693∗2≡1mod5
495
模
7
的乘法逆元是
3
,
495
∗
3
≡
1
m
o
d
7
495模7的乘法逆元是3,495*3\equiv1\mod 7
495模7的乘法逆元是3,495∗3≡1mod7
385
模
9
的乘法逆元是
4
,
385
∗
4
≡
1
m
o
d
9
385模9的乘法逆元是4,385*4\equiv1\mod 9
385模9的乘法逆元是4,385∗4≡1mod9
315
模
11
的乘法逆元是
8
,
315
∗
8
≡
1
m
o
d
11
315模11的乘法逆元是8,315*8\equiv1\mod 11
315模11的乘法逆元是8,315∗8≡1mod11
x
=
1
∗
693
∗
2
+
2
∗
3
∗
495
+
3
∗
4
∗
385
+
4
∗
315
∗
8
(
m
o
d
5
∗
7
∗
9
∗
11
)
=
1731
x=1*693*2+2*3*495+3*4*385+4*315*8(\mod 5*7*9*11)=1731
x=1∗693∗2+2∗3∗495+3∗4∗385+4∗315∗8(mod5∗7∗9∗11)=1731
3.
Z
221
∗
=
Z
13
∗
Z
17
∗
Z_{221}^*=Z_{13}^*Z_{17}^*
Z221∗=Z13∗Z17∗
200
0
2019
m
o
d
221
=
(
200
0
2019
m
o
d
13
,
200
0
2019
m
o
d
17
)
2000^{2019}\mod 221=(2000^{2019}\mod13,2000^{2019}\mod17)
20002019mod221=(20002019mod13,20002019mod17)
(
200
0
2019
m
o
d
13
,
200
0
2019
m
o
d
17
)
=
(
1
1
2019
m
o
d
13
,
1
1
2019
m
o
d
17
)
(2000^{2019}\mod13,2000^{2019}\mod17)=(11^{2019}\mod13,11^{2019}\mod17)
(20002019mod13,20002019mod17)=(112019mod13,112019mod17)
(
1
1
2019
m
o
d
13
,
1
1
2019
m
o
d
17
)
=
(
1
1
3
m
o
d
13
,
1
1
3
m
o
d
17
)
(11^{2019}\mod13,11^{2019}\mod17)=(11^{3}\mod13,11^{3}\mod17)
(112019mod13,112019mod17)=(113mod13,113mod17)
(
1
1
3
m
o
d
13
,
1
1
3
m
o
d
17
)
)
=
(
5
,
5
)
(11^{3}\mod13,11^{3}\mod17))=(5,5)
(113mod13,113mod17))=(5,5)
x
=
5
m
o
d
13
x=5\mod 13
x=5mod13
x
=
5
m
o
d
17
x=5\mod 17
x=5mod17
x
=
5
x=5
x=5
200
0
2019
m
o
d
221
=
5
2000^{2019}\mod 221=5
20002019mod221=5
7.
#include<stdio.h>
//返回a在模m下的逆元
int mul_inverse(int a,int m){
int Matrix[2][3]={{1,0,a},{0,1,m}};
while(Matrix[0][2]!=1){
int times=Matrix[0][2]/Matrix[1][2],temp[3];
for(int i=0;i<3;i++){
temp[i]=Matrix[1][i];
Matrix[1][i]=Matrix[0][i]-Matrix[1][i]*times;
Matrix[0][i]=temp[i];
}
}
while(Matrix[0][0]<0){
Matrix[0][0]+=m;
}
return Matrix[0][0];
}
int CRT(int a[],int p[],int n){
int p_inverse[100];
long long M=1;
int ret=0;
for(int i=0;i<n;i++){
M*=p[i];
}
for(int i=0;i<n;i++){
ret+=a[i]*M/p[i]*mul_inverse(M/p[i],p[i]);
ret%=M;
}
return ret;
}
int main(){
int a[]={1,2,3,4};
int p[]={5,7,9,11};
int n=4;
printf("%d\n",CRT(a,p,n));
return 0;
}