对于 任意 一个正整数
n
,1∼n
中与
n
互质的
φ(n)
个数字组成的集合记作
Zn∗。
事实上,由
Zn∗
和模
n
意义下的乘法组成的代数系统
(Zn∗,×)
是一个群。
从这一点出发理解原根和阶往往有很多奇妙的感受…
几点补充
欧拉函数
n=∏piei
φ(n)=∏piei−1(pi−1)
欧拉函数是一个经典的积性函数。
群的直积
又名 笛卡尔(Descartes)积 ,其定义如下:
设
(G1,∗)×(G2,⋅)=(G,⊕)
其中
- ×
为两个群的笛卡尔积。
- G={(a,b) ∣ a∈G1,b∈G2}
- ⊕
定义为
(a1,b1)⊕(a2,b2)=(a1∗a2,b1⋅b2)
若
g
为
n
的原根,等价于
g⊥n,g0∼gφ(n)−1modn
互不相同,等价于
g⊥n, ∀i∈[1,φ(n)−1],gi=1.
(x⊥y
表示
x,y
互质)
一个数
n
有原根当且仅当
n=2,4,pk,2pk
其中
p
为奇素数。
小结论:若一个正整数
n
有原根,则其原根数量恰好为
φ(φ(n))
。
若
a⊥n,则使
ak≡1(modn)
成立的 最小 正整数
k,称为
a
模
n
意义下的阶,记作
ordn(a)。
可以发现若
g
为模
n
意义下原根,那么
ordn(g)=φ(n)。
整数模
n
乘法群
定义
对于 任意 一个正整数
n
,1∼n
中与
n
互质的
φ(n)
个数字组成的集合记作
Zn∗。
事实上,由
Zn∗
和模
n
意义下的乘法组成的代数系统
(Zn∗,×)
是一个群。
这一点可以考虑
Zn∗
中元素所包含的质因子,可以发现是显然的。
因为任意一个处于
n
的剩余系中且不与
n
互质的元素
x,都可以除掉
gcd(x,n)
放到
gcd(n,x)n
的剩余系内考虑,所以这里只讨论
n
的剩余系中与
n
互质的元素组成的集合,即
Zn∗(称其为
n
的简化剩余系),当然也因为 我不会
Zn∗
的性质实在是太美了。
离散对数
若
n
存在原根,取任意一个
n
的原根
g
,则对于
Zn∗
中的一个每个元素
x
,都存在唯一的
k∈[0,φ(n)−1]
,使得
gk=x。
可以得出
[0,φ(n)−1]∩Z
中的元素与
Zn∗
中的元素之间一一对应。
可以建立函数
f(x)
表示
Zn∗
向
[0,φ(n)−1]∩Z
的映射。可以形象的称
f(x)
为
离散对数。这里满足很多实数定义下对数的性质。需要注意离散对数间的运算是定义在
modφ(n)
意义下的。
原根不存在的剩余系下离散对数的定义
离散对数的取值依赖于原根的选取,所以只有
n
存在原根时,
Zn∗
中的元素才存在 直接的 的离散对数。
可以利用类似于中国剩余定理的一般思想,将
n
分解为质数幂的形式,分别求出
x
在每个
pik
剩余系下的离散对数
ai,则可以用
(a0,a1,a2,⋯)
这样的 “坐标” 来类似地定义
x
在
n
剩余系下的 “离散对数”。根据中国剩余定理,可以发现这样的 “坐标”
是能够实现和原数一一对应的。
可以先考虑原根存在的
Zn∗,对
Zn∗
中的每一个元素取离散对数(不妨设这里的原根取最小的原根)放入一个集合
G,然后重新定义群
乘法运算为模
φ(n)
意义下的 加法,这样
(G,×)
也能够形成一个群。不妨用
Gn
来表示这个群。
类似地定义原根不存在的
Zm∗,设
m=i=1∏sPiei
。
他们的 “离散对数” 形成的群可以表示为
GP1e1×GP2e2×GP3e3×⋯×GPses
,其中
×
为定义在群上的直积。
值得一提的是:可以发现,两个群做直积,得到的群的阶为之前两个群的阶的乘积,可以发现,这和欧拉函数的积性是相符的。
这好像没有什么用,只是可以帮助理解或者得到一些小结论吧。
模
2k(k>2)
意义下的离散对数
注意到,2k(k>2)
也是没有原根的。
定义
2k(k>2)
意义下的 “离散对数” 需要如下两个结论
ord2k(5)=2k−2
而且对于任意一个
2k
的简化剩余系下能表示成形如
5α
的元素
x,−x
一定不能表示成形如
5α
的元素。
一个栗子
当
k=4
时,即
16=24。
Z16∗={1,3,5,7,9,11,13,15}
50=1,51=5,52=9,53=13,54=1
ord16(5)=4=2k−2=22
且
−1≡15,−5≡11,−9≡7,−15≡2
这些数字都没有在上面出现过。
简单来说就是
2k
的简化剩余系下(大小为
2k−1),有恰好一半的数字可以表示成
5αmod2k,恰好一半不可以,这两部分元素一一对应,互为剩余系下的相反数。
所以,可以把模
2k(k>2)
意义下的循环群看成是两个原根为
5
和
−1
的乘法群的直积。
其中的元素
x
的离散对数形如
(a,b)
表示
5a×(−1)b。
从乘法群的角度考虑原根和阶
对于任意正整数
n
,n
的简化剩余系中的取任意一个数字
x。
设
Sx={x0,x1,x2,⋯}
,可以发现如果定义集合
S
的乘法运算为模
n
意义下的乘法,那么这东西就是
(Zn∗,×)
的一个子群…这里
∣Sx∣
(群
(Sx,×)
的阶)就可以称为
x
在模
n
意义下的阶。
把剩余系的环和群的环结合着理解一下,可以发现这个定义和原先的定义是等价的。
根据这个东西,不难发现:
∣Sx∣=gcd(f(x),φ(n))φ(n)
这里的
f(x)
为
x
在任意原根意义下的离散对数。
存在一个显然的事实:一个常数
x
的所有倍数模
m
能够取到所有形如
k⋅gcd(x,m)
的数(k∈Z∗)。
从
n
的某个原根意义下离散对数的角度考虑,
Sx
可以看作 “所有离散对数为
gcd(f(x),φ(n))
的倍数的元素” 组成的集合,这样的数字显然有
gcd(f(x),φ(n))φ(n)
个,也就是循环子群的阶数。
之后的问题中,如果不好考虑某个引理,可以转化为选取一个原根后,对每个元素,求其离散对数,然后扔到一个剩余系环上考虑。即使是关于原根本身的引理,也可以用这样的方法证明。
可以发现,我们想要的原根
x,满足
x
的循环子群能够取遍原来群中所有元素,即
f(x)⊥φ(n)
。
考虑一下原根的数量,对于任意一个正整数
n
,其简化剩余系阶为
φ(n)
,每个数字取离散对数,指数和
φ(n)
互质的即可成为原根,这样的数字有
φ(φ(n))
个。事实上,这是原根数量的精确值。
对于 任意 一个正整数
n
,若其剩余系存在原根,则原根数恰好为
φ(φ(n)).
实现上的相关问题
什么求原根、求阶和求离散对数之类的人间烟火,可以查看 「学习总结」数论
相关栗题
debris
给定素数
P,求满足
1≤n,m≤P(P−1)
且
nm≡mn(modP)
的数对
(n,m)
个数。
答案对素数
M
取模。 数据组数
T≤100,P≤1012,M≤109
如果
n,m
一个为
P
的倍数,另一个不是,那么显然这些方案都不合法。
分两种情况:
如果
n,m
都是
P
的倍数,那么这一部分的贡献是平凡的,就是
(P−1)2。
如果
n,m
都不是
P
的倍数,可以取其离散对数:
nm⇒ gam⇒ am⇒ ad≡mn(modP)≡gbn(modP)≡bn(modφ(P))≡bc(modP−1)
定义
n=(a,c),m=(b,d)。任何一个数字
n,m
都可以用形如
(x,y)
的数对表示。
同时∀x,y∈[0,P−2] (x,y)
的数对都唯一的对应一个在
[1,P(P−1)]
的数字。
原式化简:
nm⇒ gam⇒ am⇒ ad≡mn(modP)≡gbn(modP)≡bn(modφ(P))≡bc(modP−1)
问题转化为:
若
a,b,c,d
可以在
[0,P−1)
内任取 ,方程
ad≡bc(modP−1)
的解
(a,b,c,d)
的数量。
根据乘法群的理论,把
(ZP−1∗,×)
拆分成多个
pk
的群的直积。“坐标” 每一维行为独立。
分别求出每一个
ad≡bc(modpk)
的解数量相乘即可。
考虑如何求出形如
ab≡bc(modpk)
的方程解数量。
仍然可以分两种情况:
- 方程两边都与
p
互质,这样答案也是平凡的可以考虑其中三个数字任取,然后最后一个数字算逆元即可,答案就是
φ(pk)3。
- 方程两边与
p
不互质,可以考虑方程一边的取值个数,考虑枚举
a,b
中
p
的次数,同时除去这个值,转化为互质的情况。需要注意如果其次数和大于
pk
两边
p
的幂次没必要相等。
子
求
xkmodm
(x
为非负整数)的不同值个数,答案对
109+7
取模。
m=i=1∏mspiai
k=i=1∏ksqibi
ms,ks≤2×105,pi,qi≤107,1≤ai,bi≤109
下辈子再学。
给定一个奇质数次幂
m。
n
组询问,每组给定
(x,y)
满足
x⊥m,y⊥m
判定是否存在
xa≡y(modm)
n≤2×104,m≤1018
显然求离散对数非常舒服,直接算倍数即可。只可惜
m
有亿点点大。
但是可以通过离散对数考虑,设
u,v
分别为
x,y
的离散对数。
显然我们希望:
t∈Z s.t. ut=v(modφ(m))
即:
gcd(u,φ(m))∣v
其等价于:
gcd(u,φ(m))∣gcd(v,φ(m))
由上面乘法群的推论:
∣Sx∣=gcd(φ(m),f(x))φ(m)
于是可以转化为:
∣Sx∣φ(m)∣∣Sy∣φ(m)
即:
∣Sy∣ ∣ ∣Sx∣
所以只需要对原数
x,y
分别求阶,然后判断
ordm(y)∣ordm(x)
即可。