社论 22.10.4 同态计数 题解

Problem

同态计数

\(\text{M}_ n(\mathbb{F}_ p)\) 表示模 \(p\) 意义下全体 \(n\) 阶矩阵的集合。

一个映射 \(f:R\to R\) 称为同态,当且仅当 $$\forall X,Y\in R,f(X+Y) = f(X) + f(Y)\ \land \ f(X\times Y) = f(X) \times f(Y)$$

两个映射 \(f,g\) 是不同的,当且仅当 \(\exists\ x,f(x)\neq g(x)\)

给定 \(n,p\),保证 \(p\) 是素数。你需要计算出 \(\text{M}_ n(\mathbb{F}_ p)\) 上同态映射的数量。答案对 \(10^9+7\) 取模。

\(n \le 1e7, p \le 10^9\)

\(\text{M}_ 1(\mathbb{F}_ 7)\) 上的同态映射只有两种:\(f(x) = x\)\(f(x) = 0\)。因此答案为 2。

Solution

首先我们根据一些基础的线代知识,对于一个可逆的矩阵 \(C\),形如 \(f_C(x) = C^{-1}XC\) 的映射定是同态映射。

证明

\(f_C(XY) = C^{-1}XYC = C^{-1}XCC^{-1}YC = (C^{-1}XC)(C^{-1}YC) = f_C(X)f_C(Y)\)
\(f_C(X+Y)\) 平凡,证明从略。

随后我们有断言:所有同态要么是平凡同态 \(f(X)=0\),要么是形如 \(f_C\) 的映射。

题解对于这个断言的证明:

如果你懂很多代数

注意到 \(\text{M}_n(\mathbb{F}_ p)\) 是单环,那么它上面的同态只能是平凡同态和同构,再注意到它是一个中心单代数,根据 Skolem-Noether 定理它的同构必然是内的。

如果你只懂微小的代数

我们当然只处理不平凡的同态,取 \(\mathbb Z_p\)上的 \(n\) 维向量空间 \(V\),取定一组基,把矩阵解释成线性算子。我们看 \(P_i=f(E_{i,i})\) ,不难验证 \(V=\bigoplus_i P_iV\) ,并且 Pi 是投影算子,于是 \(\text{dim}P_iV=1\)。设 \(P_1V=<A1>\)\(A_i=f(E_{i,1})A_1\),把 \(A_i\) 们在基下的坐标取成列向量,再把列向量排成行构成一个矩阵 \(A\)\(A^{−1}\) 即为所求矩阵。

如果有人看到这里就已经会了那您nb。反正我是不会。

于是我们对“很多”的部分进行一个人话的转录。

第一句:\(\text{M}_n(\mathbb{F}_ p)\) 是单环。
单环是没有非平凡理想的环。简单来说,从单环中任选一个元素 \(r\),能满足对其中任意元素左/右乘 \(r\) 得到结果还属于其自身的子群只有该单环本身。

第二句:单环上的同态只能是平凡同态或同构。
同态的定义是保持环上两个运算结构的映射。同构的定义是同态双射。
对于同态 \(f:\mathbb R\to \mathbb R\),由于这是一个自同态,因此若任意元素不在像空间或原像空间内就不满足同态性质了。因此这个同态是满射。由于这是单环上的同态,因此其对应运算保持矩阵乘法的结构,因此不存在两个不同的原像使得他们的像相同。因此这个同态是单射。
这也就证明了非平凡自同态是自同构。因此问题归约到所有非平凡自同构的形态问题。

第三句:\(\text{M}_n(\mathbb{F}_ p)\) 是一个中心单代数。
\(\text{M}_n(\mathbb{F}_ p)\) 是一个矩阵环,因此它是一个矩阵代数。矩阵代数的外推是中心单代数,因 此\(\text{M}_n(\mathbb{F}_ p)\) 是一个中心单代数。

第四句:根据 Skolem-Noether 定理,断言成立。
Skolem-Noether 定理:域上的 \(n\times n\) 矩阵代数上的自同构为内自同构。
由于第三句的证明,我们能断言 \(\text{M}_n(\mathbb{F}_ p)\) 上的自同构为内自同构。
内自同构是以共轭方式给出的定义。群 \(G\) 的一个自同构,如果是 \(G\) 内的元素的共轭作用,便称为内自同构。由 \(g\in G\) 的共轭作用给出的内自同构 \(f_g(x) = gxg^{-1}\)。取 \(g = C^{-1}\) 得到 \(f(X) = C^{-1}XC\)

由定义,有所有内自同构形如 \(f_C\)。由第二句的结论,有所有非平凡同态形如 \(f_C\)
因此我们证明了断言。

对于“微小”的部分,不要去碰它。
某些人的心态已经被读明白这段话而搞崩了。

接下来我们只需要求不同的形如 \(f_C\) 的同态的个数,取模后加上平凡同态就是答案。

注意到 \(\forall \ X,C^{-1}XC = A^{-1}XA\)。因此两边左乘 \(A\) 右乘 \(C^{-1}\) 得到 \(\forall \ X,AC^{-1}X = XAC^{-1}\)。因此 \(AC^{-1}\) 与所有矩阵乘积可交换,此性质表明其只有对角线有相同元素,即其是一个纯量阵。因此 \(A = \lambda C\)
因此 \(f_A = f_C \Leftrightarrow A = \lambda C\)。于是同态个数就是全体 \(n\) 阶可逆矩阵 \(GL_n\) 的个数除以系数种类 \((p-1)\)。注意到矩阵可逆的充要条件是矩阵满秩。于是考虑求得满秩 \(n\times n\) 矩阵的个数。
\(\mathbb Z_p\) (模 \(p\) 意义下整数集合)上的 \(n\) 维向量空间 \(V\)。从中取矩阵第一行(可视作行向量) \(a_1\),共有 \(p^n-1\) 种取法(除去全零向量)。第二行可以取 \(V \ \text{\\} \{a_1\}\) 中的所有向量,取法有 \(p^n-p\) 种(除去全零向量和先前取出的向量能表出的 \(p-1\) 个向量)。以此类推取完 \(n\) 行,这部分的答案可写作 \(\prod_{i=0}^{n-1} (p^n - p^i)\)

因此最终答案即为

\[\frac{\prod_{i=0}^{n-1} (p^n - p^i)}{p-1} + 1 \]

code
#include <bits/stdc++.h>
int n, p, sq[10000007], mod = 1e9 + 7;

typedef long long ll; typedef __int128 lll;
struct FastMod { int m; ll b; void init(int _m) { m = _m; b = ((lll)1<<64) / m; } int operator() (ll a) {ll q = ((lll)a * b) >> 64; a -= q * m; if (a >= m) a -= m; return a; } } Mod;
int add(int a, int b) { return (a += b) >= mod ? a - mod : a; } int mul(int a, int b) { return Mod(1ll * a * b); } template <typename ...Args> int mul(int a, Args ...b) { return mul(a, mul(b...)); }

int qp(int a, int b = mod - 2) { 
    int ret = 1; 
    while (b) { 
        if (b & 1) ret = mul(ret, a); 
        a = mul(a, a); 
        b >>= 1; 
    } return ret; 
}

signed main() {
    std::cin >> p >> n; int ans = 1;
    sq[0] = 1; Mod.init(mod);
    for (int i = 1; i <= n; i++) sq[i] = mul(sq[i-1], p);
    for (int i = 0; i < n; i++) ans = mul(ans, sq[n] - sq[i] + mod);
    std::cout << add(mul(ans, qp(p-1)), 1);
}
posted @ 2022-10-04 06:48  joke3579  阅读(410)  评论(2编辑  收藏  举报