zoukankan      html  css  js  c++  java
  • 「算法笔记」基础数论

    相关内容:「算法笔记」基础数论 2

    一、整除

    对于两个整数 (a,b),存在两个唯一的整数 (q,r),使得 (b=aq+r),其中 (0≤r<|a|)。

    特别地,若 (r=0),则我们称 (a) 整除 (b),记作 (amid b)。

    对于两个正整数 (a,b),若 (a mid b),则我们称 (a) 是 (b) 的约数。

    我们称一个数是质数,当且仅当其质因子只有 (1) 以及其本身。特别地,(1) 不是质数。

    二、几个结论

    1. 素数有无穷多个。

    证明:假设素数是有限的,并且数量为 (k),分别为 (p_1,p_2,...,p_k)。

    考虑一个数 (X=p_1×p_2×...×p_k+1)。

    易知 (X) 与 (p_1,p_2,...,p_k) 互质,则 (X) 必为素数,与素数只有有限的 (k) 个矛盾。

    所以素数有无穷多个。

    2. (limlimits_{x ightarrowinfty} frac{pi(n) ln n}{n}=1)  (pi(n)):不大于 (n) 的质数个数。

    3. (n) 和 (2n) 之间一定有质数。  4. (P_n sim Theta (nlog n))

    5. (sumlimits_{1leq p leq n,p是质数} frac{1}{p} sim Theta(log log n))  6. (sumlimits_{i=1}^n frac{1}{i} sim Theta (log n))

    三、公约数以及公倍数

    1. 定义

    对于 (a,b),若 (dmid a)(dmid b),则称 (d)(a,b) 的公约数。

    对于其中最大的 (d),我们称之为 (a, b) 的最大公约数,记作 (d = gcd(a, b))(d = (a, b))

    类似地,若 (amid d)(bmid d),则称 (d)(a, b) 的公倍数。

    对于其中最大的 (d),我们称之为 (a, b) 的最小公倍数,记作 (d = ext{lcm}(a, b))(d = [a, b])

    2. 引理

    (ageq b),则 (gcd(a,b)=gcd(a-b,b)=gcd(amod b,b))

    (gcd(a,b) ext{lcm}(a,b)=ab)

    证明:(a=p_1^{alpha_1} imes p_2^{alpha_2} imes ... imes p_k^{alpha_k})(b=p_1^{eta_1} imes p_2^{eta_2} imes ... imes p_k^{eta_k})

    (gcd(a,b)=p_1^{min(alpha_1,eta_1)} imes p_2^{min(alpha_2,eta_2)} imes ... imes p_k^{min(alpha_k,eta_k)})( ext{lcm}=p_1^{max(alpha_1,eta_1)} imes p_2^{max(alpha_2,eta_2)} imes ... imes p_k^{max(alpha_k,eta_k)})

    (max(alpha_i,eta_i)+min(alpha_i,eta_i)=alpha_i+eta_i)

    (a imes b=p_1^{alpha_1+eta_1} imes p_2^{alpha_2+eta_2} imescdots imes p_k^{alpha_k+eta_k})
    (=p_1^{min(alpha_1,eta_1)+max(alpha_1,eta_1)} imes cdots imes p_k^{min(alpha_k,eta_k)+max(alpha_k,eta_k)})
    (=gcd(a,b) imes ext{lcm}(a,b))

    故该命题成立。

    3. 定理(裴蜀定理)

    对于任意整数 (a, b, m),则存在整数 (x, y) 满足 (ax + by = m),当且仅当 (gcd(a, b) mid m)

    证明:(a, b) 之一为 (0),结论显然成立。
    若否,考虑 (A = {xa+yb mid (x, y) in mathbb{Z}^2}) 中的最小正元素 (d_0 = x_0a+y_0b)(这一定存在)。考虑任意 (p = x_1a + y_1bin A),设 (p = qd_0 + r),其中 (0 ≤ r < d_0),则 (r = p-qd_0in A),故 (r = 0)。故 (d_0mid p),则 (d_0mid a, b)
    然后,考虑任意 (dmid a, b),若 (a = kd)(b = ld),则 (d_0 = x_0a + y_0b = (x_0k + y_0l)d),故 (dmid d_0),故 (d_0 = gcd(a, b))。在方程中,若 (m = m_0d_0),则显然有无穷多组解。相反,若有解,则 (|m| in A), 故 (d_0mid |m|),即 (d_0mid m)

    4. 欧几里得算法

    (amid b)(bmid c)(gcd(a,b)=1),则 (abmid c)

    (forall a,bin mathbb{N})(b eq 0)(gcd(a,b)=gcd(b,amod b))

    int gcd(int x,int y){
        if(!y) return x;
        return gcd(y,x%y);
    }
    //时间复杂度:O(log(x+y)) 

    扩展欧几里得算法:求解方程 (ax+by=gcd(a,b))

    在欧几里得算法的最后一步,即 (b=0) 时,显然有一对整数 (x=1,y=0),使得 (a imes 1+0 imes 0=gcd(a,0))

    (b>0),则 (gcd(a,b)=gcd(b,a mod b))。假设存在一对整数 (x,y),满足 (b imes x+(a mod b) imes y=gcd(b,amod b)),因为 (bx+(a mod b)y=bx+(a-blfloor frac{a}{b} floor)y=ay+b(x-lfloor frac{a}{b} floor y)),所以令 (x'=y)(y'=x-lfloor frac{a}{b} floor y),就得到了 (ax'+by'=gcd(a,b))

    int exgcd(int a,int b,int &x,int &y){    //返回值为 a,b 的最大公约数 d
        if(!b) return x=1,y=0,a;
        int d=exgcd(b,a%b,x,y);
        int z=x; x=y,y=z-y*(a/b);
        return d;
    } 

    对于更为一般的方程 (ax+by=c),设 (d=gcd(a,b))。我们可以求出 (ax+by=d) 的一组特解 (x_0,y_0)。这所以 (frac{c}{d}) 也必须为整数,否则无解(所以该方程有解当且仅当 (dmid c))。我们令 (x_0,y_0) 同时乘上 (frac{c}{d}),得 (afrac{cx_0}{d}+bfrac{cy_0}{d}=c)。那么 (x=frac{c}{d}cdot x_0,y=frac{c}{d}cdot y_0) 即为一组解。

    事实上,方程 (ax+by=c) 的通解可以表示为:

    (displaystyle x=frac{c}{d}x_0+kfrac{b}{d},\,y=frac{c}{d}y_0-kfrac{a}{d}\,(kin mathbb{Z}))

    那么若求得一个 (x),则该方程 (x) 的最小整数解就是 (x%(b/d)+b/d)%(b/d)

    四、整除的性质

    1. 定理

    (amid bc)(gcd(a, b) = 1),则 (amid c)
    (amid  c)(bmid  c)(gcd(a, b) = 1),则 (abmid c)

    2. 引理 (欧几里得引理)

    若质数 (pmid ab) ,则不是 (pmid a) ,就是 (pmid b)

    证明:(pmid a) 则证毕。若 (p mid a) ,那么两者的最大公约数为 (1)。根据裴蜀定理,存在 ((m, n)) 使得 (ma + np = 1)。于是 (b = b(ma + np) = abm + bnp)
    由于 (pmid ab) ,上式右边两项都可以被 (p) 整除。所以 (pmid b)

    五、算术基本定理

    大于 (1) 的正整数 (n) 可以唯一分解成有限个质数的乘积。证明如下:

    1. 存在性

    假设存在大于 (1) 的自然数不能写成质数的乘积,并且最小的为 (n)

    首先,按照定义,(n) 大于 (1)。其次,因为质数 (p) 可以写成质数乘积:(p=p),与假设矛盾,所以 (n) 不是质数。则 (n) 只能是合数。而每个合数都可以分解成两个小于自身而大于 (1) 的自然数的积。

    设其中 (a)(b) 都是介于 (1)(n) 之间的自然数,因此,按照 (n) 的定义,(a)(b) 都可以写成质数的乘积。从而 (n) 也可以写成质数的乘积,与 (n) 的定义矛盾。因此大于 (1) 的自然数必可写成质数的乘积。

    2. 唯一性

    类似地,假设存在大于 (1) 的自然数可以用多于一种的方式写成多个质数的乘积,并且最小的为 (n)

    首先,(n) 不是质数。将 (n) 用两种方法写出:(n=p_1^{a_1}p_2^{a_2}...p_m^{a_m}=q_1^{b_1}q_2^{b_2}...q_n^{b_n})

    根据欧几里得引理,因为 (p_1 mid q_1^{b_1}q_2^{b_2}...q_n^{b_n}),所以 (q_1^{b_1},q_2^{b_2},...,q_n^{b_n}) 中有一个能被 (p_1) 整除,即 (q_1,q_2,...,q_n) 中有一个能被 (p_1) 整除。不妨设为 (q_1)(q_1) 也是质数,因此 (q_1=p_1)

    假设 (a_1>b_1),则 (p_1^{a_1-b_1}p_2^{a_2}...p_m^{a_m}=q_2^{b_2}...q_n^{b_n})

    易得,(q_2,q_3,...,q_n) 有一个能被 (p_1) 整除,但 (p_1=q_1 eq q_i (i eq 1))。所以不能有 (a_1>b_1),同理,也不能有 (a_1<b_1),因此 (a_1=b_1)

    两边相除得 (n_0=p_2^{a_2}...p_m^{a_m}=q_2^{b_2}...q_n^{b_n}),于是存在比 (n) 小的正整数,可以用多于一种的方式写成多个质数的乘积,与 (n) 的定义矛盾。因此唯一性得证。

    六、同余

    1. 定义

    (m mid a-b),则我们称 (a)(b) 在模 (m) 意义下同余,记作 (aequiv b pmod{m})

    2. 定理

    (aequiv b pmod m)(aequiv b pmod n) 意味着 (aequiv b pmod { ext{lcm}(n,m)})

    证明:因为 (aequiv b pmod m),所以 (m mid a-b)。同理可得 (n mid a-b)。所以 ( ext{lcm}(n,m) mid a-b),则 (aequiv b pmod { ext{lcm}(n,m)})

    (gcd(k,m)=d)(kaequiv kb pmod m),则 (a equiv b pmod{frac{m}{d}})

    证明:因为 (kaequiv kb pmod m),所以 (m mid k(a-b))。设 (m_0=frac{m}{d})(k_0=frac{k}{d}),则 (m_0dmid k_0d(a-b))。所以 (m_0mid k_0(a-b))

    因为 (gcd(k,m)=d),所以 (gcd(frac{k}{d},frac{m}{d})=1),即 (gcd(m_0,k_0)=1),因此 (m_0 mid a-b)。则 (a equiv b pmod {m_0}),即 (a equiv b pmod{frac{m}{d}})

    七、线性同余方程

    给定整数 (a,b,m),求一个整数 (x) 满足 (axequiv b pmod m),或给出无解。因为未知数的指数为 (1),所以我们称之为一次同余方程,也称线性同余方程。

    (axequiv b pmod m) 等价于 (m mid ax-b),即 (ax-b)(m) 的倍数。不妨设为 (-y) 倍。于是,该方程可以改写为 (ax+my=b)

    1. 定义

    对于非负整数 (a) 以及 (m),如果存在 (b) 使得 (abequiv 1 pmod m),则称 (b)(a) 在模 (m) 意义下的逆元,记作 (a^{-1} pmod m)

    2. 定理

    定理 1:(a^{-1} pmod m) 存在当且仅当 (gcd(a,m)=1)

    证明:存在 (a^{-1} pmod m),即存在 (x) 使得 (axequiv 1 pmod m),等价于存在 (ax+my=1)。根据裴蜀定理,存在整数 (x,y) 满足 (ax+my=1),当且仅当 (gcd(a,m)mid 1)。所以 (gcd(a,m)=1)

    定理 2:逆元如果存在,那么一定唯一。

    证明:假如同时存在两个逆元。

    (abequiv 1 pmod m),则 (mmid ab-1)(acequiv 1 pmod m),则 (mmid ac-1)。所以 (mmid a(b-c))

    逆元存在当且仅当 (gcd(a,m)=1),则 (mmid b-c),即 (b equiv c pmod m)。“唯一”指在 (mod m) 意义下唯一。因此唯一性得证。

    八、简化剩余系

    1. 定义

    任何 (m) 个分别属于 (m) 个剩余类(每个余数是一个剩余类)的数组成剩余系。

    所有满足 (0<n≤m)(gcd(n,m)=1)(n) 构成了一个模 (m) 的简化剩余系,记这样的 (n) 的个数为欧拉函数 (varphi(m))

    换言之,对于正整数 (n) ,欧拉函数是小于或等于 (n) 的正整数中与 (n) 互质的数的数目。

    2. 定理

    (gcd(m,m')=1)(a) 取遍 (m) 的简化剩余系,(a') 取遍 (m') 的简化剩余系,那么 (am'+a'm) 取遍模 (mm') 的简化剩余系(用中国剩余定理证)。因此 (varphi(mm')=varphi(m) varphi(m'))

    (varphi(p^e)=p^e-p^{e-1}=(p-1)p^{e-1})。因此对于 (n=p_1^{e_1} p_2^{e_2} ... p_k^{e_k})

    (varphi(n)=varphi(p_1^{e_1}) varphi(p_2^{e_2})...varphi(p_k^{e_k}))
    (=prodlimits_{i=1}^k varphi(p_i^{e_i})=prodlimits_{i=1}^k p_i^{e_i-1} (p_i-1))
    (=prodlimits_{pmid n}p^{alpha_p-1}(p-1)=prodlimits_{pmid n} p^{alpha_p} frac{p-1}{p})
    (=prodlimits_{pmid n} p^{alpha_p} prodlimits_{pmid n}frac{p-1}{p}=nprodlimits_{pmid n}(1-frac{1}{p}))

    其中 (alpha_p) 表示 (p)(n) 中的幂次。

    欧拉定理:(gcd(a,m)=1),则 (a^{varphi(m)}equiv 1 pmod m)

    欧拉定理的推论:若 (gcd(a,m)=1),则 (a^bequiv a^{b mod varphi(m)} pmod m)。

    费马小定理:(m) 为质数,且 (gcd(a,m)=1),则 (a^{m-1}equiv 1 pmod m)

    因为 (m) 为质数,所以满足 (pmid m)(p) 只有一个。

    (varphi(m)=mprodlimits_{pmid m}(1-frac{1}{p})=m imes frac{m-1}{m}=m-1)

    根据欧拉定理可得,(a^{m-1}equiv 1 pmod m)

    九、求逆元

    1. 如何求出 (a) 的逆元?

    • (gcd(a,m)=1),求 (a^{-1}pmod m)

    欧拉定理:若 (gcd(a,m)=1),则 (a^{varphi(m)}equiv 1 pmod m)

    (a^{varphi(m)}equiv a^0 pmod m)。因此 (a^{varphi(m)-1}equiv a^{-1} pmod m)

    2. 如何求出 (1)(n-1)(mod n) 意义下的逆元?

    注意到 (n mod i=n−lfloor frac{n}{i} floor i),则 (n mod iequiv −lfloor frac{n}{i} floor ipmod n),所以 (i^{-1} imes (nmod i)equiv -lfloor frac{n}{i} floorpmod n)。故 (i^{-1}equiv -lfloor frac{n}{i} floor imes (nmod i)^{-1}pmod n)

    3. 如何求出 (a_1,a_2,···,a_n) 的逆元?

    (f_i=prodlimits_{j=1}^i a_j mod p)(g_i=f_i^{-1}mod p),则只要算出 (f_n) 并求出 (g_n),然后推回去即可。

    十、线性同余方程组

    求解方程组 (xequiv a_i pmod {m_i}) 的方法?

    中国剩余定理:(m=prodlimits_{i=1}^k m_i),则在 (m_i) 两两互质时,(xequiv sumlimits_{i=1}^k M_i N_i a_i pmod m),其中 (M_i=frac{m}{m_i}),而 (M_iN_iequiv 1pmod {m_i})

    //Luogu P1495
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=20;
    int n,p[N],a[N],m=1;
    int exgcd(int a,int b,int &x,int &y){
        if(!b) return x=1,y=0,a;
        int d=exgcd(b,a%b,x,y);
        int z=x; x=y,y=z-y*(a/b);
        return d;
    } 
    int inv(int n,int mod){    //求 n 在模 mod 下的逆元 
        int x,y;
        exgcd(n,mod,x,y);    //gcd(M,p[i])=1 
        return (x%mod+mod)%mod;
    }
    int CRT(int m){
        int ans=0;
        for(int i=1;i<=n;i++){
            int M=m/p[i],t=inv(M,p[i]);    //由于 p[i] 不一定是质数,所以不能用费马小定理,也就是这里不能用快速幂求逆元(即不能用 t=mul(M,p[i]-2,p[i]),其中 mul 是快速幂)
            ans=(ans+a[i]%m*M%m*t%m)%m; 
        } 
        return ans;
    }
    signed main(){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld%lld",&p[i],&a[i]),m*=p[i]; 
        printf("%lld
    ",CRT(m));
        return 0;
    }

    十一、欧拉定理的应用

    要求 (a^b mod m),只要求 (bmod varphi(m)) 即可。

    扩展欧拉定理:(gcd(a,m) eq 1) 时,(a^b equiv a^c pmod m),其中 (c)(b<varphi(m)) 时即为 (b),否则为 (b mod varphi(m)+varphi(m))

  • 相关阅读:
    请简单介绍spring支持的常用数据库事务传播属性和事务隔离级别
    Spring Bean的作用域
    成员变量与局部变量的区别
    递归与迭代
    方法参数的传递机制 ---- 值传递
    windows phone 动画 当子控件超出父控件返回时
    把dataset 输出到 excel
    代码段
    c++ 学习纪录
    做自己的代码生成器
  • 原文地址:https://www.cnblogs.com/maoyiting/p/13418632.html
Copyright © 2011-2022 走看看