Phần này tiếp tục từ phần trước, giới thiệu các khái niệm về nhóm cyclic, nhóm Abel, đẳng cấu nhóm, tích trực tiếp để suy ra cấu trúc của mọi nhóm Abel có cấp cho trước.
Nhóm cyclic
Nhóm cyclic là dạng đơn giản nhất của nhóm. Nhóm cyclic cấp n được ký hiệu là Cn = {0, 1, 2, ..., n-1} với phép toán:
a ⊕ b = (a + b) mod n
Phép toán này có tính giao hoán: a ⊕ b = b ⊕ a. Trong nhiều tài liệu, người ta quen dùng ký hiệu cộng (+) thay cho ⊕.
Nhóm cyclic là nhóm được sinh bởi một phần tử, thường là phần tử sinh 1:
1 ⊕ 1 = 2
2 ⊕ 1 = 3
...
(n-1) ⊕ 1 = 0
Phép cộng liên tiếp n lần phần tử sinh cho ta phần tử đơn vị 0. Với mọi phần tử a trong nhóm, nếu n là số dương nhỏ nhất sao cho n·a = 0 (phép nhân lặp n lần a), thì n được gọi là chu kỳ của a. Khái niệm chu kỳ áp dụng cho mọi nhóm, không chỉ nhóm cyclic.
Đối với nhóm Cn, mọi số nguyên dương m < n và nguyên tố cùng nhau với n đều là phần tử sinh. Chu kỳ của m trong Cn là [m,n]/m, trong đó [m,n] là bội chung nhỏ nhất.
Nhóm cyclic vô hạn Z bao gồm tất cả các số nguyên với phép cộng thông thường, phần tử đơn vị là 0, phần tử sinh là 1 (và -1 cũng là phần tử sinh do tồn tại phần tử nghịch đảo).
Nhóm Abel
Nhóm Abel là nhóm có tính giao hoán, tức là với mọi a, b trong nhóm G:
a · b = b · a
Nhóm cyclic là một dạng của nhóm Abel. Tuy nhiên, có những nhóm Abel không phải là nhóm cyclic.
Xét nhóm con được xây dựng từ C2 × C2 = {(0,0), (0,1), (1,0), (1,1)} với phép toán:
(a,b) · (c,d) = (a⊕c, b⊕d)
Phần tử đơn vị là (0,0). Mọi phần tử đều tự nghịch đảo vì (a,b) · (a,b) = (0,0). Dễ dàng kiểm tra tính giao hoán. Đây là nhóm Abel 4 phần tử, nhưng không phải nhóm cyclic vì mọi phần tử khác đơn vị đều có chu kỳ 2, trong khi nhóm cyclic cấp 4 có phần tử sinh chu kỳ 4.
Đối với nhóm không giao hoán, ta xét nhóm D3 (nhóm đối xứng của tam giác) với 6 phần tử: {e, r, r2, s, sr, sr2} thỏa mãn r3 = e, s2 = e, sr = r2s. Nhóm này không giao hoán và là nhóm không giao hoán nhỏ nhất.
Đẳng cấu nhóm
Hai nhóm G và H được gọi là đẳng cấu (ký hiệu G ≅ H) nếu tồn tại một song ánh f: G → H bảo toàn phép toán:
∀a,b ∈ G: f(a · b) = f(a) * f(b)
Nói cách khác, hai nhóm đẳng cấu có cấu trúc hoàn toàn giống nhau, chỉ khác về cách đặt tên phần tử.
Ta có thể kiểm tra đẳng cấu bằng cách duyệt tất cả các hoán vị của tập hợp:
import itertools
def kiem_tra_dang_cau(op1, op2, n):
"""Kiểm tra hai bảng nhân n×n có đẳng cấu không"""
make_mul = lambda op: lambda a, b: op[a * n + b]
mul1 = make_mul(op1)
mul2 = make_mul(op2)
for perm in itertools.permutations(range(n)):
f = lambda x: perm[x]
is_iso = True
for a in range(n):
for b in range(n):
if f(mul1(a, b)) != mul2(f(a), f(b)):
is_iso = False
break
if not is_iso:
break
if is_iso:
return True
return False
Một nhóm tự đẳng cấu với chính nó gọi là tự đẳng cấu. Tập hợp các tự đẳng cấu của một nhóm cũng lập thành một nhóm, gọi là nhóm tự đẳng cấu, ký hiệu Aut(G).
Nhóm con
Nếu một tập con H của nhóm G với phép toán hạn chế trên H lập thành một nhóm, thì H gọi là nhóm con của G. Mọi nhóm con đều chứa phần tử đơn vị của G.
Trong D3, các nhóm con bao gồm: {e}, {e, s}, {e, r, r2}, {e, sr}, {e, sr2}. Tất cả đều là nhóm cyclic. {e} và toàn bộ G là các nhóm con tầm thường.
Đối với nhóm cyclic cấp n, nếu m là ước dương của n thì nhóm có nhóm con cấp m, sinh bởi phần tử n/m.
Tích trực tiếp
Cho hai nhóm G1 và G2, tích trực tiếp ngoài được định nghĩa là:
G = G1 × G2 = {(a,b) | a ∈ G1, b ∈ G2}
với phép toán: (a1,b1) · (a2,b2) = (a1·a2, b1·b2)
Dễ dàng kiểm tra G thỏa mãn mọi tiên đề nhóm: phần tử đơn vị là (e1, e2), phần tử nghịch đảo của (a,b) là (a-1, b-1).
Nếu G1 và G2 đều là nhóm Abel, tích trực tiếp cũng là nhóm Abel.
Tích trực tiếp trong: Nếu G1 và G2 là các nhóm con của G thỏa G1 ∩ G2 = {e} và mọi phần tử của G1 giao hoán với mọi phần tử của G2, thì G ≅ G1 × G2.
Điều kiện tích trực tiếp của nhóm cyclic
Xét nhóm Abel hữu hạn G được sinh bởi n phần tử: G = ⟨a1, a2, ..., an⟩. Trong nhóm Abel, mọi phần tử giao hoán nên có thể viết:
g = k1a1 + k2a2 + ... + knan
trong đó k·a biểu diễn phép cộng k lần phần tử a.
Nếu tồn tại bộ số (k1, ..., kn) không đồng thời bằng 0 sao cho k1a1 + ... + knan = 0, thì các phần tử a1, ..., an phụ thuộc tuyến tính. Khi đó có thể loại bỏ một phần tử sinh dư thừa.
Lặp lại quá trình này, ta chứng minh được mọi nhóm Abel hữu hạn đều biểu diễn được dưới dạng tích trực tiếp của các nhóm cyclic.
Chuẩn hóa tích trực tiếp
Một nhóm Abel có thể biểu diễn bằng nhiều tích trực tiếp khác nhau. Ví dụ, C2 × C3 đẳng cấu với C6 vì trong nhóm tồn tại phần tử chu kỳ 6.
Xét Cm × Cn. Gọi d = gcd(m,n) và L = lcm(m,n) = m·n/d. Phần tử (a,b) có chu kỳ L. Đặc biệt:
Phần tử (m/d·a, n/d·b) có chu kỳ d
Do đó: Cm × Cn ≅ Cd × CL
Điều này dẫn đến công thức chuẩn hóa: với dãy các số nguyên dương, ta có thể chuyển đổi thành dạng chuẩn mà mỗi số là bội của số liền trước.
def ucln(m, n):
"""Ước chung lớn nhất"""
while n:
m, n = n, m % n
return m
def bcnn(m, n):
"""Bội chung nhỏ nhất"""
return m * n // ucln(m, n)
def chuan_hoa(ds):
"""Chuẩn hóa tích trực tiếp"""
a = ds[:]
n = len(a)
for i in range(n - 1):
for j in range(i + 1, n):
a[i], a[j] = ucln(a[i], a[j]), bcnn(a[i], a[j])
# Loại bỏ các số 1
return [x for x in a if x > 1]
Ví dụ: chuẩn hóa [6, 10, 15, 20] cho kết quả [10, 30, 60] vì 10|30|60. Biểu diễn này là duy nhất.
Ứng dụng: Liệt kê nhóm Abel cấp 72
Phân tích 72 = 23 × 32. Các nhóm Abel cấp 72 bao gồm:
- C72
- C2 × C36
- C3 × C24
- C6 × C12
- C2 × C2 × C18
- C2 × C6 × C6
Phần tiếp theo sẽ hướng dẫn lập trình liệt kê tất cả các nhóm Abel đẳng cấu với cấp cho trước.