数论基础

欢迎收看大型连载电视剧——数论基础。

导读:快速幂取模、欧式筛法、裴蜀定理(贝祖定理)、威尔逊定理、费马定理、欧拉函数、欧拉定理、区间逆元(鸽一下)、(扩展)中国剩余定理、约数和定理、Lucas 定理。

快速幂取模

\(a^b \% p\)我们有时间复杂度\(O(b)\)的办法。但数据规模放大时,我们的显示界面难免会出现一个老熟人 TLE,我们需要更的方法。

根据初中数学,\(a^b\)可以化为\((a^2)^\frac{b}{2}*a^{b\%2}\),也就是我们把底数\(a\)平方一次,指数\(b\)就缩小了一半(指数\(b\)是奇数时答案要多乘一个这时的\(a\),因为\(b\)除不尽\(2\)),那么我们使\(a=a^2\)后再进行上述操作,便可使\(b\)快速缩小,在\(O(log_2 b)\)的时间求解。

CODE

ll ksm(ll a, ll b, ll p) {
    ll ans = 1;
    while (b) {
        if (b & 1)//相当于b%2==1,即b为奇数的情况
            ans *= a;
        a *= a;//将a平方
        a %= p;
        ans %= p;
        b /= 2;
    }
    return ans;
}

欧式筛法

埃式筛法已经可以做到很优秀的时间复杂度\(O(nlogn)\),但当\(n\)上升到\(10^7\)以上(参考惨痛的GDKOI2023普及组Day1的T1),我们就需要更快的做法。

先将\(2\)加入质数集合\(P\),然后从2开始枚举倍数\(a\),将倍数和我们的每一个集合\(P\)中的每一个质数相乘并打上标记。当枚举\(a\)时,\(a\)没有打上标记则\(a\)为质数,将\(a\)加入质数集合\(P\)

优化。枚举集合\(P\)中的数时,如果\(a\)\(p_i\)的倍数,则可以退出枚举集合\(P\)的循环。因为后续质数\(p_{i'}*a\)也一定是\(p_i\)的倍数,当\(a\)变大过程中,必有\(p_i*a'=p_{i'}*a\)\(p_{i'}*a\)\(p_i\)的一个倍数)。这样做可以保证每一个质数被他最小的质因子打上一次标记。

显而易见时间复杂度为\(O(n)\)

for (int i = 2; i <= n - 1; i++)
{
    if (vis[i] == 0)
        prim[++cnt] = i;
    for (int j = 1; j <= cnt; j++)
    {
        if (prim[j] * i > n)
            break;
        vis[i * prim[j]] = 1;
        if (i % prim[j] == 0)
            break;
    }
}

裴蜀定理(贝祖定理)

它不重要,但他的证明过程却被经常使用,简称:反客为主。

如果\(a\)\(b\)的最大公约数为\(d\)\(d\)整除\(c\),那么有\(ax+by=c\)

证明:

\(a'=a/d\)\(b'=b/d\),可以证明\(a'x+b'y=1\)

\[a'x-1=-b'y\\ \]

