1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
乘法逆元:
int a_mod_m(int a,int m)//gcd和egcd均为函数,可见作业二
{
if(gcd(a,m)!=1) return -1;//使用gcd函数判断两数是否互素,若互素则满足消去律,存在解
int *egcd=EGCD(a,m);//运用egcd函数算出乘法逆元,若r不是正整数则返回s
if(egcd[0]>0) return egcd[0];
else return egcd[1];
}
同余方程
int ax_b_mod_m(int a,int b,int m)//gcd和egcd均为函数,可见作业二
{
if(gcd(a,m)!=1) return -1;//使用gcd函数判断两数是否互素,若互素则满足消去律,存在解
int *egcd=EGCD(a,m);//运用egcd函数算出乘法逆元,若r不是正整数则s
if(egcd[0]>0) return egcd[0]*b;
else return egcd[1]*b;
}
2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
int mod_exp(int x, int y, int m)
{
if (y == 0) return 1;
int z = mod_exp(x, y / 2, m);
if ((y&1) == 0)return z * z % m;
else return x * z * z % m;
}
3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
因为23是素数,由费马小定理得
5
22
≡
1
(
m
o
d
23
)
5^{22}≡1( mod 23)
522≡1(mod23)又因为
5
2020
=
5
91
∗
22
+
18
5^{2020}=5^{91*22+18}
52020=591∗22+18
所以
5
2020
m
o
d
23
=
5
18
m
o
d
23
=
6
5^{2020} mod 23=5^{18} mod 23 =6
52020mod23=518mod23=6
4、使用欧拉定理计算2^{100000} mod 55。
因为55是合数,因此
ϕ
(
55
)
=
ϕ
(
5
)
∗
ϕ
(
11
)
=
40
ϕ (55)=ϕ (5)*ϕ (11)=40
ϕ(55)=ϕ(5)∗ϕ(11)=40
由欧拉定理可得
2
100000
≡
2
40
≡
1
(
m
o
d
55
)
2^{100000}≡2^{40}≡1(mod55)
2100000≡240≡1(mod55)
因此结果为1
5、手动计算7^{1000}的最后两个数位等于什么?
按规律可得为01