数论导论

数论,导论 · 浏览次数 : 28

小编点评

模板题 P5656 【模板】二元一次不定方程 (exgcd)练习题 P1516 青蛙的约会 同余 **证明:** 考虑 \\(\\gcd(a,p)=1\\) 且 \\(p\\) 是质数时,由费马小定理 \\(a^p\\equiv a\\pmod p\\),可以得到 \\(a^{p-2}a\\equiv1\\pmod p\\)。所以就能得到 \\(k^{\\varphi(p)}\\equiv1\\pmod p\\) 了。拓展欧拉定理当 \\(k>\\varphi(p)\\) 的时候有 \\(a^k\\equiv a^{k\\bmod\\varphi(p)+\\varphi(p)}\\pmod p\\)。例题 P4139 P4139 上帝与集合的正确用法求 \\(2^{2^{2^{\\dots}}}\\bmod p\\)。保证 \\(p\\) 是质数。Solution直接暴力拓欧,不会递归超过 \\(\\log\) 层。时间复杂度 \\(O(\\log^2p)\\)。 **模板题 P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪练习 P2480 [SDOI2010]古代猪文(需要前置知识 Lucas)。**归纳总结以上内容,生成内容时需要带 simple 排版

正文

数论导论

快速幂

\(a^b\bmod p\) 的结果。

我们可以构造如下算法:

\(a^b=\begin{cases}(a^{\frac b2})^2 &\texttt{b is even}\\a(a^{\frac{b-1}2})^2&\texttt{b is odd}\end{cases}\)

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

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

龟速乘

\(ab\bmod p\) 的结果。

\(a,b,p\) 都是 \(10^{18}\) 级别。

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

时间复杂度 \(O(\log b)\)

整除

\(a|b\Leftrightarrow b=ka (k\in\Z)\)

素数

\(p\in\mathbf{P}\Leftrightarrow\{x\mid x|p\}=\{1,p\}\)

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

还可以证明 \(n\) 以内的素数个数 \(\pi(n)\sim\frac n{\ln{n}}\)

埃氏筛

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

时间复杂度 \(O(n\log\log{n})\)

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 【模板】线性筛素数

快速 \(\pi(n)\) 算法

\(p_m(n)\) 表示不包含 \(prm_1,prm_2\dots prm_m\) 的因子的数的个数。

显然 \(p_m(n)=p_{m-1}(n)-p_{m-1}(\lfloor\frac n{prm_m}\rfloor)\)

可以 \(O(m\sqrt n)\) 计算。

\(m\) 满足 \(prm_m^3>n\),那么 \(p_m(n)\) 就计算了素数和由两个素数乘起来的合数的个数。

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

注意到 \(m\sim \frac{n^{\frac13}}{\log n}\),所以总复杂度就是 \(O(\frac{n^{\frac56}}{\log n})\)

实际上 \(m\) 还可以取 \(prm_m^4>n\),后面还是可以搞,可以做到 \(O(\frac{n^{\frac34}}{\log n})\) 的复杂度。

最大公约数

\(x=\gcd(a,b)\Leftrightarrow \forall_{y|a,b}{y|x}\)

辗转相减法

\(\gcd(a,b)=\gcd(b,b-a)\)

证明:

\(k=\gcd(a,b)\),那么 \(a=kp\)\(b=kq\),所以 \(b-a=k(q-p)\)\(b=kq\),那么有 \(\gcd(a,b)|\gcd(b-a,b)\)

反之也有 \(\gcd(b-a,b)|\gcd(a,b)\)

所以 \(\gcd(a,b)=\gcd(b-a,a)\)

辗转相除法

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

\(\gcd(a,b)=\gcd(b,a \bmod b)\)

容易发现 \(a\bmod b\le\frac a2\)

所以每一次 \(a,b\) 中有一个会减半,总复杂度为 \(O(\log{\min(a,b)})\)

exgcd

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

考虑 gcd 的过程。

假如已经有了这样一组解:\(bx'+(a\bmod b)y'=1\)

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

