【持续更新】【专题】初等数论

news/2025/3/12 0:41:21/文章来源:https://www.cnblogs.com/FrankWKD/p/18693084

【持续更新】【专题】初等数论

Designed By:FrankWkd 【100%原创】【禁止搬运】
Updated at 2025.01.26

前言:

  • 主要从线性筛开始速通初等数论
  • 尽可能的多证明结论而不是阐述结论。如果你只是想回顾结论,请看其他人的 \(Blog\) .

一、基础概念

  • 整除:对于两个正整数 \(a,b\), 存在一个数 \(k\) ,使得 \(a=bk\),则称 \(b\) 整除 \(a\).记作 \(b\ |\ a\).
  • 带余除法:对于两个正整数 \(a,b\), 存在两个数 \(k,r\) ,使得 \(a=bk+r\),则称 \(b\)\(a\)\(k\)\(r\).(\(b\div a=k\dots r\))
  • 因数:能整除一个数的数被称为这个数的因数.
  • 公因数:两个数共同具有的因数被称为这两个数的公因数。
  • 质数:只有 \(1\) 喝和它本身的数被称为质数。\(2\) 是质数。
  • 质因子:一个数的质因数(既是它的因数也是质数的数)被称为质因子。
  • 算术基本定理:一个数能表示成其若干个质因数的乘积(类似于分解质因数的逆运算)。

二、基础算法

  • 因数分解:分解出正整数 \(x\) 的所有因子。
    • 复杂度:\(O(\sqrt n)\)
  • 埃氏筛:快速筛出 \(1-n\) 中所有的素数。
    • 复杂度:\(O(nloglogn)\)
  • 质因数分解:快速分解出 \(n\) 的所有质因子。
    • 复杂度:\(O(\sqrt{n})\)
  • 欧几里得算法:快速求出两个数 \(a,b\) 的最小公约数( \(gcd\) ).
    • 核心公式:\(gcd(a,b)=gcd(b,a\ mod\ b)\).

三、Euler欧拉筛(线性筛)

关于线性筛

  • 一种基于埃氏筛的高效筛法。
  • 时间复杂度 \(O(n)\)
  • 保证每一个素数只被其最小质因子筛除。
  • 每个素数只是被筛除一次。
    让我们一个一个地证明这些结论:

证明

注:请结合代码理解。

