Part 0 声明
本文若无特殊说明,所有集合皆为有限集合。
Part 1 群定义
1.1 群
称一个集合 G 和某种二元运算 ⋅ 构成群当且仅当:
- 存在单位元:∃e∈G 满足 ∀g∈G 有 e⋅g=g⋅e=g;
- 满足结合律:∀g1,g2,g3∈G,有 g1⋅(g2⋅g3)=(g1⋅g2)⋅g3;
- 封闭:∀g1,g2∈G,满足 g1⋅g2∈G;
- 存在逆元:∀g∈G,有 g−1∈G 满足 g⋅g−1=g−1⋅g=e;
注意 G 不一定满足交换律,满足交换律的群叫交换群或阿贝尔群。
集合 G 和运算 ⋅ 构成的群记为 (G,⋅),本文为了方便省略了运算 ⋅,统一记作群 G。
1.2 子群
对于一个群 G,称群 H 为 G 的子群当且仅当 H⊆G。
例如模 3 意义下的乘法群 {1} 是模 3 意义下的乘法群 {1,2} 的子群。
1.3 左陪集和右陪集
对于一个群 G、它的子群 H 和一个 g∈G:
例如 {2} 是模 3 意义下的乘法群 {1,2} 的子群 {1} 的左陪集,也是它的右陪集。
Part 2 群性质
2.1 群皆可逆矩阵群
考虑一个大小为 n 的群 G,∀g∈G,显然可以把 g 写成一个 n×n 的 01 矩阵且保证写出的矩阵集仍是一个群。
所以任意群都和全体可逆矩阵群的一个子群同构。
2.2 陪集的性质和 Lagrange 定理
2.2.1 陪集的性质
考虑群 G 的任意子群 H 和任意 a,b∈G:(这里考虑右陪集,左陪集同理)
-
H⋅a∈G:由于 G 是群所以封闭;
-
a∈H⋅a:因为 e∈H;
-
a∈H⇔H⋅a=H:由于 H 是群所以封闭;
-
b∈H⋅a⇔H⋅a=H⋅b;
证明
右到左显然,左到右:
∃h∈H,h⋅a=b,所以 H⋅b=H⋅(h⋅a)=(H⋅h)⋅a=H⋅a。(根据 2)
Q.E.D.
-
H⋅a 与 H⋅b 要么相等要么不交;
证明
若有交则 ∃c∈H⋅a,c∈H⋅b,根据 3,H⋅a=H⋅c=H⋅b。
Q.E.D.
-
∣H⋅a∣=∣H∣;
证明
若 ∣H⋅a∣=∣H∣,则一定有 ∣H⋅a∣<∣H∣,则有 h1,h2∈H 满足 h1=h2 且 h1⋅a=h2⋅a。
由于 a∈G,所以 a−1∈G,所以 h1⋅a⋅a−1=h2⋅a⋅a−1,h1=h2,矛盾。
所以 ∣H⋅a∣=∣H∣,Q.E.D.
2.2.2 Lagrange 定理
对于群 G 的任意子群 S,均有 ∣G∣ 是 ∣S∣ 的因子。
证明是显然的,根据 2.2.1 中的 1、5、6 立得。
推论:∀gcd(x,p)=1,xφ(p)≡1(modp)
考虑模 m 的乘法群 Sp={x∣1≤x<p,gcd(x,p)=1},显然有 ∣Sp∣=φ(p)。
对于 Sp 的幂子群 Hx={xy mod p∣y∈N}(x∈Sp),均有 ∣Hx∣ 是 ∣Sp∣ 即 φ(p) 的因数。
因为 x∣Hx∣≡1(modp),所以 xφ(p)≡(x∣Hx∣)∣Hx∣φ(p)≡1(modp)。
Part 3 群作用
考虑一个置换群 G 和一个集合 X,满足 ∀x∈X,g∈G 都有 x⋅g∈X。
这时称 G 是 X 上的作用,例如 n 阶置换群就是 n 阶排列集上的作用。
3.1 轨道和定点
∀x∈X,定义 G 作用在 X 上的轨道 Ox 和定作用集(其实是群) Gx:
Ox={x⋅g∣g∈G}Gx={g∣g∈G,x⋅g=x}
Ox 实际上是在 G 作用下 X 中与 x 等价元素的集合。
考察 Gx 的性质:
- Gx⊆G;
- 存在单位元:e∈Gx,这很显然;
- 满足结合律:∀g1,g2,g3∈Gx,有 g1⋅(g2⋅g3)=(g1⋅g2)⋅g3,这也很显然;
- 封闭:∀g1,g2∈Gx 有 g1⋅g2∈Gx,因为 x⋅g1⋅g2=(x⋅g1)⋅g2=x⋅g2=x;
- 存在逆元:∀g∈Gx 有 g−1∈Gx,因为 x⋅g=x⇔x=x⋅g−1;
所以 Gx 是 G 的子群。
3.2 Burnside 引理和 Polya 定理
3.2.1 轨道-不动点引理(Orbit-stabilizer 引理)
∣Ox∣×∣Gx∣=∣G∣
证明
有:
∀g1,g2∈G,x⋅g1=x⋅g2Gx⋅g1=Gx⋅g2
证明
∵x⋅g1⋅g2−1=x∴g1⋅g2−1∈Gx∴g1∈Gx⋅g2,g2∈Gx⋅g1∴Gx⋅g1=Gx⋅g2
Q.E.D.
也就是说,每个满足 x⋅gy∈Ox 的 gy 都在 Gx⋅gy 这个右陪集中,并且每个 y∈Ox 都单独对应一个 Gx 的右陪集。由于子群的不同右陪集互不相交、大小相等且覆盖整个大群(Lagrange 定理、陪集的性质),所以:
∴∣Ox∣=∣G/Gx∣=∣{Gx⋅g∣g∈G}∣
那么显然有:
∣Ox∣×∣Gx∣=∣G∣
Q.E.D.
3.2.2 Burnside 引理
设 Xg={x∣x∈X,x⋅g=x},X/G={Ox∣x∈X} 即 X 在 G 作用下的轨道集合(∣X/G∣ 即为 X 在 G 作用下本质不同元素个数),则:
∣X/G∣=∣G∣1g∈G∑∣Xg∣
证明
根据轨道-不动点引理:
∣Ox∣×∣Gx∣=∣G∣
并且注意到:
x∈X∑∣Gx∣=g∈G∑∣Xg∣x∈X/G∑∣x∣=∣X∣∀y1,y2∈Ox,Gy1=Gy2
所以:
g∈G∑∣Xg∣=x∈X∑∣Gx∣=Ox∈X/G∑y∈Ox∑∣Gy∣=Ox∈X/G∑∣Ox∣×∣Gx∣=∣X/G∣×∣G∣
Q.E.D.
3.2.3 Polya 定理
考虑给所有满足 x∈X 的 x 中元素染上 m 种不同颜色(相同颜色元素本质相同)。∀g∈G,设 c(g) 为 g 中轮换个数(置换中环的个数),则在 G 作用下本质不同染色方案数为:
∣G∣1g∈G∑mc(g)
证明
只需证明 ∣Xg∣=mc(g)。
由于对于每一个 g 的轮换 o,o 中元素染相同颜色才能在应用变换 g 后保持不变,所以每个轮换有 m 种染色方案。而一共有 c(g) 个轮换,所以有 mc(g) 种染色方式在应用变换 g 后保持不变。
所以 ∣Xg∣=mc(g),Q.E.D.
Tips:
观察 Ploya 定理的证明过程,不难发现对于置换作用 g,满足 x⋅g=x 的 x∈X 必定满足位于同一个轮换的元素本质相同。
这方便了 Burnside 引理的应用。
Part 4 群例题
-
P4980 【模板】Pólya 定理
查看题解
考虑 n 阶顺时针旋转置换构成的集合 G:
- 存在单位元:置换 pi=i 在 G 中;
- 满足结合律:显然;
- 封闭:显然;
- 存在逆元:显然,可以绕一大圈再回来;
所以 G 是一个群。
考虑 Polya 定理:
∣X[m]/G∣=∣G∣1g∈G∑mc(g)
注意到 ∀g∈G,若 p⋅g 后 p1→px,则 g 中置换环有 gcd(x,n) 个,即 c(g)=gcd(x,n)。证明考虑从 i 向 i+x−1 mod n+1 即旋转后的点连边。
所以答案即为:
n1d∣n∑ndi=1∑dn[gcd(i,dn)=1]=n1d∣n∑ndφ(dn)
有一个神奇的结论,d∣n∑O(d)=O(n43),所以暴力计算 φ(dn) 能过。
考虑时间复杂度更正确的做法,实际上可以把 n 质因数分解,求 φ(dn) 时再 O(logn) 分解质因数根据 φ 的积性算出 φ(dn)。单次时间复杂度 O(nlogn)。
代码如下:(O(Tnlogn) 做法)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int S=100005,BS=35,p=1000000007;
int n;
bool nop[S];
int tot,prime[S];
int cp,ps[S],pi[S][BS];
inline int qpow(int x,int y)
{
int res=1;
for(;y>0;y>>=1,x=1ll*x*x%p) res=y&1?1ll*res*x%p:res;
return res;
}
inline void init()
{
nop[0]=nop[1]=true;
for(int i=2;i<=S-3;i++)
{
if(!nop[i]) prime[++tot]=i;
for(int j=1;j<=tot;j++)
{
if(1ll*i*prime[j]>S-3) break;
nop[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}
inline void slove()
{
scanf("%d",&n);
cp=0;
int tn=n;
for(int i=1;1ll*prime[i]*prime[i]<=tn;i++)
{
if(tn%prime[i]==0)
{
++cp;
int tt=1;
ps[cp]=prime[i],pi[cp][0]=1,pi[cp][1]=ps[cp]-1;
while(tn%ps[cp]==0) tn/=ps[cp],pi[cp][tt+1]=pi[cp][tt]*ps[cp],tt++;
}
}
if(tn>1) cp++,ps[cp]=tn,pi[cp][0]=1,pi[cp][1]=tn-1;
int sum=0;
for(int i=1;1ll*i*i<=n;i++)
{
if(n%i==0)
{
int d=i,pid=1;
for(int j=1;j<=cp;j++)
{
int ct=0;
while(d%ps[j]==0) ct++,d/=ps[j];
pid*=pi[j][ct];
}
sum=(sum+1ll*qpow(n,n/i)*pid%p)%p;
if(i*i!=n)
{
d=n/i,pid=1;
for(int j=1;j<=cp;j++)
{
int ct=0;
while(d%ps[j]==0) ct++,d/=ps[j];
pid*=pi[j][ct];
}
sum=(sum+1ll*qpow(n,i)*pid%p)%p;
}
}
}
sum=1ll*sum*qpow(n,p-2)%p;
printf("%d\n",sum);
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T-->0) slove();
return 0;
}
-
【2023NOI模拟赛27】美术作业
-
洛谷题目列表&tag=Polya 定理