数论基础

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

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

快速幂取模

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

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

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上升到107以上(参考惨痛的GDKOI2023普及组Day1的T1),我们就需要更快的做法。

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

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

显而易见时间复杂度为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;
    }
}

裴蜀定理(贝祖定理)

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

如果ab的最大公约数为dd整除c,那么有ax+by=c

证明:

a=a/db=b/d,可以证明ax+by=1

ax1=by

ax1b=y

axb=y1

ax%b=1

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

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

推论:如果a,b为正整数,gcd(a,b)=10a,1a,2a,...,(b1)ab各不相同。

证明:用反证法,若ia%b=ja%b(ij)a%b=0。因为0<i,j<b,设j<i,则0<ij<b,与引理一矛盾,得证。

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

证明:根据推论ka%b的结果只能是集合0,1,...,b1中的数。又因为集合中的数个不相等且有b个,其中肯定有1个为1

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

威尔逊定理

这个威尔就是逊了……

(p1)!1modp,当且仅当p为质数。

证明:

先证明充分性:
p为质数(p1)!1modp

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

i2%p=1

i2kp=1

移项得:

i21=kp

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

(i+1)(i1)=kp

由于p是质数,那么i+1p的质数或i1p的质数,且有0<i<p,得

i+1=pi1=0

i=p1i=1

所以说对于1<i<p1都有一个不等于自己的数字相乘模p等于1,那么由模的基本性质可得123(p1)=1(p1)p1modp

p11modp

充分性得证。

再证明必要性:
(p1)!1modpp为质数。

即证p不为质数(p1)!i(i1)modp

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

若有iip,那么(p1)!0modp

若有ii=p,那么(p1)!modp必为i的倍数。

必要性得证。

费马定理

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

p为质数,且a%p0,那么ap11modp

证明:

(a1)(a2)(a3)(p1)%p=ap1(p1)!%p

又因为:
p为质数,根据裴蜀定理推论,得(a1)%p,(a2)%p,,(a(p1))%p结果互不相等,且1<ai%p<p,所以:

(a1)(a2)(a3)(p1)%p=(p1)!%p

由我们上面的结论可知:

(p1)!%p=ap1(p1)!%p

由威尔逊定理得

(p1)%p=ap1(p1)%p

因为p1p互质,等式两边同时除以p1,得

1%p=ap1%p

费马定理得证。

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

欧拉函数

乌拉

前置任务积性函数

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

基本性质:

1.有f(n)=if(piai)

pi为质数,ai为自然数。

2.若f(n)=ifai(pi)则该函数为完全积性函数。

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

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

ϕ(1)=1

  • 1.若n为质数,则ϕ(n)=n1

  • 2.若有n=ap,那么ϕ(n)=ap(11a)

其中n为质数,p为正整数。

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

那么ϕ(n)=apap1=ap1(a1)=apa1a=ap(1+1a)

  • 3.令n=a1p1a2p2akpk,根据积性函数的性质

ϕ(n)=i=1kϕ(aipi)

ϕ(n)=i=1kaipi(11ai)

ϕ(n)=ni=1k(11ai)

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

欧拉定理

乌拉,哔~

rm互质,则rϕ(m)1modm

证明:

引理1:设p的简化剩余系为p1,p2,,pk,则rp1%p,rp2%p,,rpk%p也构成p的简化剩余系。

首先根据裴蜀定理推论rp1%p,rp2%p,,rpk%p两两不同,再证明他们模m后与m互质。

rpi是这ϕ(m)个数中的任意一个。设rpixmodmgcd(x,m)1

rpi=km+x,令d=gcd(x,m),则d|xd|m,所以d|rpi,因为rm互质,pim互质,所以rpim互质,所以d只能等于1

引理1得证。

根据引理1,得:

(ap1)(ap2)(apk)p1p2pkmodm

化简,得

aϕ(m)1modm

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

区间逆元

faster的逆元求法。

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

设模数为 pi1i 关于 p 的逆元.

