第三章
1、模指数运算函数
要求: 写一个模指数运算函数Mod_Exp,输入a、b和m,输出a^b mod m,即a的b次方模m。
递归版本:
C++代码如下:
//递归版本
int Mod_Exp(int a, int b, int m)
{
if (b == 0)
return 1;
int temp = Mod_Exp(a, b / 2, m);
if (b % 2 == 0)
return (temp * temp) % m;
else if (b % 2 == 1)
return (a * temp * temp) % m;
}
迭代版本:
C++代码如下:
//迭代版本
int Mod_Exp_1(int a, int b, int m)
{
int res = 1;
while (b != 0)
{
if (b & 1)
res = (res * a) % m;
b = b >> 1;
a = (a * a) % m;
}
return res;
}
2、求乘法逆元函数
**要求:**写一个求乘法逆元的函数Mul_Inverse,输入a和m,求a模m的乘法逆元。提示,要求只输出正整数。
首先,a模m的乘法逆元存在当且仅当
gcd
(
a
,
m
)
=
1
\gcd(a,m)=1
gcd(a,m)=1,然后我们求乘法逆元的思路主要是利用扩展欧几里得算法(egcd算法)。
C++代码如下:
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;//若逆元<0,则再求出大于0的乘法逆元
if (rs.d == 1)//a,m互素
return rs.r;
else
return -1;//乘法逆元不存在
}
第四章
第一题
**题目:**设 p = 23 和 a = 3,使用费尔马小定理计算
a
2019
m
o
d
p
a^{2019}\bmod p
a2019modp?
解:
a
2019
m
o
d
p
=
3
2019
m
o
d
23
=
3
91
∗
22
+
17
m
o
d
23
a^{2019}\bmod p=3^{2019}\bmod23=3^{91*22+17}\bmod23
a2019modp=32019mod23=391∗22+17mod23
91
∗
22
=
91
∗
(
23
−
1
)
91*22=91*(23-1)
91∗22=91∗(23−1),根据费尔马小定理可得
3
23
−
1
≡
1
(
m
o
d
23
)
3^{23-1}\equiv1\pmod{23}
323−1≡1(mod23),所以
3
91
∗
22
+
17
m
o
d
23
=
3
17
m
o
d
23
=
16
3^{91*22+17}\bmod23=3^{17}\bmod23=16
391∗22+17mod23=317mod23=16
第五题
**题目:**请证明 13 整除
2
70
+
3
70
2^{70}+3^{70}
270+370。[提示:这是一道名为证明题的计算题。]
解:证明 13 整除
2
70
+
3
70
2^{70}+3^{70}
270+370即证明
(
2
70
+
3
70
)
m
o
d
13
=
0
(2^{70}+3^{70})\bmod13=0
(270+370)mod13=0
(
2
70
+
3
70
)
m
o
d
13
(2^{70}+3^{70})\bmod13
(270+370)mod13
=
(
2
70
m
o
d
13
+
3
70
m
o
d
13
)
m
o
d
13
=(2^{70}\bmod13+3^{70}\bmod13)\bmod13
=(270mod13+370mod13)mod13
=
(
2
12
∗
5
+
10
m
o
d
13
+
3
12
∗
5
+
10
m
o
d
13
)
m
o
d
13
=(2^{12*5+10}\bmod13+3^{12*5+10}\bmod13)\bmod13
=(212∗5+10mod13+312∗5+10mod13)mod13
根据费尔马小定理可得:
2
13
−
1
≡
1
(
m
o
d
13
)
2^{13-1}\equiv1\pmod{13}
213−1≡1(mod13),
3
13
−
1
≡
1
(
m
o
d
13
)
3^{13-1}\equiv1\pmod{13}
313−1≡1(mod13)
所以:
(
2
12
∗
5
+
10
m
o
d
13
+
3
12
∗
5
+
10
m
o
d
13
)
m
o
d
13
(2^{12*5+10}\bmod13+3^{12*5+10}\bmod13)\bmod13
(212∗5+10mod13+312∗5+10mod13)mod13
=
(
2
10
m
o
d
13
+
3
10
m
o
d
13
)
m
o
d
13
=(2^{10}\bmod13+3^{10}\bmod13)\bmod13
=(210mod13+310mod13)mod13
=
(
10
+
3
)
m
o
d
13
=
0
=(10+3)\bmod13=0
=(10+3)mod13=0,题目得证。
第六题
**题目:**使用欧拉定理计算
2
100000
m
o
d
55
2^{100000}\bmod55
2100000mod55。
解:欧拉定理:
设
n
n
n 和
a
a
a为正整数,且
gcd
(
a
,
n
)
=
1
\gcd(a,n)=1
gcd(a,n)=1,则
a
ϕ
(
n
)
≡
1
(
m
o
d
n
)
a^{\phi(n)}\equiv1\pmod{n}
aϕ(n)≡1(modn)
gcd
(
2
,
55
)
=
1
\gcd(2,55)=1
gcd(2,55)=1可得
2
ϕ
(
55
)
≡
1
m
o
d
55
2^{\phi(55)}\equiv1\bmod55
2ϕ(55)≡1mod55
又由欧拉
p
h
i
phi
phi函数公式可得
ϕ
(
55
)
=
ϕ
(
5
)
∗
ϕ
(
11
)
=
4
∗
10
=
40
\phi(55)=\phi(5)*\phi(11)=4*10=40
ϕ(55)=ϕ(5)∗ϕ(11)=4∗10=40
即
2
40
m
o
d
55
=
1
2^{40}\bmod55=1
240mod55=1
所以
2
100000
m
o
d
55
2^{100000}\bmod55
2100000mod55
=
2
100000
m
o
d
55
=2^{100000}\bmod55
=2100000mod55
=
2
40
∗
2500
m
o
d
55
=2^{40*2500}\bmod55
=240∗2500mod55
=
(
2
40
m
o
d
55
)
2500
m
o
d
55
=(2^{40}\bmod55)^{2500}\bmod55
=(240mod55)2500mod55
=
1
m
o
d
55
=
1
=1\bmod55=1
=1mod55=1
第八题
**题目:**手动计算
7
1000
7^{1000}
71000 的最后两个数位等于什么?
解:题目即计算
7
1000
m
o
d
100
7^{1000}\bmod100
71000mod100的值,与上一题相同由欧拉定理可得
7
ϕ
(
100
)
≡
1
m
o
d
100
7^{\phi(100)}\equiv1\bmod100
7ϕ(100)≡1mod100
ϕ
(
100
)
=
40
\phi(100)=40
ϕ(100)=40所以
7
40
m
o
d
100
=
1
7^{40}\bmod100=1
740mod100=1
所以
7
1000
m
o
d
100
7^{1000}\bmod100
71000mod100
=
7
40
∗
25
m
o
d
100
=7^{40*25}\bmod100
=740∗25mod100
=
(
7
40
m
o
d
100
)
25
m
o
d
100
=(7^{40}\bmod100)^{25}\bmod100
=(740mod100)25mod100
=
1
m
o
d
100
=
1
=1\bmod100=1
=1mod100=1
所以最后两个数子是0和1。