第七章
2.群 Z17 * 有多少个生成元?已知 3 是其中一个生成元,请问 9 和 10 是否生成元?
Zp* = { 1,2,3,…,16 }
|Zp* |=16
Φ(16)=8,生成元8个
Z17* 中与16互素的数有{1,3,5,7,9,11,13,15}
9=32 mod 17, 9不是生成元
10=33mod 17, 10是生成元
3.p 和 q 是两个不同的素数,请问 Zpq 都多少个生成元?r 是任意正整数,请问 Zpr都多少个生成元
对于群 Zpq,φ(pq) = (p-1)(q-1)。
在 Zpq 中,有 (p-1)(q-1) 个生成元。
对于群 Zpr,φ(pr )= p(r-1)(p-1) 。
则在 Zpr 中,有 p(r-1)(p-1) 个生成元。
6.证明:如果群 G 没有非平凡子群,则群 G 是循环群。
证明:G有且仅有两个子群,{e}与平凡子群G,即本身。
- {e}为循环群
- ∀g∈G且g≠e,< g >={gk:k∈Z}为G的子群,< g >为由g生成的循环群
< g >=G,故G为循环群。
8.证明:设 G 为任意群,且 g ∈ G。 如果存在 m, n ∈ Z 使得 gm = 1 且 gn = 1,则gd = 1,其中 d = gcd(m, n)。
证明:
gm = 1 , gn = 1
d = gcd(m, n)。
由 Bézout 定理,存在整数 x 和 y 使得 mx + ny = d。
gd = gmx + ny
= (gm)x · ( gn )y
= 1x · 1y
= 1
因此,gd = 1,其中 d = gcd(m, n)。
第八章
1.证明:设 G 是群,H 是 G 的子群。任取 g1, g2 ∈ G,则 g1H = g2H 当且仅当 g1-1g2 ∈ H。
-
g1H = g2H,证明 g1-1g2∈H 。
因为 g1H = g2H
所以对于 h ∈ H,有 g1h = g2。
等式两边同时左乘 g1-1,得 g1-1(g1h) = g1-1g2
有 h = g1-1g2 , h∈H
故g1H = g2H,有 g1-1g2∈H -
g1-1g2 ∈H,证明 g1H = g2H。
g1-1g2 ∈ H,所以 g1(g1-1g2) ∈ g1H。
有g2 ∈ g1H。
对于 h ∈ H,由上述证明,我们可以写成 h = g1-1g2。
有 g1h = g2,即 g1(g1-1g2) = g2。
即g2 ∈ g1H。
故g1-1g2∈ H,那么 g1H = g2H。
g1H = g2H当且仅当 g1-1g2 ∈ H 得证。
3.如果 G 是群,H 是群 G 的子群,且 [G : H] = 2,请证明对任意的 g ∈ G,gH = Hg
证明:gH⊆Hg且Hg⊆gH
[G : H]=2,即H在G上有两个不同的左陪集。其中一个为H本身。
设另一个左陪集为H‘
-
由于 H 是 G 的子群,那么 e ∈ H,其中 e 是群 G 的单位元素。因此有 H = He。
H 和 gH 是 G 的左陪集,则 G = H ∪ gH。
若H∪ gH非空,那么由于H和 gH 是左陪集,它们的交集不应包含非空集合。
因此,H ∪ gH 必须是空集。 -
∃h∈H 使得 gh∈H。
即∀g ∈G,∃ h ∈H 使得 gh ∈ H,即 gH ⊆ H。 -
g ∈G,则 g = ge , e ∈ H。
H是子群,e ∈H,所以 g ∈ gH。
因此,H ⊆ gH。
综上所述, gH = Hg。
5.设 G 是阶为 pq 的群,其中 p 和 q 是素数。请证明 G 的任意非平凡子群是循环群
证明:
给定群 (G) 的阶为 (pq),其中 (p) 和 (q) 是素数。现在我们来证明 (G) 的任意非平凡子群是循环群。
首先,由拉格朗日定理,|G| = pq,G可能的阶数为 1, p, q, pq。
- |H| = 1,那么 H 是平凡子群。
- |H| = p 或 |H| = q,
据拉格朗日定理, H 是 G 的一个非平凡的循环子群。
(p 和 q 是素数,所以只有平凡子群和 G 本身的阶才是 pq 的因数。)
|H| 只能为 p或 q。 - |H| = pq,那么 H=G ,是非平凡的循环子群。
若|H| = p或 |H| = q 。
p 和 q 是素数,存在阶为 p 或 q 的循环群。
设|H| =p,是一个阶为 p 的子群。
由群论的基本定理,阶为 p的群同构于 Cp循环群。
同理, |H| = q,也同构于 Cq循环群。
对于任意非平凡子群 H,它都是循环群。
9.编程完成以下工作:对任意给定的一个素数 p,求出 Zp* 的最小生成元。任取一个整数 n,对大于 1 小于 n 的所有素数 p,求 Zp* 最小生成元,并求以上最小生成元集合中最大者所对应的素数 p。
点击查看代码
#include <iostream>
#include <cmath>
#include <vector>
bool isPrime(int n) {
if (n < 2) {
return false;
}
for (int i = 2; i <= sqrt(static_cast<double>(n)); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int findMinGenerator(int p) {
std::vector<int> factors;
int phi = p - 1;
for (int i = 2; i <= sqrt(static_cast<double>(phi)); i++) {
if (phi % i == 0) {
factors.push_back(i);
if (i != phi / i) {
factors.push_back(phi / i);
}
}
}
for (int i = 2; i <= p; i++) {
bool isGenerator = true;
for (int factor : factors) {
if (gcd(i, p) == 1 && static_cast<int>(pow(i, phi / factor)) % p == 1) {
isGenerator = false;
break;
}
}
if (isGenerator) {
return i;
}
}
return -1;
}
int main() {
int n;
std::cout << "Enter a positive integer n: ";
std::cin >> n;
int maxGenerator = -1;
int maxPrime = -1;
for (int p = 2; p < n; p++) {
if (isPrime(p)) {
int generator = findMinGenerator(p);
if (generator > maxGenerator) {
maxGenerator = generator;
maxPrime = p;
}
}
}
std::cout << "The maximum generator is " << maxGenerator << " for prime p = " << maxPrime << std::endl;
return 0;
}
运行结果: