抽象代数学习笔记

标题其实是假的,这只是 yhx 神仙的集训队论文的一半的学习笔记而已(所以只有群论

环和域可能在 OI 里用处就不大了(毕竟两个运算还是复杂一些

群论 (group)

:封闭,结合,单位元,逆。

实际上群有三个定义六个性质,有兴趣的可以搜一下(

交换群:群,交换。

  • \(\text{mod} \ m\) 意义下加法构成 \(m\) 阶循环群 \(Z_m\)
  • 所有 \(n!\)\(n\) 元置换构成 \(n\) 元对称群 \(S_n\)
  • 所有 \(\lceil\frac{n!}2\rceil\)\(n\) 元偶置换构成 \(n\) 元交错群 \(A_n\)
  • 对于正 \(n\) 边形,翻转/旋转置换称为 \(2n\) 阶二面体群 \(D_{2n}\)

生成子群:对于群 \((G,\circ)\)\(\varnothing\ne S\subseteq G\),包含 \(S\) 的所有子群的交称为 \(S\)\(G\) 中生成的子群,记做 \(\langle S\rangle\)

元素的阶:对于群 \(G\) 和其元素 \(a\in G\)\(|\langle a\rangle|=|a|\)

陪集:对于群 \(G\) 和其子群 \(H\le G\),和元素 \(g\in G\),定义(左)陪集 \(gH=\{g\circ h|h\in H\}\),同理可以定义右陪集。

定理 2.1.1:对于子群 \(H\le G\),导出的陪集完全相同或交集为空。

定理 2.1.2:对于有限群 \(G\) 及其子群 \(H\le G\),有 \(|G|=|H|\cdot [G:H]\),其中 \([G:H]\) 表示 \(H\) 可以导出的陪集个数。

置换群\(n\) 元对称群 \(S_n\) 的子群。

染色\(n\) 元染色指对集合 \(\{1,2,\dots,n\}\) 的每个元素分配一个物品的分配方案。用 \(\mathbf c\) 表示一个染色,\(\mathbf c[i]\) 表示该染色中 \(i\) 位置的物品,\(\mathcal C\) 表示所有染色的集合。

置换作用于染色:对于置换 \(f\in S_n\) 和染色 \(\mathbf c\in \mathcal C\),定义 \((f\cdot\mathbf c)[i]=c[f^{-1}(i)]\)

容易看出 \(e\cdot\mathbf c=\mathbf c\)\((f\circ g)\cdot \mathbf c=f\cdot(g\cdot\mathbf c)\)

广义染色:对于群 \(G\) 和全集 \(\mathcal C\),定义运算 \(G\times \mathcal C\rightarrow\mathcal C\),满足

  1. \(e\cdot \mathbf c=\mathbf c\)
  2. \((f\circ g)\cdot\mathbf c=f\cdot(g\cdot\mathbf c)\)

则称 \(\mathcal C\) 是广义染色集合,\(\mathbf c\in\mathcal C\) 是广义染色。

轨道\(G\cdot\mathbf c=\{g\cdot\mathbf c\mid g\in G\}\)

稳定子群\(G_{\mathbf c}=\{g\in G\mid g\cdot\mathbf c=\mathbf c\}\)

容易发现稳定子群是子群(

定理 2.2.1 (轨道-稳定子群定理)\(|G\cdot\mathbf c|\cdot|G_{\mathbf c}|=|G|\)

proves

证明:考虑 \(g\in G\),对于左陪集 \(gG_{\mathbf c}\) 中的元素 \(f=g\circ h_0\),有 \(f\cdot\mathbf c=g\cdot(h_0\cdot\mathbf c)=g\cdot\mathbf c\)。因此左陪集 \(gG_{\mathbf c}\) 作用于 \(\mathbf c\) 产生相同的染色。

考虑 \(g_1,g_2\in G\)\(g_1\cdot\mathbf c=g_2\cdot\mathbf c\Rightarrow (g_1^{-1}\circ g_2)\cdot\mathbf c=g_1^{-1}\cdot(g_2\cdot\mathbf c)=g_1^{-1}\cdot(g_1\cdot\mathbf c)=\mathbf c\)。所以 \(g_1^{-1}\circ g_2\in G_{\mathbf c}\),所以 \(g_2\in g_1G_{\mathbf c}\),根据定理 2.1.1,\(g_1G_{\mathbf c}=g_2G_{\mathbf c}\)

所以 \(G_{\mathbf c}\) 导出的每个陪集作用于 \(\mathbf c\) 得到不同的染色,所以陪集数量就等于 \(G\) 作用于 \(\mathbf c\) 得到的染色数,所以 \([G:G_\mathbf c]=|G\cdot\mathbf c|\),根据定理 2.1.2,Q.E.D。

不动点\(X^g=\{\mathbf c\in X\mid g\cdot\mathbf c=\mathbf c\}\)

等价染色:对于群 \(G\) 和两个染色 \(\mathbf c_1,\mathbf c_2\),定义 \(\mathbf c_1\)\(\mathbf c_2\) 等价当且仅当 \(\exist g\in G,g\cdot\mathbf c_1=\mathbf c_2\)

容易发现 \(\mathbf c_1\)\(\mathbf c_2\) 等价当且仅当 \(\mathbf c_2\in G\cdot\mathbf c_1\),或 \(G\cdot\mathbf c_1=G\cdot\mathbf c_2\)

则等价类与轨道对应,定义 \(X/G\) 表示轨道集合。

定理 2.2.2 (Burnside 引理)\(|G||X/G|=\sum_{g\in G}|X^g|\)

proves

证明:考虑 \(\sum_{g\in G}\sum_{\mathbf c\in X}[g\cdot\mathbf c=\mathbf c]\)

枚举置换,贡献为不动点数量,即为 \(\sum_{g\in G}|X^g|\)

枚举染色,贡献为稳定子群大小,即为 \(\sum_{\mathbf c\in X}|G_\mathbf c|=|G|\cdot\sum_{\mathbf c\in X}\frac 1{|G\cdot\mathbf c|}\)

每个轨道内的元素贡献 1/轨道大小,所以每个轨道贡献 \(1\),即为 \(|G||X/G|\)。Q.E.D.

Polya 计数

置换的循环指标:对于 \(n\) 元置换 \(g=(a_{11}a_{12}\dots a_{1L_1})\dots(a_{y1}a_{y2}\dots a_{yL_y})\),定义它的循环指标是 \(\prod t_{L_i}\),其中 \(t_1,t_2,\dots,t_n\) 为形式变元。

置换群的循环指标:对于置换群 \(G\),定义它的循环指标为群中所有置换的指标的平均值,记做 \(Z_G(\mathbf t)\)

定理 2.3.1 (Polya 定理) 定义 \(f(t)=\sum_{w\ge 0}f_wt^w\),其中 \(f_w\) 表示权值为 \(w\) 的颜色数量。定义染色 \(\mathbf c\) 的权值 \(\omega(\mathbf c)=\sum_{i=1}^n\omega(\mathbf c[i])\)。定义 \(F(t)\) 表示在 \(G\) 的作用下每种权值的染色的不同轨道数的生成函数。则

\[F(t)=Z_G(f(t),f(t^2),\dots,f(t^n)) \]

定理 2.3.2 (广义 Burnside 引理)

\[\sum_{O\in X/G}\omega(G_O)|O|=\sum_{g\in G}\omega(g)|X^g| \]

其中每个置换 \(g\in G\) 有权值 \(\omega(g)\),子群的权值 \(\omega(G_O)=\sum_{g\in G_O}\omega(g)\)

证明:考虑 \(\sum_{g\in G}\sum_{\mathbf c\in X}[g\cdot\mathbf c=\mathbf c]\omega(g)\)

推论 2.3.1 (Polya 容斥) 在定理 2.3.2 中取 \(\omega(g)=\text{sgn}(g)\) 即可得到

\[|G|\sum_{O\in X/G}\left[\mathbf c\in O,i\ne j\Rightarrow \mathbf c[i]\ne \mathbf c[j]\right]=\sum_{g\in G}\text{sgn}(g)|X^g| \]

【ZJOI2018】树

题目描述:给定正整数 \(n,k\) 和质数 \(p\)。设 \(\mathcal T\) 是所有以 \(1\) 为根的 \(n\) 个点的带标号树构成的集合,\(E_1,E_2,\dots,E_{\lambda}\) 是同构等价类,求 \(\dfrac{\sum_{i=1}^{\lambda}|E_i|^k}{n!^k}\bmod p\)

数据范围:\(n\le 2000,k\le 10^9,10^8<p<10^9\)

xyx 为什么这么强啊

solution

设有根无标号树的组合类为 \(\mathcal T\),考虑 \(\alpha\in\mathcal T\),设其形成的等价类个数为 \(\omega(\alpha)\)

对于两个等价类定义笛卡尔积,容易发现 \(\omega(t_1\times t_2)=\omega(t_1)\omega(t_2)\binom{|t_1|+|t_2|}{|t_1|}\)

为了用生成函数描述,设 \(T(\mathcal A;z)=\sum_{\alpha\in\mathcal A}\left(\frac{\omega(\alpha)}{|\alpha|!}\right)^kz^{|\alpha|}\),所求即为 \([z^n]T(\mathcal A;z)\)

容易发现 \(T(\mathcal A+\mathcal B)=T(\mathcal A)+T(\mathcal B),T(\mathcal A\times\mathcal B)=T(\mathcal A)T(\mathcal B)\)

然后看回 \(\mathcal T\),众所周知 \(\mathcal T^{\square}=\text{MSET}(\mathcal T)\),其中 \(\mathcal T\)\(\mathcal T^{\square}\) 上加一个固定标号的根,也即 \([z^n]T(\mathcal T)=\frac 1{n^k}[z^{n-1}]T(\mathcal T^{\square})\)。然后就可以推柿子了:

\[\begin{aligned} T(\mathcal T^\square)&=T(\text{MSET}(\mathcal T)) \\ &=T\left(\exp\sum_{i\ge 1}\frac 1i\sum_{t\in\mathcal T}t^i\right) \\ &=T\left(\prod_{i\ge 1}\prod_{t\in\mathcal T}\sum_{j\ge 0}\frac{t^{ij}}{i^jj!}\right) \\ &=\prod_{i\ge 1}\prod_{t\in\mathcal T}\sum_{j\ge 0}\frac{T(t)^{ij}}{i^jj!} \\ &=\exp\sum_{i\ge 1}\sum_{t\in\mathcal T}\frac{T(t)^i}i \end{aligned} \]

发现这里的次数有变化,所以考虑再加一维,使次数可以变动。

\[T(\mathcal A;z,u)=\sum_{\alpha\in\mathcal A}\frac{z^{|\alpha|}}{1-\frac{\omega(\alpha)}{|\alpha|!}u} \]

乘法定义为 \(z\) 卷积,\(u\) 点积。然后就可以得到:

\[\begin{aligned} [u^k]T(t;z)^i&=\omega(t)^{ik}\frac{z^{i|t|}}{|t|!^{ik}}=[u^{ik}]T(t;z^i) \\ [u^kz^n]T(\mathcal T;z)&=\frac 1{n^k}[z^{n-1}]\exp\sum_{i\ge 1}\frac{[u^{ik}]T(\mathcal T;z^i)}{i} \\ \end{aligned} \]

然后差不多乱搞搞就可以 \(O(n^2)\) 算了?

然后看 Polya 计数的方法,也是算同样的答案:各等价类大小的 \(k\) 次方之和。

\(f_n\) 表示 \(n\) 个点时的答案,\(g_{i,s}\) 表示所有树大小 \(\le i\),总和 \(=s\) 的森林对应的答案,则 \(f_i=g_{i-1,i-1}\),初值为 \(g_{1,s}=1\)

转移考虑枚举当前加入了 \(d\) 个大小为 \(i\) 的树,即为

\[g_{i,s}=\sum_{d=0}^{\lfloor\frac si\rfloor}g_{i-1,s-di}I_{i,d}\binom{s}{di}^k \]

\(I_{i,d}\) 表示所有 \(d\) 棵大小为 \(i\) 的树构成的带标号有根森林的答案......

然后一个字都看不懂啊啊啊啊啊


u1s1,想起来当时做这题的时候,Euler 变换有 Polya 的推法,也有生成函数的推法,也就是解析组合(还可以更高大上地叫做组合结构符号化)

要理解群论计数还是好烧脑子,不如多练练上面那种做法(就是不知道适用范围怎么样了

群的判定和表示

不变子群:对于群 \((G,\circ)\) 及子群 \(H\le G\),若 \(g\in G,h\in H\Rightarrow g\circ h\circ g^{-1}\in H\),则称 \(H\)\(G\) 的不变子群,记做 \(H\unlhd G\),此时若 \(H\ne G\)\(H\)\(G\) 的真不变子群,记做 \(H\lhd G\)

商群:对于群 \((G,\circ)\) 及不变子群 \(N\),在 \(N\) 的所有陪集 \(G/N\) 上定义运算 \(\cdot\) 满足

\[(aN)\cdot (bN)=(a\circ b)N \]

则称 \((G/N,\cdot)\)\(G\)\(N\) 的商群。

可以手算验证一下,考虑 \(h_1,h_2\in H,a,b\in G\)

\[\begin{aligned} &(a\circ h_1)\circ (b\circ h_2) \\ =&a\circ h_1\circ(b\circ h_2\circ b^{-1})\circ b \\ =&(a\circ b)\circ(b^{-1}\circ (h_1\circ (b\circ h_2\circ b^{-1}))\circ b) \end{aligned} \]

后面那一大坨显然 \(\in N\),也就是说 \((aN)\circ(bN)\subseteq (a\circ b)N\)

同态:对于群 \((G,\circ),(H,\cdot)\),若映射 \(f:G\rightarrow H\) 满足

\[f(a\circ b)=f(a)\cdot f(b) \]

则称 \(f\)\(G\)\(H\) 的同态映射,简称同态。

\(f\) 是单射/满射/双射 时,称为单同态/满同态/同构。

:设 \(f\)\(G\)\(H\) 的同态,\(e_H\)\(H\) 的单位元,则集合

\[f^{-1}(e_H)=\{g\in G\mid f(g)=e_H\} \]

称为 \(f\) 的核,记做 \(\ker f\)

显然 \(\ker f\) 是不变子群。

定理 3.1.1 (群同态基本定理)\(f\)\((G,\circ)\)\((H,\cdot)\) 的满同态,则 \(G/\ker f\)\(H\) 同构。

proves

证明:设 \(K=\ker f\),定义 \(\phi:G/K\rightarrow H\),其中 \(\phi(gK)=f(g)\)

显然 \(\phi\) 是映射,现在考虑证明 \(\phi\) 是同构。

  • \(gK,hK\in G/K\Rightarrow \phi((g\circ h)K)=f(g\circ h)=f(g)\cdot f(h)=\phi(gK)\cdot\phi(hK)\)。所以 \(\phi\) 是同态。
  • \(\phi(gK)=\phi(hK)\),则 \(f(g)=f(h)\Rightarrow f(g\circ h^{-1})=f(g)\cdot f(h^{-1})=f(g)\cdot f(h)^{-1}=e_H\),所以 \(g\circ h^{-1}\in K\Rightarrow gK=hK\),所以 \(\phi\) 是单射。
  • \(\forall h\in H,\exist g\in G,f(g)=h\),所以 \(\phi(gK)=f(g)=h\),所以 \(\phi\) 是满射。

综上,\(\phi\) 是双同态,所以 \(G/K\)\(H\) 同构。

定理 3.1.2 (群同构第三定理)\(N\)\(G\) 的不变子群,则

  • \(N\le H\le G\Leftrightarrow H/N\le G/N\)
  • \(N\le H\unlhd G\Leftrightarrow H/N\unlhd G/N\Rightarrow \frac{G/N}{H/N}\cong G/H\)

群的判定

题目描述:给定 \(n\times n\) 的乘法表,判断它是否是群。

封闭性、单位元、逆元都很好检验,最重要的是结合律。

引理 3.2.1 给定 \(n\) 阶有限群 \(G\),存在 \(S\subseteq G\) 使得 \(|S|\le\lfloor\log_2 n\rfloor\),且 \(G=\langle S\rangle\)

proves

证:定义子群链 \(\{e\}=G_0\le G_1\le\dots\le G_k=G\),其中 \(G_i=\langle\{g_1,g_2,\dots,g_i\}\rangle\)

构造方法如下:设我们已经知道 \(G_0,G_1,\dots,G_{i-1}\),现在要知道 \(G_i\)。若 \(G_{i-1}=G\) 则完成构造,否则任取 \(g_i\in G\backslash G_{i-1}\),令 \(G_i=\langle G_{i-1}\cup\{g_i\}\rangle\),根据消去律,\(|G_i|\ge 2|G_{i-1}|\),所以 \(n\ge 2^k|G_0|\),即 \(k\le\lfloor\log_2 n\rfloor\)

引理 3.2.2\((G,\circ)\) 满足封闭、单位元、逆元,\(G=\langle S\rangle\),则 \(G\) 满足结合律 \(\Leftrightarrow(s\in S,g,h\in G\Rightarrow (g\circ s)\circ h=g\circ(s\circ h))\)

proves

证:\(\Rightarrow\) 显然,考虑 \(\Leftarrow\)

\(A=\{s|\forall g,h\in G,(g\circ s)\circ h=g\circ (s\circ h)\}\),则 \(a,b\in A\Rightarrow (g\circ(a\circ b))\circ h=((g\circ a)\circ b)\circ h=(g\circ a)\circ (b\circ h)=g\circ (a\circ (b\circ h))=g\circ((a\circ b)\circ h)\Rightarrow a\circ b\in A\),因为 \(S\subseteq A\),由该结论可得 \(\langle S\rangle=G\subseteq A\),即 \(G\) 满足结合律。

使用这个方法就可以在 \(O(n^2\log n)\) 的时间复杂度内判断结合律。

对于群 \(G\) 及其元素 \(g\in G\),定义映射 \(\lambda_g(x)=g\circ x\),则 \(\lambda_g(x)\) 是双射,且 \(\lambda_g(\lambda_h(x))=\lambda_{g\circ h}(x)\)\(\lambda_g(x)\)\(\lambda_{g^{-1}}(x)\) 互为逆映射,且 \(\lambda_g\) 是一个 \(G\) 上的置换,而 \(\{\lambda_g\mid g\in G\}\) 构成了一个置换群,即 \(|G|\) 元对称群的子群。

定理 3.3.1 (Cayley 定理) 每个 \(n\) 阶有限群都同构于一个不超过 \(n\) 元的置换群。

UOJ154【UR #10】列队

题目描述:给定群 \(G\) 和正整数 \(n\),求 \(G\)\(n\) 元对称群 \(S_n\) 的单同态个数\(\bmod 998244353\)\(T\) 组数据。

数据范围:\(T\le 10,|G|\le 30,n\le 1000\)

solution

对于群 \(G,H\),设 \(G\)\(H\) 的同态数量为 \(\text{homo}(G,H)\),单同态数量为 \(\text{mono}(G,H)\)

考虑一个同态 \(f:G\rightarrow H\),设 \(K=\ker f\),则 \(G/K\)\(\text{im} \ f\) 之间存在同构 \(\phi\),则将同构 \(\phi\) 的陪域扩展到 \(H\) 就得到了 \(G/K\)\(H\) 的单同态。由此可得,\(G\)\(H\) 的每个同态都对应到 \(G/N\)\(H\) 的一个单同态,其中 \(N\)\(G\) 的不变子群。

\[\text{homo}(G,H)=\sum_{N\unlhd G}\text{mono}(G/N,H) \]

现在就可以转化为计算若干个 \(\text{homo}(G,H)\) 的子问题。

考虑给定群 \(G\) 计算到 \(S_n\) 的同态个数。对于置换群 \(H=\text{im} \ f\),定义 \(i\) 的特征染色 \(\chi_i\)\(i\) 位置为黑色,其他位置为白色。则 \(\forall i\in[1,n]\)\(H\cdot \chi_i\) 中黑色出现位置的集合,构成了 \(\{1,2,\dots,n\}\) 的一个划分。

考虑其中一个集合 \(A\),而 \(|A|=k\),不妨设 \(1\in A\),则 \(|H\cdot\chi_1|=k\),根据轨道-稳定子群定理,\(H_{\chi_1}=\frac{|H|}{|H\cdot\chi_1|}=\frac{|H|}k\)。根据同态的性质,\(H_{\chi_1}\) 的原象是 \(G\) 的一个 \(\frac{|G|}k\) 阶子群。感性理解一下???

然而我们要求的是 \(f\) 的个数,所以要用 \(G\) 的结构表示 \(f\)

容易发现划分的各个集合之间互不影响,只需要对应好然后给划分的元素标好号即可。

考虑 \(1\) 所在的划分,假设是 \(\{2,3,\dots,k\}\),在 \(G\) 中搞一个大小为 \(\frac{|G|}k\) 的子群 \(S\),令它的象为 \(H_{\chi_1}\),那么 \(S\) 导出的 \(k\) 个左陪集作用于 \(\chi_1\) 之后将黑色分别移动到 \(1,2,\dots,k\)

设这 \(k\) 个左陪集为 \(S,g_2S,\dots,g_kS\),不妨设 \(g_iS\) 将黑色移到 \(i\),这里的标号有 \((k-1)!\) 种。

然后发现确定好 \(g_i\) 之后就确定好了所有置换,具体来说,\(g\in G,s\in S\Rightarrow g(j)=g((g_j\circ s)(1))=(g\circ g_j\circ s)(1)=(g\circ g_j)(1)\)。也就是说 \(g(j)\)\(g\circ g_j\) 唯一确定,与 \(s\) 没有关系。

现在就可以直接计数了,每个划分的集合是带标号无序组,所以是 EGF 的 exp 形式,

\[f(x)=\sum_k\frac{x^k}k\sum_{H\unlhd G,|H|=\frac{|G|}k}=\sum_{H\unlhd G}\frac{x^{|G|/|H|}}{|G|/|H|} \\ \text{homo}(G,S_n)=n![x^n]\exp f(x) \]

#include<bits/stdc++.h>
#define PB emplace_back
#define MP make_pair
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int N = 30, M = 1003, mod = 998244353;
template<typename T>
void read(T &x){
	int ch = getchar(); x = 0; bool f = false;
	for(;ch < '0' || ch > '9';ch = getchar());
	for(;ch >= '0' && ch <= '9';ch = getchar()) x = x * 10 + ch - '0';
	if(f) x = -x;
}
template<typename T>
bool chmax(T &a, const T &b){if(a < b) return a = b, 1; return 0;}
template<typename T>
bool chmin(T &a, const T &b){if(a > b) return a = b, 1; return 0;}
void qmo(int &x){x += x >> 31 & mod;}
int T, n, m, e, A[N][N], inv[N], sta[M], siz[M], fr, re, q[N], f, r, iv[M], F[M];
set<int> S; bool reg[M];
bool regu(int x){
	for(int i = 0;i < m;++ i)
		for(int j = 0;j < m;++ j)
			if((x >> j & 1) && !(x >> A[A[i][j]][inv[i]] & 1))
				return false;
	return true;
} int cnt[M], d[M];
int calc(int x){
	memset(cnt, 0, sizeof cnt);
	memset(d, 0, sizeof d);
	for(int i = 0;i < re;++ i)
		if((sta[x] & sta[i]) == sta[x]) ++ cnt[m / siz[i]];
	d[0] = 1;
	for(int i = 1;i <= n;++ i){
		for(int j = 1;j <= m && j <= i;++ j)
			d[i] = (d[i] + (LL)cnt[j] * d[i-j]) % mod;
		d[i] = (LL)d[i] * iv[i] % mod;
	} return d[n];
}
int dfs(int x){
	if(~F[x]) return F[x];
	int &ans = F[x]; ans = calc(x);
	for(int i = 0;i < re;++ i)
		if(x != i && reg[i] && ((sta[x] & sta[i]) == sta[x]))
			qmo(ans -= dfs(i));
	return ans;
}
void solve(){
	read(n); read(m); e = -1; S.clear(); memset(F, -1, sizeof F);
	bool ff = false;
	for(int i = 0;i < m;++ i){
		bool flg = true;
		for(int j = 0;j < m;++ j){
			read(A[i][j]); -- A[i][j];
			flg &= A[i][j] == j;
		} if(flg && e >= 0) ff = true;
		if(flg) e = i;
	} if(e == -1 || ff){puts("0"); return;}
	for(int i = 0;i < m;++ i){
		inv[i] = -1;
		for(int j = 0;j < m;++ j)
			if(A[i][j] == e){inv[i] = j; break;}
		if(inv[i] == -1){puts("0"); return;}
	}
	for(int i = 0;i < m;++ i)
		for(int j = 0;j < m;++ j)
			for(int k = 0;k < m;++ k)
				if(A[A[i][j]][k] != A[i][A[j][k]]){puts("0"); return;}
	e = 1 << e; fr = re = 0; sta[re++] = e;
	while(fr < re){
		int u = sta[fr++];
		for(int i = 0;i < m;++ i) if(!(u >> i & 1)){
			int v = u | (1<<i); f = r = 0; q[r++] = i;
			while(f < r){
				int x = q[f++];
				for(int j = 0;j < m;++ j) if(v >> j & 1){
					if(!(v >> A[x][j] & 1)){v |= 1 << A[x][j]; q[r++] = A[x][j];}
					if(!(v >> A[j][x] & 1)){v |= 1 << A[j][x]; q[r++] = A[j][x];}
				}
			} if(!S.count(v)){S.insert(v); sta[re++] = v;}
		}
	} sort(sta, sta + re); for(int i = 0;i < re;++ i){reg[i] = regu(sta[i]); siz[i] = __builtin_popcount(sta[i]);}
	int ans = dfs(lower_bound(sta, sta + re, e) - sta);
	for(int i = 1;i <= n;++ i) ans = (LL)ans * i % mod; printf("%d\n", ans);
}
int main(){
	iv[1] = 1; for(int i = 2;i < M;++ i) iv[i] = mod - (LL)mod / i * iv[mod % i] % mod;
	read(T); while(T --) solve();
}

关于 \(n\) 阶群的子群个数有一个上界 \(O(n^{\log n}\log n)\)然而看上去就超松的样子,分析方法大概就是上面的引理 3.2.1,枚举生成子群的集合。

\(|G| \le 30\)\(G\) 的子群个数的最大值是 \(67\),当 \(G=\Z_2^4\) 时取到。

于是你想知道 \(\Z_2^m\) 的子群个数不你不想,结果 oeis 出来好东西(

高斯二项式系数

q-number :

\[[k]_q=\sum_{i=0}^{k-1}q^i=\begin{cases}\frac{1-q^k}{1-q} & \pod{q\ne 1} \\ k & \pod{q=1}\end{cases} \]

q-factorial :

\[[n]_q!=\prod_{k=1}^n[k]_q \]

q-binom :

\[\binom nm_q=\frac{[n]_q!}{[m]_q![n-m]_q!} \\ \binom nm_q=q^m\binom{n-1}m_q+\binom{n-1}{m-1}_q \\ \binom nm_q=\binom{n-1}m_q+q^{n-m}\binom{n-1}{m-1}_q \]

容易发现 \(q=1\) 时这就是通常的二项式系数。

根据递推公式得到 \(q\in\Z\Rightarrow\binom nm_q\in\Z\)

性质 1 : 在所有桶为 \(\{c\}_{i=1}^m\) 的正整数序列 \(\{a\}_{i=1}^n\) 中(\(n=\sum_{i=1}^m c_i\)),已知逆序对个数所对应的方案数的生成函数是

\[\binom n{c_1,\dots,c_m}_q=\frac{[n]_q!}{\prod_{i=1}^m[c_i]_q!} \]

证明:想了好久组合意义,结果发现写出递推公式就完事了???

可以用这个来出模板题(我谔谔

性质 2 : 当 \(q\) 为质数时,\(\Z_q^n\) 的大小为 \(q^m\) 的(不变)子群个数,或 \(\mathbb F_q^n\)\(m\) 维子空间个数为 \(\binom nm_q\)

证明:想了好久组合意义,结果发现写出递推公式就完事了???

有 dalao 知道组合意义么...(我自闭

性质 3 (行的生成函数)

\[\prod_{k=0}^{n-1}(1+q^iz)=\sum_{m=0}^nq^{\binom m2}\binom nm_qz^m \]

证明:不想组合意义,归纳就完事了!!!

性质 4

\[\sum_{m=0}^n(-1)^mq^{\binom m2}\binom nm_q=[n=0] \]

证明:上面那条柿子代入 \(z=-1\) 即可。

性质 5 (高斯二项式反演)

\[b_n=\sum_{m=0}^n\binom nm_qa_m\Leftrightarrow a_n=\sum_{m=0}^n(-1)^mq^{\binom m2}\binom nm_qb_m \]

证明:

\[\left(\sum_{n\ge 0}\frac{z^n}{[n]_q!}\right)\times\left(\sum_{n\ge 0}(-1)^nq^{\binom n2}\frac{z^n}{[n]_q!}\right)=1 \]

可是这东西有个jb用啊...

计算群论

题目描述:给定 \(n\) 阶置换群 \(S_n\)\(m\) 个元素,求这 \(m\) 个元素生成的子群阶数。

数据范围:\(n,m\le 50\)

计算群论研究形如 \(\langle S\rangle\) 构成的“群论结构”,Schreier-Sims 算法是其中最基础的算法。


考虑构造子群链 \(\langle S\rangle=G_0\ge G_1\ge\dots\ge G_k=\{e\}\),则 \(|G|=\prod_{i=0}^{k-1}\frac{|G_i|}{|G_{i+1}|}=\prod_{i=0}^{k-1}[G_i:G_{i+1}]\)

考虑增量构造法,逐渐向 \(S\) 中添加元素,对子群链中的每个子群进行维护。

初始时 \(S=\varnothing,G=\{e\}\),要向 \(S\) 中添加新元素 \(g\),需要判断 \(g\) 是否已经在 \(\langle S\rangle\) 中。

定义 4.1 (截面) 对于群 \(G\) 及其子群 \(H\le G\),设 \(H\) 导出的左陪集集合为 \(C_1,C_2,\dots,C_k\),其中 \(k=[G:H]\),则包含单位元的集合 \(R=\{r_1,r_2,\dots,r_k\}\),其中 \(r_i\in C_i\),称作 \(H\) 的一个左截面。同理可以定义右截面。

考虑 \(H=G_{\chi_1}\) 的一个右截面 \(R=\{e=r_1,r_2,\dots,r_k\}\),满足

  • \(\forall i\ne j,Hr_i\ne Hr_j\),也就是 \(r_i\circ r_j^{-1}\notin H\)
  • 考虑陪集 \(Hr_i\),任取其中元素 \(h_0\circ r_i\),有 \((h_0\circ r_i)^{-1}(1)=(r_i^{-1}\circ h_0^{-1})(1)=r^{-1}_i(h_0^{-1}(1))=r^{-1}(1)\)
  • \(\forall g\in G\),根据 \(g^{-1}(1)\) 可以唯一确定其所在的陪集 \(Hr_i\),也就是 \(r_i=Hg\cap R\),称其为 \(g\) 的标准置换 \(\text{norm}\ g\)

然后考虑元素判定,此时若 \(g\in\langle S\rangle\),则存在 \(r_i\) 使得 \((r_i\circ g)(1)=1\Rightarrow r_i\circ g\in H\Rightarrow r_i\in Hg^{-1}\),也就是求 \(\text{norm}(g^{-1})\)

关于如何求 \(\text{norm}(g)\),则可以先求出 \(g^{-1}(1)\),找到 \(1\) 的原象与其相同的 \(r_i\) 即可。

然后就有 \(g\in G\Leftrightarrow r_i\circ g\in G_{\chi_1}\),递归下去即可。


然后继续考虑增量构造,改变了 \(S\) 之后考虑截面 \(R\) 发生的变化。

\(R\) 中每个元素记录 \(1\) 不同的原象,只需要考虑 \(1\) 多了哪些原象即可。

设原先 \(1\) 的原象集合为 \(A_1\),新增置换 \(g\) 后,考虑置换 \(r_i\circ g\)。也就是 \(\forall p\in A_1\),设 \(r_i(p)=1\),则 \((r_i\circ g)^{-1}(1)=(g^{-1}\circ r_i^{-1})(1)=g_i^{-1}(r_i^{-1}(1))=g_i^{-1}(p)\),也就是 \(g_i^{-1}(p)\) 也是 \(1\) 的原象,枚举 \(A_1\) 中元素搜索即可。


然后继续考虑增量构造,改变了 \(R\) 之后对稳定子群 \(G_{\chi_1}\) 生成集 \(S'\) 的影响。

引理 4.1 (Schreier) 设群 \(H\)\(G=\langle S\rangle\) 的子群,\(R\)\(H\) 的右截面,

\[S'=\{(r\circ s)\circ(\text{norm}(r\circ s))^{-1}\mid r\in R,s\in S\} \]

\(H=\langle S'\rangle\)

证明:显然 \(\forall g\in G,g\circ(\text{norm}(g))^{-1}\in H\),所以 \(\langle S'\rangle\subseteq H\)。考虑证明 \(H\subseteq\langle S'\rangle\)

因为 \(e\in R\),所以 \(\forall h\in H\)\(h\) 可以表示为 \(r\circ s_1\circ\cdots\circ s_k\),其中 \(r\in R,s_i\in S\)

考虑归纳证明上述表示的元素 \(\in\langle S'\rangle\),当 \(k=0\)\(h=r\in H\cap R=\{e\}\),所以 \(h\in\langle S'\rangle\)

假设 \(k-1\) 时此结论成立,考虑 \(k\) 时,有

\[\begin{aligned} h&=r\circ s_1\circ\cdots\circ s_k \\ &=(r\circ s_1)\circ(\text{norm}(r\circ s_1)^{-1})\circ\text{norm}(r\circ s_1)\circ s_2\circ\cdots\circ s_k \end{aligned} \]

根据归纳假设,\(\text{norm}(r\circ s_1)\in R,s_i\in S\Rightarrow \text{norm}(r\circ s_1)\circ s_2\cdots s_k\in\langle S'\rangle\),又因为 \((r\circ s_1)\circ(\text{norm}(r\circ s_1))^{-1}\in\langle S'\rangle\),所以 \(h\in\langle S'\rangle\),成立,Q.E.D.

posted @ 2021-02-12 16:58  mizu164  阅读(757)  评论(0编辑  收藏  举报