\[\frac{a'x-1}{b}=-y\\ \]

\[\frac{a'x}{b}=-y余1\\ \]

\[a'x \% b=1 \]

引理一:如果\(a\)\(b\)为正整数且\(gcd(a,b)=1\),则不存在整数\(k\)(\(0 \lt k \lt b\))使得\(k*a \% b=0\)

证明:用反证法,因为\(a*k \% b=0\),所以\(a*k\)包含了\(b\)中所有质因子。因为\(gcd(a,b)=1\),所以\(k\)\(b\)的倍数。但\(k \lt b\),所以\(k\)不为\(b\)的倍数。产生了矛盾,得证。

推论:如果\(a,b\)为正整数,\(gcd(a,b)=1\)\(0*a,1*a,2*a,...,(b-1)*a\)\(b\)各不相同。

证明:用反证法,若\(i*a \% b=j*a \% b\)\((i-j)*a \% b=0\)。因为\(0 \lt i,j \lt b\),设\(j \lt i\),则\(0 \lt i-j \lt b\),与引理一矛盾,得证。

引理二:如果\(gcd(a,b)=1\),则有且仅有一个整数\(k(k < b)\),使得\(k*a \% b=1\)

证明:根据推论\(k*a \% b\)的结果只能是集合\({0,1,...,b-1}\)中的数。又因为集合中的数个不相等且有\(b\)个,其中肯定有\(1\)个为\(1\)

根据引理二,裴蜀定理得证。

威尔逊定理

这个威尔就是逊了……

\((p-1)! \equiv -1 \mod p\),当且仅当\(p\)为质数。

证明:

先证明充分性:
\(p\)为质数\(\rightarrow (p - 1)! \equiv -1 \mod p\)

\(0 \lt i \lt p\),由裴蜀定理引理2可知\(i\)的逆元(\(1 \lt x \lt p\))具有唯一性,现在来讨论\(i^2 \equiv 1 \mod p\)

\[i^2 \% p = 1 \]

\[i^2 - k*p = 1 \]

移项得:

\[i^2 - 1 = k*p \]

根据小学的平方差公式得:

\[(i + 1) * (i - 1) = k*p \]

由于\(p\)是质数,那么\(i + 1\)\(p\)的质数或\(i - 1\)\(p\)的质数,且有\(0 \lt i \lt p\),得

\[i + 1 = p 或 i - 1 = 0 \]

\[i = p - 1 或 i = 1 \]

所以说对于\(1 \lt i \lt p - 1\)都有一个不等于自己的数字相乘模\(p\)等于\(1\),那么由模的基本性质可得\(1 * 2 * 3 * … * (p - 1) = 1 * (p - 1) \equiv p - 1 \mod p\)

\(p - 1 \equiv -1 \mod p\)

充分性得证。

再证明必要性:
\((p - 1)! \equiv -1 \mod p \rightarrow\)\(p\)为质数。

即证\(p\)不为质数\(\rightarrow (p - 1)! \equiv i (i \neq 1) \mod p\)

如果\(p\)不是质数那么\(p\)的每一个因子都小于\(p\),设\(i(1 \lt i \lt p)\)\(p\)的因数。

若有\(i * i \neq p\),那么\((p - 1)! \equiv 0 \mod p\)

若有\(i * i = p\),那么\((p - 1)! \mod p\)必为\(i\)的倍数。

必要性得证。

费马定理

你可能会求逆元,但你可能不知道,求逆元的原理是它……

\(p\)为质数,且\(a \% p \neq 0\),那么\(a^{p-1} \equiv 1 \mod p\)

证明:

\[(a * 1) * (a * 2) * (a * 3) * … * (p - 1) \% p = a ^ {p - 1} * (p - 1)! \% p \]

又因为:
\(p\)为质数,根据裴蜀定理推论,得\((a * 1) \% p,(a * 2) \% p,…,(a * (p - 1)) \% p\)结果互不相等,且\(1\lt a*i\%p \lt p\),所以:

\[(a * 1) * (a * 2) * (a * 3) * … * (p - 1) \% p = (p - 1)! \% p \]

由我们上面的结论可知:

\[(p - 1)! \% p = a ^ {p - 1} * (p - 1)! \% p \]

由威尔逊定理得

\[(p - 1) \% p = a ^ {p - 1} * (p - 1) \% p \]

因为\(p - 1\)\(p\)互质,等式两边同时除以\(p - 1\),得

\[1 \% p = a ^ {p - 1} \% p \]

费马定理得证。

该定理多用于求一个数关于质数的逆元。

欧拉函数

乌拉

前置任务积性函数

定义:
积性函数指对于所有互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数。——百度百科

基本性质:

1.有\(f(n)=\prod\limits_i f(p_i^{a_i})\)

\(p_i\)为质数,\(a_i\)为自然数。

2.若\(f(n)=\prod\limits_i f^{a_i}(p_i)\)则该函数为完全积性函数。

欧拉函数就是一个kun积性函数,证明什么的就算了

对于一个正整数\(n\)\(n\)的欧拉函数记为\(\phi(n)\),表示不超过\(n\)且与\(n\)互质的数的个数。

\(\phi(1)=1\)

  • 1.若\(n\)为质数,则\(\phi(n)=n-1\)

  • 2.若有\(n=a^p\),那么\(\phi(n)=a^p*(1-\frac{1}{a})\)

其中\(n\)为质数,\(p\)为正整数。

证明:由于\(n\)为一个质数的若干次方,那么与\(n\)不互质的数(小于等于\(n\))肯定是\(a\)的倍数,即\(a,2*a,3*a,\cdots,a*a^p-1\),共\(a^p-1\)个。

那么\(\phi(n)=a^p-a^{p-1}=a^{p-1}*(a-1)=a^p*\frac{a-1}{a}=a^p*(1+\frac{1}{a})\)

  • 3.令\(n=a_1^{p_1}a_2^{p_2} \cdots a_k^{p_k}\),根据积性函数的性质

\[\phi(n)=\prod\limits_{i=1}^{k}\phi(a_i^{p_i}) \\ \]

\[\phi(n)=\prod\limits_{i=1}^{k}a_i^{p_i}*(1-\frac{1}{a_i}) \\ \]

\[\phi(n)=n*\prod\limits_{i=1}^{k}(1-\frac{1}{a_i}) \]

该方法即可快速求出一个数的欧拉函数。

欧拉定理

乌拉,哔~

\(r\)\(m\)互质,则\(r^{\phi(m)} \equiv 1 \mod m\)

证明:

引理1:设\(p\)的简化剩余系为\(p_1,p_2,\cdots,p_k\),则\(r*p_1\%p ,r*p_2\%p,\cdots,r*p_k\%p\)也构成\(p\)的简化剩余系。

首先根据裴蜀定理推论\(r*p_1\%p ,r*p_2\%p,\cdots,r*p_k\%p\)两两不同,再证明他们模\(m\)后与\(m\)互质。

\(rp_i\)是这\(\phi(m)\)个数中的任意一个。设\(rp_i \equiv x \mod m\)\(gcd(x,m) \neq 1\)

\(rp_i=km+x\),令\(d=gcd(x,m)\),则\(d|x\)\(d|m\),所以\(d|rp_i\),因为\(r\)\(m\)互质,\(p_i\)\(m\)互质,所以\(rp_i\)\(m\)互质,所以\(d\)只能等于\(1\)

引理1得证。

根据引理1,得:

\[(a*p_1)*(a*p_2)* \cdots*(a*p_k) \equiv p_1*p_2*\cdots*p_k \mod m \]

化简,得

\[a^{\phi(m)} \equiv 1 \mod m \]

\(m\)为质数时,该定理上升为费马定理。

区间逆元

faster的逆元求法。

如果用费马定理,或者乌拉欧拉定理求逆元需要\(\log_n\)的时间复杂度,放到区间里,将会造成\(n\log_n\)的时间复杂度,但总有一些呼吸都是浪费氧气,火葬都污染环境的出题人想要把\(log_n\)卡掉,于是我们的数论里就多了它……

设模数为 \(p\)\(i^{-1}\)\(i\) 关于 \(p\) 的逆元.

由于 \(1^{-1}=1\),所以我们由此向后递推。

\(k=\lfloor \frac{p}{i} \rfloor\)\(j=p \mod i\),有 \(p=ki+j\)

那么 \(ki+j\equiv 0 \mod p\)

两边同时乘以 \(i^{-1}\times j^{-1}\)

\(kj^{-1}+i^{-1}\equiv 0 \mod p\)

\(i^{-1}\equiv -kj^{-1} \mod p\)

\(k,j\) 代入,得 \(i^{-1}\equiv -\lfloor \frac{p}{i} \rfloor (p \mod i)^{-1}\)

由于递推求逆(\(p\mod i<i\)),此时 \((p\mod i)^{-1}\) 已经求出,故可以求出 \(i^{-1}\)

inv[1]=1;
for(int i=2;i<=n;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;

中国剩余定理(CRT)

扩展欧几里得后面再补

方程思想是数学中很麻烦重要的思想,如果我们有一些同余的等式,那么我们可以列出如下的同余方程。

\[\begin{cases} a \equiv b_1 \mod r_1 \\ a \equiv b_2 \mod r_2 \\ a \equiv b_3 \mod r_3 \\ \cdots \\ a \equiv b_n \mod r_n \\ \end{cases} \]

CRT是解决这种方程组在\(r_1,r_2,\cdots,r_n\)互质的模线性方程组。

因为\(r_1,r_2,\cdots,r_n\)互质,令\(A_i=r_1*r_2*\cdots*r_{i-1}*r{i+1}*r{i+2}*\cdots*r_n\),即\(A_i=\prod\limits_{j \neq i} r_j\),则\(A_i\)\(r_i\)互质。

根据裴蜀定理引理2,存在 \(c_i\) 使得 \(c_i*A_i \equiv 1 \mod r_i\),则设\(x_i=c_i*A_i*b_i\),易得 \(x_i \equiv b_i \mod r_i\),而 \(A_i\) 可以被其他的 \(r_i\) 整除,所以 \(x_i \equiv 0 \mod r_j \quad(j \neq i)\)

那么易得 \((x_i+x_j) \equiv b_i \mod r_i\)\((x_i+x_j) \equiv b_j \mod r_j\)

易证 \(\sum\limits_{i=1}^{n}x_i\) 满足每一个方程,那么 \(x=\sum\limits_{i=1}^{n}x_i=\sum\limits_{i=1}^{n}A_i*c_i*b_i\)

对于 \(x\),如果加上所有 \(r_i\) 的公倍数,那么 \(x\) 依然满足条件。

即通解为 \(x=\sum\limits_{i=1}^{n}A_i*c_i*b_i+p*\prod\limits_{i=1}^{n}r_i\)

其中 \(p\) 为任意整数。

扩展中国剩余定理

由于这个世界上总有一些奇思妙想,所以它扩展了……

还是那个熟悉的方程组

\[\begin{cases} a \equiv b_1 \mod r_1 \\ a \equiv b_2 \mod r_2 \\ a \equiv b_3 \mod r_3 \\ \cdots \\ a \equiv b_n \mod r_n \\ \end{cases} \]

但今天\(r_i\)不互质……

先取前2个方程:

\[a = k * r_1 + b_1 = p * r_2 + b_2 \]

移项得:

\[k * r_1 - p * r_2 = b_2 - b_1 \]

这个不定方程可以使用扩展欧几里得算法求出,当扩展欧几里得无法求出该方程解时,方程组无解。

若我们求出 \(k\) 的一个特解为\(k_0\),满足 \(k_0 * r_1 - p * r_2 = b_2 - b_1\)。那么 \(k\) 的通解为 \(k = k_0 + b * (r_2 / gcd(r_1,r_2))\)

其中 \(b\) 为任意整数,gcd 为最大公约数。

\(k\) 代入方程组 \(x = k * r + b_1\) 中,得

\[x = k_0 * r_1 + b * (r_2 / gcd(r_1,r_2)) * r_1 + b_1 \]

由于 \(r_1 * r_2 / gcd(r_1,r_2) = lcm(r1,r_2)\),得

\[x = k_0 * r_1 + b * lcm(r_1,r_2) + b_1 \]

其中 lcm 为最小公倍数。

同时模 \(lcm(r_1,r_2)\),得

\[x \equiv k_0 * r_1 + b_1 \mod lcm(r_1,r_2) \]

我们在将这个新方程合并到原方程组,最后求出的\(x\)就是符合条件的答案。

约数和定理

对于一个数 \(n\) 来说,根据整数唯一分解定理,设

\[n=p_1^{r_1}*p_2^{r_2}*p_3^{r_3}*\cdots*p_k^{r_k} \]

对于第 \(i\) 个质因子,我们可以取 \(r_i+1\)\(p_i\)

又有 \(k\) 个质因子可取,根据乘法原理可得:

\[d[n]=(r_1+1)*(r_2+1)*(r_3+1)*\cdots*(r_k+1) \]

\(d[n]\)\(n\) 的质因子个数。

如何线性求一段数的约数给数?

考虑使用线性筛(欧拉筛)。

分类讨论:

1.若 \(i\) 为质数

\[d[i]=2; \]

约数仅为 \(i\)\(1\)

2.若 \(i\) 为合数

  • 2.1若 \(i\) 的最小质因子为 \(p_j\)
    由于 \(\frac{i}{p_j}\leq i\) 且为整数。

由于递推求 \(d\),所以 \(d[\frac{i}{p_j}]\) 已求出。

\(\frac{i}{p_j}\) 的最小质因子为 \(num[\frac{i}{p_j}]\)。则易得:

\[d[i]=d[\frac{i}{p_j}]/(num[\frac{i}{p_j}]+1)*(num[\frac{i}{p_j}]+2) \]

上式可以由 \(d[i]\)\(d[\frac{i}{p_j}]\) 化简得来。

同时需要维护\(num[i]=num[\frac{i}{p_j}]+1\)

ps:特别的:\(i\) 为质数时 \(num[i]=1\)

  • 2.2若 \(i\) 的最小质因子不为 \(p_j\)

那么 \(i*p_j\) 的最小质因子为 \(p_j\),则易得:

\[num[i*p_j]=1\\ d[i*p_j]=d[i]*(num[i*p_j]+1); \]

使用线性筛即可快速求出。

void Gt()
{
    d[1]=1;
    for(int i=2;i<=maxn-5;i++)
    {
        if(!vis[i])
        {
            cnt++;
            p[cnt]=i;
            d[i]=2;
            num[i]=1;
        }
        for(int j=1;j<=cnt&&p[j]*i<=maxn-5;j++)
        {
            vis[p[j]*i]=true;
            if(i%p[j]==0)
            {
                d[i*p[j]]=d[i]/(num[i]+1)*(num[i]+2);
                num[i*p[j]]=num[i]+1;
                break;
            }
            else
            {
                d[i*p[j]]=d[i]*2;
                num[i*p[j]]=1;
            }
        }
    }
}

Lucas 定理

先放结论:

\[C_a^b \equiv C_{\lfloor \frac{a}{p} \rfloor}^{\lfloor \frac{b}{p} \rfloor} \cdot C_{a \mod p}^{b \mod p} \mod p \]

先证明 \(C_p^i \equiv \frac{p}{i}C_{p-1}^{i-1} \equiv 0 \mod p\)

\[C_p^i=\frac{p!}{i!(p-i)!}=\frac{p}{i} \cdot \frac{(p-1)!}{(i-1)!(p-i)!}=\frac{p}{i}C_{p-1}^{i-1} \]

得证。

考虑二项式定理,易得:

\[(1+x)^p \equiv C_p^0+C_{p}^1x+C_{p}^2x^2+\cdots+C_p^px^p \equiv 1+x^p \mod p \]

Ps:除去 \(C_p^p=1\) 以外,其他的项都被模为 \(0\)

此时,令 \(a=lp+r,b=sp+j\)

求证 \(C_a^b \equiv C_l^s\cdot C_r^j \mod p\)

接着剥削二项式

\[(1+x)^a=(1+x)^{lp}(1+x)^r \]

展开 \((1+x)^{lp}\)

\[(1+x)^{lp} \equiv ((1+x)^p)^l \equiv (1+x^p)^l \mod p \]

\[\therefore (1+x)^a \equiv (1+x^p)^l(1+x)^r \mod p \]

通过上式,观察 \(x^b\) 项。

\[\because C_a^b x^b \equiv C_l^sx^{sp}\cdot C_r^jx^j \mod p \\ \]

\[\therefore C_a^b x^b \equiv C_l^sC_r^jx^b \mod p \\ \]

\[\therefore C_a^b \equiv C_{\lfloor \frac{a}{p} \rfloor}^{\lfloor \frac{b}{p} \rfloor} \cdot C_{a \mod p}^{b \mod p} \mod p \]

Ps:左边是直接二项式的 \(x^b\) 项,右边是二项式 \((1+x^p)^l\)\(x^{sp}\)\((1+x)^r\)\(x^j\) 项。

posted @ 2023-07-05 10:36  彬彬冰激凌  阅读(43)  评论(0)    收藏  举报