Shu Yu Mo's Blog
YTQ 貓貓 數學 程式碼
整数模 n 乘法群
  1. 1. 几点补充
    1. 1.1. 欧拉函数
    2. 1.2. 群的直积
    3. 1.3. 原根
    4. 1.4.
  2. 2. 整数模 \(n\) 乘法群
    1. 2.1. 定义
    2. 2.2. 离散对数
    3. 2.3. 原根不存在的剩余系下离散对数的定义
    4. 2.4. 模 \(2^k(k>2)\) 意义下的离散对数
    5. 2.5. 从乘法群的角度考虑原根和阶
  3. 3. 实现上的相关问题
  4. 4. 相关栗题
    1. 4.1. debris
    2. 4.2.
    3. 4.3. 小A与两位神仙

老文章,加到新博客里面测试一下数学公式渲染。过段时间删掉。

几点补充

欧拉函数

\(n=\prod \limits{p_i^{e_i}}\)

\[ \varphi(n) = \prod\limits{p_i^{e_i-1}(p_i-1)} \]

欧拉函数是一个经典的积性函数。

群的直积

又名 笛卡尔(Descartes)积 ,其定义如下:

\((G_1, *) \times (G_2, \cdot) = (G, \oplus)\)

其中

  • \(\times\) 为两个群的笛卡尔积。
  • \(G = \{(a, b)\ | \ a \in G_1, b\in G_2\}\)
  • \(\oplus\) 定义为 \((a_1, b_1) \oplus (a_2, b_2) =(a_1 * a_2, b_1 \cdot b_2)\)

原根

\(g\)\(n\) 的原根,等价于 \(g \perp n, g^0 \sim g^{\varphi(n)-1} \mod n\) 互不相同,等价于 \(g \perp n,\ \forall i \in [1, \varphi(n)-1], g^i \not = 1\). (\(x \perp y\) 表示 \(x, y\) 互质)

一个数 \(n\) 有原根当且仅当 \(n = 2,4,p^k, 2p^k\) 其中 \(p\) 为奇素数。

小结论:若一个正整数 \(n\) 有原根,则其原根数量恰好为 \(\varphi(\varphi(n))\)

若 $a n $,则使 $a^k n $ 成立的 最小 正整数 \(k\),称为 \(a\)\(n\) 意义下的阶,记作 \(\text{ord}_n(a)\)。 可以发现若 \(g\) 为模 \(n\) 意义下原根,那么 \(\operatorname{ord}_n(g) = \varphi(n)\)

整数模 \(n\) 乘法群

定义

对于 任意 一个正整数 \(n\)\(1 \sim n\) 中与 \(n\) 互质的 \(\varphi(n)\) 个数字组成的集合记作 \(\mathbb{Z}^*_n\)

事实上,由 \(\mathbb{Z}_n^*\) 和模 \(n\) 意义下的乘法组成的代数系统 \((\mathbb{Z}^*_n, \times )\) 是一个

这一点可以考虑 \(\mathbb{Z}^*_n\) 中元素所包含的质因子,可以发现是显然的。

因为任意一个处于 \(n\) 的剩余系中且不与 \(n\) 互质的元素 \(x\),都可以除掉 \(\gcd(x, n)\) 放到 \(\frac{n}{\gcd(n, x)}\) 的剩余系内考虑,所以这里只讨论 \(n\) 的剩余系中与 \(n\) 互质的元素组成的集合,即 \(\mathbb{Z}_n^*\)(称其为 \(n\) 的简化剩余系),当然也因为 我不会 \(\mathbb{Z}_n^*\) 的性质实在是太美了。

离散对数

\(n\) 存在原根,取任意一个 \(n\) 的原根 \(g\) ,则对于 \(\mathbb{Z}^*_n\) 中的一个每个元素 \(x\) ,都存在唯一的 \(k \in [0, \varphi(n)-1]\) ,使得 \(g^k =x\)

可以得出 \([0, \varphi(n)-1] \cap \mathbb{Z}\) 中的元素与 \(\mathbb{Z}_n^*\) 中的元素之间一一对应。

可以建立函数 \(f(x)\) 表示 \(\mathbb{Z}_n^*\)\([0, \varphi(n)-1] \cap \mathbb{Z}\) 的映射。可以形象的称 \(f(x)\)离散对数。这里满足很多实数定义下对数的性质。需要注意离散对数间的运算是定义在 \(\mod \varphi(n)\) 意义下的。

原根不存在的剩余系下离散对数的定义

离散对数的取值依赖于原根的选取,所以只有 \(n\) 存在原根时, \(\mathbb{Z}_n^*\) 中的元素才存在 直接的 的离散对数。

可以利用类似于中国剩余定理的一般思想,将 \(n\) 分解为质数幂的形式,分别求出 \(x\) 在每个 \(p_i^k\) 剩余系下的离散对数 \(a_i\),则可以用 \((a_0, a_1, a_2,\cdots )\) 这样的 "坐标" 来类似地定义 \(x\)\(n\) 剩余系下的 “离散对数”。根据中国剩余定理,可以发现这样的 “坐标” 是能够实现和原数一一对应的。

