数论——同余

数论有一部分的总括


a , b ∈ N , a ≠ 0 a, b\in\mathbb{N},a\neq0 a,bN,a̸=0
a a a b b b b ÷ a b\div a b÷a的余数为 b   m o d   a b\bmod a bmoda
若存在 m ∈ Z + m\in\mathbb{Z}^+ mZ+,使得 a   m o d   m   =   b   m o d   m a\bmod m\ =\ b\bmod m amodm = bmodm,记作 a ≡ b ( m o d m ) a\equiv b\pmod{m} ab(modm)

1.整除

若存在整数 p ≠ 0 p\neq0 p̸=0使得 a q = b aq=b aq=b,那么称 a a a b b b的因数(约数), b b b a a a的倍数, a a a整除 b b b b b b能被 a a a整除,记作 a ∣ b a\mid b ab,同时 b ≡ 0 ( m o d a ) b\equiv0\pmod{a} b0(moda)

性质

a ∣ b , b ∣ c ⇒ a ∣ c a\mid b,b\mid c\Rightarrow a\mid c ab,bcac
a ∣ b , c ∣ d ⇒ a c ∣ b d a\mid b,c\mid d\Rightarrow ac\mid bd ab,cdacbd
a ∣ b , a ∣ c ⇒ a ∣ p b + q c a\mid b,a\mid c\Rightarrow a\mid pb+qc ab,acapb+qc

整除也可以定义同余,即 a ≡ b ( m o d m ) ⇔ m ∣ ( a − b ) a\equiv b\pmod{m}\Leftrightarrow m\mid (a-b) ab(modm)m(ab)
所以,若 a ≡ b ( m o d m ) , n ∣ m ⇔ a ≡ b ( m o d n ) \mathbf{a\equiv b\pmod{m},n\mid m\Leftrightarrow a\equiv b\pmod{n}} ab(modm),nmab(modn)

2.性质

自反性: a ≡ a ( m o d m ) a\equiv a\pmod{m} aa(modm)
对称性: a ≡ b (   m o d   m ) ⇒ b ≡ a ( m o d m ) a\equiv b(\bmod m) \Rightarrow b\equiv a\pmod{m} ab(modm)ba(modm)
传递性: a ≡ b ( m o d m ) , b ≡ c ( m o d m ) ⇒ a ≡ c ( m o d m ) a\equiv b\pmod{m},b\equiv c\pmod{m}\Rightarrow a\equiv c\pmod{m} ab(modm),bc(modm)ac(modm)

a ≡ b ( m o d m ) ⇔ k a ≡ k b ( m o d k m ) \mathbf{a\equiv b\pmod{m}\Leftrightarrow ka\equiv kb\pmod{km}} ab(modm)kakb(modkm)
证明: m ∣ ( a − b ) ⇔ k m ∣ k ( a − b ) ⇔ k m ∣ ( k a − k b ) ⇔ k a ≡ k b ( m o d k m ) m\mid (a-b)\Leftrightarrow km\mid k(a-b)\Leftrightarrow km\mid (ka-kb)\Leftrightarrow ka\equiv kb\pmod{km} m(ab)kmk(ab)km(kakb)kakb(modkm)

a c ≡ b c ( m o d m ) ⇔ a ≡ b ( m o d m ( c , m ) ) \mathbf{ac\equiv bc\pmod{m}\Leftrightarrow a\equiv b\pmod{\frac{m}{(c,m)}}} acbc(modm)ab(mod(c,m)m)
证明:(充分性)有 m ∣ c ( a − b ) m\mid c(a-b) mc(ab)
( m , c ) = 1 (m,c)=1 (m,c)=1,则 m ∣ ( a − b ) m\mid (a-b) m(ab)
否则,有 m ( c , m ) ∣ c ( c , m ) ( a − b ) \frac{m}{(c,m)}\mid \frac{c}{(c,m)}(a-b) (c,m)m(c,m)c(ab),那么 m ( c , m ) ∣ ( a − b ) \frac{m}{(c,m)}\mid (a-b) (c,m)m(ab),因为 ( m ( c , m ) , c ( c , m ) ) = 1 (\frac{m}{(c,m)},\frac{c}{(c,m)})=1 ((c,m)m,(c,m)c)=1

