算法

模 n 单位群:先拆结构,再做统计

从互素条件进入单位群,用 CRT 和素数幂结构拆分问题,避免把模数互素误当成答案积性。

本页目录6 节

当问题要求 ak1(modn)a^k\equiv1\pmod n 的最小正整数 kk,先检查 gcd(a,n)\gcd(a,n)。以下讨论 n>1n>1;模 11 的边界应按题目定义单独处理。

从同余转到单位群 #

gcd(a,n)>1\gcd(a,n)>1,公共素因子 pp 会使 aka^kpp 等于 00,不可能等于 11。若 gcd(a,n)=1\gcd(a,n)=1,由 Bézout 等式可知 aa 有模 nn 逆元。

这些可逆剩余类组成单位群

U(n)=(Z/nZ)×,U(n)=φ(n).U(n)=(\mathbb Z/n\mathbb Z)^\times,\qquad |U(n)|=\varphi(n).

在有限群中元素阶存在,且整除群的大小。因此 Euler 定理给出 aφ(n)1(modn)a^{\varphi(n)}\equiv1\pmod n,但 φ(n)\varphi(n) 通常不是 aa 的最小正周期。

例如 n=8,a=3n=8,a=3 时,φ(8)=4\varphi(8)=4,但 321(mod8)3^2\equiv1\pmod8,所以 33 的阶是 22

按素数幂分解的规则 #

n=ipiein=\prod_i p_i^{e_i}。中国剩余定理保持乘法运算,并将可逆元对应到各分量的可逆元,所以

U(n)iU(piei).U(n)\cong\prod_i U(p_i^{e_i}).

CmC_mmm 阶循环群,需要使用的结构如下。

模数单位群
奇素数幂 pep^eCpe1(p1)C_{p^{e-1}(p-1)}
22平凡群
44C2C_2
2e2^ee3e\ge3C2×C2e2C_2\times C_{2^{e-2}}

这里奇素数幂的结论来自原根存在定理;不能只由单位个数推出它是循环群。CRT 与单位群结构的来源见完整题解中的定理与引用

对于 e3e\ge3,模 2e2^e 的两个生成方向可以取 1-155:前者阶为 22,后者阶为 2e22^{e-2}55 的幂模 44 总为 11,不会等于 1-1,两个子群交集只有单位元。乘积大小为 2e1=φ(2e)2^{e-1}=\varphi(2^e),恰好覆盖全部单位。

典型例题:模 8 与模 15 #

U(8)={1,3,5,7}U(8)=\{1,3,5,7\}。后三个元素平方都为 11,阶分布为一个 11 和三个 22;故它是 C2×C2C_2\times C_2,不能当作 C4C_4。元素阶之和为 77,不是 1111

再看 15=3515=3\cdot5

U(15)U(3)×U(5)C2×C4.U(15)\cong U(3)\times U(5)\cong C_2\times C_4.

阶整除 22 的元素有 22=42\cdot2=4 个,其中一个是单位元,所以阶恰为 22 的有 33 个。全部 88 个元素的阶都整除 44,剩下 44 个阶为 44。阶之和为

1+32+44=23.1+3\cdot2+4\cdot4=23.

Trick:模数互素不等于答案积性 #

A(n)A(n)U(n)U(n) 中所有元素的阶之和。虽然 3355 互素,但两个单位群中的元素阶可能共享素因子。直积中的阶取最小公倍数,不能直接将两个阶之和相乘:

A(3)=3,A(5)=11,A(15)=2333.A(3)=3,\qquad A(5)=11,\qquad A(15)=23\ne33.

要让阶能够相乘,须把循环群长度再拆成素数幂,把同一素数的部分归为一个分量。不同素数分量中元素的阶才两两互素。

例如 U(27)C18C2×C9U(27)\cong C_{18}\cong C_2\times C_9,这时可以分开统计两个素数分量,再乘起来;C2×C4C_2\times C_4 则必须归入同一个 22 分量。

接到实现 #

E · Exponent 的 C++17 实现先分解模数,按上表得到循环群长度,再分解长度并统计各素数分量。它不需要实际寻找原根,也不枚举全部可逆元。

该实现适用于题目范围 1n1091\le n\le10^9;使用 64 位整数,n=1n=1 按原题定义返回 11完整题解包含推导、分解复杂度与中间乘积界,运行说明验证摘要与同一份源码对应。

继续阅读与来源 #

返回个人知识手册 · 第二场记录

讨论

评论

正在加载评论…

输入关键词开始搜索。