《退役人的自我救赎系列》——其二,也就是差不多算是初等数论的知识。
一句话简介:NTT 即快速数论变换 ,是一种可以在n log n n\log n n log n 的时间内完成多项式乘法的算法——的一部分。
前置知识 FFT可以看我之前写过的一篇文章:基础知识:FFT - 简单入门 - 七海の参考書 (shiraha.cn)
FFT 需要使用复数——这样就无法回避大量的浮点运算,然后精度就会爆炸;但是由于已经证明了在复数域内,具有循环卷积特性的唯一变换是DFT ,所以在复数域中不存在具有循环卷积性质的更简单的离散正交变换;因此,我们就提出了以数论为基础的具有循环卷积性质的快速数论变换 (NTT ):它的特点在于用有限域上的单位根来取代复平面上的单位根。
上面这段话是上网抄的。虽然我现在还理解不了,但是有一件事情十分清楚——和 FFT 利用单位根的性质减少运算量一样,NTT 利用了原根的性质来减少运算量,达到了同样的复杂度。
阶 定义若a , p ∈ N + a, p\in\N^+ a , p ∈ N + 满足gcd ( a , p ) = 1 \gcd(a, p)=1 g cd( a , p ) = 1 和p > 1 p>1 p > 1 ,那么:
对于使得a n ≡ 1 mod p a^n \equiv 1\ \text{mod}\ p a n ≡ 1 mod p 成立的最小的n n n ,我们称之为a a a 模p p p 的阶 ,记作δ p ( a ) \delta_p(a) δ p ( a ) 或ord p a \text{ord}_pa ord p a 。
性质 1. 对于i ∈ [ 0 , δ p ( a ) ) i\in[0, \delta_p(a)) i ∈ [ 0 , δ p ( a )) ,所有的a i mod p a_i\ \text{mod}\ p a i mod p 都互不相同反证法:令有j ≠ k j\ne k j = k 在该范围内并且模意义下相同,那么显然有a ∣ j − k ∣ ≡ 1 mod p a^{|j-k|}\equiv1\ \text{mod}\ p a ∣ j − k ∣ ≡ 1 mod p ,且∣ j − k ∣ |j-k| ∣ j − k ∣ 也属于该范围内,和定义矛盾。
2. 对于任何a n ≡ 1 mod p a^n \equiv 1\ \text{mod}\ p a n ≡ 1 mod p ,有δ p ( a ) ∣ n \delta_p(a) \mid n δ p ( a ) ∣ n 显然。否则,把n n n 表示为k δ p ( a ) + m k\delta_p(a) + m k δ p ( a ) + m ,显然m ∈ ( 0 , δ p ( a ) ) m \in (0, \delta_p(a)) m ∈ ( 0 , δ p ( a )) 且满足a m ≡ 1 mod p a^m \equiv 1\ \text{mod}\ p a m ≡ 1 mod p ,和性质 1 冲突。
推论 1 :若有gcd ( a , p ) = 1 \gcd(a, p)=1 g cd( a , p ) = 1 ,那么δ p ( a ) ∣ ϕ ( p ) \delta_p(a) \mid \phi(p) δ p ( a ) ∣ ϕ ( p )
由欧拉定理可知:若gcd ( a , p ) = 1 \gcd(a, p) = 1 g cd( a , p ) = 1 ,则a ϕ ( p ) ≡ 1 mod p a^{\phi(p)} \equiv 1 \ \text{mod} \ p a ϕ ( p ) ≡ 1 mod p 。那么由性质 2 可得δ p ( a ) ∣ ϕ ( p ) \delta_p(a) \mid \phi(p) δ p ( a ) ∣ ϕ ( p ) 。
3. 若q ∈ Z + q\in\Z^+ q ∈ Z + ,p p p 是素数,那么δ p ( q i ) = δ p ( q ) ⟺ gcd ( δ p ( q ) , i ) = 1 \delta_p(q^i)=\delta_p(q) \iff \gcd(\delta_p(q), i)=1 δ p ( q i ) = δ p ( q ) ⟺ g cd( δ p ( q ) , i ) = 1 首先,我们记q i = q gcd ( δ p ( q ) , i ) ⋅ r q^i = q^{\gcd(\delta_p(q), i)\cdot r} q i = q g c d ( δ p ( q ) , i ) ⋅ r ,显然r = i gcd ( δ p ( q ) , i ) ∈ Z + r=\frac i{\gcd(\delta_p(q), i)} \in\Z^+ r = g c d ( δ p ( q ) , i ) i ∈ Z +
由性质 2 和题设条件欧拉函数的性质,可得:δ p ( q ) ∣ ϕ ( p ) = ( p − 1 ) \delta_p(q) \mid \phi(p) = (p-1) δ p ( q ) ∣ ϕ ( p ) = ( p − 1 ) (好像没用)
那么,有:( g i ) δ p ( q ) gcd ( δ p ( q ) , i ) = ( g δ p ( q ) ) i gcd ( δ p ( q ) , i ) = g r ⋅ δ p ( q ) ≡ 1 mod p (g^i)^{\frac{\delta_p(q)}{\gcd(\delta_p(q), i)}}=(g^{\delta_p(q)})^{\frac i{\gcd(\delta_p(q), i)}}=g^{r\cdot \delta_p(q)}\equiv1\ \text{mod}\ p ( g i ) g c d ( δ p ( q ) , i ) δ p ( q ) = ( g δ p ( q ) ) g c d ( δ p ( q ) , i ) i = g r ⋅ δ p ( q ) ≡ 1 mod p
假设gcd ( δ p ( q ) , i ) ≠ 1 \gcd(\delta_p(q), i)\ne1 g cd( δ p ( q ) , i ) = 1 ,那么gcd ( δ p ( q ) , i ) > 1 \gcd(\delta_p(q), i)>1 g cd( δ p ( q ) , i ) > 1 ,那么δ p ( q ) gcd ( δ p ( q ) , i ) < δ p ( q ) \frac{\delta_p(q)}{\gcd(\delta_p(q), i)}<\delta_p(q) g c d ( δ p ( q ) , i ) δ p ( q ) < δ p ( q )
因为( g i ) δ p ( q ) gcd ( δ p ( q ) , i ) ≡ 1 mod p (g^i)^{\frac{\delta_p(q)}{\gcd(\delta_p(q), i)}}\equiv1\ \text{mod}\ p ( g i ) g c d ( δ p ( q ) , i ) δ p ( q ) ≡ 1 mod p ,由性质 2 可得δ p ( q i ) ∣ δ p ( q ) gcd ( δ p ( q ) , i ) \delta_p(q^i)\mid\frac{\delta_p(q)}{\gcd(\delta_p(q), i)} δ p ( q i ) ∣ g c d ( δ p ( q ) , i ) δ p ( q ) ,因此δ p ( q i ) ≤ δ p ( q ) gcd ( δ p ( q ) , i ) \delta_p(q^i)\le\frac{\delta_p(q)}{\gcd(\delta_p(q), i)} δ p ( q i ) ≤ g c d ( δ p ( q ) , i ) δ p ( q )
综上所述,可得:δ p ( q i ) ≤ δ p ( q ) gcd ( δ p ( q ) , i ) < δ p ( q ) \delta_p(q^i)\le\frac{\delta_p(q)}{\gcd(\delta_p(q), i)}<\delta_p(q) δ p ( q i ) ≤ g c d ( δ p ( q ) , i ) δ p ( q ) < δ p ( q )
即gcd ( δ p ( q ) , i ) ≠ 1 ⇒ δ p ( q i ) ≠ δ p ( q ) \gcd(\delta_p(q), i)\ne1\Rightarrow \delta_p(q^i)\ne\delta_p(q) g cd( δ p ( q ) , i ) = 1 ⇒ δ p ( q i ) = δ p ( q ) ,必要条件 得证。
继承上述的证明,若有gcd ( δ p ( q ) , i ) = 1 \gcd(\delta_p(q), i)=1 g cd( δ p ( q ) , i ) = 1 ,那么δ p ( q ) gcd ( δ p ( q ) , i ) = δ p ( q ) \frac{\delta_p(q)}{\gcd(\delta_p(q), i)}=\delta_p(q) g c d ( δ p ( q ) , i ) δ p ( q ) = δ p ( q )
由上述证明就可以得到:δ p ( q i ) ≤ δ p ( q ) \delta_p(q^i)\le\delta_p(q) δ p ( q i ) ≤ δ p ( q )
因为g i ⋅ δ p ( q ) gcd ( δ p ( q ) , i ) ≡ 1 mod p g^{i\cdot\frac{\delta_p(q)}{\gcd(\delta_p(q), i)}}\equiv1\ \text{mod}\ p g i ⋅ g c d ( δ p ( q ) , i ) δ p ( q ) ≡ 1 mod p ,和性质 2 和 4 可知:δ p ( q ) ∣ i ⋅ δ p ( q i ) \delta_p(q)\mid i\cdot\delta_p(q^i) δ p ( q ) ∣ i ⋅ δ p ( q i )
因为gcd ( δ p ( q ) , i ) = 1 \gcd(\delta_p(q), i)=1 g cd( δ p ( q ) , i ) = 1 ,所以上式 ⇒ δ p ( q ) ∣ δ p ( q i ) 上式\Rightarrow\delta_p(q)\mid \delta_p(q^i) 上式 ⇒ δ p ( q ) ∣ δ p ( q i ) ,也就是δ p ( q ) ≤ δ p ( q i ) \delta_p(q)\le\delta_p(q^i) δ p ( q ) ≤ δ p ( q i )
综上所述,∵ δ p ( q i ) ≤ δ p ( q ) ∧ δ p ( q ) ≤ δ p ( q i ) \because \delta_p(q^i)\le\delta_p(q) \and \delta_p(q)\le\delta_p(q^i) ∵ δ p ( q i ) ≤ δ p ( q ) ∧ δ p ( q ) ≤ δ p ( q i ) ,∴ δ p ( q ) = δ p ( q i ) \therefore \delta_p(q)=\delta_p(q^i) ∴ δ p ( q ) = δ p ( q i )
即gcd ( δ p ( q ) , i ) = 1 ⇒ δ p ( q i ) = δ p ( q ) \gcd(\delta_p(q), i)=1\Rightarrow \delta_p(q^i)=\delta_p(q) g cd( δ p ( q ) , i ) = 1 ⇒ δ p ( q i ) = δ p ( q ) ,充分条件 得证。
综上所述,gcd ( δ p ( q ) , i ) = 1 \gcd(\delta_p(q), i)=1 g cd( δ p ( q ) , i ) = 1 是δ p ( q ) = δ p ( q i ) \delta_p(q)=\delta_p(q^i) δ p ( q ) = δ p ( q i ) 的充分必要条件 。
4.δ p ( a b ) = δ p ( a ) gcd ( δ p ( a ) , b ) \delta_p(a^b) = \frac{\delta_p(a)}{\gcd(\delta_p(a), b)} δ p ( a b ) = g c d ( δ p ( a ) , b ) δ p ( a ) ,其中a , p , b ∈ Z + a, p, b \in \Z^+ a , p , b ∈ Z + 由阶的定义可知:( a b ) δ p ( a b ) ≡ a b ⋅ δ p ( a b ) ≡ 1 mod p (a^b)^{\delta_p(a^b)} \equiv a^{b\cdot\delta_p(a^b)}\equiv1\ \text{mod} \ p ( a b ) δ p ( a b ) ≡ a b ⋅ δ p ( a b ) ≡ 1 mod p
又由性质 2,可以得到:δ p ( a ) ∣ b ⋅ δ p ( a b ) ⇒ δ p ( a ) gcd ( δ p ( a ) , b ) ∣ b gcd ( δ p ( a ) , b ) ⋅ δ p ( a b ) \delta_p(a)\mid b\cdot\delta_p(a^b) \Rightarrow \frac{\delta_p(a)}{\gcd(\delta_p(a), b)}\mid \frac{b}{\gcd(\delta_p(a), b)}\cdot\delta_p(a^b) δ p ( a ) ∣ b ⋅ δ p ( a b ) ⇒ g c d ( δ p ( a ) , b ) δ p ( a ) ∣ g c d ( δ p ( a ) , b ) b ⋅ δ p ( a b )
显然,因为gcd ( δ p ( a ) gcd ( δ p ( a ) , b ) , b gcd ( δ p ( a ) , b ) ) = 1 \gcd(\frac{\delta_p(a)}{\gcd(\delta_p(a), b)}, \frac{b}{\gcd(\delta_p(a), b)})=1 g cd( g c d ( δ p ( a ) , b ) δ p ( a ) , g c d ( δ p ( a ) , b ) b ) = 1 ,因此:上式 ⇒ δ p ( a ) gcd ( δ p ( a ) , b ) ∣ δ p ( a b ) 上式\Rightarrow \frac{\delta_p(a)}{\gcd(\delta_p(a), b)}\mid\delta_p(a^b) 上式 ⇒ g c d ( δ p ( a ) , b ) δ p ( a ) ∣ δ p ( a b )
又因为定义:a b ⋅ δ p ( a ) gcd ( δ p ( a ) , b ) ≡ a δ p ( a ) ⋅ b gcd ( δ p ( a ) , b ) ≡ 1 mod p a^{b\cdot\frac{\delta_p(a)}{\gcd(\delta_p(a), b)}}\equiv a^{\delta_p(a)\cdot\frac{b}{\gcd(\delta_p(a), b)}} \equiv 1\ \text{mod}\ p a b ⋅ g c d ( δ p ( a ) , b ) δ p ( a ) ≡ a δ p ( a ) ⋅ g c d ( δ p ( a ) , b ) b ≡ 1 mod p ,b gcd ( δ p ( a ) , b ) \frac{b}{\gcd(\delta_p(a), b)} g c d ( δ p ( a ) , b ) b 显然是整数。
所以由性质 2 可得:δ p ( a b ) ∣ δ p ( a ) gcd ( δ p ( a ) , b ) \delta_p(a^b)\mid\frac{\delta_p(a)}{\gcd(\delta_p(a), b)} δ p ( a b ) ∣ g c d ( δ p ( a ) , b ) δ p ( a )
综上所述:∵ δ p ( a ) gcd ( δ p ( a ) , b ) ∣ δ p ( a b ) ∧ δ p ( a b ) ∣ δ p ( a ) gcd ( δ p ( a ) , b ) \because \frac{\delta_p(a)}{\gcd(\delta_p(a), b)}\mid\delta_p(a^b)\ \and\ \delta_p(a^b)\mid\frac{\delta_p(a)}{\gcd(\delta_p(a), b)} ∵ g c d ( δ p ( a ) , b ) δ p ( a ) ∣ δ p ( a b ) ∧ δ p ( a b ) ∣ g c d ( δ p ( a ) , b ) δ p ( a ) ,∴ δ p ( a b ) = δ p ( a ) gcd ( δ p ( a ) , b ) \therefore \delta_p(a^b)=\frac{\delta_p(a)}{\gcd(\delta_p(a), b)} ∴ δ p ( a b ) = g c d ( δ p ( a ) , b ) δ p ( a )
5.p ∈ N + , a , b ∈ Z p \in \N^+,\ a, b\in\Z p ∈ N + , a , b ∈ Z ,gcd ( a , p ) = gcd ( b , p ) = 1 \gcd(a, p) = \gcd(b, p) = 1 g cd( a , p ) = g cd( b , p ) = 1 ,那么gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1 ⟺ \iff ⟺ δ p ( a b ) = δ p ( a ) δ p ( b ) \delta_p(ab)=\delta_p(a)\delta_p(b) δ p ( ab ) = δ p ( a ) δ p ( b ) 由定义可得a δ p ( a ) ≡ 1 mod p a^{\delta_p(a)}\equiv1\ \text{mod}\ p a δ p ( a ) ≡ 1 mod p 和b δ p ( b ) ≡ 1 mod p b^{\delta_p(b)}\equiv1\ \text{mod}\ p b δ p ( b ) ≡ 1 mod p ,那么:( a b ) lcm ( δ p ( a ) , δ p ( b ) ) ≡ 1 mod p (ab)^{\text{lcm}(\delta_p(a),\delta_p(b))}\equiv1\ \text{mod}\ p ( ab ) lcm ( δ p ( a ) , δ p ( b )) ≡ 1 mod p
由性质 2,可得:δ p ( a b ) ∣ lcm ( δ p ( a ) , δ p ( b ) ) \delta_p(ab)\mid\text{lcm}(\delta_p(a),\delta_p(b)) δ p ( ab ) ∣ lcm ( δ p ( a ) , δ p ( b ))
设δ p ( a b ) = δ p ( a ) δ p ( b ) \delta_p(ab)=\delta_p(a)\delta_p(b) δ p ( ab ) = δ p ( a ) δ p ( b ) 成立,那么:上式 ⇒ δ p ( a ) δ p ( b ) ∣ lcm ( δ p ( a ) , δ p ( b ) ) 上式 \Rightarrow \delta_p(a)\delta_p(b)\mid\text{lcm}(\delta_p(a),\delta_p(b)) 上式 ⇒ δ p ( a ) δ p ( b ) ∣ lcm ( δ p ( a ) , δ p ( b ))
又因为lcm ( δ p ( a ) , δ p ( b ) ) = δ p ( a ) δ p ( b ) gcd ( δ p ( a ) , δ p ( b ) ) \text{lcm}(\delta_p(a),\delta_p(b)) = \frac{\delta_p(a)\delta_p(b)}{\gcd(\delta_p(a),\delta_p(b))} lcm ( δ p ( a ) , δ p ( b )) = g c d ( δ p ( a ) , δ p ( b )) δ p ( a ) δ p ( b ) ,可得gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1
即δ p ( a b ) = δ p ( a ) δ p ( b ) \delta_p(ab)=\delta_p(a)\delta_p(b) δ p ( ab ) = δ p ( a ) δ p ( b ) ⇒ \Rightarrow ⇒ gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1 ,必要性 得证。
又由阶的定义:( a b ) δ p ( a b ) ≡ 1 mod p (ab)^{\delta_p(ab)}\equiv1\ \text{mod}\ p ( ab ) δ p ( ab ) ≡ 1 mod p ,可以进行如下推导:
( a b ) δ p ( a b ) ≡ ( a b ) δ p ( a b ) δ p ( b ) ≡ a δ p ( a b ) δ p ( b ) ⋅ b δ p ( a b ) δ p ( b ) ≡ a δ p ( a b ) δ p ( b ) ⋅ 1 ≡ 1 mod p (ab)^{\delta_p(ab)}\equiv(ab)^{\delta_p(ab)\delta_p(b)}\equiv a^{\delta_p(ab)\delta_p(b)}\cdot b^{\delta_p(ab)\delta_p(b)}\equiv a^{\delta_p(ab)\delta_p(b)}\cdot 1\equiv1\ \text{mod}\ p ( ab ) δ p ( ab ) ≡ ( ab ) δ p ( ab ) δ p ( b ) ≡ a δ p ( ab ) δ p ( b ) ⋅ b δ p ( ab ) δ p ( b ) ≡ a δ p ( ab ) δ p ( b ) ⋅ 1 ≡ 1 mod p
由性质 2,可得:δ p ( a ) ∣ δ p ( a b ) δ p ( b ) \delta_p(a)\mid\delta_p(ab)\delta_p(b) δ p ( a ) ∣ δ p ( ab ) δ p ( b ) ;因为gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1 ,所以δ p ( a ) ∣ δ p ( a b ) \delta_p(a)\mid\delta_p(ab) δ p ( a ) ∣ δ p ( ab )
同理,可得:δ p ( b ) ∣ δ p ( a b ) \delta_p(b)\mid\delta_p(ab) δ p ( b ) ∣ δ p ( ab ) ;因为gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1 ,所以δ p ( a ) δ p ( b ) ∣ δ p ( a b ) \delta_p(a)\delta_p(b)\mid\delta_p(ab) δ p ( a ) δ p ( b ) ∣ δ p ( ab )
由定理可得:a δ p ( a ) ≡ a δ p ( a ) δ p ( b ) ≡ 1 mod p a^{\delta_p(a)}\equiv a^{\delta_p(a)\delta_p(b)}\equiv1\ \text{mod}\ p a δ p ( a ) ≡ a δ p ( a ) δ p ( b ) ≡ 1 mod p 和b δ p ( b ) ≡ b δ p ( a ) δ p ( b ) ≡ 1 mod p b^{\delta_p(b)}\equiv b^{\delta_p(a)\delta_p(b)}\equiv1\ \text{mod}\ p b δ p ( b ) ≡ b δ p ( a ) δ p ( b ) ≡ 1 mod p ,因此:
a δ p ( a ) δ p ( b ) ⋅ b δ p ( a ) δ p ( b ) ≡ ( a b ) δ p ( a ) δ p ( b ) ≡ 1 mod p a^{\delta_p(a)\delta_p(b)} \cdot b^{\delta_p(a)\delta_p(b)} \equiv (ab)^{\delta_p(a)\delta_p(b)} \equiv1\ \text{mod}\ p a δ p ( a ) δ p ( b ) ⋅ b δ p ( a ) δ p ( b ) ≡ ( ab ) δ p ( a ) δ p ( b ) ≡ 1 mod p
由性质 2,可得δ p ( a b ) ∣ δ p ( a ) δ p ( b ) \delta_p(ab)\mid\delta_p(a)\delta_p(b) δ p ( ab ) ∣ δ p ( a ) δ p ( b ) ;因此,可证δ p ( a b ) = δ p ( a ) δ p ( b ) \delta_p(ab)=\delta_p(a)\delta_p(b) δ p ( ab ) = δ p ( a ) δ p ( b )
即gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1 ⇒ \Rightarrow ⇒ δ p ( a b ) = δ p ( a ) δ p ( b ) \delta_p(ab)=\delta_p(a)\delta_p(b) δ p ( ab ) = δ p ( a ) δ p ( b ) ,充分性 得证。
综上所述:gcd ( δ p ( a ) , δ p ( b ) ) = 1 \gcd(\delta_p(a),\delta_p(b))=1 g cd( δ p ( a ) , δ p ( b )) = 1 是δ p ( a b ) = δ p ( a ) δ p ( b ) \delta_p(ab)=\delta_p(a)\delta_p(b) δ p ( ab ) = δ p ( a ) δ p ( b ) 的充分必要条件 。
原根 定义m ∈ N + , g ∈ Z m \in \N^+,g\in\Z m ∈ N + , g ∈ Z ,若有δ m ( g ) = ϕ ( m ) \delta_m(g)=\phi(m) δ m ( g ) = ϕ ( m ) 且gcd ( m , g ) = 1 \gcd(m,g)=1 g cd( m , g ) = 1 ,那么称g g g 是模m m m 的一个原根。
若整数g g g 模正整数m m m 的阶(这要求它们互质)和ϕ ( m ) \phi(m) ϕ ( m ) 相等,那么g g g 是模m m m 的一个原根。
性质……我一定是哪里变得奇怪了才会想着抄录全部性质并键证它们== 哪天闲的没事干再补全吧()
定理 原根的存在条件判断对于一个整数p p p 是否存在原根:
对于整数p = 2 , 4 p=2,4 p = 2 , 4 ,它们的原根显然存在 奇素数p p p 的原根存在;对于α ∈ N + \alpha\in\N^+ α ∈ N + ,p α p^\alpha p α 的原根存在 对于奇素数p p p ,α ∈ N + \alpha\in\N^+ α ∈ N + ,2 p α 2p^\alpha 2 p α 的原根存在 若p p p 不符合上述的任何条件,则对于∀ a ∈ Z \forall a\in\Z ∀ a ∈ Z 和gcd ( a , p ) = 1 \gcd(a, p)=1 g cd( a , p ) = 1 ,都有δ p ( a ) < ϕ ( p ) \delta_p(a) < \phi(p) δ p ( a ) < ϕ ( p ) ,即p p p 不存在原根 与之相关的一些定理:
对于奇素数p p p ,若g g g 是其原根,则g g g 或者 g + p g+p g + p 是p 2 p^2 p 2 的原根 对于奇素数p p p ,α ∈ N + \alpha \in \N^+ α ∈ N + ,若g g g 是模p α p^\alpha p α 的原根,则g g g 和 g + p α g+p^\alpha g + p α 中的奇数是2 p α 2p^\alpha 2 p α 的原根 简单地说,对于奇素数p p p ,α ∈ N + \alpha\in\N^+ α ∈ N + ,有原根的数包括:{ 2 , 4 , p α , 2 p α } \{2,4,p^\alpha,2p^\alpha\} { 2 , 4 , p α , 2 p α }
求法对于一个数n n n ,如果它存在原根,那么首先找到它的最小原根并令其为g g g ;那么,n n n 的所有原根都可以表示为g k g^k g k ,k k k 是正整数并且满足gcd ( ϕ ( n ) , k ) = 1 \gcd(\phi(n),k)=1 g cd( ϕ ( n ) , k ) = 1 ,共ϕ ( ϕ ( n ) ) \phi(\phi(n)) ϕ ( ϕ ( n )) 个。
最小原根g g g 的大小已经证明是不会超过n 4 \sqrt[4]{n} 4 n 的,所以可以通过暴力枚举来确定,然后按照定义要求来验证某个数字是否是原根——但是定义要求δ n ( g ) = ϕ ( n ) \delta_n(g)=\phi(n) δ n ( g ) = ϕ ( n ) ,我们无法对于每一个备选g g g 都枚举i ∈ [ 1 , ϕ ( n ) ) i\in[1,\phi(n)) i ∈ [ 1 , ϕ ( n )) 来计算g i g^i g i ,观察它不和1 1 1 同余来判定它是阶。
注意到阶的性质 2 的推论 1,我们可以知道δ n ( g ) ∣ ϕ ( n ) \delta_n(g)\mid\phi(n) δ n ( g ) ∣ ϕ ( n ) ;也就是说,对于备选g g g ,如果它模n n n 下的阶不满足原根的要求,而是另有k < ϕ ( n ) k < \phi(n) k < ϕ ( n ) 存在,那么它满足k ∣ ϕ ( n ) k\mid\phi(n) k ∣ ϕ ( n ) ;那么,我们只需要检查ϕ ( n ) \phi(n) ϕ ( n ) 的所有真 因数就可以找到可能存在的k k k 了,而不需要枚举整个[ 1 , ϕ ( n ) ) [1,\phi(n)) [ 1 , ϕ ( n )) ;具体地,若ϕ ( n ) \phi(n) ϕ ( n ) 的质因子被记为p 1 , … , p r p_1,\dots,p_r p 1 , … , p r ,那么实际上我们只需要检查所有的ϕ ( n ) p i \frac{\phi(n)}{p_i} p i ϕ ( n ) 即可——它覆盖了所有的真因数的倍数,检查它们等同于检查了所有的真因数。
综上所述,找到最小原根g g g 所需要的时间是O ( n 4 ⋅ log n ) \mathcal{O}(\sqrt[4]n\cdot\log n) O ( 4 n ⋅ log n ) 的;利用最小原根g g g 求出所有原根所需要的时间是O ( ϕ ( n ) ⋅ log n ϕ ( n ) 4 ) \mathcal O (\phi(n)\cdot\log n^{\frac{\phi(n)}4}) O ( ϕ ( n ) ⋅ log n 4 ϕ ( n ) ) 的。完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 template <int n>auto &linear_sieve () { static vector<int > prime; static array<int , n + 1> vis; for (int i = 2 ; i <= n; ++i) { if (!vis[i]) prime.push_back (i), vis[i] = i; for (auto &pp : prime) { if ((llong) i * pp > n) break ; vis[i * pp] = pp; if (i % pp == 0 ) break ; } } static auto ret = make_pair (ref (prime), ref (vis)); return ret; } llong fast_pow (llong a, llong b, llong mod) { llong ans = 1 ; while (b) { if (b & 1u ) ans = (ans * a) % mod; a = (a * a) % mod, b >>= 1u ; } return ans % mod; } constexpr int N = 1e6 + 5 ;bool check_primitive_root ( const set<int > &de, llong g, llong phi, llong n) { if (fast_pow (g, phi, n) == 1 ) { return none_of (de.begin (), de.end (), [&](int p) { return fast_pow (g, phi / p, n) == 1 ; }); } else return false ; } signed main () {#ifndef ONLINE_JUDGE freopen ("in.txt" , "r" , stdin); #endif const auto [p, dc] = linear_sieve <N>(); const auto decompose = [&dc = dc] (llong x, set<int > &de) { de.clear (); for (auto ii = x; ii > 1 ;) { de.insert (dc[ii]); ii /= dc[ii]; } }; bitset<N> has_primitive_root; has_primitive_root.set (1 ).set (2 ).set (4 ); for (llong pp : p) { if (pp == 2 ) continue ; for (auto now = pp; now < N; now *= pp) { has_primitive_root.set (now); if (now * 2 < N) has_primitive_root.set (now * 2 ); } } vector<llong> ans; for (auto T = read (); T--;) { auto n = read (), d = read (), phi = n; if (has_primitive_root[n]) { set<int > de_n, de_phi; decompose (n, de_n); for (auto pi : de_n) (phi /= pi) *= (pi - 1 ); decompose (phi, de_phi); llong g = 0 , lim = n; for (int i = 1 ; i <= lim; ++ i) if (check_primitive_root (de_phi, i, phi, n)) { g = i; break ; } if (!g) { cout << 0 << endl << endl; continue ; } ans.clear (); for (auto gi = g, i = 1ll ; i <= phi; ++ i, (gi *= g) %= n) { if (gcd (i, phi) == 1 ) ans.push_back (gi); } sort (ans.begin (), ans.end ()); cout << ans.size () << endl; for (auto id = d - 1 ; id < ans.size (); id += d) cout << ans[id] << ' ' ; cout << endl; } else cout << 0 << endl << endl; } return 0 ; }
首先筛出质数,再筛出所有的可能有原根的数——这一步是O ( n log n ) \mathcal O (n\log n) O ( n log n ) 的;对于一个有原根的数n n n ,首先利用筛的结果(当然也可以直接用线性筛直接算好了存起来)根据定义求出ϕ ( n ) \phi(n) ϕ ( n ) ,然后再利用筛维护的数据(或者埃氏筛直接存起来)分解其质因数存好备用;暴力枚举,并且利用上面说的方法来检查其是否为原根,求出最小原根——这一步是理论O ( n 4 log n ) \mathcal O (\sqrt[4]n\log n) O ( 4 n log n ) 的;最后再利用最小原根生成所有的原根:这需要重复ϕ ( n ) \phi(n) ϕ ( n ) 次,每次使用gcd \gcd g cd 检查——这一步是O ( ϕ ( n ) log n ) \mathcal O(\phi(n)\log n) O ( ϕ ( n ) log n ) 的。
上面的代码可以通过 P6091 【模板】原根 。需要注意虽然最小原根有这个理论界限,但是求的时候只遍历到⌈ n 1 4 ⌉ \lceil n^\frac14\rceil ⌈ n 4 1 ⌉ 似乎会暴毙……
阶和原根那么如何理解这两个抽象的概念呢?
后记 参考资料