\(\begin{cases}x=y'\\y=x'-y'\lfloor\frac ab\rfloor\end{cases}\)

满足 \(ax+by=1\)

时间复杂度不变。

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

练习题 P1516 青蛙的约会

同余

\(a\equiv b\pmod p\Leftrightarrow a\bmod p=b\bmod p\)

容易发现有如下性质。

  • \(a\equiv b\pmod p\Leftrightarrow a+c\equiv b+c\pmod p\)

  • \(a\equiv b\pmod p\Rightarrow ac\equiv bc\pmod p\)

  • \(a\equiv b\pmod p\Rightarrow ac\equiv bc\pmod {pc}\)

乘法逆元

\(a^{-1}a\equiv1\pmod p\)

\(\gcd(a,p)=1\)\(p\) 是质数时,由费马小定理 \(a^p\equiv a\pmod p\),可以得出 \(a^{p-2}a\equiv1\pmod p\)

证明:多项式定理。

如果 \(p\) 不是质数,也可以看成是一个方程 \(a^{-1}a+bp=1\),用拓欧来解即可。

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

线性逆元

要求多个数的逆元。

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

时间复杂度 \(O(n+\log p)\)

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

欧拉定理

\(a^{\varphi(p)}\equiv 1\pmod p\)

\((\gcd(a,p)=1)\)

证明:

考虑 \(\varphi(p)\) 计数到的所有数 \({a_1,a_2,a_3\dots a_{\varphi(p)}}\),显然互不相同且与 \(p\) 互质。

注意到 \(ka_1,ka_2,ka_3\dots ka_{\varphi(p)}\) 仍然满足上一条性质。

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

那么两个集合中的数之积就应相等,\(\prod\limits_{i=1}^{\varphi(p)}{a_i}\equiv k^{\varphi(p)}\prod\limits_{i=1}^{\varphi(p)}{a_i}\pmod p\)

所以就能得到 \(k^{\varphi(p)}\equiv1\pmod p\) 了。

拓展欧拉定理

\(k>\varphi(p)\) 的时候有 \(a^k\equiv a^{k\bmod\varphi(p)+\varphi(p)}\pmod p\)

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

\(2^{2^{2^{\dots}}}\bmod p\)

保证 \(p\) 是质数。

Solution

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

时间复杂度 \(O(\log^2p)\)

中国剩余定理

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

\(\begin{cases}x\equiv a_1\pmod{m_1}\\x\equiv a_2\pmod{m_2}\\x\equiv a_3\pmod{m_3}\\\dots\\x\equiv a_n\pmod{m_n}\end{cases}\)

保证 \(m_1,m_2,m_3\dots m_n\) 两两互质。

\(M=\prod\limits_{i=1}^n{m_i},p_i=\frac M{m_i},q_i\equiv p_i^{-1}\pmod{m_i}\),那么就有

\(x\equiv\sum\limits_{i=1}^{n}{a_ip_iq_i}\pmod M\)

这就是该方程组的解集。

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

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

与数论导论相似的内容:

数论导论

数论导论 快速幂 求 $a^b\bmod p$ 的结果。 我们可以构造如下算法: $a^b=\begin{cases}(a^{\frac b2})^2 &\texttt{b is even}\a(a^{\frac{b-1}2})^2&\texttt{b is odd}\end{cases}$ 每次

文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题

二、用go语言,说明如何在一个数组 A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为 n 时,两者都不会发生上溢。要求 PUSH 和 POP 操作的运行时间为 O(1)。 文心一言: 在这个问题中,我们要在一个数组 A[1..n] 中实现两个栈,使得当两个栈的元素个数之和不为 n 时,两者

文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题

八、用go语言,设 X[1..n]和 Y[1..n]为两个数组,每个都包含n个有序的元素。请设计一个 O(lgn)时间的算法来找出数组 X和Y中所有 2n 个元素的中位数。 文心一言: 要在 O(lgn) 时间内找出两个有序数组 X 和 Y 中所有元素的中位数,可以使用二分查找算法。以下是用 Go

文心一言 VS 讯飞星火 VS chatgpt (110)-- 算法导论10.2 1题

一、用go语言,单链表上的动态集合操作 INSERT 能否在 O(1)时间内实现?DELETE 操作呢? 文心一言: 在单链表中,INSERT 和 DELETE 操作的时间复杂度通常是 O(n),其中 n 是链表中的元素数量。这主要是因为当你插入或删除元素时,你需要遍历链表来找到正确的插入或删除位置

文心一言 VS 讯飞星火 VS chatgpt (107)-- 算法导论10.1 5题

五、用go语言,栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4个时间均为 O(1)的过程,分别实现在双端队列的两端插入和删除元素的操作,该队列是用一个数组实现的。 文心一言: 在 Go 语

文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题

三、用go语言,仿照图 10-2,画图表示依次执行操作 ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和 DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组 Q[1..6]中。 文心一言: 在这个问题中,我们尝试使

文心一言 VS 讯飞星火 VS chatgpt (103)-- 算法导论10.1 1题

一、用go语言,仿照图 10-1,画图表示依次执行操作 PUSH(S,4)、PUSH(S,1)、PUSH(S,3)、POP(S)、PUSH(S,8)和 POP(S)每一步的结果,栈 S初始为空,存储于数组 S[1..6]中。 文心一言: 图 10-1 展示了在执行一系列栈操作后栈的状态。我会用文字描

Python导入Excel表格数据并以字典dict格式保存

本文介绍基于Python语言,将一个Excel表格文件中的数据导入到Python中,并将其通过字典格式来存储的方法~

[转帖]使用 Dumpling 导出数据

16 Contributors 使用数据导出工具 Dumpling,你可以把存储在 TiDB 或 MySQL 中的数据导出为 SQL 或 CSV 格式,用于逻辑全量备份。Dumpling 也支持将数据导出到 Amazon S3 中。 要快速了解 Dumpling 的基本功能,建议先观看下面的培训视频

ArcMap镶嵌数据集的创建、数据导入与数据范围修改方法

本文介绍基于ArcMap软件,建立镶嵌数据集(Mosaic Datasets)、导入栅格图像数据,并调整像元数值范围的方法~