1、实现求乘法逆元的函数,给定a和m,求a模m的乘法逆元,无解时请给出无解提示,并且只返回正整数。进而给出求解同余方程(ax = b mod m)的函数,即给定a,b,m,输出满足方程的x,无解给出无解提示。
附:由上一题的egcd算法如下,又求乘法逆元存在的前提是题目中的gcd(a,m)=1,故以此为判断是否有解的条件,其中
//求c的乘法逆元
int changed_egcd(int m, int c)
{
int* arr = new int[3];
int r0, r1, s0, s1;
r0 = 1, r1 = 0, s0 = 0, s1 = 1;
int temp, temp_r, temp_s;
while (c != 0)
{
int q = m / c;
temp = m % c;
m = c;
c = temp;
temp_r = r0 - q * r1, r0 = r1, r1 = temp_r;
temp_s = s0 - q * s1, s0 = s1, s1 = temp_s;
}
if (m != 1) return 0; //若最大公因子不是1(不互素),则无解
arr[0] = r0, arr[1] = s0, arr[2] = m; //其中这里默认arr[1]为所求乘法逆元
return arr[1];
}
//求方程的解x
int find_ans(int a,int b,int m)
{
if (changed_egcd(m, a) == 0)return 0; //无解
else return b * changed_egcd(m, a);
}
2、实现模指数运算的函数,给定x、y和m,求x的y次方模m。
int mod_exp(int x, int y, int p)
{
int res = 1;
while (y > 0)
{
if ((y & 1) == 1)res = (res * x) % p;
y = y / 2;
x = (x * x) % p;
}
return res;
}
3、设p = 23和a = 5,使用费尔马小定理计算a^{2020} mod p?
依题目,由费尔马小定理得
5
2020
(
m
o
d
23
)
5^{2020}(mod 23)
52020(mod23) =
5
(
23
−
1
)
∗
91
+
18
(
m
o
d
23
)
5^{(23-1)*91+18}(mod 23)
5(23−1)∗91+18(mod23) =
5
18
(
m
o
d
23
)
5^{18}(mod 23)
518(mod23)
由模指数运算
知18=0b10010
故有
y
0
=
0
y0 = 0
y0=0,
x
1
=
18
m
o
d
23
x^1= 18 mod 23
x1=18mod23
y
0
=
1
y0 = 1
y0=1,
x
1
=
2
m
o
d
23
x^1= 2 mod 23
x1=2mod23
y
0
=
0
y0 = 0
y0=0,
x
1
=
4
m
o
d
23
x^1= 4 mod 23
x1=4mod23
y
0
=
0
y0 = 0
y0=0,
x
1
=
16
m
o
d
23
x^1= 16 mod 23
x1=16mod23
y
0
=
1
y0 = 1
y0=1,
x
1
=
3
m
o
d
23
x^1= 3 mod 23
x1=3mod23
a
2020
m
o
d
p
=
(
2
∗
3
)
m
o
d
23
=
6
a^{2020} mod p=(2*3)mod 23=6
a2020modp=(2∗3)mod23=6
4、使用欧拉定理计算2^{100000} mod 55
因为
g
c
d
(
2
,
55
)
=
1
gcd(2, 55) = 1
gcd(2,55)=1
由欧拉Phi函数知
ϕ
(
55
)
=
40
ϕ(55)=40
ϕ(55)=40
由欧拉定理
2
40
≡
1
m
o
d
55
2^{40}≡1 mod 55
240≡1mod55
又有
100000
m
o
d
40
=
0
100000mod40=0
100000mod40=0
故
2
100000
≡
1
m
o
d
55
2^{100000}≡1 mod 55
2100000≡1mod55
5、手动计算7^{1000}的最后两个数位等于什么?
依题意,知目的即求
7
1000
m
o
d
100
的
值
7^{1000}mod 100的值
71000mod100的值
因为
g
c
d
(
7
,
100
)
=
1
gcd(7, 100) = 1
gcd(7,100)=1
由欧拉Phi函数知
ϕ
(
100
)
=
40
ϕ(100)=40
ϕ(100)=40
由欧拉定理
7
40
≡
1
m
o
d
100
7^{40}≡1 mod 100
740≡1mod100
又有
1000
m
o
d
40
=
0
1000mod40=0
1000mod40=0
得
7
1000
≡
1
m
o
d
100
7^{1000}≡1 mod 100
71000≡1mod100
故最后的两位数
7
1000
7^{1000}
71000为01