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

news/2025/1/31 5:06:17/文章来源: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

五、同余

  • 符号为 \(【\equiv】\).
  • 定义:\(a\equiv b(mod\ p)\) 表示: \((a-b)\ mod\ p=0\),即 \(a-b=km\)\(k\) 为整数)。
  • 举个栗子:\(a=13,b=3,p=5\),计算 \((13-3)\ mod\ 5\) 正好是 \(0\),所以 \(5\) 能够整除 \(10\).我们这时称: \(13\equiv 3(mod\ 5)\)
  • 性质:\(a=b\)\(a\equiv b(mod\ m)\)
  • 证明:
  • 等式两边同时 \(mod\ p\) 得:
    • \[a\ mod\ x=b\ mod\ x \]

  • \(a=k_1x+r,b=k_2x+r\), 其中 \(k_1\) 是整数, \(r\) 就是 \(a\) 除以 \(x\) 后的余数,也就是 \(a\ mod\ x = r\)
  • 因为已知 \(a\% x = b\% x\),所以它们除以 \(x\) 后的余数相同,都为 \(r\),其中 \(k_2\) 是整数。
  • 那么:
    • \[a-b=(k_1x+r)-(k_2x+r)=(k_1-k_2)x \]

  • 因为 \(k_1,k_2\) 都是整数,所以说:\(a-b\) 是能被 \(m\) 整除的。
  • 所以:
    • \[(a-b)\ mod\ x=0 \]

  • 根据同余的定义得:
    • \[a\equiv b(mod\ x) \]

  • 所以得出结论:等式两边同时模上一个数,等式依然成立。

六、逆元

前置知识

请保证你已经足够熟悉同余相关知识!

定义

  • 先放定义: 给定正整数 \(a,m\),若存在整数 \(x\) 使得 \(a\times x\equiv 1(mod\ m)\),则称:\(x\)\(a\) 在模 \(m\) 意义下的逆元,记作:\(a^{-1}\) .(注意这个写法是在模运算的情境下的一种表示,不是常规的倒数那种意思哦)

证明:

存在性:若 \(gcd(x,p)=1\) ,则 \(x\) 在模 \(p\) 意义下存在逆元。

  • 根据裴蜀定理,若 \(gcd(x,p)=1\) ,则存在整数 \(s,t\) ,使得 \(xs+pt=1\)
  • 现在我们考虑其在模 \(p\) 的意义下, \(1\ mod\ p=1\),根据同余的性质,\((xs+pt)\bmod p=1\bmod p\)
  • 因为 \(pt\equiv 0(mod\ p)\),所以 \(pt\)\((sx+pt)\bmod p\) 并没有贡献,可以省略。
  • 那么舍去 \(pt\) 后的式子为:\(sx\bmod p=1\bmod p\)
  • 此时,\(s\) 就是 \(x\) 在模 \(p\) 意义下的逆元,即:\(x\ ·\ s\equiv1\pmod p\) .
  • 得证:若 \(gcd(x,p)=1\)\(x\) 在模 \(p\) 意义下存在逆元。

必要性:若 \(x\) 在模 \(p\) 意义下存在逆元,则 \(gcd(x,p)=1\)

  • \(x\) 在模 \(p\) 意义下存在逆元时,我们把这个逆元记作 \(y\),那么存在:
    • \[xy\equiv 1\pmod p \]

  • 根据模运算的定义的逆运算得:
    • \[(xy-1)\bmod p=0 \]

  • 我们将模运算写成这样的形式(\(k\) 为整数):
    • \[xy-1=kp \]

  • 移项得:
    • \[xy-kp=1 \]

  • 我们设 \(d=gcd(x,p)\),根据最大公约数的性质,\(d\) 整除 \(x,p\),即:
    • \[d\ |\ x,\ \ d\ |\ p \]

  • 因为 \(d\) 整除 \(x\),所以 \(d\) 整除 \(xy\)
  • 因为 \(d\) 整除 \(p\),所以 \(d\) 整除 \(kp\)
  • 所以 \(d\) 整除 \(xy-kp\)
  • 因为 \(xy-kp=1\) ,所以 \(d\) 整除 \(1\),又因为 \(d\) 是正整数,所以 \(d=1\),即:\(gcd(x,p)=1\)

  • 综上,充分性和必要性均得证,所以 \(x\) 在模 \(p\) 同余下存在逆元当且仅当 \(gcd(x,p)=1\)

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

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