void getprime() {for (int i = 2; i <= n; i++) {if (!vis[i]) p[++k] = i;//k为素数个数for (int j = 1; j <= k and i * p[j] <= n; j++) {vis[i * p[j]] = 1;if (i % p[j] == 0) break;}}
}
    1. 为什么这样写呢?怎么保证每个合数都被无遗漏地筛除呢?
    • 设一合数为 \(x\) ,因为它是合数,所以它一定能表示为 \(x=pi\) 的形式(一个合数可以分解成两个数的乘积)。
    • 我们令 \(p\)\(x\) 的最小质因子。
    • 现在请看代码,可知:当 \(i\ mod\ p=0\) 时循环立即中断。通俗的理解就是:当 \(i\)\(p\) 的倍数时,循环直接 \(break\).
    • 那么,让我们回归到程序,第二层循环遍历的是所有已经筛出来的质数,由程序可得:只要有一个数符合循环 \(break\) 的标准,循环就中断了。
    • 符合循环 \(break\) 标准的质数肯定是一个小于 \(p\)\(i\) 因数的质数,对吧?
    • 既然这个数是 \(i\) ,的质因子,\(i\) 又是 \(x\) 的因子,这个数就是 \(x\) 的质因子。
    • 因为 \(p\)\(x\) 的最小质因子,没有比它更小的质因子了,所以第二层循环中不可能再出现比 \(p\) 小而且是 \(x\) 的质因子的数了。
    • 所以 \(x\) 一定能被筛到。
    • 得证(反证法,不是特别严谨,有问题或疑问请评论或私信)。
    1. 那又如何保证每一个数只被其最小质因子筛一次呢?
    • 我们设将要被筛除的合数为 \(x\) ,将其分解为 \(x=py=qz\) 的形式。
    • 其中,\(p\)\(x\) 的最小质因子,\(q\)\(x\) 的另一个质因子(比 \(p\) 大)
    • 接下来让我们再次分解: \(x=pqk\)\(p,q\) 就是上面的 \(p,q\)\(k\) 为使得上面式子成立的数.
    • 那么现在有:

    \[x=p(qk) \]

    \[x=q(pk) \]

    • 我们设 \(y=qk\), \(z=pk\), 我们不难得到:\(z\) 中一定含有质因子 \(p\) 。而且 \(p<q\)
    • \(i\) 枚举到 \(z\)\(j\) 枚举到 \(p\) 时,\(i\ mod\ j=0\) 会先一步成立,所以 \(j\) 不会再往下面枚举到 \(q\) ,从而避免了枚举到 \(py=x\) 之后又枚举到 \(qz=x\) ,造成重复计算.而且每个合数仅仅被其最小质因子(也就是 \(p\))筛除.
    • 让我们举个栗子:
        1. 要筛除的合数 \(x\)\(35\)
        1. 最小质因子 \(p\)\(5\)
        1. 质因子 \(q\)\(7\)
        1. \(35\) 可以写成 \(35=5*7=7*5(x=py=qz)\) 的形式。
        1. \(35\) 还可以写成 \(35=5*7*1(x=pqk)\) 的形式。
        1. 由第五步中的式子转化为:\(35=5*(7*1)=7*(5*1)(x=py=qz)\) 的形式。
        1. 由第四步可知:\(y=7,z=5\).
        1. 由第六步可知:\(y=7*1,z=5*1\).
        1. 那么,\(z\) 中含有 \(p\) 的时候就会 \(break\),刚好是在筛出 \(35\) 这个合数之后,以保证不会再往下筛,从而避免一个数被筛多次的情况。
    1. 为什么复杂度是线性( \(O(n)\) )的?
    • 因为每个质数只会被记录一次,每个合数只是会被筛除一次,但是埃氏筛会将每个合数筛 \(loglogn\) 次( \(O(nloglogn)\) ),这就是欧拉筛(线性筛)为什么复杂度是 \(O(n)\) 的原因。

例题:

    • 题面描述:\(T\) 组数据。每次给定一个整数 \(n\),求 \(n\) 所有质因子的按位异或和.
    • 数据范围:\(1\le T\le 10^5,2\le N\le 10^8\)
    • 思路:如果每次把 n 都除以自己的最小质因子,那么可以 \(O(log n)\) 完成一次质因子分解。
      如何求出最小质因子?
      在线性筛的时候,每个数都被自己的最小质因子筛掉。所以我们只要在当一个数被筛的时候记录筛掉它的数即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e8 + 5;
bitset <N> vis;
int mn[N];
int p[N / 10];
void getprime() {for (int i = 2; i <= n; i++) {if (!vis[i])p[++k] = i, mn[i] = i;for (int j = 1; j <= k && i * p[j] <= n; j++) {vis[i * p[j]] = 1;mn[i * p[j]] = p[j];if (i % p[j] == 0)break;}}
}
int main() {int T, n;cin >> T;while (T--) {cin >> n;int ans = 0;while (n > 0) ans ^= nm[n], n /= nm[n];cout << ans << '\n';}
}

四、欧几里得定理及其扩展&裴蜀定理

欧几里得定理(\(gcd\)

定理

  • 先放定理:设 \(a,b\) 是两个整数,且 \(b \neq 0\),则 \(gcd(a,b)=gcd(b,a\ mod\ b)\)
  • 时间复杂度:\(O(log\ min(a,b))\)

前置知识

  • 模运算( \(\%\) ): 相信你学习到这里已经掌握了几乎所有模运算性质,这里我们只需使用到一个,即:
    • \[a\ mod\ b=a-\left \lfloor \frac{a}{b} \right \rfloor \times b \]

    • \[a=a\ mod\ b+\left \lfloor \frac{a}{b} \right \rfloor \times b \]

    • 为什么是这样呢?
    • 这里的 \(\left \lfloor \frac{a}{b} \right \rfloor\) 就是 \(a\div b\) 所得的整数商。将 \(a\) 减去这个值所得的就是 \(a\div b\) 所得的余数。也就是 \(a\ mod\ b\)
    • 我们举例说明:
      • \[10\%3=10-\left \lfloor \frac{10}{3} \right \rfloor \times 3 \]

      • \[10=10\%3(余数部分)+\left \lfloor \frac{10}{3} \right \rfloor \times 3(整数商) \]

证明

下面开始证明(汗流浃背

  • \(d=gcd(a,b)\) ,则 \(d\) 能整除 \(a,b\), 即:
    • \[d|a\ \ d|b \]

  • 可以写成:
    • \[a=k_1d,b=k_2d\ (k_1,k_2\in \mathbb {Z(整数)}) \]

  • 根据前置知识,\(a\%b\) 可以写成:
    • \[a\%b=a-\left \lfloor \frac{a}{b} \right \rfloor \times b \]

  • \(a=k_1d,b=k_2d\) 带入得:
    • \[a\%b=k_1d-\left \lfloor \frac{k_1d}{k_2d} \right \rfloor \times k_2d \]

  • 根据分数线的性质消元得:
    • \[a\%b=k_1d-\left \lfloor \frac{k_1}{k_2} \right \rfloor \times k_2d \]

  • \(q=\left \lfloor \frac{k_1}{k_2} \right \rfloor\) ,并将其带入得:
    • \[a\%b=k_1d-qk_2d \]

  • 提出公因数 \(d\) 可得:
    • \[a\%b=(k_1-qk_2)d \]

  • 因为 \(k_1,k_2\) 被定义为整数,且 \(q\) 已经经过了向下取整,所以 \(q\) 也是整数,故 \(k_1+qk_2\) 也是整数。
  • 立得: \(d\) 整除 \(a\ mod\ b\) .
  • 所以 \(d\) 既是 \(a,b\) 的最大公约数,也是 \(b,a\ mod\ b\) 的公约数。
  • 反过来,设 \(d'=gcd(b,a\ mod\ b)\), 则 \(d'\) 整除 \(b,a\ mod\ b\) .
  • 由前置知识得: \(a=a\ mod\ b+\left \lfloor \frac{a}{b} \right \rfloor \times b\)
    • 因为: \(d'\) 整除 \(a\ mod\ b,b\)
    • 所以: \(d'\) 整除 \(a\ mod\ b,\left \lfloor \frac{a}{b} \right \rfloor \times b\)
    • 所以 \(d'|a\). (\(d'\) 整除 \(a\)).
  • 所以:\(d'\) 整除 \(a,b\) .
  • 整合
    • 因为 \(d\)\(a,b\)最大公因数,而 \(d'\) 只是 \(a,b\) 的公因数,不难得到:\(d'\le d\)
    • 因为 \(d'\)\(b,a\ mod\ b\)最大公因数,而 \(d\) 只是 \(b,a\ mod\ b\) 的公因数,不难得到:\(d\le d'\)
  • 综上所述:
    • \[\left\{\begin{matrix}d\le d'\\d'\le d\end{matrix}\right. \]

    • 该方程的解为:\(d=d'\)
  • 即:
    • \[gcd(a,b)=gcd(b,a\ mod\ b) \]

    • \(b=0\) 时,\(gcd(a,b)=a\) ,因为 \(b\) 除以任何数都是 \(0\) ,那这个时候的最大公约数就理所应当的成为了 \(a\), 满足:\(a|a,b(0)|a\)
  • 我们只需要逐渐递归求解 \(gcd\) 即可,递归的终止条件为 \(b=0\) ,那时只需 \(return\ a\) 即可。

裴蜀定理

定理

先放定理:设 \(a,b\) 是不全为零的整数,则存在整数 \(x,y\),使得 \(ax + by=gcd(a,b)\)

证明

请确保您已经理解 \(gcd\) 及其前置知识&证明。

  • \(b=0\) 时,由上面的证明可得:
    • \[gcd(a,b)=a \]

  • 这时,\(x=1,y=0\) 显然满足 \(ax + by=gcd(a,b)\)

  • 我们假设对于 \(b,a\ mod\ b\),裴蜀定理成立,即存在整数 \(x_1,y_1\),满足
    • \[bx_1+(a\ mod\ b)y_1=gcd(b,a\ mod\ b) \]

  • 由模运算的性质( \(gcd\) 的前置知识)可得:
    • \[a\ mod\ b=a-\left \lfloor \frac{a}{b} \right \rfloor b \]

  • 将其带入得:
    • \[bx_1+(a-\left \lfloor \frac{a}{b} \right \rfloor b)y_1=gcd(b,a\ mod\ b) \]

  • 拆括号得:
    • \[bx_1+ay_1-\left \lfloor \frac{a}{b} \right \rfloor by_1=gcd(b,a\ mod\ b) \]

  • 移项得:
    • \[ay_1+bx_1-\left \lfloor \frac{a}{b} \right \rfloor by_1=gcd(b,a\ mod\ b) \]

  • 合并同类项可得:
    • \[ay_1+(x_1-\left \lfloor \frac{a}{b} \right \rfloor y_1)b=gcd(b,a\ mod\ b) \]

  • \(gcd\) 的证明可得: \(gcd(a,b)=gcd(b,a\ mod\ b)\).
  • 带入得:
    • \[ay_1+(x_1-\left \lfloor \frac{a}{b} \right \rfloor y_1)b=gcd(a,b) \]

  • 令:
    • \[x=y_1,y=x_1-\left \lfloor \frac{a}{b} \right \rfloor y_1 \]

  • 就找到了满足条件的 \(x,y\)
  • 由数学归纳法可知,裴蜀定理对于任意不全为零的整数 \(a,b\) 都成立。
  • 证毕。

扩展欧几里得算法(\(exgcd\)

提示:扩展欧几里得算法是一种使用程序求解问题的算法,不是定理!

目标

目标:由 \(gcd\) 和裴蜀定理求 \(ax+by=gcd(a,b)\) 的一组整数解。

做法

  • 请确保您已经理解裴蜀定理的证明!
  • 现在有方程 \(ax+by=gcd(a,b)\) ,求该方程的一组解。
  • 由裴蜀定理可知,当 \(b=0\) 时,该方程的解为 \(x=1,y=0\)
  • 根据裴蜀定理的结论可知:
    • \[x = y_1,y = x_1 - \lfloor\frac{a}{b}\rfloor y_1 \]

  • 这样就得到了满足 \(ax + by = gcd(a, b)\) 的整数 \(x\)\(y\)
  • 由裴蜀定理可知,\(x_1,y_1\)\(bx_1+(a\ mod\ b)y_1=gcd(b,a\ mod, b)\) 的解。只要再次递归求解该方程即可。
  • 详情见程序流程图:(绘图工具:draw.io)img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876424.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[2025.1.27 MySQL学习] SQL优化

SQL优化 Insert优化批量插入Insert into emp values(1,tom),(2,mike),(3,john); 手动提交事务start transaction;、commit; 主键顺序插入,1 2 3 4 5 6 7... 大批量插入数据,Insert性能较低,可以使用load指令,使用指令:#客户端连接服务器,加上参数--local-infile mysql --…

DeepSeek-R1:开源Top推理模型的实现细节、使用与复现

核心观点 ● 直接用强化学习就可以让模型获得显著的推理能力,说明并不一定需要SFT才行。 ● 强化学习并不一定需要复杂的奖励模型,使用简单的规则反而取得意想不到的效果。 ● 通过知识蒸馏让小模型一定程度上也有推理能力,甚至在某些场景下的表现超过了Top模型,比直接在小…

高通平台Android源码bootloader分析之sbl1(一)

高通8k平台的boot过程搞得比较复杂, 我也是前段时间遇到一些问题深入研究了一下才搞明白。不过虽然弄得很复杂,我们需要动的东西其实很少,modem侧基本就sbl1(全称:Secondary boot loader)的代码需要动一下,ap侧就APPSBL代码需要动(对此部分不了解,可参照:bootable 源…

读量子霸权17模拟宇宙(下)

黑洞、暗物质、粒子标准模型及超越理论被探讨,弦理论为领先候选,量子计算机模拟宇宙成为可能,平行宇宙理论也被提出,物理学界寻求宇宙终极理论。1. 黑洞 1.1. 模拟黑洞可以很快耗尽普通数字超级计算机的计算能力 1.2. 并没有人真正知道当一颗大质量恒星在引力作用下坍缩时会…

VSCode 接入DeepSeek V3大模型

转载自: VSCode 接入DeepSeek V3大模型,附使用说明 - 唯知笔记 DeepSeek V3 是一个拥有 6710 亿参数的专家混合(MoE)语言模型。最新评估表明,DeepSeek V3 已经超越了其他开源模型。重点是:国内(不需要工具),便宜(10块钱大约500万tokens)。 作为日常开发使用的编辑器 VSC…

06_LaTeX之特色工具和功能

本文介绍一些特色的 $\LaTeX{}$ 辅助功能。前两个功能 $\texttt{BibTeX}$ 和 $\texttt{makeindex}$ 依靠一些辅助程序自动生成参考文献、索引等;之后的使用颜色、超链接等则令我们生成美观易用的电子文档。06_\(\LaTeX{}\) 之特色工具和功能 目录06_\(\LaTeX{}\) 之特色工具和…

程序员常用高效实用工具推荐,办公效率提升利器!

前言 在当今这个技术日新月异的时代,开发者只有持续学习,才能紧跟时代的浪潮。为了助力开发者在高效学习与工作中实现平衡(告别996的束缚),众多卓越且实用的开发工具应运而生,它们如同强大的助力器,极大地提升了我们的工作效率与创造力。🚀Gitee加速访问: https://gi…

Cisco NX-OS System Software - ACI 16.0(8f)M - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件

Cisco NX-OS System Software - ACI 16.0(8f)M - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件Cisco NX-OS System Software - ACI 16.0(8f)M 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件 请访问原文链接:https://sysin.org/blog/cisco-aci-16/ 查看最新…

[译] WinForms:分析一下(我用 Visual Basic 写的)

原文 | Klaus Loeffelmann 翻译 | 郑子铭 如果您从未看过电影《分析这一点》,下面是简短的介绍:假设一个纽约家族的成员有可疑的习惯,他决定认真考虑接受治疗以改善他的精神状态。在比利克里斯托和罗伯特德尼罗的推动下,剧情一定会很有趣。虽然《分析这一点!》讽刺性地处理…

Cisco APIC 6.0(8f)M - 应用策略基础设施控制器

Cisco APIC 6.0(8f)M - 应用策略基础设施控制器Cisco APIC 6.0(8f)M - 应用策略基础设施控制器 Application Policy Infrastructure Controller (APIC) 请访问原文链接:https://sysin.org/blog/cisco-apic-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思科…

python--成功案例

https://www.python.org/about/success/