抽象代数入门
本文主要梳理和原根有关的群论基础知识。
以后学的抽代知识也会往这里填。
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:可以尺规作图构造的数字(长度、面积)集合。
参考文献
修订记录
- 2020年5月8日 创建文章