由于 11=1,所以我们由此向后递推。

k=pij=pmodi,有 p=ki+j

那么 ki+j0modp

两边同时乘以 i1×j1

kj1+i10modp

i1kj1modp

k,j 代入,得 i1pi(pmodi)1

由于递推求逆(pmodi<i),此时 (pmodi)1 已经求出,故可以求出 i1

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

中国剩余定理(CRT)

扩展欧几里得后面再补

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

{ab1modr1ab2modr2ab3modr3abnmodrn

CRT是解决这种方程组在r1,r2,,rn互质的模线性方程组。

因为r1,r2,,rn互质,令Ai=r1r2ri1ri+1ri+2rn,即Ai=jirj,则Airi互质。

根据裴蜀定理引理2,存在 ci 使得 ciAi1modri,则设xi=ciAibi,易得 xibimodri,而 Ai 可以被其他的 ri 整除,所以 xi0modrj(ji)

那么易得 (xi+xj)bimodri(xi+xj)bjmodrj

易证 i=1nxi 满足每一个方程,那么 x=i=1nxi=i=1nAicibi

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

即通解为 x=i=1nAicibi+pi=1nri

其中 p 为任意整数。

扩展中国剩余定理

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

还是那个熟悉的方程组

{ab1modr1ab2modr2ab3modr3abnmodrn

但今天ri不互质……

先取前2个方程:

a=kr1+b1=pr2+b2

移项得:

kr1pr2=b2b1

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

若我们求出 k 的一个特解为k0,满足 k0r1pr2=b2b1。那么 k 的通解为 k=k0+b(r2/gcd(r1,r2))

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

k 代入方程组 x=kr+b1 中,得

x=k0r1+b(r2/gcd(r1,r2))r1+b1

由于 r1r2/gcd(r1,r2)=lcm(r1,r2),得

x=k0r1+blcm(r1,r2)+b1

其中 lcm 为最小公倍数。

同时模 lcm(r1,r2),得

xk0r1+b1modlcm(r1,r2)

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

约数和定理

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

n=p1r1p2r2p3r3pkrk

对于第 i 个质因子,我们可以取 ri+1pi

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

d[n]=(r1+1)(r2+1)(r3+1)(rk+1)

d[n]n 的质因子个数。

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

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

分类讨论:

1.若 i 为质数

d[i]=2;

约数仅为 i1

2.若 i 为合数

  • 2.1若 i 的最小质因子为 pj
    由于 ipji 且为整数。

由于递推求 d,所以 d[ipj] 已求出。

ipj 的最小质因子为 num[ipj]。则易得:

d[i]=d[ipj]/(num[ipj]+1)(num[ipj]+2)

上式可以由 d[i]d[ipj] 化简得来。

同时需要维护num[i]=num[ipj]+1

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

  • 2.2若 i 的最小质因子不为 pj

那么 ipj 的最小质因子为 pj,则易得:

num[ipj]=1d[ipj]=d[i](num[ipj]+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 定理

先放结论:

CabCapbpCamodpbmodpmodp

先证明 CpipiCp1i10modp

Cpi=p!i!(pi)!=pi(p1)!(i1)!(pi)!=piCp1i1

得证。

考虑二项式定理,易得:

(1+x)pCp0+Cp1x+Cp2x2++Cppxp1+xpmodp

Ps:除去 Cpp=1 以外,其他的项都被模为 0

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

求证 CabClsCrjmodp

接着剥削二项式

(1+x)a=(1+x)lp(1+x)r

展开 (1+x)lp

(1+x)lp((1+x)p)l(1+xp)lmodp

(1+x)a(1+xp)l(1+x)rmodp

通过上式,观察 xb 项。

CabxbClsxspCrjxjmodp

CabxbClsCrjxbmodp

CabCapbpCamodpbmodpmodp

Ps:左边是直接二项式的 xb 项,右边是二项式 (1+xp)lxsp(1+x)rxj 项。

posted @   彬彬冰激凌  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示