拾起,单位根的记忆

· · 个人记录

拾起,单位根的记忆

阶:

定义:

对于 a\in \mathbf{Z} m \in \mathbf{N}_+ a\perp m ,满足 a^n \equiv 1\pmod{m} 的最小正整数 n 记为 \delta_m(a)

约定:下列性质均在 a\in \mathbf{Z} m \in \mathbf{N}_+ a\perp m 的情况下研究

性质一:

### 性质二: $ a^n\equiv 1 \pmod{m} $ 当且仅当 $ \delta_m(a) \mid n

性质三:

\delta_m(a^k)=\dfrac{\delta_m(a)}{\gcd(\delta_m(a),k)}

性质四:

\dfrac{\operatorname{lcm}(\delta_m(a),\delta_m(b))}{\operatorname{gcd}(\delta_m(a),\delta_m(b))} \mid \delta_m(ab) \mid \operatorname{lcm}(\delta_m(a),\delta_m(b))

更为简单的形式: \delta_m(ab)=\delta_m(a)\delta_m(b) \iff \delta_m(a) \perp \delta_m(b)

性质五:

总存在 c ,满足 \delta_m(c)=\operatorname{lcm}(\delta_m(a),\delta_m(b))

原根:

定义:

若存在 g 满足 \delta_m(g)=\varphi(m) ,则称 g 为模 m 的原根

原根判定定理:

对于 m \ge 3 g \perp m g 是模 m 的原根当且仅当对于所有 p \mid \varphi(m) ,都有 g^{\frac{\varphi(m)}{p}} \not\equiv1 \pmod m

原根个数定理:

m 的原根个数为 \varphi({\varphi{(m)})}

原根存在定理:

m 的原根存在当且仅当 m=1,2,4,p^e,2p^e ,其中 p 为奇质数且 e \in \mathbf{N}_+

求原根的算法:

从小到大逐一枚举并判断,直到找到原根

代码:

时间复杂度为 O(n^{\frac{1}{4}}\log n) ,可以找到所有原根

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
typedef long long ll;
int T,cnt,phi[N],pri[N]; vector<int> factor,ans; bool vis[N];
void init(int n){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]) pri[++cnt]=i,phi[i]=i-1;
        for(int j=1;j<=cnt&&i*pri[j]<=n;j++){
            vis[i*pri[j]]=true;
            if(i%pri[j]==0){
                phi[i*pri[j]]=phi[i]*pri[j];
                break;
            }
            else phi[i*pri[j]]=phi[i]*phi[pri[j]];
        }
    }
}
int qpow(ll a,ll b,int mod){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod; b>>=1;
    } return res;
}
void divide(int x){
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            factor.push_back(i);
            while(x%i==0) x/=i;
        }
    }
    if(x>1) factor.push_back(x);
}
bool exist(int n){
    if(n==2||n==4) return 1;
    if(n%2==0) n/=2;
    for(int i=2;pri[i]<=n;i++){
        if(n%pri[i]==0){
            while(n%pri[i]==0) n/=pri[i];
            return n==1;
        }
    }
    return 0;
}
int main(){
    init(1000000); scanf("%d",&T);
    while(T--){
        int n,d; scanf("%d%d",&n,&d);
        if(!exist(n)){
            puts("0\n");
            continue;
        }
        factor.clear(); ans.clear(); divide(phi[n]);
        int g;
        for(int i=1;;i++){
            bool is=1;
            if(__gcd(i,n)!=1) continue;
            for(int j=0;j<factor.size();j++){
                if(qpow(i,phi[n]/factor[j],n)==1){ is=0; break; }
            }
            if(is){ g=i; break; }
        }
        ll power=1;
        for(int s=1;ans.size()<phi[phi[n]];s++){
            power=power*g%n;
            if(__gcd(phi[n],s)==1) ans.push_back(power);
        }
    }
}

单位根反演:

主要形式: [k\mid n]=\frac{1}{k}\sum\limits_{i=0}^{k-1} \omega_{k}^{in}

在模 m 意义下,取 \omega_k=g^{\frac{\varphi(m)}{k}} ,一般题目的 m 为质数,所以 \omega_k=g^{\frac{m-1}{k}}

多项式中的问题:

对于多项式 f(x) ,求 \sum_i[x^i]f(x)[k\mid i]

用单位根反演: Ans=\sum_i[x^i]f(x)\frac{1}{k}\sum_{j=0}^{k-1}\omega_{k}^{ij}=\frac{1}{k}\sum_{j=0}^{k-1}\sum_i[x^i](\omega_k^{j})^if(x)=\frac{1}{k}\sum_{j=0}^{k-1}f(\omega_k^j)

例题:

约定:保证 k\mid mod-1 mod 为质数且存在模 mod 的原根

题目:#6247. 九个太阳

\sum_{i=0}^n \binom{n}{i}[k\mid i]

解答:

题目:#6485. LJJ 学二项式定理

\sum_{i=0}^n \binom{n}{i} s^i a_{i\% 4}

解答:

题目:P10664 BZOJ3328 PYXFIB

\sum_{i=1}^n [k\mid i]\binom{n}{i}F_i ,其中 F_i 表示斐波那契数列

解答:

题目:#5370. 循环序列

\sum_{i=0}\binom{k}{ni+x}

解答:

题目:P5591 小猪佩奇学数学

\sum_{i=0}^n \binom{n}{i}p^i\lfloor \frac{i}{k} \rfloor

解答:

题目:P10084 [GDKOI2024 提高组] 计算

可转化为: 1,2,\dots,n 的集合,求有多少个子集,满足子集元素和为 k 的倍数,保证 k\mid n

注意:此题不满足约定

解答:

题目:P6800 【模板】Chirp Z-Transform

给定多项式 f(x) ,求 f(c^0),f(c^1),\dots , f(c^m)

解答:

虽然与单位根反演无关

题目:P5293 [HNOI2019] 白兔之舞

矩阵的转移是平凡的,可将问题变为对于每个 t,求 \sum_{i=0}^L \binom{L}{i}[i\equiv t \pmod{k}]W^i

解答:

题目:TopCoder 11351 TheCowDivOne

\{0,1,\dots,n-1\} $ 中选 $ k $ 个数,和为 $ n $ 的倍数的方案数,模 $ 1e9+7 $,$ k\le1e3 $,$ n\le 1e9

注意:此题不满足约定

解答:

让我们请出二元生成函数

题目:HT-054-NOI 优秀的匹配

给定二维数组,问是否有排列 p ,使 k\mid \sum_{i=1}^n a_{i,p_i} \forall \, i,a_{i,p_i}\ne -1

数据范围: 1\le n,k \le 100

解答:

总结:何时用单位根反演:

出现以下情况时,可以考虑: