数论学习笔记2

一.素数相关算法和定理
  1. 素数筛法

    -埃氏筛法

    原理:素数的整数倍是合数

    时间复杂度为: O ( n l o g   n ) O(nlog\ n) O(nlog n)

    const int N = 1e6 + 5;
    int p[N], cnt;
    bool isp[N];
    void make_prime(int n = N - 5) {
        memset(isp, true, sizeof(isp));
        isp[0] = isp[1] = false;
        for (int i = 2; i <= n; i ++) {
            if (! isp[i]) continue;
            p[++ cnt] = i;
            for (int k = i*i; k <= n; k += i) 
                isp[k] = true;
        }
    }
    

    -欧拉筛法(也叫线性筛法)

    原理:整数的素数倍是合数

    时间复杂度为: O ( n ) O(n) O(n)

    const int N = 1e6 + 5;
    int p[N], cnt;
    bool isp[N];
    void Euler_Sieve(int n = N - 5) {
        for (int i = 2; i <= n; i ++) {
            if (! isp[i]) p[++ cnt] = i;
            // 关键处 1
            for (int j = 1; j <= cnt && (ll)i*p[j] <= n; j ++) {
                isp[i*p[j]] = true;
                if (i % p[j] == 0) break; // 关键处 2
            }
        }
    }
    

    下面证明欧拉筛为什么不重不漏:

    基于一个定理:整数唯一分解定理

    不管 i i i 是否是素数,都会执行 “关键处 1”。

    1. 如果 i i i 是素数的话,那么一个大的素数 i i i 的乘以不大于 i i i 的素数,这样筛除的数跟之前的是不会重复的。筛出的数都是 n = p 1 ∗ p 2 n = p_1*p_2 n=p1p2 的形式, p 1 p_1 p1 p 2 p_2 p2 不相等;

    2. 如果 i i i 是合数,此时 i i i 可以表示为 i = p 1 α 1 ∗ p 2 α 2 ∗ … ∗ p n α n i = p_1^{\alpha_1}*p_2^{\alpha_2}*…*p_n^{\alpha_n} i=p1α1p2α2pnαn p i p_i pi 都是素数 ( 1 ≤ i ≤ n ) ,   p i ≤ p j   ( i ≤ j ) ,   α i > 0 (1\le i\le n),\ p_i\le p_j\ (i\le j),\ \alpha_i>0 (1in), pipj (ij), αi>0 p 1 p_1 p1 是最小的素数。

      按照程序的进行,当筛到下一个数为 n e x t 1 = i ∗ p 1 = p 1 α 1 + 1 ∗ p 2 α 2 ∗ … ∗ p n α n next_1 = i*p_1=p_1^{\alpha_1+1}*p_2^{\alpha_2}*…*p_n^{\alpha_n} next1=ip1=p1α1+1p2α2pnαn 时停止此轮筛除。

      假设程序未停止,将会继续筛除 n e x t 2 = p 1 α 1 ∗ p 2 α 2 + 1 ∗ … ∗ p n α n ,    n e x t n = p 1 α 1 ∗ p 2 α 2 ∗ … ∗ p n α n + 1 next_2=p_1^{\alpha_1}*p_2^{\alpha_2+1}*…*p_n^{\alpha_n},\ \ next_n=p_1^{\alpha_1}*p_2^{\alpha_2}*…*p_n^{\alpha_n+1} next2=p1α1p2α2+1pnαn,  nextn=p1α1p2α2pnαn+1

      显而易见的, n e x t i   ( 2 ≤ i ≤ n ) next_i\ (2\le i\le n) nexti (2in) 都将被至少筛除两次。

      为什么呢?我们可以发现 p 1 α 1 − 1 ∗ p 2 a 2 + 1 ∗ … ∗ p n α n ,   …   , p 1 α 1 − 1 ∗ p 2 a 2 ∗ … ∗ p n α n + 1 p_1^{\alpha_1-1}*p_2^{a_2+1}*…*p_n^{\alpha_n},\ …\ , p_1^{\alpha_1-1}*p_2^{a_2}*…*p_n^{\alpha_n+1} p1α11p2a2+1pnαn,  ,p1α11p2a2pnαn+1 (这些数都是大于 i i i 的),它们乘上 p 1 p_1 p1 后都可把 n e x t i next_i nexti 筛除。

    -区间筛法

    我们什么时候会使用到区间筛法呢,当数据范围为这样的时候: [ L ,   R ] [L,\ R] [L, R] ,区间长度为 R − L + 1 ≤ 1 0 6 , L ,   R ≤ 1 0 12 R-L+1 \le 10^6,L,\ R\le 10^{12} RL+1106L, R1012

    我们直接套用线筛或者埃氏筛法都会爆炸,这时候就要换个思路:

    原理:合数可以分解为两个不为 1 且不等于本身的因子相乘,即 n = a ∗ b   ( n 为合数 ) n = a*b\ (n为合数) n=ab (n为合数) ,且有 m i n ( a ,   b ) ≤ n min(a,\ b) \le \sqrt{n} min(a, b)n

    证明:不妨设 a ≤ b a\le b ab
    ∵ a ≤ b ,   a ∗ b = n ∴ a ∗ a ≤ a ∗ b = n ∴ a ≤ n \because a\le b,\ a*b = n \\ \therefore a*a\le a*b= n \\ \therefore a \le \sqrt{n} ab, ab=naaab=nan
    所以,我们可以在 [ 1 ,   n ] [1,\ \sqrt{n}] [1, n ] 的范围内找到 n n n 的一个因子。

    我们先筛出 R \sqrt{R} R 内的所有素数,然后再把区间 [ L ,   R ] [L,\ R] [L, R] 内的所有合数都去掉,这里去掉所有合数主要利用了埃氏筛法的思想:素数的整数倍是合数。

    if (L == 1) L = 2; // 特判,1 不是质数也不是合数
    memset(isp, false, sizeof(isp));
    for (int i = 1; i <= cnt; i ++) {
        ll P = p[i], s = (L + P - 1) / P * P; // s 为起点
        if (s < 2*P) s = 2 * P;
        for (ll j = s; j <= R; j += P) 
            isp[j-L+1] = true; // 减去 L - 1 相当于做了个简单哈希
    }
    
  2. Miller-Rabin素数探测

    基于两个定理:费马小定理二次探测定理

    -费马小定理:

    如果 p p p 是一个素数,且 0 < a < p 0<a<p 0<a<p ,则有 a p − 1 ≡ 1   ( m o d   p ) a^{p-1} \equiv 1\ (mod\ p) ap11 (mod p)

    -二次探测定理:

    如果 p p p 是素数, x x x 是小于 p p p 的正整数,且 x 2 ≡ 1   ( m o d   p ) x^2\equiv 1\ (mod\ p) x21 (mod p) ,则要么 x = 1 x=1 x=1 ,要么 x = p − 1 x=p-1 x=p1

    证明:
    ∵ x 2 ≡ 1   ( m o d   p ) ∴ x 2 − 1 ≡ 0   ( m o d   p ) ∴ p   ∣   ( x + 1 ) ( x − 1 ) ∵ p  是质数 ∴ x = k 1 p + 1    o r    x = k 2 p − 1 ∵ 0 < x < p ∴ x = p − 1    o r    x = 1 \because x^2\equiv 1\ (mod\ p)\\ \therefore x^2-1\equiv 0\ (mod\ p)\\ \therefore p\ |\ (x+1)(x-1)\\ \because p\ 是质数\\ \therefore x = k_1p+1\ \ \textcolor{red}{or}\ \ x = k_2p-1\\ \because 0 < x < p\\ \therefore x=p-1\ \ \textcolor{red}{or}\ \ x = 1 x21 (mod p)x210 (mod p)p  (x+1)(x1)p 是质数x=k1p+1  or  x=k2p10<x<px=p1  or  x=1
    逆否命题为: x x x 是小于 p p p 的正整数,当 x 2   m o d   p = 1 x^2\ mod\ p = 1 x2 mod p=1 (触发二次探测条件)时,如果 x ≠ 1 x\not=1 x=1 x ≠ p − 1 x\not=p-1 x=p1 ,则说明 p p p 一定不是素数。

    选择底数:

    // 当然也是能继续加一些素数作为底数,这里给出常用的 5 个
    const int MT = 5;
    int p[MT] = {2376124251};
    

    一些解决乘法溢出的办法:

    // 慢速乘 (慎重使用,可能会TLE)
    inline ll fmul(ll a, ll b, ll mod) {
        if (b < 0) a = -a, b = -b;
        ll res = 0;
        while (b) {
            if (b & 1) res = (res + a) % mod;
            a = (a + a) % mod;
            b >>= 1;
        }
        return res;
    }
    // 基于一种新数据类型 __int128
    inline ll fmul(ll a, ll b, ll mod) {
        return (__int128) a * b % mod;
    }
    

    快速幂:

    inline ll fpow(ll a, ll b, ll mod) {
        ll res = 1;
        for (; b; b >>= 1, a = fmul(a, a, mod))
            if (b & 1) res = fmul(res, a, mod);
    	return res;
    }
    

    Miller_Rabin素数测试:

    (1)对于偶数和 0,1,2 可以直接判断;

    (2)设要测试的数为 x x x ,我们取一个较小的质数 a a a ,设 s ,   t s,\ t s, t ,满足 2 s ⋅ t = x − 1 2^s\cdot t=x-1 2st=x1 (其中 t t t 是奇数)。

    (3)我们先算出 a t a^t at ,然后不断地平方并且进行二次探测(利用其逆否命题)(进行 s s s 次)。

    (4)最后我们根据费马小定理,如果最后 a x − 1 ≢ 1   ( m o d   x ) a^{x-1}\not\equiv 1\ (mod\ x) ax11 (mod x) ,则说明 x x x 是合数。

    (5)多次取不同的 a a a 进行 M i l l e r − R a b i n Miller-Rabin MillerRabin 素数测试,这样可以使得正确性更高。

    bool Miller_Rabin(ll n) {
    	if (n == 2) return true;
        if (n < 2 || (n&1) == 0) return false;
        ll s = 0, t = n - 1;
        while (0 == (t&1)) s ++, t >>= 1;
        for (int i = 0; i < MT && p[i] < n; i ++) {
            ll b = fpow(p[i], t, n);
            for (int j = 0; j < s; j ++) {
                ll k = fmul(b, b, n);
                if (k == 1 && b != 1 && b != n - 1) \\二次探测定理
                    return false;
                b = k;
            }
            if (b != 1) return false;  \\费马小定理
        }
        return true;
    }
    
  3. Pollard-Rho 算法(待更)

    Pollard-Pho算法是John Pollard 发明的一种能快速找到大整数的一个非1、非自身的因子的算法。

