本文主要梳理和原根有关的群论基础知识。

以后学的抽代知识也会往这里填。

2020.5.8:为了学二次剩余,又来补充内容了。

(order)在群中有两个相关含义。一是指群的元素个数——这不是我们今天要讨论的。

群中一个元素的阶(有时称为周期)是指使得的最小正整数是这个群的单位元。若不存在这样的,称有无限阶。有限群的所有元素均有有限阶。

一个元素的阶被记为或者

在剩余系(模意义)下的阶我们也记作,表示意义下的阶。

原根

原根(primitive root)是数论(域论)中的概念。

对于两个正整数,如果,那么根据欧拉定理,有

而如果在意义下的阶等于,即,则称意义下的原根。此时,构成的简化剩余系。

特殊地,当是质数时,,也就是说此时构成的剩余系。

原根的存在性

并不是所有的剩余系都有原根。

有原根的充要条件是,其中是奇素数,是任意正整数。

如果 p 是一个奇素数且有原根,那么或者是模的一个原根。

如果 r 是模的原根,那么它也是模的原根。

原根的计算

考虑枚举使得。然后我们枚举质因子,判断是否。如果该等式始终不成立,那么就是原根。

该算法复杂度为

如果是质数那么复杂度就是

实际运行过程中原根都不会太大,因此该算法通常比较快。

int pw(int a,long long m,int P){
    int res=1;
    m%=(P-1);
    while(m)m&1?res=1ll*res*a%P:0,a=1ll*a*a%P,m>>=1;
    return res;
}
int primitive_root_prime(int p){
    vector<int> vd;
    int pp=p-1;
    for(int i=2;i*i<=pp;++i){
        if(pp%i)continue;
        vd.pb(i);
        while(pp%i==0)pp/=i;
    }
    if(pp>1)vd.pb(pp);
    pp=p-1;
    FOR(i,2,p-1){
        bool flag=0;
        for(auto d:vd){
            if(pw(i,pp/d,p)==1){flag=1;break;}
        }
        if(flag==0)return i;
    }
    assert(0); // prime must have primitive root
    return -1;
}

域(Field)是一种可以进行加减乘除(除了除以即加法单位元)运算的代数结构。

非正式地说,域是一个集合且定义了加法和乘法运算。并且每个元素都有加法和乘法的逆元,使得能够定义除法和减法运算。

确切地说,它需要满足如下性质:

  • 加法和乘法结合律;
  • 加法和乘法交换律;
  • 存在加法和乘法的单位元;
  • 存在加法逆元;
  • 存在乘法逆元;
  • 有加法对乘法的分配律。

常见的域有:

  • 有理数域
  • 复数域
  • Constructible numbers:可以尺规作图构造的数字(长度、面积)集合。

参考文献

Wikipedia - Order (group theory))

Wikipedia - Field)