【数论学习】关于原根的LJ笔记
有关NTT的一个小知识点:对于一个模数p,所有的数在非0意义下都是原根的幂次的形式
原根是虾米?
对于一个模数p,所有的数在非0意义下都是 原根的幂次的形式。
于是这里g0,g1,g2,g3……..互不相同,且gphi(p)=g0==1
一个模数存在原根的充要条件,形式是以下四种形式:m=2,4,pa,2*pa(p为一个质数)
m原根个数 phi( phi(m) )
求原根方法
对于一个质数p对p-1因式分解然后从2开始枚举就好了!
如果不是质数,那么n,我们对phi(n)进行因式分解枚举就好。
以下为方便对质数进行考虑(合数类同)
P-1=p1k1*p2k2*p3k3….*pnkn
一个很原始的想法:对于每个数,将他的每个幂次计算一遍,看是不是刚好p-1的一个循环。(刚好完全占满)O(p-1)
简化:对于判断g是否为p的原根只需要检验g((x-1)/p1),g((x-1)/p2)….g^((x-1)/pn)这n个数中是否有一个数mod p为1,若存在在g不是原根(因为原本那个数不是,包含因子后一定也不是),时间复杂度O(m)^log(p-1)
伪代码
int yuangen(int p) { divi(p-1)//分解质因数 for( g=1;g-->phi(p);g++ ) { bool ff=1; for(i=1-->top)//top为多少个质因数 { int gg=(p-1)/num[i];//质因数num if(montgomery(g,gg,p)==1)//Montgomey二分快速幂 ff=0,break; } if (ff) return g; } return -1; }
一个简易的求原根法(真代码):
inline bool judge(int x, int p) { for (int i = 2; i * i <= p; i ++) if ((p - 1)%i==0&&ksm(x,(p-1)/i,p)==1) return 0; return 1; } inline int Find_Root(int p) { if (p == 2) return 1; int res = 2; for (; !judge(res, p); res ++) ; return res; }
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 |