二. 中国剩余定理
  1. 定理说明
    ( S ) : { x ≡ a 1 ( m o d   m 1 ) x ≡ a 2 ( m o d   m 2 ) ⋮ x ≡ a n ( m o d   m n ) (S):\begin{cases} \begin{aligned} x &\equiv a_1& (mod\ m_1)\\ x &\equiv a_2& (mod\ m_2)\\ &\vdots\\ x &\equiv a_n& (mod\ m_n) \end{aligned} \end{cases} (S): xxxa1a2an(mod m1)(mod m2)(mod mn)

    假设整数 m 1 ,   m 2 ,   … ,   m n m_1,\ m_2,\ …,\ m_n m1, m2, , mn 两两互质,则对任意的整数: a 1 ,   a 2 ,   … ,   a n a_1,\ a_2,\ …,\ a_n a1, a2, , an ,方程组 ( S ) (S) (S) 有解,并且解可以通过如下方式构造得到:

    M = m 1 × m 2 × … × m n = ∏ i = 1 n m i M=m_1\times m_2\times …\times m_n=\displaystyle\prod_{i=1}^{n}m_i M=m1×m2××mn=i=1nmi 是整数 m 1 ,   m 2 ,   … ,   m n m_1,\ m_2,\ …,\ m_n m1, m2, , mn 的乘积,并设 M i = M / m i M_i=M/m_i Mi=M/mi ∀ i ∈ { 1 , 2 , … , n } \forall i\in\{1,2,…,n\} i{1,2,,n} 是除了 m i m_i mi 以外的 n − 1 n-1 n1 个整数的乘积。

    t i = M i − 1 t_i=M_i^{-1} ti=Mi1 M i M_i Mi m i m_i mi 的数论倒数( t i t_i ti M i M_i Mi m i m_i mi 意义下的逆元) M i t i ≡ 1   ( m o d   m i ) M_it_i\equiv 1\ (mod\ m_i) Miti1 (mod mi) ∀ i ∈ { 1 , 2 , … , n } \forall i\in\{1,2,…,n\} i{1,2,,n}

    方程组( S S S)的通解形式为 x = a 1 t 1 M 1 + a 2 t 2 M 2 + … + a n t n M n + k M = k M + ∑ i = 1 n a i t i M i x=a_1t_1M_1+a_2t_2M_2+…+a_nt_nM_n+kM=kM+\displaystyle\sum_{i=1}^na_it_iM_i x=a1t1M1+a2t2M2++antnMn+kM=kM+i=1naitiMi

    在模 M M M 意义下,方程组( S S S)只有一个解: x = ( ∑ i = 1 n a i t i M i )   m o d   M x=(\displaystyle\sum_{i=1}^na_it_iM_i)\ mod\ M x=(i=1naitiMi) mod M

  2. 定理证明:从假设可知,对 ∀ i ∈ { 1 , 2 , … , n } \forall i\in\{1,2,…,n\} i{1,2,,n} ,由于 ∀ j ∈ { 1 , 2 , … , n } ,   j ≠ i ,   G C D ( m i ,   m j ) = 1 \forall j\in\{1,2,…,n\},\ j\not=i,\ GCD(m_i,\ m_j)=1 j{1,2,,n}, j=i, GCD(mi, mj)=1,所以 G C D ( m i ,   M i ) = 1 GCD(m_i,\ M_i)=1 GCD(mi, Mi)=1。这说明存在整数 t i t_i ti 使得 t i M i ≡ 1   ( m o d   m i ) t_iM_i\equiv 1 \ (mod\ m_i) tiMi1 (mod mi) 。这样的 t i t_i ti 叫做 M i M_i Mi m i m_i mi 的逆元。

    ∀ i ∈ { 1 , 2 , … , n } \forall i\in\{1,2,…,n\} i{1,2,,n},考察乘积 a i t i M i a_it_iM_i aitiMi 可知:
    a i t i M i ≡ a i ⋅ 1 ≡ a i   ( m o d   m i ) ∀ j ∈ { 1 , 2 , … , n } ,   j ≠ i   , a i t i M i ≡ 0   ( m o d   m j ) ∴ x = a 1 t 1 M 1 + a 2 t 2 M 2 + … + a n t n M n 满足 : ∀ i ∈ { 1 , 2 , … , n } ,   x = a i t i M i + ∑ j ≠ i a j t j M j ≡ a i + ∑ j ≠ i 0 ≡ a i   ( m o d   m i ) a_it_iM_i\equiv a_i\cdot 1\equiv a_i\ (mod\ m_i)\\ \forall j\in \{1,2,…,n\},\ j\not=i\ ,a_it_iM_i\equiv 0\ (mod\ m_j)\\ \therefore x=a_1t_1M_1+a_2t_2M_2+…+a_nt_nM_n\\ 满足: \forall i\in\{1,2,…,n\},\ x=a_it_iM_i+\displaystyle\sum_{j\not=i}a_jt_jM_j\equiv a_i+\displaystyle\sum_{j\not=i}0\equiv a_i\ (mod\ m_i) aitiMiai1ai (mod mi)j{1,2,,n}, j=i ,aitiMi0 (mod mj)x=a1t1M1+a2t2M2++antnMn满足:i{1,2,,n}, x=aitiMi+j=iajtjMjai+j=i0ai (mod mi)
    这说明 x x x 就是方程组 ( S S S)的一个解。

    另外,假设 x 1 x_1 x1 x 2 x_2 x2 都是方程组 ( S S S)的解,那么: ∀ i ∈ { 1 , 2 , … , n } ,   x 1 − x 2 ≡ 0   ( m o d   m i ) \forall i\in\{1,2,…,n\},\ x_1-x_2\equiv 0\ (mod\ m_i) i{1,2,,n}, x1x20 (mod mi)。而 m 1 , m 2 , … , m n m_1,m_2,…,m_n m1,m2,,mn 两两互质,这说明 M = ∏ i = 1 n m i M=\displaystyle\prod_{i=1}^{n}m_i M=i=1nmi 整除 x 1 − x 2 x_1-x_2 x1x2 ,且 L C M ( m 1 , m 2 , … , m n ) = M LCM(m_1,m_2,…,m_n) = M LCM(m1,m2,,mn)=M。所以方程组的通解为: { k M + ∑ i = 1 n a i t i M i ;   k ∈ Z } \{kM+\displaystyle\sum_{i=1}^na_it_iM_i;\ k\in\Z\} {kM+i=1naitiMi; kZ}。另外,在模 M M M 意义下,方程组( S S S)只有一个解: x = ( ∑ i = 1 n a i t i M i )   m o d   M x=(\displaystyle\sum_{i=1}^na_it_iM_i)\ mod\ M x=(i=1naitiMi) mod M

    线性代数角度:考虑 n n n 个方程组( 1 ≤ i ≤ n 1\le i\le n 1in),
    { x ≡ 0 ( m o d   m 1 ) ⋮ x ≡ 0 ( m o d   m i − 1 ) x ≡ 1 ( m o d   m i ) x ≡ 0 ( m o d   m i + 1 ) ⋮ x ≡ 0 ( m o d   m n ) \begin{cases} \begin{aligned} x &\equiv 0& (mod&\ m_1)\\ &\vdots \\ x &\equiv 0& (mod&\ m_{i-1})\\ x &\equiv 1& (mod&\ m_i)\\ x &\equiv 0& (mod&\ m_{i+1})\\ &\vdots \\ x &\equiv 0& (mod&\ m_n) \end{aligned} \end{cases} xxxxx00100(mod(mod(mod(mod(mod m1) mi1) mi) mi+1) mn)
    由于 m i   ( 1 ≤ i ≤ n ) m_i\ (1\le i\le n) mi (1in) 两两互质,这个方程组作变量替换,令 x = ( M / m i ) ∗ y x=(M/m_i)*y x=(M/mi)y ,方程组等价于求解同余方程: ( M / m i )   y ≡ 1   ( m o d   m i ) (M/m_i)\ y\equiv 1\ (mod\ m_i) (M/mi) y1 (mod mi) ,求解出 y y y 后,若要得到特解 x i x_i xi ,只要令: x i = ( M / m i ) ∗ y i x_i=(M/m_i)*y_i xi=(M/mi)yi ,则方程组的解为: x 0 = a 1 x 1 + a 2 x 2 + … + a n x n   ( m o d   M ) x_0=a_1x_1+a_2x_2+…+a_nx_n\ (mod\ M) x0=a1x1+a2x2++anxn (mod M) ,在模 M M M 的意义下唯一。

  3. 代码如下

    ll CRT(ll *a, ll *m, ll n) {
        ll M = 1, ans = 0;
        for (int i = 1; i <= n; i ++) 
            M *= m[i];
        for (int i = 1; i <= n; i ++) {
            ll Mi = M / m[i], t, y;
            exgcd(Mi, m[i], t, y); 			// Mi * t = 1 (mod m[i])
            t = (t % m[i] + m[i]) % m[i];
            // ans += a[i] * t * Mi
            ans = (ans + fmul(fmul(a[i], t, M), Mi, M)) % M;
        }
        return ans;
    }
    
三. 扩展中国剩余定理
  1. 定理说明:此时的 m i m_i mi (模数)不需要两两互质。

  2. 算法实现及其证明:

    我们先考虑两个式子:
    x ≡ a 1 ( m o d   m 1 ) x ≡ a 2 ( m o d   m 2 ) \begin{aligned} x &\equiv a_1 &(mod\ m_1)\\ x &\equiv a_2 &(mod\ m_2) \end{aligned} xxa1a2(mod m1)(mod m2)
    我们设 k 1 k_1 k1 k 2 k_2 k2 是满足 x = a 1 + k 1 m 1 x=a_1+k_1m_1 x=a1+k1m1 x = a 2 + k 2 m 2 x=a_2+k_2m_2 x=a2+k2m2 的两个整数。

    显然有 a 1 + k 1 m 1 = a 2 + k 2 m 2 a_1+k_1m_1=a_2+k_2m_2 a1+k1m1=a2+k2m2 ,即 m 1 k 1 − m 2 k 2 = a 1 − a 2 m_1k_1-m_2k_2=a_1-a_2 m1k1m2k2=a1a2

    根据线性同余方程,当 G C D ( m 1 ,   m 2 )   ∣   a 2 − a 1 GCD(m_1,\ m_2)\ |\ a_2-a_1 GCD(m1, m2)  a2a1 时有解。我们先将 m 1 K 1 − m 2 K 2 = G C D ( m 1 ,   m 2 ) m_1K_1-m_2K_2=GCD(m_1,\ m_2) m1K1m2K2=GCD(m1, m2) 的解 K 1 ,   K 2 K_1,\ K_2 K1, K2 求出,接着将式子左右两边同时乘以 a 2 − a 1 G C D ( m 1 ,   m 2 ) \frac{a_2-a_1}{GCD(m_1,\ m_2)} GCD(m1, m2)a2a1 得到 k 1 ,   k 2 k_1,\ k_2 k1, k2 。从而我们可以得到 x 0 x_0 x0 (一个特解)。

    接着求出通解:我们设两个解为 x 1 x_1 x1 x 2 x_2 x2 x 1 < x 2 x_1<x_2 x1<x2),因为两个解都满足给定的两个同余方程,因此存在两个整数 δ 1 \delta_1 δ1 δ 2 \delta_2 δ2 x 2 = x 1 + δ 1 m 1 = x 1 + δ 2 m 2 x_2=x_1+\delta_1m_1=x_1+\delta_2m_2 x2=x1+δ1m1=x1+δ2m2

    我们设 x 2 − x 1 = Δ x x_2-x_1=\Delta x x2x1=Δx ,显然 δ 1 m 1 = δ 2 m 2 \delta_1m_1=\delta_2m_2 δ1m1=δ2m2 (1),设 d = G C D ( m 1 ,   m 2 ) ,   n 1 = m 1 d ,   n 2 = m 2 d d=GCD(m_1,\ m_2),\ n_1=\frac{m_1}{d},\ n_2=\frac{m_2}{d} d=GCD(m1, m2), n1=dm1, n2=dm2,则(1)式等价于 δ 1 × n 1 d = δ 2 × n 2 d \delta_1\times n_1d=\delta_2\times n_2d δ1×n1d=δ2×n2d ,即 δ 1 n 1 = δ 2 n 2 \delta_1n_1=\delta_2n_2 δ1n1=δ2n2 ,所以有 n 1   ∣   δ 2 × n 2 n_1\ |\ \delta_2\times n_2 n1  δ2×n2 ,由于 G C D ( n 1 ,   n 2 ) = 1 GCD(n_1,\ n_2) = 1 GCD(n1, n2)=1 。因此 n 1   ∣   δ 2 n_1\ |\ \delta_2 n1  δ2 。所以 n 1 n 2   ∣   δ 2 × n 2 n_1n_2\ |\ \delta_2\times n_2 n1n2  δ2×n2 ,进而 n 1 × n 2 d   ∣   Δ x n_1\times n_2d\ |\ \Delta x n1×n2d  Δx。因此 L C M ( m 1 ,   m 2 )   ∣   Δ x LCM(m_1,\ m_2)\ |\ \Delta x LCM(m1, m2)  Δx

    由此得出结论:任意两个解之间的差都是模数的最小公倍数

    通解为: { x 0 + k ⋅ L C M ( m 1 ,   m 2 ) ;   k ∈ Z } \{x_0+k\cdot LCM(m_1,\ m_2);\ k\in\Z\} {x0+kLCM(m1, m2); kZ}

    从另一个角度我们将两个方程合并得到了一个新的方程:
    x ≡ x 0   ( m o d   L C M ( m 1 ,   m 2 ) ) x\equiv x_0\ (mod\ LCM(m_1,\ m_2)) xx0 (mod LCM(m1, m2))

  3. 代码如下

    pair<bool, ll> exCRT(ll* r, ll* m, ll n) {
        ll x, y, ans = r[0], M = m[0];
        for (int i = 1; i < n; i ++) {
            ll a = M, b = m[i], c = (r[i] - ans%b + b) % b;
            ll d = exgcd(a, b, x, y), q = b/d;
            if (d == 0 || c % d) return make_pair(0, 0);
            x = fmul(x, c/d, q);
            ans += x * M, M *= q;
            ans = (ans%M + M) % M;
        }
        return make_pair(1, (ans%M + M) % M);
    }
    
四. 欧拉定理
  1. 同余类(Residue class):

    通过一个整数模 n n n 的余数,我们可以把所有整数分成 n n n 类,记 r ‾ n = { m ∈ Z   ∣   m n + r } \overline{r}_n=\{m\in \Z\ |\ mn+r\} rn={mZ  mn+r} 为模 n n n r r r同余类(也叫剩余类)。

    举个列子: 4 ‾ 10 = { … ,   − 16 ,   − 6 ,   4 ,   14 ,   24 ,   … } \overline{4}_{10}=\{…,\ -16,\ -6,\ 4,\ 14,\ 24,\ …\} 410={, 16, 6, 4, 14, 24, } 是模 10 余 4 的同余类。

  2. 完全剩余系(Complete residue system):

    0 ‾ n ,   1 ‾ n ,   2 ‾ n ,   … ,   ( n − 1 ) ‾ n \overline{0}_n,\ \overline{1}_n,\ \overline{2}_n,\ …,\ \overline{(n-1)}_n 0n, 1n, 2n, , (n1)n 中各挑出一个数就组成了一个模 n n n完全剩余系(完系) R n R_n Rn

    R n = { r 0 ,   r 1 ,   … ,   r n − 1 } R_n=\{r_0,\ r_1,\ …,\ r_{n-1}\} Rn={r0, r1, , rn1},其中 r 0 ∈ 0 ‾ n ,   r 1 ∈ 1 ‾ n ,   r 2 ∈ 2 ‾ n ,   … ,   r n − 1 ∈ ( n − 1 ) ‾ n r_0\in \overline{0}_n,\ r_1\in\overline{1}_n,\ r_2\in\overline{2}_n,\ …,\ r_{n-1}\in\overline{(n-1)}_n r00n, r11n, r22n, , rn1(n1)n

    换句话说, n n n 个模 n n n 互不同余的整数组成一个模 n n n 的完全剩余系。我们称 R n = { 0 ,   1 ,   … ,   n − 1 } R_n=\{0,\ 1,\ …,\ n-1\} Rn={0, 1, , n1} 为模 n n n 的一个最小非负完全剩余系(最小非负完系)

  3. 缩剩余系(Reduced residue system):

    取一个模 n n n 的完全剩余系 R n R_n Rn ,取出里面所有和 n n n 互质的数,这些数组成一个模 n n n缩剩余系(缩系),记为 ϕ n \boldsymbol{\phi_n} ϕn

    ϕ n = { c 1 ,   c 2 ,   … ,   c φ ( n ) } \boldsymbol{\phi_n}=\{c_1,\ c_2,\ …,\ c_{\varphi(n)}\} ϕn={c1, c2, , cφ(n)} ,其中 φ ( n ) \varphi(n) φ(n) 是欧拉函数,代表 小于 n n n 的正整数中的和 n n n 互质的数 的个数。

    由于 G C D ( c i ,   n ) = G C D ( c i + k n ,   n ) = 1 GCD(c_i,\ n) = GCD(c_i+kn,\ n) = 1 GCD(ci, n)=GCD(ci+kn, n)=1 ,每一个模 n n n 的缩剩余系有相同数量的元素(缩剩余系中的每一个数所属的同余类是确定的,所以总有确定的 φ ( n ) \varphi(n) φ(n) 个同余类)

    如果缩剩余系 ϕ n = { c 1 ,   c 2 ,   … ,   c φ ( n ) } \boldsymbol\phi_n=\{c_1,\ c_2,\ …,\ c_{\varphi(n)}\} ϕn={c1, c2, , cφ(n)} 满足 1 ≤ c 1 ,   c 2 ,   … ,   c φ ( n ) ≤ n − 1 1\le c_1,\ c_2,\ …,\ c_{\varphi(n)} \le n-1 1c1, c2, , cφ(n)n1 ,那么称其为模 n n n最小正缩剩余系(最小正缩系)

  4. 欧拉函数(Euler‘s totient function):

    对于正整数 n n n φ ( n ) \varphi(n) φ(n) 代表 **小于 n n n 的正整数中的和 n n n 互质的数 **的个数,这个函数被称为欧拉函数,欧拉还告诉我们
    φ ( n ) n = ∏ p   ∣   n ( 1 − 1 p ) \frac{\varphi(n)}{n} = \displaystyle\prod_{p\ |\ n}(1-\frac{1}{p}) nφ(n)=p  n(1p1)
    其中 p p p 取到 n n n 的所有质因子。

    所以我们可以很方便地计算一个整数的欧拉函数的值,比如:
    φ ( 1926 ) = φ ( 2 × 3 2 × 107 ) = 1926 ( 1 − 1 2 ) ( 1 − 1 3 ) ( 1 − 1 107 ) = 636 \varphi(1926)=\varphi(2\times 3^2 \times 107) = 1926(1-\frac{1}{2})(1-\frac{1}{3})(1-\frac{1}{107}) = 636 φ(1926)=φ(2×32×107)=1926(121)(131)(11071)=636
    欧拉函数的证明

    首先我们考虑 φ ( p e ) \varphi(p^e) φ(pe) ,其中 p p p 是质数, e e e 是非负整数,如果要使 G C D ( p e ,   k ) ≠ 1 GCD(p^e,\ k) \not= 1 GCD(pe, k)=1 ,只能让 k k k 等于 p p p 的倍数,在 1 ≤ k ≤ p e 1\le k\le p^e 1kpe 范围内, p p p 的倍数有 p ,   2 p ,   3 p ,   … ,   p e − 1 p p,\ 2p,\ 3p,\ …,\ p^{e-1}p p, 2p, 3p, , pe1p ,总共 p e − 1 p^{e-1} pe1 个数,所以 φ ( p e ) = p e − p e − 1 = p e ( 1 − 1 p ) \varphi(p^e) = p^e-p^{e-1} = p^e(1-\frac{1}{p}) φ(pe)=pepe1=pe(1p1)

    然后我们证明对于 G C D ( m ,   n ) = 1 GCD(m,\ n)=1 GCD(m, n)=1 φ ( m n ) = φ ( m ) φ ( n ) \varphi(mn)=\varphi(m)\varphi(n) φ(mn)=φ(m)φ(n) ,我们首先构造两个集合,第一个集合是模 m n mn mn 的最小正缩系 ϕ m n \boldsymbol\phi_{mn} ϕmn ,第二个集合定义为:
    S = { ( m ,   n )   ∣   m ∈ ϕ m ,   n ∈ ϕ n } S = \{(m,\ n)\ |\ m\in\boldsymbol\phi_m,\ n\in\boldsymbol\phi_n \} S={(m, n)  mϕm, nϕn}
    其中 ϕ m ,   ϕ n \boldsymbol{\phi_m},\ \boldsymbol{\phi_n} ϕm, ϕn 分别是模 m ,   n m,\ n m, n 的最小正缩系,显然 ∣ ϕ m n ∣ = φ ( m n ) |\boldsymbol\phi_{mn}|=\varphi(mn) ϕmn=φ(mn) ∣ S ∣ = φ ( m ) φ ( n ) |S|=\varphi(m)\varphi(n) S=φ(m)φ(n)

    如果我们证明存在一个双射 f f f ϕ m n → S \boldsymbol\phi_{mn}\rightarrow S ϕmnS ,就证明了 φ ( m n ) = φ ( m ) φ ( n ) \varphi(mn) = \varphi(m)\varphi(n) φ(mn)=φ(m)φ(n)

    我们构造函数如下:
    f ( a ) = ( a   m o d   m , a   m o d   n ) f(a) = (a\ mod\ m, a\ mod\ n) f(a)=(a mod m,a mod n)
    首先我们用反证法证明 f f f 是单射(即证明存在两个数 a ≠ b ,   f ( a ) = f ( b ) a\not=b,\ f(a)=f(b) a=b, f(a)=f(b) ,从而导出矛盾),假设 a ,   b ∈ ϕ m n a,\ b\in\boldsymbol{\phi_{mn}} a, bϕmn 满足 a ≠ b  且  f ( a ) = f ( b ) a\not=b\ 且\ f(a)=f(b) a=b  f(a)=f(b) ,那么就有
    a ≡ b ( m o d   m ) a ≡ b ( m o d   n ) \begin{aligned} a &\equiv b &(mod\ &m)\\ a &\equiv b &(mod\ &n) \end{aligned} aabb(mod (mod m)n)
    显然因为 G C D ( m ,   n ) = 1 GCD(m,\ n) = 1 GCD(m, n)=1 我们能得出 a ≡ b   ( m o d   m n ) a\equiv b\ (mod\ mn) ab (mod mn) ,这与我们的假设矛盾(因为 ϕ m n \boldsymbol\phi_{mn} ϕmn 是模 m n mn mn 的缩系, a ,   b a,\ b a, b ϕ m n \boldsymbol\phi_{mn} ϕmn 的两个不同的元素,所以他们模 m n mn mn 不同余)。接下来,中国剩余定理 告诉我们

    如果整数 r 1 ,   r 2 r_1,\ r_2 r1, r2 和正整数 G C D ( n 1 ,   n 2 ) = 1 GCD(n_1,\ n_2) = 1 GCD(n1, n2)=1 ,同余方程组
    x ≡ r 1 ( m o d   n 1 ) x ≡ r 2 ( m o d   n 2 ) \begin{aligned} x &\equiv r_1 &(mod\ n_1)\\ x &\equiv r_2 &(mod\ n_2) \end{aligned} xxr1r2(mod n1)(mod n2)
    0 ≤ x < n 1 n 2 0\le x < n_1n_2 0x<n1n2 范围内有且只有一个解。

    通过中国剩余定理我们能够证明 f f f 是满射,所以 f f f 是双射。

    所以对于 G C D ( m ,   n ) = 1 GCD(m,\ n) = 1 GCD(m, n)=1 ,就有 φ ( m n ) = φ ( m ) φ ( n ) \varphi(mn) = \varphi(m)\varphi(n) φ(mn)=φ(m)φ(n) ,假设 n n n 的唯一分解为 :
    n = 2 e 1 × 3 e 2 × 5 e 3 × … = ∏ k = 1 ∞ p k e k n = 2^{e_1}\times 3^{e_2}\times 5^{e_3}\times …=\displaystyle\prod_{k=1}^{\infty}p_k^{e_k} n=2e1×3e2×5e3×=k=1pkek
    其中 e 1 ,   e 2 ,   … ∈ N e_1,\ e_2,\ …\in \N e1, e2, N ,那么:
    φ ( n ) = φ ( ∏ k = 1 ∞ p k e k ) = ∏ k = 1 ∞ φ ( p k e k ) = ∏ k = 1 ∞ p k e k ( 1 − 1 p k ) = ( ∏ k = 1 ∞ p k e k ) ∏ k = 1 ∞ ( 1 − 1 p k ) = n × ∏ k = 1 ∞ ( 1 − 1 p k ) \begin{aligned} \varphi(n) &=\varphi(\displaystyle\prod_{k=1}^{\infty}p_k^{e_k}) =\displaystyle\prod_{k=1}^{\infty}\varphi(p_k^{e_k}) =\displaystyle\prod_{k=1}^{\infty}p_k^{e_k}(1-\frac{1}{p_k}) \\ &=(\displaystyle\prod_{k=1}^{\infty}p_k^{e_k})\displaystyle\prod_{k=1}^{\infty}(1-\frac{1}{p_k}) = n\times \displaystyle\prod_{k=1}^{\infty}(1-\frac{1}{p_k}) \end{aligned} φ(n)=φ(k=1pkek)=k=1φ(pkek)=k=1pkek(1pk1)=(k=1pkek)k=1(1pk1)=n×k=1(1pk1)
    欧拉函数还有一些性质(证明待补):

    • 如果正整数 n > 2 n>2 n>2 ,那么 φ ( n ) \varphi(n) φ(n) 是偶数。
    • 如果 n   ∣   N n\ |\ N n  N ,那么 φ ( n )   ∣   φ ( N ) \varphi(n)\ |\ \varphi(N) φ(n)  φ(N)
    • 对于正整数 m , n m, n m,n φ ( m n ) = φ ( m ) φ ( n ) G C D ( m ,   n ) φ ( G C D ( m ,   n ) ) \varphi(mn)=\varphi(m)\varphi(n)\frac{GCD(m,\ n)}{\varphi(GCD(m,\ n))} φ(mn)=φ(m)φ(n)φ(GCD(m, n))GCD(m, n)
    • 特别的,如果 m , n m, n m,n 互质,那么 φ ( m n ) = φ ( m ) φ ( n ) \varphi(mn) = \varphi(m)\varphi(n) φ(mn)=φ(m)φ(n)
    • 对于正整数 n n n ∑ d   ∣   n φ ( d ) = n \displaystyle\sum_{d\ |\ n}\varphi(d) = n d  nφ(d)=n
    • 对于正整数 n n n ∑ 1 ≤ k ≤ n ,   G C D ( k ,   n ) = 1 k n = φ ( n ) 2 \displaystyle\sum_{1\le k\le n, \ GCD(k,\ n) = 1} \frac{k}{n} = \frac{\varphi(n)}{2} 1kn, GCD(k, n)=1nk=2φ(n)
    // 线性预处理欧拉函数 phi[i]
    int phi[N];
    int p[N], cnt;
    bool isp[N];
    void GetPhi(int n = N - 5) {
        for (int i = 2; i <= n; i ++) {
            if (! isp[i]) phi[i] = i - 1, p[++ cnt] = i;
            for (int j = 1; j <= cnt && i * p[j] <= n; j ++) {
                isp[i*p[j]] = true;
                if (i % p[j]) phi[i*p[j]] = phi[i] * (p[j] - 1);
                else { phi[i*p[j]] = phi[i] * p[j]; break; }
            }
        }
    }
    

接下来进入正题:欧拉定理

  1. 定理描述:

    如果正整数 n n n 和整数 a a a 互质,那么就有 a φ ( n ) ≡ 1   ( m o d   n ) a^{\varphi(n)} \equiv 1\ (mod\ n) aφ(n)1 (mod n) ,其中 φ ( n ) \varphi(n) φ(n) 是欧拉函数。

    证明:考虑模 n n n 的最小正缩系 ϕ n = { c 1 ,   c 2 ,   … ,   c φ ( n ) } \boldsymbol\phi_n=\{c_1,\ c_2,\ …,\ c_{\varphi(n)}\} ϕn={c1, c2, , cφ(n)} , 已知 G C D ( a ,   n ) = 1 GCD(a,\ n) = 1 GCD(a, n)=1 ,我们在 ϕ n \boldsymbol\phi_n ϕn 的每一个元素面前都乘以一个 a a a
    a ϕ n = { a c 1 ,   a c 2 ,   … ,   a c φ ( n ) } a\boldsymbol{\phi_n} = \{ac_1,\ ac_2,\ …,\ ac_{\varphi(n)}\} aϕn={ac1, ac2, , acφ(n)}
    利用反证法可以证明 a ϕ n a\boldsymbol{\phi_n} aϕn 也是一个模 n n n 的缩系(其元素的同余类的顺序有可能会改变,但是这并没有任何影响),假设 a c i ≡ a c j   ( m o d   n ) ac_i\equiv ac_j\ (mod\ n) aciacj (mod n) ,其中 i ≠ j i\not=j i=j ,因为 a , n a,n a,n 互质可以将 a a a 消去,那么就有 c i ≡ c j   ( m o d   n ) c_i\equiv c_j\ (mod\ n) cicj (mod n) ,这是不可能的,矛盾。
    ∏ i = 1 φ ( n ) c i ≡ ∏ i = 1 φ ( n ) a c i   ( m o d   n ) ∏ i = 1 φ ( n ) c i ≡ a φ ( n ) ∏ i = 1 φ ( n ) c i   ( m o d   n ) \begin{aligned} \displaystyle\prod_{i=1}^{\varphi(n)} c_i & \equiv \displaystyle\prod_{i=1}^{\varphi(n)}ac_i\ &(mod\ n) \\ \displaystyle\prod_{i=1}^{\varphi(n)} c_i & \equiv a^{\varphi(n)} \displaystyle\prod_{i=1}^{\varphi(n)}c_i\ &(mod\ n) \end{aligned} i=1φ(n)cii=1φ(n)cii=1φ(n)aci aφ(n)i=1φ(n)ci (mod n)(mod n)
    显然 G C D ( n ,   ∏ i = 1 φ ( n ) c i ) = 1 GCD(n,\ \displaystyle\prod_{i=1}^{\varphi(n)}c_i) = 1 GCD(n, i=1φ(n)ci)=1 ,所以可以两边消去它,得到: a φ ( n ) ≡ 1   ( m o d   n ) a^{\varphi(n)} \equiv 1\ (mod\ n) aφ(n)1 (mod n)

    由此,当 n = p n= p n=p 是一个质数时,我们可以得到费马小定理(Fermat’s little theorem)

    如果 p p p 是一个质数,且 G C D ( a ,   p ) = 1 GCD(a,\ p) = 1 GCD(a, p)=1,那么 a p − 1 ≡ 1   ( m o d   p ) a^{p-1} \equiv 1\ (mod\ p) ap11 (mod p) ,即 p   ∣   n p − n p\ | \ n^p-n p  npn 对于任意整数 n n n 满足 G C D ( n ,   p ) = 1 GCD(n,\ p) = 1 GCD(n, p)=1 都成立。

    当然,费马小定理也可以用归纳法证明:假设 p   ∣   n p − n p\ |\ n^p-n p  npn ,那么
    ( n + 1 ) p − ( n + 1 ) ≡ ∑ r = 1 p − 1 ( p r ) n r + n p − n (n+1)^p-(n+1) \equiv \displaystyle\sum_{r=1}^{p-1}\binom{p}{r}n^r+n^p-n (n+1)p(n+1)r=1p1(rp)nr+npn
    1 ≤ r ≤ p − 1 1\le r\le p-1 1rp1 时,二项式系数 ( p r ) = p ! ( p − r ) ! r ! \binom{p}{r} = \frac{p!}{(p-r)!r!} (rp)=(pr)!r!p! 的分子中有 p p p ,分母中每一个因子都不能整除 p p p (因为 p p p 是质数),所以 p p p 能够整除 ( p r ) \binom{p}{r} (rp),进而得到 p   ∣   ( n + 1 ) p − ( n + 1 ) p\ |\ (n+1)^p-(n+1) p  (n+1)p(n+1) 。当 n = 0 n=0 n=0 时显然成立,所以定理成立。特别的 n = 0 n=0 n=0 时显然成立。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值