• NTT 求原根


      使用NTT需要保证模数mod 为质数。

      通过以下代码求得一个模数的原根 , 常见的质数的原根  998244353 -> 3    1e9+7 -> 5

    #include<bits/stdc++.h>
    #define ll long long
    #define IL inline
    #define RG register
    using namespace std;
    
    ll prm[1000],tot,N,root;
    
    ll Power(ll bs,ll js,ll MOD){
        ll S = 1,T = bs;
        while(js){
            if(js&1)S = S*T%MOD;
            T = T*T%MOD; 
            js >>= 1; 
        } return S;
    }
    
    IL ll GetRoot(RG ll n){
        RG ll tmp = n - 1 , tot = 0;
        for(RG ll i = 2; i <= sqrt(tmp); i ++){
            if(tmp%i==0){
                prm[++tot] = i;
                while(tmp%i==0)tmp /= i;
            }
        }
        if(tmp != 1)prm[++tot] = tmp;            //质因数分解
        for(RG ll g = 2; g <= n-1; g ++){
            bool flag = 1;
            for(RG int i = 1; i <= tot; i ++){     //检测是否符合条件
                if(Power(g,(n-1)/prm[i],n) == 1)
                    { flag = 0; break; } 
            }
            if(flag)return g;
        }return 0;                        //无解 
    }
    
    int main(){
        cin >> N;
        root = GetRoot(N);
        cout<<root<<endl;
        return 0;
    }
    

    g是mod(r * 2 ^ k + 1)的原根

    r * 2 ^ k + 1

    r

    k

    g

    3

    1

    1

    2

    5

    1

    2

    2

    17

    1

    4

    3

    97

    3

    5

    5

    193

    3

    6

    5

    257

    1

    8

    3

    7681

    15

    9

    17

    12289

    3

    12

    11

    40961

    5

    13

    3

    65537

    1

    16

    3

    786433

    3

    18

    10

    5767169

    11

    19

    3

    7340033

    7

    20

    3

    23068673

    11

    21

    3

    104857601

    25

    22

    3

    167772161

    5

    25

    3

    469762049

    7

    26

    3

    998244353

    119

    23

    3

    1004535809

    479

    21

    3

    2013265921

    15

    27

    31

    2281701377

    17

    27

    3

    3221225473

    3

    30

    5

    75161927681

    35

    31

    3

    77309411329

    9

    33

    7

    206158430209

    3

    36

    22

    2061584302081

    15

    37

    7

    2748779069441

    5

    39

    3

    6597069766657

    3

    41

    5

    39582418599937

    9

    42

    5

    79164837199873

    9

    43

    5

    263882790666241

    15

    44

    7

    1231453023109121

    35

    45

    3

    1337006139375617

    19

    46

    3

    3799912185593857

    27

    47

    5

    4222124650659841

    15

    48

    19

    7881299347898369

    7

    50

    6

    31525197391593473

    7

    52

    3

    180143985094819841

    5

    55

    6

    1945555039024054273

    27

    56

    5

    4179340454199820289

              29           

               57           

               3            

    东北日出西边雨 道是无情却有情
  • 相关阅读:
    HeidiSQL 导入Excel数据
    两片74门实现的双边沿D触发器
    java多线程
    java集合框架
    java异常处理
    java基础学习5
    java基础学习4
    Java基础学习3
    Java基础学习2
    LeetCode 184场周赛
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/9512798.html
Copyright © 2020-2023  润新知