数论基础

考试发现逆元不会,所以决定还是学一下数论把

先来搞清几个概念(from:hzwer)

同除和同余

假设 (m)(n) 是整数,且 (m) 不是 (0),则 m 整除 (n) 指的是 (n)(m) 的倍
数,即存在整数 (k),使得 (n = mk)

• 记为 (m | n)
• 称 (m)(n) 的一个约数

同余并记

如果 (m) 整除 (a - b),我们就说 (a)(b)(m) 同余并记
(a ≡ b (mod m))

素数

如果一个数 (x),没有 (1)(x) 以外的数是 (x) 的约数,称 (x) 是素数(质
数)

• 比如 2,3,5,7,11 …

eg:

证明素数有无穷多个?

假设素数是有限的,假设素数只有有限的n个,最⼤的⼀个素
数是(p)

(q)为所有素数之积加上(1),那么,(q =(2×3×5×…×p) + 1)
能被所有素数整除,我们找到了一个更大的素数

素数唯一分解

若整数 (N ≥ 2),那么 (N) 一定可以唯一地表示为若干个素数的乘积。
形如
(N) (=) (p_1^{r_1}*p_2^{r_2}*…p_k^{r_k}) ((p_i) 为素数 , (r_i) ≥ 0)

最大公约数

• 两个不同时为 (0) 的数 (a)(b) 的最大公因数是同时整除它们的两个最大
的数,记为 (gcd( a , b ))
• 如果 (gcd( a , b ) = 1),我们称它们互质。
• 比如 (gcd( 16 , 24 ) = 8)

快速幂 ab

• 预处理 (a_1~a_2~a_4~…~a_2n),对 (b) 做二进制拆分
• 如 (a^{21} = a^{16} * a^{4} * a^{1})

逆元(倒数

逆元的引入是为了解决在同余意义下,无法进行除法的问题 !
也就是解决 (a / b % m) 情况

在模 (p) 意义下,(x) 的乘法逆元 (x^{p-1}) 满足如下同余方程:
(x * x^{-1} ≡ 1 (mod p))

eg:

(15 / 3 = 5 (mod 7) => (15 mod 7) * (3^{-1}) mod 7)

求逆元??

我们有:

(inv(x)⋅x ≡ 1 (mod p))

又据费马小定理:(x^{p-1} ≡ 1 (mod p))

故有:(inv(x)⋅x ≡ x^{p-1}(mod p))

两边同时除以 (x) 有:

(inv(x) ≡ x^{p-2}(mod p))

这就是模质数意义下的逆元求法

代码实现

int qmi(int a,int k,int p)
{
    int res=1%p;
    while(k)
    {
        if(k & 1)res=(ll)res*a%p;
        a=(ll)a*a%p;
        k>>=1;
    }
    return res;

}
原文地址:https://www.cnblogs.com/Arielzz/p/14038860.html