可以先考虑原根存在的 \(\mathbb{Z}_n^*\),对 \(\mathbb{Z}_n^*\) 中的每一个元素取离散对数(不妨设这里的原根取最小的原根)放入一个集合 \(G\),然后重新定义群 乘法运算为模 \(\varphi(n)\) 意义下的 加法,这样 \((G, \times)\) 也能够形成一个群。不妨用 \(G_n\) 来表示这个群。

类似地定义原根不存在的 \(\mathbb{Z}_m^*\)

\(m=\prod_{i=1}^{s}\limits{P_i^{e_i}}\) 。他们的 “离散对数” 形成的群可以表示为 \(G_{P_1^{e_1}}\times G_{P_2^{e_2}} \times G_{P_3^{e_3}}\times\cdots\times G_{P_s^{e_s}}\) ,其中 \(\times\) 为定义在群上的直积。

值得一提的是:可以发现,两个群做直积,得到的群的阶为之前两个群的阶的乘积,可以发现,这和欧拉函数的积性是相符的。

这好像没有什么用,只是可以帮助理解或者得到一些小结论吧。

\(2^k(k>2)\) 意义下的离散对数

注意到,\(2^k(k>2)\) 也是没有原根的。

定义 \(2^k (k > 2)\) 意义下的 “离散对数” 需要如下两个结论

\[ \operatorname{ord}_{2^k}(5)=2^{k-2} \]

而且对于任意一个 \(2^k\) 的简化剩余系下能表示成形如 \(5^\alpha\) 的元素 \(x\)\(-x\) 一定不能表示成形如 \(5^\alpha\) 的元素。

一个栗子

\(k=4\) 时,即 \(16=2^4\)

\(\mathbb{Z}_{16}^*=\{1, 3, 5, 7, 9, 11, 13, 15\}\)

\(5^0=1, 5^1=5, 5^2=9, 5^3=13, 5^4=1\)

\(\operatorname{ord}_{16}(5)=4=2^{k-2}=2^2\)

\(-1\equiv 15, -5\equiv 11, -9\equiv 7, -15\equiv 2\) 这些数字都没有在上面出现过。

简单来说就是 \(2^k\) 的简化剩余系下(大小为 \(2^{k-1}\)),有恰好一半的数字可以表示成 \(5^\alpha \mod 2^k\),恰好一半不可以,这两部分元素一一对应,互为剩余系下的相反数。

所以,可以把模 \(2^k (k>2)\) 意义下的循环群看成是两个原根为 \(5\)\(-1\) 的乘法群的直积。

其中的元素 \(x\) 的离散对数形如 \((a, b)\) 表示 \(5^a \times (-1)^b\)

从乘法群的角度考虑原根和阶

对于任意正整数 \(n\)\(n\) 的简化剩余系中的取任意一个数字 \(x\)

\(S_x=\{x^0, x^1, x^2,\cdots\}\) ,可以发现如果定义集合 \(S\) 的乘法运算为模 \(n\) 意义下的乘法,那么这东西就是 \((\mathbb{Z}_n^*, \times)\) 的一个子群…这里 \(|S_x|\) (群 \((S_x, \times)\) 的阶)就可以称为 \(x\) 在模 \(n\) 意义下的阶。

把剩余系的环和群的环结合着理解一下,可以发现这个定义和原先的定义是等价的。

根据这个东西,不难发现: \[ |S_x|=\frac{\varphi(n)}{\gcd(f(x), \varphi(n))} \]

这里的 \(f(x)\)\(x\) 在任意原根意义下的离散对数。

存在一个显然的事实:一个常数 \(x\) 的所有倍数模 \(m\) 能够取到所有形如 \(k\cdot\gcd(x, m)\) 的数(\(k \in \mathbb{Z^*}\))。

\(n\) 的某个原根意义下离散对数的角度考虑, \(S_x\) 可以看作 “所有离散对数为 \(\gcd(f(x), \varphi(n))\) 的倍数的元素” 组成的集合,这样的数字显然有 \(\frac{\varphi(n)}{\gcd(f(x), \varphi(n))}\) 个,也就是循环子群的阶数。

之后的问题中,如果不好考虑某个引理,可以转化为选取一个原根后,对每个元素,求其离散对数,然后扔到一个剩余系环上考虑。即使是关于原根本身的引理,也可以用这样的方法证明。

可以发现,我们想要的原根 \(x\),满足 \(x\) 的循环子群能够取遍原来群中所有元素,即 \(f(x) \perp \varphi(n)\)

考虑一下原根的数量,对于任意一个正整数 \(n\) ,其简化剩余系阶为 \(\varphi(n)\) ,每个数字取离散对数,指数和 \(\varphi(n)\) 互质的即可成为原根,这样的数字有 \(\varphi(\varphi(n))\) 个。事实上,这是原根数量的精确值。

