ACM暑期集训9

今天依旧学习的是数论。

1.同余方程

同余:设 m 是正整数,若 a 和 b 是整数,且 m | (a - b),则称 a 和 b 模 m 同余,记作 a ≡ b (mod m)。

一元线性同余方程:形如 ax ≡ b (mod m) 的同余式。     

定理:设 d = gcd(a, m),若 d | b,则该方程恰有 d 个模 m 不同余的解 x = x0 + (m / d)t,其中 x = x0 为一组特解,t = 0, 1, 2, ..., d-1,若 d 不能整除 b 则无解。     

证明:上式等价于 ax - my = b,当 gcd(a, m) | b 时有无穷多解 x = x0 + (m / d)t,其中 x = x0 为一组特解。再证有 d 个模 m 不同余的解,若 x0 + (m / d)t1 ≡ x0 + (m / d)t2 (mod m),则 (m / d)(t1 - t2) = km,两边同除以 (m / d),得 t1 - t2 = kd,因此 t1 ≡ t2 (mod d),这表明不同余的解可以由 t 取遍 0, 1, 2, ..., d - 1 得到。

LL solve(LL a, LL b, LL m) { //求ax ≡ b (mod m) 的最小解
    LL x, y;
    LL d = exgcd(a, m, x, y);
    if(b % d == 0) {
        x = x * (b / d);
        x = (x % (m / d) + (m / d)) % (m / d);
        return x;
    }
    else {
        return -1; //无解
    }
}

2.中国剩余定理

设 m1, m2, ..., mr 是两两互素的正整数,则同余方程组

x ≡ a1 (mod m1)

x ≡ a2 (mod m2)

        ......

x ≡ ar (mod mr)     

有模 M = m1m2 ... mr 的唯一解。     

证明:令 Mk = M / mk,由 gcd(Mk, mk) = 1,可求得 Mk 模 mk 的一个逆 yk,构造 x = a1M1y1 + a2M2y2 + ... + arMryr,则 x ≡ akMkyk ≡ ak (mod mk)。再证有模 M 的唯一解,设 x1 和 x2 都是解,则对每个 k,有 x1 ≡ x2 ≡ ak (mod mk),即 mk | (x1 – x2),所以 M | (x1 – x2),所以 x1 ≡ x2 (mod M)。

1)迭代法解同余方程组

一般地,先设 x = m0t + a0,其中 m0 = 1,a0 = 0,对于第 1~r 个同余方程,重复以下步骤:     

①代入第 i 个同余方程,得到 m0t ≡ ai – a0 (mod mi)     

②解出 t = mi’u + t0,其中 mi’ = mi / gcd(m0, mi)     

③代入原方程得 x = m0(mi’u + t0) + a0     

④先更新 a0 = m0t0 + a0,再更新 m0 = m0mi’

即使 m1, m2, ..., mr 不两两互素,只要同余方程是相容的,迭代法仍然可行。

LL a[MAXN], m[MAXN];
bool solve(LL &m0, LL &a0, int n) { //通解为 m0 * t + a0
    m0 = 1; a0 = 0;
    for(int i = 0; i < n; i++) {
        LL t, s, t0;
        LL d = exgcd(m0, m[i], t, s);
        if((a[i] - a0) % d != 0) return false;
        t *= (a[i] - a0) / d;
        t0 = (t % (m[i] / d) + (m[i] / d)) % (m[i] / d);
        a0 += m0 * t0;
        m0 *= (m[i] / d);
        a0 %= m0;
    }
    return true;
}

3.欧拉函数

1)费马小定理:设 p 是一个素数,则对于任意整数 a,都有 ap ≡ a (mod p),若 a, p 互素,则有 ap-1 ≡ 1 (mod p)。     证明: ap = ((a - 1) + 1)p = (a - 1)p + kp + 1

≡(a - 1)p + 1 (mod p)

≡(a - 2)p + 1 + 1 (mod p)

≡(a - 3)p + 1 + 1 + 1 (mod p)

......

≡1 + ... + 1 + 1 (mod p) = a