3.辗转相除法

就是欧几里得算法,用于在 O ( log ⁡ max ⁡ ( a , b ) ) O(\log\max(a,b)) O(logmax(a,b))时间内求出 ( a , b ) (a,b) (a,b)

这是基于一个定理的—— ( a , b ) = ( r , b ) (a,b)=(r,b) (a,b)=(r,b),其中 a ≡ r ( m o d b ) a\equiv r\pmod{b} ar(modb)
证明:
a = m c , b = n c , ( m , n ) = 1 , a = k b + r a=mc,b=nc,(m,n)=1,a=kb+r a=mc,b=nc,(m,n)=1,a=kb+r,则 a = m c = k b + r = k n c + r ⇒ r = ( m − k n ) c a=mc=kb+r=knc+r\Rightarrow r=(m-kn)c a=mc=kb+r=knc+rr=(mkn)c
所以说现在需要证 ( ( m − k n ) c , n ) = 1 ((m-kn)c,n)=1 ((mkn)c,n)=1
使用反证法,设 m − k n = x d , n = y d , d > 1 m-kn=xd,n=yd,d>1 mkn=xd,n=yd,d>1,则有 m = x d + k n = x d + k y d = ( x + k y ) d m=xd+kn=xd+kyd=(x+ky)d m=xd+kn=xd+kyd=(x+ky)d,这样 d ∣ ( m , n ) d\mid (m,n) d(m,n),与 ( m , n ) = 1 (m,n)=1 (m,n)=1矛盾,所以原命题成立。

模板代码:__gcd(a,b)

inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
inline long long lcm(long long a, long long b) { return a / gcd(a,b) * b; }

由于 a &VeryThinSpace; m o d &VeryThinSpace; b &lt; a 2 a\bmod b&lt;\frac{a}{2} amodb<2a,每次递归后 a , b a,b a,b中间至少有一个数缩小一半,所以该算法求 g c d gcd gcd的时间复杂度为 O ( log ⁡ max ⁡ ( a , b ) ) O(\log\max(a,b)) O(logmax(a,b))

4.欧拉函数

4.1.完全剩余系

定义模m同余的所有整数构成一个剩余类。将整数划分为m个剩余类,同一个类中所有的数模m同余,来自不同剩余类的数模m不同余。
例如模3意义下可分为以下3个剩余类 { … , − 3 , 0 , 3 , 6 , … } , { … , − 2 , 1 , 4 , 7 , … } , { … , − 1 , 2 , 5 , 8 , … } \{…,-3,0,3,6,…\}, \{…,-2,1,4,7,…\}, \{…,-1,2,5,8,…\} {,3,0,3,6,},{,2,1,4,7,},{,1,2,5,8,}
记号[a]表示a所在的剩余类,例如 [ 0 ] = { … , − 3 , 0 , 3 , 6 , … } [0]= \{…,-3,0,3,6,…\} [0]={,3,0,3,6,}
对于集合S,S中所有数模m的余数构成的集合称为S在模m意义下的剩余系。如果S为全体整数,此剩余系称为完全剩余系
一般地,模m意义下的完全剩余系为 { 0 , 1 , 2 , … , m − 1 } \{0,1,2,…,m-1\} {0,1,2,,m1}
剩余系中与m互质的数的集合称为简化剩余系,或缩系

完全剩余系的性质:

  1. 对于 m m m个整数,其构成模 m m m的完系等价于其关于模 m m m两两不同余
  2. a i ( 1 ≤ i ≤ m ) a_i(1\leq i\leq m) ai(1im)构成模 m m m的完系 k , t ∈ Z , ( k , m ) = 1 k,t\in \mathbb{Z},(k,m)=1 k,tZ,(k,m)=1,则 k a i + t ka_i+t kai+t也构成模 m m m的完系。

4.2.简化剩余系