相关文章

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用) @目录四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)2.hash 哈希表常用指令(详细讲解说明)2.1 hset <key><field><value> 给<…

qcom usb PD tcpc overview

该软件层将PMxxxxB硬件连接到LPM模块,因为上述模块使用Type-C端口控制器接口(TCPCI)进行通信。 软件层,使PMIC Type-C PD硬件适用于基于TCPCI的软件架构 基本状态机:进入、离线、待机状态 PMIC Type-C和PD PHY中断的消费者 PMIC硬件专用排序和定时器

男生如何自己简单理发

快过年了,给自己理个发。 从24年10月份开始,目前已经给自己理发两次,都是短发寸头,给我爸和我三叔各理发一次,算是有点经验了,我准备过年前给自己再稍微修理头发一下。自己动手实践,且效果还不错的情况下,真的非常有成就感,如果有人指导情况下,其实自己理发难度不高,…

测序中的GC偏好

001、 测序中的GC偏好指的是基因组上GC含量在50%左右的区域更容易被测到,产生的reads更多,这些区域的覆盖度更高,在高GC或者低GC区域,不容易被测到,产生较少的reads,这些区域的覆盖度更少。用基因组单位长度的bin中的GC含量作为横坐标,覆盖度作为纵坐标作图,可以明显的…

人工智能(AI)简史:推动新时代的科技力量

人工智能(AI,Artificial Intelligence)是计算机科学的一个分支,旨在研究和开发可以模拟、扩展或增强人类智能的**系统**。它涉及多种技术和方法,包括机器学习、深度学习、自然语言处理(NLP)、计算机视觉、专家系统等。一、人工智能简介 人工智能(AI,Artificial Intell…

03. vim编辑器的使用

一、vim编辑器的使用vim 是 Unix 和 类 Unix 操作系统中常用的文本编辑器。如果 Ubuntu 系统默认没有安装 vim,我们可以使用 apt 工具安装 vim 编辑器。sudo apt install vim安装好 vim 之后,我们可以如下命令编辑一个文件。 vim 文件用 vim 打开一个文件就直接进入了 一般模…

“简单”学英语

本文总结了本人作为英语学渣的较为无痛的学习英语方法,无痛当然学习时间长一些,但相对简单一些,实操性强。 前言 最近和人聊天时对方说,感觉没什么可以学,但又想学点什么,我回答:”学英语啊“。有人迷茫,不知道怎么发展时,我回答:“先学点英语啊”。有人在犹豫要不要…

路飞学城5-celery

Celery Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。 文档:http://docs.jinkan.org/docs/celery/getting-started/index…

Linux 安装并使用 EasyConnect

x86_64-linux-gnu下载: 如果你下载之后要登入 https://yzftxdy.com 的话,你就先在浏览器里面输入这个网址,网站会弹出来给你下载的机会如果你的浏览器无法下载,你可以让别人帮你下载 .deb 文件。糖下载完了就 dpkg -i balabala.deb,于是你打开 "show apps"会找到…

[Jest] 测试快照

在对组件进行测试的时候,往往需要从两个方面进行测试:交互:确保组件在进行交互时功能正常 渲染:确保组件渲染输出正确(比如不会多一个或者少一个 DOM 元素)针对渲染方面的测试,我们就可以使用快照来进行测试。 所谓快照,就是给渲染出来的 DOM 元素拍一张“照片”(将最…

[React Jest] 测试 Hook

在进行 React 开发的时候,还有一个非常重要的功能模块,那就是 Hook,自定义 Hook 作为一块公共逻辑的抽离,也会像组件一样被用到多个地方,因此对 Hook 的测试也是非常有必要的。 Hook 没有办法像普通函数一样直接进行测试,因为在 React 中规中,Hook 必须要在组件里面使用…

07_LaTeX之绘图功能

除了排版文字,$\LaTeX{}$ 也支持用代码表示图形。不同的扩展已极大丰富了 $\LaTeX{}$ 的图形功能,`TikZ` 就是其中之一。本章将带你了解一些基本的绘图功能。07_\(\LaTeX{}\) 之绘图功能 目录07_\(\LaTeX{}\) 之绘图功能绘图语言简介\(\textrm{TikZ}\) 绘图语言\(\textrm{Tik…