数学基础III 扩展中国剩余定理 扩展Lucas定理 扩展BSGS 原根 指标

扩展中国剩余定理

一般的中国剩余定理只能解决模数互质的情况。扩展中国剩余定理可以解决模数不互质的情况。
考虑依次将 n 个方程合并起来。设前面合并起来的方程是 x = m u k u + a u ,当前枚举到的方程是 x = m v k v + a v ,则联立得到( x 的符号可忽略)

m u k u + m v k v = a u a v

使用扩展欧几里得,求出最小正整数解 k u k v 。那么我们合并得到的方程就是
x = l c m ( m u , m v ) k + m u k u + a u

这样合并到最后就能得到答案。

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定理可以解决模数为任意正整数的问题,复杂度为 O ( p t ) ,其中 p t 是模数分解为的质因数的幂。

首先学习求 n ! mod p t 。将乘数中将 p 的倍数提出来,除以倍数后依然是阶乘形式,因此这一部分可以递归计算。而其它部分按值域每 ( p 1 ) p t 1 分为一组,它们对 mod p t 是同余的,因此计算一组即可,复杂度 O ( p t )
举例说明,模数为 3 2 25 ! 3 8 × 8 ! × ( 1 × 2 × 4 × 5 × 7 × 8 ) 3 × 25
然后就可以计算 C n m mod p t 了。
回到原问题,我们将模数质因数分解为 p i t i ,设答案为 a n s ,则我们得到若干个同余方程 a n s C n m ( mod p i t i ) 。使用上述方法算出系数,然后中国剩余定理合并即可。

扩展BSGS

a x b ( mod m ) m 为任意正整数。
因为要求 a 1 mod m ,所以在 gcd ( a , m ) = 1 时才能用BSGS解。考虑转化成这个形式。
原方程化为 a x 1 a gcd ( a , m ) b gcd ( a , m ) ( mod m gcd ( a , m ) ) 。将 a gcd ( a , m ) 等看作系数,递归计算直到 gcd ( a , m ) = 1 。然后反带回去即可。答案 = x +

原根 指标

在模 p 意义下的原根 g 有以下性质:
原根个数 = φ ( φ ( p ) )
g i g j ( mod p ) i j ( mod φ ( p ) )
指标的定义: g i n d ( x ) x
由此, x k ( mod p ) 可转化为 i n d ( x ) k ( mod φ ( p ) )
求指标用BSGS,将指标还原用快速幂。

原根的求法

设模数为 p ,将 φ ( p ) 分解为 P i t i 。从 2 开始枚举 g ,如果有 g φ ( p ) P i 1 ( mod p ) 满足则不是原根,否则找到一个原根。

二次剩余

本季度内

猜你喜欢

转载自blog.csdn.net/myjs999/article/details/81133555