2)欧拉定理:设 n 是一个正整数,则对于任意整数 a,都有 aφ(n)+1 ≡ a (mod n),若 a, n 互素,则有 aφ(n) ≡ 1 (mod n)。其中 φ(n) 为欧拉函数,定义为不超过 n 且与 n 互素的正整数的个数。

3)积性函数

算术函数:也称数论函数,定义在所有正整数上的函数。

积性函数:也称乘性函数,对任意两个互素的正整数 n 和 m,均有 f(mn) = f(m)f(n) 的算术函数。

完全积性函数:也称完全乘性函数,对任意两个正整数 n 和 m,均有 f(mn) = f(m)f(n) 的算术函数。

性质:若 n = p1γ1p2γ2 ... ptγt,则 f(n) = f(p1γ1)f(p2γ2) ... f(ptγt)

 

欧拉函数是积性函数

莫比乌斯函数是积性函数

4)欧拉函数的性质

若 n = p1γ1p2γ2 ... ptγt      则 φ(n) = φ(p1γ1)φ(p2γ2) ... φ(ptγt)

 

 5)分解素因数求欧拉函数

时间复杂度 O(sqrt(n))

LL eular(LL n) {
    getFactors(n);
    LL ret = n;
    for(int i = 0; i < cnt; i++){
        ret = ret / factor[i][0] * (factor[i][0] - 1);
    }
    return ret;
}

6)分解素因数求欧拉函数(II)

LL eular(LL n) {
    LL ans = n;
    for(int i = 2; i <= n / i; i++) {
        if(n % i == 0) {
            ans -= ans / i;
            while(n % i == 0) {
                n /= i;
            }
        }
    }
    if(n > 1) ans -= ans / n;
    return ans;
}

7)筛选法求欧拉函数

int phi[MAXN+1];
void getEuler() {
    memset(phi, 0, sizeof(phi));
    phi[1] = 1;
    for(int i = 2; i <= MAXN; i++) {
        if(!phi[i]) { // i是素数
            for(int j = i; j <= MAXN; j += i) {
                if(!phi[j]) {
                    phi[j] = j;
                }
                phi[j] = phi[j] / i * (i - 1);
            }
        }
    }
}

8)欧拉函数的应用

利用欧拉定理求逆元:当 a, n 互素时,模 n 下 a 的逆元可以由 a^(φ(n)-1) 求得。

欧拉降幂公式:当 b > φ(n) 时,a^b ≡ a^(b % φ(n) + φ(n) )(mod n),这里不需要 a, n 互素。

4.非线性丢番图方程

定理:没有适用于求解所有非线性丢番图方程的通用方法。

常见的非线性丢番图方程:   

 ①毕达哥拉斯三元组(勾股数):x^2 + y^2 = z^2     当 gcd(x, y, z) = 1,则称该毕达哥拉斯三元组是本原的。     

定理:x, y, z 构成本原毕达哥拉斯三元组(假设y为偶数) 当且仅当存在互素且奇偶性不同的正整数 m, n (m > n),满足 x = m^2 - n^2, y = 2mn, z = m^2 + n^2。     

②费马大定理:整数 n > 2 时,x^n + y^n = z^n 无非零整数解     

③佩尔方程: x^2 - Dy^2 = 1 

5.佩尔方程

形如 x2 - Dy2 = 1 的丢番图方程被称为佩尔方程。     

当 D 为正整数且不是完全平方数时,该方程有无穷多解。

当 D 为完全平方数时,该方程无解。

定理:设 x1, y1 是方程的最小解,则所有正整数解 xk, yk 可由下式得到

最小整数解 x1, y1 的求法:D < 30 时暴力枚举,否则需要用到数论中的连分数

递推法求佩尔方程通解     

对于 x^2 - Dy^2 = M,其中 M = ±1, ±2, ±4,若方程存在基本解 (x1, y1),则有   

Xn = C(Xn-1 - Xn-2) + Xn-3,     

Yn = C(Yn-1 - Yn-2) + Yn-3,     

当 M 为 1, 2, 4, -1, -2, -4 时,     

C 分别为 2X1+1, 2X1^2-1, x1+1, 4X1^2+3, 2X1^2+3, X1^2+3,          

所以佩尔方程在有解的情况下,往往可以递推求通解。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值