编程题
1、写一个模指数运算函数Mod_Exp,输入a、b和m,输出a^b mod m,即a的b次方模m。
int Mod_Exp(int a, int b, int m)
{
int result;
result = pow(a, b);
result = result % m;
return result;
}
2、写一个求乘法逆元的函数Mul_Inverse,输入a和m,求a模m的乘法逆元。提示,要求只输出正整数。
void Mul_Inverse(int a, int m)
{
double result;
for (int i = 1; i < a; i++)
{
result = (i * m + 1) / a;
if (result / int(result) == 1)
cout << int(result) << endl;
}
}
计算题
1.设 p = 23 和 a = 3,使用费尔马小定理计算 a^2019 mod p?
a
2019
m
o
d
p
=
3
22
∗
91
+
17
m
o
d
23
=
3
17
m
o
d
23
=
3
1
+
16
m
o
d
23
=
(
3
∗
8
1
4
)
m
o
d
23
=
(
3
∗
1
2
4
)
m
o
d
23
=
(
3
∗
14
4
2
)
m
o
d
23
=
(
3
∗
6
2
)
m
o
d
23
=
(
3
∗
36
)
m
o
d
23
=
(
3
∗
13
)
m
o
d
23
=
39
m
o
d
23
=
16
\begin{aligned} a^{2019}mod\ p&=3^{22*91+17}mod\ 23=3^{17}mod\ 23=3^{1+16}mod\ 23\\ &=(3*81^{4})mod\ 23=(3*12^{4})mod\ 23=(3*144^{2})mod\ 23\\ &=(3*6^{2})mod\ 23=(3*36)mod\ 23=(3*13)mod\ 23\\ &=39 mod\ 23=16 \end{aligned}
a2019mod p=322∗91+17mod 23=317mod 23=31+16mod 23=(3∗814)mod 23=(3∗124)mod 23=(3∗1442)mod 23=(3∗62)mod 23=(3∗36)mod 23=(3∗13)mod 23=39mod 23=16
5.请证明 13 整除 2^70 +3^70。[提示:这是一道名为证明题的计算题。]
2
70
m
o
d
13
=
2
12
∗
5
+
10
m
o
d
13
=
2
10
m
o
d
13
=
3
2
2
m
o
d
13
=
1
9
2
m
o
d
13
=
6
2
m
o
d
13
=
36
m
o
d
13
\begin{aligned} 2^{70}mod\ 13&=2^{12*5+10}mod\ 13=2^{10}mod\ 13\\ &=32^{2}mod\ 13=19^{2}mod\ 13\\ &=6^{2}mod\ 13=36 mod\ 13 \end{aligned}
270mod 13=212∗5+10mod 13=210mod 13=322mod 13=192mod 13=62mod 13=36mod 13
同理,
3
70
m
o
d
13
=
3
10
m
o
d
13
=
(
3
∗
2
7
3
)
m
o
d
13
=
(
3
∗
1
4
3
)
m
o
d
13
=
3
m
o
d
13
\begin{aligned} 3^{70}mod\ 13&=3^{10}mod\ 13=(3*27^{3})mod\ 13\\ &=(3*14^{3})mod\ 13=3mod\ 13 \end{aligned}
370mod 13=310mod 13=(3∗273)mod 13=(3∗143)mod 13=3mod 13
所以,
(
2
13
+
3
13
)
m
o
d
13
=
2
70
m
o
d
13
+
3
70
m
o
d
13
=
36
m
o
d
13
+
3
m
o
d
13
=
108
m
o
d
13
=
0
\begin{aligned} (2^{13}+3^{13})mod\ 13&=2^{70}mod\ 13+3^{70}mod\ 13\\ &=36mod\ 13+3mod\ 13\\ &=108mod\ 13\\ &=0 \end{aligned}
(213+313)mod 13=270mod 13+370mod 13=36mod 13+3mod 13=108mod 13=0
6. 使用欧拉定理计算 2^100000 mod 55。
因为
ϕ
(
55
)
=
40
所以
,
根据欧拉定理,
2
100000
m
o
d
55
=
2
40
∗
2500
m
o
d
55
=
1
m
o
d
55
=
1
\begin{aligned} &因为\ ϕ(55)=40\\ &所以,根据欧拉定理,\\ &2^{100000}mod\ 55=2^{40*2500}mod\ 55=1mod\ 55=1 \end{aligned}
因为 ϕ(55)=40所以,根据欧拉定理,2100000mod 55=240∗2500mod 55=1mod 55=1
8. 手动计算 7^1000 的最后两个数位等于什么?
要算
7
1000
的最后两个数位,即算
7
1000
m
o
d
100
因为
ϕ
(
100
)
=
100
∗
(
1
−
1
/
2
)
∗
(
1
−
1
/
5
)
=
40
所以
7
1000
m
o
d
100
=
7
40
∗
25
m
o
d
100
=
1
m
o
d
100
=
1
即
7
1000
的最后两个数位为
01
\begin{aligned} &要算7^{1000}的最后两个数位,即算7^{1000}mod\ 100\\ &因为\ ϕ(100)=100*(1-1/2)*(1-1/5)=40\\ &所以\ 7^{1000}mod\ 100=7^{40*25}mod\ 100=1mod\ 100=1\\ &即7^{1000}的最后两个数位为01 \end{aligned}
要算71000的最后两个数位,即算71000mod 100因为 ϕ(100)=100∗(1−1/2)∗(1−1/5)=40所以 71000mod 100=740∗25mod 100=1mod 100=1即71000的最后两个数位为01