数论导论

数论导论

快速幂

abmodp 的结果。

我们可以构造如下算法:

ab={(ab2)2b is evena(ab12)2b is odd

每次 b 会减半,所以时间复杂度 O(logb)

模板题P1226 【模板】快速幂||取余运算

龟速乘

abmodp 的结果。

a,b,p 都是 1018 级别。

我们同样可以构造类似的算法。

时间复杂度 O(logb)

整除

a|bb=ka(kZ)

素数

pP{xx|p}={1,p}

可以证明有无穷多个素数。

还可以证明 n 以内的素数个数 π(n)nlnn

埃氏筛

每个数筛掉倍数。一个优化就是只筛素数。

时间复杂度 O(nloglogn)

int ntp[maxn];

void ass() {
    for (int i = 2; i < maxn; i++) {
        if (ntp[i]) continue;
        for (int j = i + i; j < maxn; j += i)
            ntp[j] = 1;
    }
}

欧拉筛

还是筛倍数,但是让每个数只被最小的质因子筛到。

每个数都去和之前算出来的素数相乘来标记 ntp

如果当前素数超过了当前数的最小质因子了,那就不再用后面的素数更新了。

时间复杂度 O(n)

int tot;
int ntp[maxn];
int prm[maxn];

void ols() {
    for (int i = 2; i < maxn; i++) {
        if (!ntp[i]) prm[++tot] = i;
        for (int j = 1; j <= tot && prm[j] * i < maxn; j++) {
            ntp[i * prm[j]] = 1;
            if (i % prm[j] == 0)
                break;
        }
    }
}

模板题 P3383 【模板】线性筛素数

快速 π(n) 算法

pm(n) 表示不包含 prm1,prm2prmm 的因子的数的个数。

显然 pm(n)=pm1(n)pm1(nprmm)

可以 O(mn) 计算。

m 满足 prmm3>n,那么 pm(n) 就计算了素数和由两个素数乘起来的合数的个数。

第二个东西显然可以 O(n) 搞掉。

注意到 mn13logn,所以总复杂度就是 O(n56logn)

实际上 m 还可以取 prmm4>n,后面还是可以搞,可以做到 O(n34logn) 的复杂度。

最大公约数

x=gcd(a,b)y|a,by|x

辗转相减法

gcd(a,b)=gcd(b,ba)

证明:

k=gcd(a,b),那么 a=kpb=kq,所以 ba=k(qp)b=kq,那么有 gcd(a,b)|gcd(ba,b)

反之也有 gcd(ba,b)|gcd(a,b)

所以 gcd(a,b)=gcd(ba,a)

辗转相除法

直接多次应用上法可以得出

gcd(a,b)=gcd(b,amodb)

容易发现 amodba2

所以每一次 a,b 中有一个会减半,总复杂度为 O(logmin(a,b))

exgcd

求解方程 ax+by=1 的一组解。

考虑 gcd 的过程。

假如已经有了这样一组解:bx+(amodb)y=1

那我们可以构造出一组解:

{x=yy=xyab

满足 ax+by=1

时间复杂度不变。

模板题 P5656 【模板】二元一次不定方程 (exgcd)

练习题 P1516 青蛙的约会

同余

ab(modp)amodp=bmodp

容易发现有如下性质。

  • ab(modp)a+cb+c(modp)

  • ab(modp)acbc(modp)

  • ab(modp)acbc(modpc)

乘法逆元

a1a1(modp)

gcd(a,p)=1p 是质数时,由费马小定理 apa(modp),可以得出 ap2a1(modp)

证明:多项式定理。

如果 p 不是质数,也可以看成是一个方程 a1a+bp=1,用拓欧来解即可。

模板题 P3811 【模板】乘法逆元

线性逆元

要求多个数的逆元。

先求出前缀积,再求所有数的积的逆元,再一次往前乘就可以了。

时间复杂度 O(n+logp)

模板题 P5431 【模板】乘法逆元 2

欧拉定理

aφ(p)1(modp)

(gcd(a,p)=1)

证明:

考虑 φ(p) 计数到的所有数 a1,a2,a3aφ(p),显然互不相同且与 p 互质。

注意到 ka1,ka2,ka3kaφ(p) 仍然满足上一条性质。

显然这两个集合模意义下就必然是相同的了。

那么两个集合中的数之积就应相等,i=1φ(p)aikφ(p)i=1φ(p)ai(modp)

所以就能得到 kφ(p)1(modp) 了。

拓展欧拉定理

k>φ(p) 的时候有 akakmodφ(p)+φ(p)(modp)

例题 P4139 P4139 上帝与集合的正确用法

222modp

保证 p 是质数。

Solution

直接暴力拓欧,不会递归超过 log 层。

时间复杂度 O(log2p)

中国剩余定理

求一个同余方程组的解集:

{xa1(modm1)xa2(modm2)xa3(modm3)xan(modmn)

保证 m1,m2,m3mn 两两互质。

M=i=1nmi,pi=Mmi,qipi1(modmi),那么就有

xi=1naipiqi(modM)

这就是该方程组的解集。

模板题 P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

练习 P2480 [SDOI2010]古代猪文(需要前置知识 Lucas)

posted @   jeefy  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示