对于 任意 一个正整数 \(n\) ,若其剩余系存在原根,则原根数恰好为 \(\varphi(\varphi(n))\).

实现上的相关问题

什么求原根、求阶和求离散对数之类的人间烟火,可以查看 「学习总结」数论

相关栗题

debris

给定素数 \(P\),求满足 \(1 \le n, m\le P(P-1)\)\(n^m \equiv m^n \pmod{P}\) 的数对 \((n, m)\) 个数。

答案对素数 \(M\) 取模。 数据组数 \(T \le 100, P \le 10^{12}, M \le 10^9\)

如果 \(n, m\) 一个为 \(P\) 的倍数,另一个不是,那么显然这些方案都不合法。

分两种情况:

如果 \(n, m\) 都是 \(P\) 的倍数,那么这一部分的贡献是平凡的,就是 \((P-1)^2\)

如果 \(n, m\) 都不是 \(P\) 的倍数,可以取其离散对数: \[ n =g^a\pmod{P} \\ m =g^b\pmod{P} \\ n =c\pmod{P-1} \\ m =d\pmod{P-1} \]

定义 \(n=(a, c),m=(b, d)\)。任何一个数字 \(n,m\) 都可以用形如 \((x, y)\) 的数对表示。同时,\(\forall x,y \in [0, P-2]\ \ (x, y)\) 的数对都唯一的对应一个在 \([1, P(P-1)]\) 的数字。

原式化简: \[ \begin{split} \ &n^m &\equiv m^n &\pmod{P} \\ \Rightarrow\ &g^{am} &\equiv g^{bn} &\pmod{P}\\ \Rightarrow\ &{am} &\equiv {bn} &\pmod{\varphi(P)}\\ \Rightarrow\ &{ad} &\equiv {bc} &\pmod{P-1}\\ \end{split} \]

问题转化为:

\(a, b, c, d\) 可以在 \([0, P-1)\) 内任取 ,方程 \(ad\equiv bc \pmod{P-1}\) 的解 \((a, b, c, d)\) 的数量。

根据乘法群的理论,把 \((\mathbb{Z}_{P-1}^*, \times)\) 拆分成多个 \(p^k\) 的群的直积。“坐标” 每一维行为独立。

分别求出每一个 \(ad\equiv bc \pmod{p^k}\) 的解数量相乘即可。

考虑如何求出形如 \(ab\equiv bc \pmod{p^k}\) 的方程解数量。

仍然可以分两种情况:

  • 方程两边都与 \(p\) 互质,这样答案也是平凡的可以考虑其中三个数字任取,然后最后一个数字算逆元即可,答案就是 \(\varphi(p^k)^3\)
  • 方程两边与 \(p\) 不互质,可以考虑方程一边的取值个数,考虑枚举 \(a, b\)\(p\) 的次数,同时除去这个值,转化为互质的情况。需要注意如果其次数和大于 \(p^k\) 两边 \(p\) 的幂次没必要相等。

\(x^k \bmod m\) (\(x\) 为非负整数)的不同值个数,答案对 \(10^9 + 7\) 取模。

\(m=\prod_{i=1}^{m_s}\limits{p_i^{a_i}}\)

\(k=\prod_{i=1}^{k_s}\limits{q_i^{b_i}}\)

\(m_s, k_s\le 2\times 10^5, p_i,q_i \le10^7, 1\le a_i,b_i \le 10^9\)

下辈子再学。

小A与两位神仙

给定一个奇质数次幂 \(m\)

\(n\) 组询问,每组给定 \((x, y)\) 满足 \(x\perp m, y\perp m\)

判定是否存在 \(x^a\equiv y\pmod{m}\)

\(n \le 2\times 10^4,m\le 10^{18}\)

显然求离散对数非常舒服,直接算倍数即可。只可惜 \(m\) 有亿点点大。

但是可以通过离散对数考虑,设 \(u, v\) 分别为 \(x, y\) 的离散对数。

显然我们希望: \[ t \in \mathbb{Z}\ \ \ \text{s.t.}\ \ ut=v \pmod{\varphi(m)} \]

即: \[ \gcd(u, \varphi(m)) | v \] 其等价于: \[ \gcd(u, \varphi(m)) | \gcd(v, \varphi(m)) \] 由上面乘法群的推论: \[ |S_x|=\frac{\varphi(m)}{\gcd(\varphi(m), f(x))} \]

于是可以转化为: \[ \frac{\varphi(m)}{|S_x|} \mid \frac{\varphi(m)}{|S_y|} \] 即: \[ |S_y| \ \ \ \ \ \ | \ \ \ \ \ \ |S_x| \] 所以只需要对原数 \(x, y\) 分别求阶,然后判断 \(\operatorname{ord}_m(y) | \operatorname{ord}_m(x)\) 即可。