原根
阶
由欧拉定理知,若 \((a,m)=1\) ,则 \(a^{\varphi (m)} \equiv 1 \pmod {m}\)
因此满足 \(a^n \equiv 1 \pmod{m}\)的最小正整数 \(n\) 存在,这个 \(n\) 称作 \(a\) 模 \(m\) 的阶,记作 \(\delta_m(a)\) 或 \(ord_m(a)\)
此外还有“半阶”的概念, \(\delta^-\) 表示满足 \(a^n\equiv -1 \pmod{m}\) 的最小的n
在互质的条件下,阶一定存在,半阶不一定存在
性质1
$a,a^2 ,\cdots,a^{\delta_m(a)} $模 \(m\) 两两不同余。
证明:
假设存在 \(i\neq j\) ,且 \(a^i \equiv a^j \pmod{m}\) ,则有 \(a^{|i-j|} \equiv 1 \pmod{m}\) .
但显然有 \(0<|i-j|<\delta_m(a)\) ,这与阶的最小性矛盾。
性质2
若 \(a^n \equiv 1 \pmod m\),则 \(\delta_m(a)\mid n\).
证明:
对 \(n\) 除以 \(\delta_m(a)\) 做带余除法,设 \(n=\delta_m(a)q+r, 0\leq r < \delta_m(a)\).
若 \(r>0\),则 \(a^r\equiv a^r(a^{\delta_m(a)})^q\equiv a^n\equiv 1 \pmod{m}\)
这与阶的最小性矛盾,故 \(r=0\) .
- 据此还有:若 \(a^p\equiv a^q \pmod{m}\) ,则有 \(p\equiv q \pmod{\delta_m(a)}\).
性质3
设 \(m\in N^{*}\),\(a,b\in Z\),\((a,m)=(b,m)=1\),则
\(\delta_m(ab)=\delta_m(a)\delta_m(b)\) 等价于 \((\delta_m(a),\delta_m(b))=1\)
性质4
设 \(k\in N\), \(m\in N^{*}\),\(a\in Z\),\((a,m)=1\),则 \(\delta_m(a^k)=\frac{\delta_m(a)}{(\delta_m(a),k)}\)
性质3,4证明略,可以看oi-wiki。
原根
设 \(m \in \mathbf{N}^{*},g\in \mathbf{Z}\). 若 \((g,m)=1\),且 \(\delta_m(g)=\varphi(m)\),则称 \(g\) 为模 \(m\) 的原根。
特别的,当 \(m\) 是质数时,由阶的性质1得,我们有 \(g^i \bmod m,i\in[1,m-1]\) 的结果互不相同。(这里经常对 \(i\) 的范围有两种表述,\(i\in[1,m-1]\) 或 \(i\in[0,m-1)\) 。仔细想想这两者是等价的。首先,在模 \(m\) 意义下我们可能得到的非零取模结果只有 \(1,2,...,m-1\) ,且 \(g^0=1,g^{m-1}\equiv 1 \pmod{m}\),也就是这个在哪边取这个 \(1\) 的一个问题。
在抽象代数中,原根就是循环群的生成元。这个概念只在模 m 缩剩余系关于乘法形成的群中有「原根」这个名字,在一般的循环群中都称作「生成元」。
并非每个模 m 缩剩余系关于乘法形成的群都是循环群,存在原根就表明它同构于循环群,如果不存在原根就表明不同构。 ——引自oi-wiki
原根判定定理
设 \(m \geqslant 3, (g,m)=1\),则 \(g\) 是模 \(m\) 的原根的充要条件是,
对于 \(\varphi(m)\) 的每个质因数 \(p\),都有\(g^{\frac{\varphi(m)}{p}}\not\equiv 1\pmod m.\)
证明:必要性显然,否则不符合最小性。
充分性考虑反证,假设存在一个g,满足该条件但不是原根。
由于 \(g^{\varphi(m)}\equiv 1 \pmod{m}\),带入阶的性质2,会有 \(\delta_m(g)|\varphi(m)\) .
但,g 不是 m 的原根,所以 \(\delta_m(g)\neq \varphi(m)\) ,所以一定存在一个 \(\varphi(m)\) 的质因子 p 使得 \(\delta_m(g)|\frac{\varphi(m)}{p}\) ,矛盾。
原根个数
若一个数 \(m\) 有原根,则它原根的个数为 \(\varphi(\varphi(m)).\)
证明:
若 m 有原根 g,由阶的性质4得:
\(\delta_m(g^k)=\frac{\delta_m(g)}{gcd(\delta_m(g),k)}=\frac{\varphi(m)}{gcd(\varphi(m),k)}\)
所以若 \(gcd(\varphi(m),k)=1\) ,则有 \(\delta_m(g^k)=\varphi(m)\),此时 \(g^k\) 也是 m 的原根。这样的 k 有 \(\varphi(\varphi(m))\) 个。
注意到,这些 \(g^k\) 模m是互不同余的(由阶的性质1),所以直接算就行。
原根存在定理
一个数 \(m\) 存在原根当且仅当 \(m=2,4,p^{\alpha},2p^{\alpha}\),其中 \(p\) 为奇质数,\(\alpha\in \mathbf{N}^{*}.\)
证明极为复杂,因此略。
求原根
经某些dalao证明,质数 \(p\) 的最小原根是 \(O\left(p^{0.25}\right)\)级别的。
我们首先判断该数字是否有原根,然后暴力枚举判断最小原根,最后用原根个数定理中的条件找出剩下的 \(g^k\) 这些原根即可。
我们寻找n的最小原根的复杂度是 \(O(n^{0.25}\log^2 n)\),实际上复杂度瓶颈在最后sort的 \(O(n\log n)\) 上
[模板] 原根
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int T,n,d,phi[maxn],p[maxn],cnt,vis[maxn];
int rt[maxn],tot,f[maxn],ans[maxn],num;
void init(){
phi[1]=1;
for(int i=2;i<=maxn-5;i++){
if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*p[j]<=maxn-5;j++){
vis[i*p[j]]=1;
if(i%p[j]==0){
phi[i*p[j]]=phi[i]*p[j];
break;
} else phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
rt[2]=rt[4]=1;
for(int i=2;i<=cnt;i++){
for(long long j=p[i];j<=maxn-5;j*=p[i]) rt[j]=1;//小心炸int
for(long long j=2*p[i];j<=maxn-5;j*=p[i]) rt[j]=1;
}
}
int gcd(int x,int y){
if(y==0) return x;
return gcd(y,x%y);
}
int qpow(int x,int y,int p){
int res=1;
while(y){
if(y&1) res=1ll*res*x%p;
x=1ll*x*x%p;
y>>=1;
}
return res;
}
void div(int n){
tot=0;
for(int i=2;i<=n/i;i++){
if(n%i==0){
f[++tot]=i;
while(n%i==0) n/=i;
}
}
if(n>1) f[++tot]=n;
}
bool check(int x,int n){
if(gcd(x,n)!=1) return 0;
for(int i=1;i<=tot;i++){
if(qpow(x,phi[n]/f[i],n)==1) return 0;
}
return 1;
}
int findrt(int n){
for(int i=1;i<n;i++){
if(check(i,n)) return i;
}
return 0;
}
void getrt(int n,int x){
int y=1; num=0;
for(int i=1;i<=phi[n];i++){
y=1ll*y*x%n;
if(gcd(i,phi[n])==1) ans[++num]=y;
}
}
int main(){
init();
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&d);
if(rt[n]){
div(phi[n]);
int mn=findrt(n);
getrt(n,mn);
sort(ans+1,ans+num+1);
printf("%d\n",num);
for(int i=d;i<=num;i+=d) printf("%d ",ans[i]);
printf("\n");
} else printf("0\n\n");
}
return 0;
}
指标
指标,又称离散对数,就是在模意义下进行的对数运算。设 \(p\in N^+\) 且有原根 \(g\) ,对于满足 \(gcd(a,p)=1\) 的整数 \(a\),必然存在唯一的 \(0\leq k < \varphi(p)\) 使得 \(g^k \equiv a \pmod{p}\) 。
则称 \(k\) 为 \(a\) 模 \(p\) 的指标,记作 \(k=ind(a)=\gamma(a)\)
性质和普通对数类似
-
若 \(a\equiv b\pmod{p}\) ,则 \(\gamma(a)\equiv \gamma(b) \pmod{\varphi(p)}\)
-
\(\gamma(ab)=\gamma(a)+\gamma(b)\)
-
\(\gamma(a^n)=n\gamma(a) \pmod{\varphi(p)}\)
例
bzoj 1420. Discrete Root
它问的是 \(x^k \equiv a \pmod{p}\) 的所有 \(x\)
如果你对算法比较熟悉,就会想到BSGS算法:求 \(a^x\equiv b \pmod{p}\) 的最小 \(x\)
那么我们试图把在底数上的未知数转化到指数上。
已知 \(p\) 为质数,则必然存在原根,且 \(\delta_m(a)=\varphi(p)=p-1\)。
由阶的性质1,对于 \(i\in {x|1\leq x < p}\) ,存在唯一的 \(j\in{x|1\leq x <p}\) 使得 \(g^j\equiv i \pmod{p}\) ,我们不妨就令这个映射为 \(j=f(i)\) .
那么方程转化为 $ x^k \equiv$ \((g^{f(x)})^k\) \(\equiv (g^k)^{f(x)}\) $\equiv a \pmod{p} $
我们就可以用 BSGS 求出 f(x) 进而求出 \(g^{f(x)}\)
还有一种方法是用指标转化,直接就出来了(但笔者在写这题的时候还没学指标
bzoj 2219. 数论之神
跟上一题的区别在于这个模数不一定有原根,然后我们就需要一系列的分解质因数和化为同余方程组。需要一个巨大的分讨来求解因数个数。
我刚把那一坨latex打完,直接退出,直接完蛋。。全**丢了,气死了

浙公网安备 33010602011771号