简化剩余系又称既约剩余系,缩系。
定义:剩余系中与m互质的数的集合称为简化剩余系。
性质:

  1. m m m为自然数, k , t k,t k,t为任意整数, ( k , m ) = 1 (k,m)=1 (k,m)=1,则当x属于m的简化剩余系时, k x + t m kx+tm kx+tm亦属于模 m m m的简化剩余系。
  2. m m m为自然数, k , t k,t k,t为任意整数, ( k , m ) = 1 (k,m)=1 (k,m)=1,若ai组成了模m的简化剩余系,那么 k a i + t m ka_i+tm kai+tm也组成模 m m m的简化剩余系。

4.3.正题

欧拉是一个大坏人……
在这里插入图片描述
一个数n的简化剩余系的大小记为 φ ( n ) \varphi(n) φ(n),称为欧拉函数,一个等价的定义是 n n n以内和 n n n互质的数的个数。
a &gt; 1 a&gt;1 a>1,则 a = p 1 w 1 ∗ p 2 w 2 ∗ p 3 w 3 ∗ ⋯ ∗ p m w m a={p_1}^{w_{_1}}*{p_2}^{w_{_2}}*{p_3}^{w_{_3}}*\cdots*{p_m}^{w_{_m}} a=p1w1p2w2p3w3pmwm,则 φ ( n ) = n ∏ i = 1 m ( 1 − p i ) = ∏ i = 1 m p i w i − 1 ( p i − 1 ) \varphi(n)=n\prod_{i=1}^{m}(1-p_i)=\prod_{i=1}^{m}{p_i}^{w_{_i}-1}(p_i-1) φ(n)=ni=1m(1pi)=i=1mpiwi1(pi1)
(老师说:)从表达式看出,欧拉函数是积性函数。

性质(鬼火冒):

  1. 对于质数 p p p φ ( p ) = p − 1 \varphi(p)=p−1 φ(p)=p1
  2. n &gt; 2 n&gt;2 n>2时, φ ( n ) \varphi(n) φ(n)是偶数
  3. 小于 n n n且与 n n n互质的数的总和为 φ ( n ) ∗ n 2 \varphi(n)*\frac{n}{2} φ(n)2n
  4. n = ∑ d ∣ n φ ( n ) n=\sum_{d\mid n}\varphi(n) n=dnφ(n)

4.4.计算

一般来说,我们可以根据上面的两个公式求出 φ ( n ) \varphi(n) φ(n)
公式一计算( O ( n ) O(\sqrt n) O(n )): φ ( n ) = n ∏ i = 1 m ( 1 − p i ) \varphi(n)=n\prod_{i=1}^{m}(1-p_i) φ(n)=ni=1m(1pi)

inline int phi(int n) {
    int res = n;
    for(register int i = 2; i <= sqrt(n); i++) {
        if(n % i == 0) {
            res = res / i * (i - 1);
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1) res = res / n * (n - 1);
    return res;
}

该方法适合于单个计算的情况。
公式二计算:( O ( n ) O(n) O(n))
注:此方法是基于欧拉筛的,得到 φ ( 1 ) − φ ( n ) \varphi(1)-\varphi(n) φ(1)φ(n)

const int MAXN = 100001;
bool vis[MAXN];
int phi[MAXN], pr[MAXN], tot;
inline void Euler(int n) {
    phi[1] = 1;
    for(register int i = 2; i <= n; i++) {
        if(!vis[i]) {
            pr[++tot] = i;
            phi[i] = i - 1;
        }
        for(register int j = 1; j <= tot && i * pr[j] <= n; j++) {
            vis[i * pr[j]] = 1;
            if(i % pr[j]) phi[i * pr[j]] = phi[i] * (pr[j] - 1);
            else {
                phi[i * pr[j]] = phi[i] * pr[j];
                break;
            }
        }
    }
}

5.一些定理

5.1.欧拉定理

( a , n ) = 1 , a , n ∈ Z + \mathbf{(a,n)=1,a,n\in\mathbb{Z^+}} (a,n)=1,a,nZ+,则 a φ ( n ) ≡ 1 ( m o d n ) \mathbf{a^{\varphi(n)}\equiv1\pmod{n}} aφ(n)1(modn)

证明:设 n n n的缩系为 b 1 , b 2 , ⋯ &ThinSpace; , b φ ( n ) b_1,b_2,\cdots,b_{\varphi(n)} b1,b2,,bφ(n)
都乘以 a a a,那么 a b 1 , a b 2 , ⋯ &ThinSpace; , a b φ ( n ) ab_1,ab_2,\cdots,ab_{\varphi(n)} ab1,ab2,,abφ(n)亦构成n的缩系(缩系性质二)
b 1 b 2 ⋯ b φ ( n ) ≡ a b 1 a b 2 ⋯ a b φ ( n ) ≡ a φ ( n ) b 1 b 2 ⋯ b φ ( n ) ( m o d n ) b_1b_2\cdots b_{\varphi(n)}\equiv ab_1ab_2\cdots ab_{\varphi(n)}\equiv a^{\varphi(n)} b_1b_2\cdots b_{\varphi(n)}\pmod{n} b1b2bφ(n)ab1ab2abφ(n)aφ(n)b1b2bφ(n)(modn)
由于 n n n的缩系内所有数之积与 n n n是互质的,故约去 b 1 b 2 ⋯ b φ ( n ) b_1b_2\cdots b_{\varphi(n)} b1b2bφ(n)
a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)} ≡1\pmod{n} aφ(n)1(modn)

