扩展中国剩余定理
一般的中国剩余定理只能解决模数互质的情况。扩展中国剩余定理可以解决模数不互质的情况。
考虑依次将
个方程合并起来。设前面合并起来的方程是
,当前枚举到的方程是
,则联立得到(
的符号可忽略)
使用扩展欧几里得,求出最小正整数解 和 。那么我们合并得到的方程就是
这样合并到最后就能得到答案。
int excrt() {
int ca = a[0], cm = m[0];
for(int i = 1; i < n; i++) {
int exa = a[i], exm = m[i];
int d, x, y;
exgcd(cm, exm, d, x, y);
if((exa-ca)%d) return -1;
x *= (exa-ca)/d; // 求解不定方程
ca = cm*x + ca;
cm = lcm(cm, exm);
}
return ca;
}
扩展Lucas定理
Lucas定理只能解决模数是质数的情况。事实上很多扩展定理都是将质数推广到非质数而来的。扩展Lucas定理可以解决模数为任意正整数的问题,复杂度为 ,其中 是模数分解为的质因数的幂。
首先学习求
。将乘数中将
的倍数提出来,除以倍数后依然是阶乘形式,因此这一部分可以递归计算。而其它部分按值域每
分为一组,它们对
是同余的,因此计算一组即可,复杂度
。
举例说明,模数为
。
然后就可以计算
了。
回到原问题,我们将模数质因数分解为
,设答案为
,则我们得到若干个同余方程
。使用上述方法算出系数,然后中国剩余定理合并即可。
扩展BSGS
求
,
为任意正整数。
因为要求
,所以在
时才能用BSGS解。考虑转化成这个形式。
原方程化为
。将
等看作系数,递归计算直到
。然后反带回去即可。答案
。
原根 指标
在模
意义下的原根
有以下性质:
原根个数
;
;
指标的定义:
;
由此,
可转化为
。
求指标用BSGS,将指标还原用快速幂。
原根的求法
设模数为 ,将 分解为 。从 开始枚举 ,如果有 满足则不是原根,否则找到一个原根。
二次剩余
本季度内