第七章
Z
17
∗
Z_{17}^*
Z17∗有
ϕ
(
16
)
=
8
\phi(16)=8
ϕ(16)=8个生成元
Z
17
∗
的阶为
16
Z_{17}^*的阶为16
Z17∗的阶为16,gcd(2,16)=2,因此9的阶是16/2=8,9不是生成元。gcd(3,16)=1,10的阶是16/1=16,所以10也是生成元。
Z
p
q
有
ϕ
(
p
q
)
=
ϕ
(
p
)
ϕ
(
q
)
=
(
p
−
1
)
∗
(
q
−
1
)个生成元
Z_{pq}有\phi(pq)=\phi(p)\phi(q)=(p-1)*(q-1)个生成元
Zpq有ϕ(pq)=ϕ(p)ϕ(q)=(p−1)∗(q−1)个生成元
Z
p
r
有
ϕ
(
p
r
)
=
p
r
−
p
r
−
1
个生成元
Z_{p^r}有\phi(p^r)=p^r-p^{r-1}个生成元
Zpr有ϕ(pr)=pr−pr−1个生成元
G只有平凡子群,根据子群的阶必然整除G的阶,那么G的阶必然是素数(因子只有1和它本身), 阶为素数的群必然为循环群
由
B
e
z
o
u
t
定理
d
=
g
c
d
(
m
,
n
)
=
b
m
+
r
n
由Bezout定理d=gcd(m,n)=bm+rn
由Bezout定理d=gcd(m,n)=bm+rn
g
d
=
g
b
m
+
r
n
=
g
b
m
g
r
n
=
1
b
1
r
=
1
g^d=g^{bm+rn}=g^{bm}g^{rn}=1^b1^r=1
gd=gbm+rn=gbmgrn=1b1r=1
第八章
充分性:
g
1
H
=
g
2
H
,
g
1
h
1
=
g
2
h
2
,
g
1
−
1
g
1
h
1
=
g
1
−
1
g
2
h
2
,
h
1
=
g
1
−
1
g
2
h
2
,
h
1
h
2
−
1
=
g
1
−
1
g
2
,
g
1
−
1
g
2
∈
H
g_1H=g_2H,g_1h_1=g_2h_2,g_1^{-1}g_1h_1=g_1^{-1}g^2h_2,h_1=g_1^{-1}g_2h_2,h_1h_2^{-1}=g_1^{-1}g_2,g_1^{-1}g_2\in H
g1H=g2H,g1h1=g2h2,g1−1g1h1=g1−1g2h2,h1=g1−1g2h2,h1h2−1=g1−1g2,g1−1g2∈H
必要性:
g
1
−
1
g
2
∈
H
,
对于任意
g
1
,
g
2
都有
g
1
g
1
−
1
g
2
∈
g
1
H
,
g
2
∈
g
2
H
,
g
1
H
与
g
2
H
互为子集,
g
1
H
=
g
2
H
g_1^{-1}g_2\in H,对于任意g_1,g_2都有g_1g_1^{-1}g_2\in g_1H,g_2\in g_2H,g_1H与g_2H互为子集,g_1H=g_2H
g1−1g2∈H,对于任意g1,g2都有g1g1−1g2∈g1H,g2∈g2H,g1H与g2H互为子集,g1H=g2H
[
G
:
H
]
=
2
,
G
只有平凡子群,
G
的阶必然为素数,
G
是循环群,
H
是一个循环子群
[G:H]=2,G只有平凡子群,G的阶必然为素数,G是循环群,H是一个循环子群
[G:H]=2,G只有平凡子群,G的阶必然为素数,G是循环群,H是一个循环子群
对于任意的
g
∈
G
,
都有
g
H
=
H
g
对于任意的g\in G,都有gH=Hg
对于任意的g∈G,都有gH=Hg
G的阶是pq,那么G的子群的阶必然是1,p,q,pq。G的非平凡子群的阶是p或者q。
阶是素数的群必然是循环群,所以G的非平凡群是循环群
#include<bits/stdc++.h>
using namespace std;
bool is_prim(int n){
for(int i=2;i<sqrt(n)+1;i++){
if(n%i==0){
return false;
}
}
return true;
}
//获取Z_p star最小生成元
int get_min_g(int p){
for(int i=2;i<p;i++){
for(int j=2;j<p;j++){
if((int)pow(i,j)%p==1){
if(j==p-1){
return i;
}else{
break;
}
}
}
}
return -1;
}
//获取小于n的素数中,最小生成元最大的那个素数
int get_max_p(int n){
int ret=0;
for(int i=2;i<n;i++){
if(is_prim(i)){
if(get_min_g(i)>get_min_g(ret)){
ret=i;
}
}
}
return ret;
}
int main(){
int p;
scanf("%d",&p);
printf("最小生成元为:%d\n",get_min_g(p));
int n;
scanf("%d",&n);
printf("获取小于n的素数中,最小生成元最大的那个素数是:%d\n",get_max_p(n));
system("pause");
return 0;
}