第一章
迭代版本的乘法
int mul(int a, int b)
{
int res = 0;
while(b)
{
if(b & 1) res += a;
a <<= 1;
b >>= 1;
}
return res;
}
除法算法的证明
除法算法:
对任意给定的整数 a a a和 b b b,其中 b > 0 b>0 b>0,存在唯一的整数对 q q q(商)和 r r r(余数)使得,
a = q b + r a = qb + r a=qb+r且 0 ≤ r < b 0 ≤ r < b 0≤r<b。
由于存在性的证明在书上已有提及,故我们只需要证明:
①
0
≤
r
<
b
0\leq r<b
0≤r<b
②
q
q
q和
r
r
r的唯一性
①假设
r
≥
b
r\geq b
r≥b,则:
对于集合S:
S
=
{
a
−
b
k
:
k
∈
Z
且
a
−
b
k
≥
0
}
S=\left \{ a-bk:k\in \Z且a-bk\geq 0 \right \}
S={a−bk:k∈Z且a−bk≥0}
r
r
r是其中的最小元且满足
r
=
a
−
q
b
r=a-qb
r=a−qb.
由于
r
≥
b
r\geq b
r≥b,则:
r
′
=
a
−
(
q
+
1
)
b
≥
0
r'=a-(q+1)b\geq 0
r′=a−(q+1)b≥0
因而
r
′
∈
S
r'\in S
r′∈S且
r
′
<
r
r'<r
r′<r,这与
r
r
r是最小元矛盾.
故假设不成立,原命题成立.
②由
q
q
q的唯一性不难知道
r
=
a
−
q
b
r=a-qb
r=a−qb同样具有唯一性,
故只需证明
q
q
q的唯一性.
不妨假设存在
q
1
,
r
1
,
q
2
,
r
2
∈
Z
,
(
q
1
≠
q
2
,
r
1
≠
r
2
)
{q_{1}}^{},{r_{1}}^{},{q_{2}}^{},{r_{2}}^{}∈Z,(q1≠q2,r 1≠r2)
q1,r1,q2,r2∈Z,(q1=q2,r1=r2)使:
a
=
q
1
b
+
r
1
=
q
2
b
+
r
2
a={q_{1}}^{}b+{r_{1}}^{}={q_{2}}^{}b+{r_{2}}^{}
a=q1b+r1=q2b+r2
则:
∣
r
1
−
r
2
∣
=
∣
q
1
b
−
q
2
b
∣
≥
b
\left |{r_{1}}^{} -{r_{2}}^{}\right |=\left |{q_{1}}^{}b-{q_{2}}^{}b \right |≥b
∣r1−r2∣=∣q1b−q2b∣≥b
这显然与
0
≤
r
1
,
r
2
<
b
0≤{r_{1}}^{},{r_{2}}^{}<b
0≤r1,r2<b矛盾,从而假设不成立.
故
q
1
=
q
2
q_1=q_2
q1=q2,
q
q
q的唯一性得证.
第二章
迭代版本的gcd
int gcd(int a,int b)
{
while(b)
{
int t = a % b;
a = b;
b = t;
}
return a;
}
迭代版本的egcd
//求gcd(a,b)的Bezout系数x和y,即xa+yb=gcd(a,b)
int egcd(int a, int b, int *x, int *y)
{
int r1 = 1, s1 = 0, r2 = 0, s2 = 1;
while(b)
{
int q = a / b, t = a % b, tr = r1, ts = s1;
r1 = r2, s1 = s2, a = b;
r2 = tr - q * r2, s2 = ts - q * s2, b = t;
}
*x = r1, *y = s1;
return a;
}
递归版本的egcd
//从最深处(即b=0)开始递归计算
//递归从bx+(a%b)y=d得到ax'+by'=d
//其中,x'=y, y'=x-(a/b)*y
int exgcd(int a, int b, int *x, int *y)
{
if(!b)
{
*x = 1, *y = 0;
return a;
}
int d = exgcd(b, a % b, x, y);
//完成x'和y'的赋值
int t = *x;
*x = *y;
*y = t - a / b * (*x);
return d;
}
欧拉函数
int phi(int n)
{
int res = 0;
for(int i = 1; i < n; i ++ )
{
if(gcd(i, n) == 1) ++ res;
}
return res;
}
课后习题6
题目:假设
g
a
≡
1
(
m
o
d
m
)
g^{a} ≡ 1 \pmod m
ga≡1(modm)且
g
b
≡
1
(
m
o
d
m
)
g^{b} ≡ 1 \pmod m
gb≡1(modm),请证明:
g
g
c
d
(
a
,
b
)
≡
1
(
m
o
d
m
)
g^{gcd(a,b)} \equiv1\pmod m
ggcd(a,b)≡1(modm)
法一:无穷递降法
详细见链接
法二:利用同余运算的性质
先介绍一个引理(其证明思路放在法二的最后)
g a ≡ 1 ( m o d m ) ⇒ g k a ≡ 1 ( m o d m ) , k ∈ Z g^a\equiv1\pmod m\Rightarrow g^{ka}\equiv1\pmod m,k\in \Z ga≡1(modm)⇒gka≡1(modm),k∈Z
由Bezout定理有:
∃
r
,
s
∈
Z
,
使
a
r
+
b
s
=
g
c
d
(
a
,
b
)
\exist r,s\in \Z,使ar+bs=gcd(a,b)
∃r,s∈Z,使ar+bs=gcd(a,b)
由上述引理不难得到:
g
a
≡
1
(
m
o
d
m
)
⇒
g
a
r
≡
1
(
m
o
d
m
)
g^a\equiv1\pmod m\Rightarrow g^{ar}\equiv1\pmod m
ga≡1(modm)⇒gar≡1(modm)
g
b
≡
1
(
m
o
d
m
)
⇒
g
b
s
≡
1
(
m
o
d
m
)
g^b\equiv1\pmod m\Rightarrow g^{bs}\equiv1\pmod m
gb≡1(modm)⇒gbs≡1(modm)
从而有:
g
a
r
+
b
s
≡
g
a
r
⋅
g
b
s
≡
1
(
m
o
d
m
)
g^{ar+bs}\equiv g^{ar}\cdot g^{bs}\equiv 1\pmod m
gar+bs≡gar⋅gbs≡1(modm)
即:
g
g
c
d
(
a
,
b
)
≡
1
(
m
o
d
m
)
g^{gcd(a,b)}\equiv1\pmod m
ggcd(a,b)≡1(modm)
引理的证明:
①当
k
≥
0
k\geq0
k≥0时:
g
k
a
≡
g
a
⋅
g
a
⋯
g
a
⏟
k
≡
1
(
m
o
d
m
)
g^{ka}\equiv\begin{matrix} \underbrace{ g^a\cdot g^a\cdots g^a } \\k \end{matrix} \equiv1\pmod m
gka≡
ga⋅ga⋯gak≡1(modm)
②当
k
<
0
k<0
k<0时:
由于
g
a
≡
1
(
m
o
d
m
)
g^a\equiv 1\pmod m
ga≡1(modm),故:
g
−
a
≡
1
(
m
o
d
m
)
g^{-a}\equiv 1\pmod m
g−a≡1(modm)
进而有,
g
k
a
≡
(
g
−
a
)
−
k
≡
(
g
−
a
)
⋅
(
g
−
a
)
⋯
(
g
−
a
)
⏟
−
k
≡
1
(
m
o
d
m
)
g^{ka}\equiv (g^{-a})^{-k}\equiv \begin{matrix} \underbrace{ (g^{-a})\cdot (g^{-a})\cdots (g^{-a}) } \\-k \end{matrix}\equiv 1\pmod m
gka≡(g−a)−k≡
(g−a)⋅(g−a)⋯(g−a)−k≡1(modm)
综上所述,引理成立。
法三:从循环群得到的一点小启发:
构造如下集合S:
S
=
{
a
:
g
a
≡
1
(
m
o
d
m
)
,
a
>
0
}
S=\left \{a:g^a\equiv1\pmod m ,a>0\right \}
S={a:ga≡1(modm),a>0}
不难知道:S是全体自然数集合
N
∗
\N^*
N∗的一个子集.
由良序原则知:S中一定存在最小元,记作
x
x
x.
不妨假设
x
∤
a
x\nmid a
x∤a,设
a
=
q
x
+
r
,
q
,
r
∈
Z
,
0
<
r
<
x
a=qx+r,q,r\in\Z,0<r<x
a=qx+r,q,r∈Z,0<r<x,则:
g
a
≡
g
q
x
+
r
≡
g
r
≡
1
(
m
o
d
m
)
g^{a}\equiv g^{qx+r} \equiv g^r\equiv 1\pmod m
ga≡gqx+r≡gr≡1(modm)
不难发现
r
∈
S
r\in S
r∈S,但是
r
<
x
r<x
r<x,这就与
x
x
x是最小元矛盾.
故假设不成立,即
x
∣
a
x\mid a
x∣a.
同理可证得
x
∣
b
x\mid b
x∣b,进而有:
x
∣
a
,
x
∣
b
⇒
x
∣
g
c
d
(
a
,
b
)
x\mid a, x\mid b\Rightarrow x\mid gcd(a,b)
x∣a,x∣b⇒x∣gcd(a,b)
不妨设
g
c
d
(
a
,
b
)
=
k
x
,
k
∈
Z
gcd(a,b)=kx,k\in \Z
gcd(a,b)=kx,k∈Z,利用同余运算的性质有:
g
g
c
d
(
a
,
b
)
≡
g
k
x
≡
1
(
m
o
d
m
)
g^{gcd(a,b)}\equiv g^{kx}\equiv 1\pmod m
ggcd(a,b)≡gkx≡1(modm)
证毕.
课后习题8
证明:如果
g
c
d
(
a
,
b
)
=
d
gcd(a, b) = d
gcd(a,b)=d,则
g
c
d
(
a
/
d
,
b
/
d
)
=
1
gcd(a/d, b/d) = 1
gcd(a/d,b/d)=1。
证明思路:利用Bezout定理即可。
g
c
d
(
a
,
b
)
=
d
⇒
∃
x
,
y
∈
Z
,
x
a
+
y
b
=
d
gcd(a,b)=d\Rightarrow\exist x,y\in \Z,xa+yb =d
gcd(a,b)=d⇒∃x,y∈Z,xa+yb=d
由于
d
=
g
c
d
(
a
,
b
)
d=gcd(a,b)
d=gcd(a,b),则:
d
∣
a
d|a
d∣a,
d
∣
b
d|b
d∣b
因而:
x
a
d
+
y
b
d
=
1
x\frac{a}{d}+y\frac{b}{d}=1
xda+ydb=1
即:
∃
x
,
y
∈
Z
,
x
a
d
+
y
b
d
=
1
\exist x, y\in \Z,x\frac{a}{d}+y\frac{b}{d}=1
∃x,y∈Z,xda+ydb=1
由Bezout定理知:
g
c
d
(
a
d
,
b
d
)
=
1
gcd(\frac{a}{d},\frac{b}{d})=1
gcd(da,db)=1
事实上,对原命题稍加改动可以使该命题是充分且必要的,即:
g
c
d
(
a
d
,
b
d
)
=
1
,
d
>
0
⇔
g
c
d
(
a
,
b
)
=
d
gcd(\frac{a}{d},\frac{b}{d})=1,d>0\Leftrightarrow gcd(a,b) = d
gcd(da,db)=1,d>0⇔gcd(a,b)=d
⇐
\Leftarrow
⇐已证,我们证明
⇒
\Rightarrow
⇒:
由Bezout定理有:
∃
x
,
y
∈
Z
,
x
a
d
+
y
b
d
=
1
\exist x,y\in \Z ,x\frac{a}{d}+y\frac{b}{d}=1
∃x,y∈Z,xda+ydb=1
即:
x
a
+
y
b
=
d
xa+yb=d
xa+yb=d
再次使用Bezout定理可知:
g
c
d
(
a
,
b
)
∣
d
gcd(a,b)|d
gcd(a,b)∣d
注意隐含条件
d
∣
a
,
d
∣
b
d|a,d|b
d∣a,d∣b,从而有:
d
∣
g
c
d
(
a
,
b
)
d|gcd(a,b)
d∣gcd(a,b)
又
d
>
0
d>0
d>0,显然有:
d
=
g
c
d
(
a
,
b
)
d=gcd(a,b)
d=gcd(a,b)