欧拉定理也有特殊情况——那就是费马小定理。
p ∈ P , p ∤ a p\in\mathbb{P},p\nmid a pP,pa,则 a p − 1 ≡ 1 ( m o d p ) \mathbf{a^{p-1}\equiv1\pmod{p}} ap11(modp)

欧拉定理也可以用于降幂,可以得到 a b ≡ a b % φ ( m ) + φ ( m ) ( m o d m ) , b ≥ φ ( m ) \mathbf{a^b\equiv a^{b\%\varphi(m)+\varphi(m)}\pmod m,b\geq\varphi(m)} abab%φ(m)+φ(m)(modm),bφ(m)

5.2.二次探测定理

p p p是奇素数,在 p p p的缩系内解方程 x 2 ≡ 1 ( m o d p ) x^2\equiv1\pmod{p} x21(modp)
x 2 − 1 ≡ ( x + 1 ) ( x − 1 ) ≡ 0 ( m o d p ) x^2−1\equiv(x+1)(x−1)\equiv0\pmod{p} x21(x+1)(x1)0(modp)
显然有 1 1 1 p − 1 p−1 p1两个解,这两个解是唯二解。

5.3.威尔逊定理

p ∈ P ⇔ ( p − 1 ) ! ≡ − 1 ( m o d p ) p\in\mathbb{P}\Leftrightarrow(p-1)!\equiv-1\pmod{p} pP(p1)!1(modp)
证明:证明

5.4.Miller-Rabin

实在写不下去了链接
和代码

typedef long long ll;
inline ll mul(ll a, ll b, ll mod) {
    ll res = 0;
    for (; b ; a = (a + a) % mod, b >>= 1)
        if (b & 1)
            res = (res + a) % mod;
    return res;
}
inline ll ksm(ll a, ll n, ll mod) {
    ll res = 1;
    for (; n ; a = mul(a, a, mod), n >>= 1)
        if (n & 1)
            res = mul(res, a, mod);
    return res;
}
inline bool Miller_Rabin(ll n) {
    if(n == 2 ||  n == 3 ||  n == 5 ||  n == 7) return 1;
    if(n % 2 == 0|| n % 3 == 0 ||  n % 5 == 0 ||  n % 7 == 0) return 0;
    ll m = n - 1, k = 0;
    while(!(m & 1)) {
        k++; m >>= 1;
        for(register int i = 1; i <= 10; i++) {
            ll a = rand() % (n - 1) + 1;
            ll x = ksm(a, m, n); ll y;
            for(register int j = 1; j <= k; j++) {
                y = mul(x, x, n);
                if (y == 1 && x != 1 && x != n - 1)
                    return 0;
                x = y;
            }
            if(y != 1) return 0;
        }
    }
    return 1;
}

另外,进行多轮素性测试,误判率将指数级收敛。

上一篇
下一篇
回到原来的地方

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值