第七章
2、群
有多少个生成元?已知3是其中一个生成元,请问6和10是否生成元?
解:={1、2、3...16},群
的阶为φ(17),φ(n)表示小于n且与n互质的正整数的个数,因为 17是一个质数,所以φ(17)=16。群
是一个循环群,其生成元的个数等于φ(16) = 8。 因 此,群
有8个生成元。
因为,gcd(2 , 16) = 2 ,所以9不是生成元。
因为,gcd(3 , 16) = 1 ,所以10是生成元。
3、p 和 q 是两个不同的素数,请问
有多少个生成元?r是任意正整数,请问
有多少个生成元?
解:根据欧拉定理,的阶数=φ(pq) = φ(p)·φ(q) = (p-1)·(q-1) ,所以有 (p-1)·(q-1) 个生成元 。
①如果 r=1 ,那么有 p-1 个生成元
②如果 r≥2 ,是循环群,所以
的阶为φ(
),因为p是素数,所以φ(
)=
-
,所以有
-
个生成元。
6、证明:如果群G没有非平凡子群,则群G是循环群。
证明:首先,我们知道对于任意群G,群本身和平凡子群{e}都是G的子群。因此,当群G没有非平 凡子群时,意味着除了群本身和平凡子群之外,没有其他的子群存在。
①当G={e}时,显然,群G是循环群
②当G≠{e}时,由命题7.1:G是群,任意g∈G,则集合〈g〉={:k∈Z}是G的子群,称〈g〉为 由g生成的循环群。所以〈g〉是平凡子群{e}或群本身G。因为〈g〉是循环群,所以G也是循环 群。
8、证明:设G为任意群,且g∈G。如果存在m,n∈G使得
=1且
=1,则
=1,其中d=gcd(m,n)。
证明:因为d=gcd(m,n),根据定理:设a和b为非零整数,存在整数r和s使得gcd(a,b)= ar + bs 。所以d=gcd(m,n)= mr + ns 。 因为
=1,所以
=1即
=1 ;同理,
=1 。所以
=
=
·
= 1 。
第八章
1、设G是群,H是G的子群。任取
,
∈G,则
H =
H 当且仅当
∈H。
①充分性:存在、
∈ H,因为
H =
H,使得
=
、所以
=
。由群 的公理易知
∈ H,所以
∈ H 。
②必要性:存在 h ∈ H , ∈ H ,使得
= h ,即
=
,即
∈
H ,由命题 8.1.陪集的属性得
H =
H 。
3、如果G是群,H是G的子群,且[G:H] = 2,请证明对任意的g∈G,gH=Hg。
证明:因为 [G:H] = 2 ,可知群G被划分为2个不同的左陪集。分别记为 H 和 K
①当 g ∈ H 时 ,由群公理封闭性得 gH = Hg = H
②当 g ∉ H 时 ,则gH ≠ H ,Hg≠H,由于[G:H]=2,故 gH = Hg = K
5、设G是阶为pq的群,其中p和q是素数。请证明G的任意非平凡子群是循环群。
证明:因为 p,q 是素数,所以pq的因子只有1,p,q,pq 。因为是非平凡子群,所以G的非平凡 子群的阶只能是p或q,由拉格朗日定理推论得,因为G的非平凡子群是素数阶有限群,所以G的 任意非平凡子群是循环群。
9、编程完成以下工作:对任意给定的一个素数p,求出
的最小生成元。任取一个整数n,对大于1小于n的所有素数p,求
的最小生成元,并求以上最小生成元集合中最大者所对应的素数p。
//对任意给定的一个素数p,求出模p的乘法群的最小生成元。
#include <iostream>
#include <vector>
bool is_prime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int mod_mult_group_generator(int p) {
std::vector<int> factors;
int phi = p - 1;
for (int i = 2; i * i <= phi; i++) {
if (phi % i == 0) {
factors.push_back(i);
if (i != phi / i) {
factors.push_back(phi / i);
}
}
}
for (int g = 2; g < p; g++) {
bool is_generator = true;
for (int factor : factors) {
if ((long long)std::pow(g, factor) % p == 1) {
is_generator = false;
break;
}
}
if (is_generator) {
return g;
}
}
return -1; // No generator found
}
int main() {
int p;
std::cout << "请输入一个素数p:";
std::cin >> p;
if (!is_prime(p)) {
std::cout << "输入的数不是素数" << std::endl;
return 1;
}
int generator = mod_mult_group_generator(p);
std::cout << "模" << p << "的乘法群的最小生成元为: " << generator << std::endl;
return 0;
}
//输入一个整数n,对大于1小于n的所有素数p,求模p的乘法群的最小生成元集并输出,求以上最小生成元集合中最大者所对应的素数p并输出
#include <iostream>
#include <vector>
#include <cmath>
bool is_prime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int mod_mult_group_generator(int p) {
std::vector<int> factors;
int phi = p - 1;
for (int i = 2; i * i <= phi; i++) {
if (phi % i == 0) {
factors.push_back(i);
if (i != phi / i) {
factors.push_back(phi / i);
}
}
}
for (int g = 2; g < p; g++) {
bool is_generator = true;
for (int factor : factors) {
if (std::pow(g, factor) % p == 1) {
is_generator = false;
break;
}
}
if (is_generator) {
return g;
}
}
return -1; // No generator found
}
int main() {
int n;
std::cout << "请输入一个整数n:";
std::cin >> n;
int max_generator = 0;
int max_p = 0;
for (int p = 2; p < n; p++) {
if (is_prime(p)) {
int generator = mod_mult_group_generator(p);
std::cout << "模" << p << "的乘法群的最小生成元为: " << generator << std::endl;
if (generator > max_generator) {
max_generator = generator;
max_p = p;
}
}
}
std::cout << "最大生成元对应的素数p为: " << max_p << std::endl;
return 0;
}