首页 > 其他分享 >通过求逆元的几种方式复习基础数论

通过求逆元的几种方式复习基础数论

时间:2023-07-30 22:34:55浏览次数:39  
标签:frac 复习 数论 复杂度 pmod 逆元 frac1 mathcal

逆元

若 \(ax=1\pmod p\),那么称 \(a\) 是 \(x\) 的逆元,显然 \(x\) 也是 \(a\) 的逆元。
两边同时除以 \(a\) 得到 \(x=\frac1a\pmod p\),可以写成 \(x=a^{-1}\pmod p\),这么看来,乘法逆元就是取模意义下的倒数啊。
若 \(p\) 为质数,\(0\) 没有逆元,\(1\) 的逆元是 \(1\),\(p-1\) 的逆元是 \(p-1\)。其他都是一对一对的逆元,证明可见「裴蜀定理」。
为啥 \(p-1=\frac1{p-1}\pmod p\) 呢?直观解释是负负得正 \(-1=\frac1{-1}\),另一种解释是 \(1=p^2-2p+1=(p-1)^2\pmod p\)。

暴力求解

\(ax=1\pmod p\) 是个线性同余方程。解 \(x\) 必然 \(\in[0,p-1]\),所以直接暴力寻找可能的 \(x\)。
单次复杂度 \(\mathcal O(p)\)。

费马小定理

前置条件:\(p\) 为质数。

求解 \(x\) 就是计算 \(a^{-1}\)。
根据费马小定理,若 \(p\) 为质数,则 \(a^{p-1}=1\pmod p\),将等式两边同时乘 \(a^{-1}\) 就可以得到 \(a^{p-2}=a^{-1}\),快速幂求解。
单次复杂度 \(\mathcal O(\log p)\)。

欧拉定理

费马小定理可以看作欧拉定理的特殊情况。
根据欧拉定理,若 \(\gcd(a,p)=1\),则 \(a^{\varphi(p)}=1\pmod p\),将等式两边同时乘 \(a^{-1}\) 就可以得到 \(a^{\varphi(p)-1}=a^{-1}\)。
单次复杂度由 \(\varphi\) 的求解方法确定,从 \(\mathcal O(\sqrt p)\sim\mathcal O(\log p)\) 均有可能。

拓展欧几里得

\(ax=1\pmod p\) 可以转化为 \(ax+pk=1\),其中 \(a,p\) 已知,需要求一组 \(x,k\) 使得 \(x\in[0,p-1]\)。
通过裴蜀定理可得存在一组 \(x,k\) 使得 \(ax+pk=\gcd(a,p)\)。所以若 \(\gcd(a,p)=1\),那么 \(ax+pk=1\) 必然有解。根据解的周期性可知必然存在一个解使得 \(x\in[0,p-1]\)。所以逆元存在的充分条件是 \(\gcd(a,p)=1\)。
求解 \(ax+pk=1\) 可以采用拓展欧几里得的方法求解。

前缀积

\(\binom nm=\frac{n!}{m!(n-m)!}\),类似的,\(\frac1a=\frac{(a-1)!}{a!}\)。
通过前缀积预处理出 \(1!,2!\ldots(a-1)!,a!\),求出 \(a!\) 的逆元 \(\frac1{a!}\),再一路循环回去 \(\frac1i=\frac{i+1}{(i+1)!}\) 就可以求出所有阶乘和阶乘的逆元。而且这个方法对于求 \(\frac1{\prod_{i=l}^ri},1\le l\le r<p\) 也是在常数时间内完成,
求出 \([1,n]\) 中所有逆元的复杂度是 \(\mathcal O(n+\log p)\)。

线性求逆元

\[\begin{aligned} p&=0\pmod p\\ \lfloor\frac pa\rfloor\times a+p\bmod a&=0\pmod p\\ \frac{\lfloor\frac pa\rfloor}{p\bmod a}+\frac1a&=0\pmod p\\ \frac1a&=-\frac{\lfloor\frac pa\rfloor}{p\bmod a}\pmod p \end{aligned} \]

发现要求出 \(\frac1a\) 必须得求出 \(\frac1{p\bmod a}\),可以使用数组递推下去也可以直接递归求解。
求出 \([1,n]\) 中所有逆元的复杂度是 \(\mathcal O(n)\)。
若递归求解,已知时间复杂度上界为 \(\mathcal O(n^{\frac13})\),下界为 \(\Omega(\frac{\ln n}{\ln\ln n})\)。有人猜想其复杂度为 \(\mathcal O(\log^2n)\)。不过在 int 范围内可以近似看作单 \(\log\) 倒是真的。

模数 \(p\) \(998244353\) \(10^9+7\) \(10^9+9\)
\(n=10^6\) 的递归次数 \(30\) \(31\) \(29\)
\(n=10^7\) 的递归次数 \(35\) \(39\) \(35\)
\(n=10^8\) 的递归次数 \(40\) \(45\) \(42\)

线性筛

若 \(t\mid a\),那么 \(\frac1a=\frac1t\times\frac1{\frac at}\)。
借助线性筛筛出 \([1,n]\) 的所有质数以及他们的逆元。在线性筛时,每个数 \(i\) 只会被自己的最小质因子 \(\operatorname{mpf}(i)\) 筛到,所以计算 \(\frac1{\operatorname{mpf}(i)}\times\frac1{\frac i{\operatorname{mpf}(i)}}\) 就行了。
若求出 \([1,n]\) 中所有逆元,线性筛的复杂度为 \(\mathcal O(n)\),只有 \([1,n]\) 中的质数需要计算逆元,质数个数约为 \(\frac n{\ln n}\),每个的计算复杂度为 \(\log p\),所以总复杂度为 \(\mathcal O(n+\frac{n\log p}{\ln n})\),近似于线性。

标签:frac,复习,数论,复杂度,pmod,逆元,frac1,mathcal
From: https://www.cnblogs.com/bxjz/p/calc-inv.html

相关文章

  • 逆元
     同余:简单来说就是在除法中取模要找到其逆元 逆元:如果一个线性同余方程ax≡1(modb),则x称为amodb的逆元简单来说就是modb是一种环境,而所求的x是a在modb环境中的倒数 以下是求逆元的法子扩展欧几里得法求逆元,时间复杂度o(logn)1voidexgcd(inta,intb,......
  • 数论
    1.桌球问题矩形球桌四个角有洞yx坐标在(0,0)(m,0)(m,n)(0,n)球从(0,0)沿45度方向无限大力发射,求mn满足啥条件能落袋解法:这种桌球问题只要无限延伸方块就行,相当于解y=x有没有(am,bn)解,其中a和b是整数。m和n如果是正整数,n*m=m*n,肯定落袋;如果是......
  • 【模板】数论基础:exGCD,exCRT,inverse,Lucas,BSGS,primitive root
    7.29数论WIP\(a\equivb\pmodp\Rightarrow\frac{a}{d}\equiv\frac{b}{d}\pmod{\frac{p}{d}},d=\gcd(a,b,p)\)。exGCD若\((a,b)=1\),则\(0\leqx<b\),\(ax\bmodb\)互不相同,有一个是\(1\)。证明:\(ax_1\equivax_2\pmodb\)则\((x_1-x_2)a|b\),因为......
  • 非线性规划【复习笔记】
    一、基本概念(一)、非线性规划数学模型非线性规划数学模型的一般形式是:\(\begin{cases}minf(\boldX)\\\quadh_i(\boldX)=0(i=1,2,\dots,m)\\\quadg_j(\boldX)\geq0(j=1,2,\dots,l)\end{cases}\)其中,\(X=(x_1,x_2,\dots,x_n)^T\)是\(n\)维欧氏空间\(E_n\)中的点......
  • 初等数论学习笔记
    前言更熟悉的阅读体验?前置知识(这个应该很显然):\(\operatorname{lcm}(a,b)=\dfrac{ab}{\gcd(a,b)}\)线性筛素数直接上代码。constintMAXN=100000008;boolnp[MAXN];vector<int>prm,pre;voidgg(constintN=100000000){ pre.resize(N+1); for(inti=2;i<=N;i++){ if......
  • 第十五节 数论 - 2
    AT_abc182_d题解洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述从数轴的原点开始向正方向走。第一次向前走\(a_1\)步,第二次向前走\(a_1+a_2\),以此类推。求走过的最大位置。思路首先直接模拟时间复杂度\(O(n^2)\),看一下数......
  • String类|笔记1(复习)
    由于字符串应用广泛,Java中专门提供了面向字符串对象的String类。1、字符串常用的构造方法 2、String对象的比较在讨论String对象的比较时,先看看String类的引用机制。创建对象S1,S2,S3,虚拟机栈中分别存储指向堆区的引用对象的地址,S1和S3指向相同的引用对象,S3指向不同的引用对象......
  • 第十五节 数论 - 2
    AT_agc017_b题解洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输......
  • [c/c++][考研复习笔记]内部排序篇学习笔记
    考研排序复习笔记插入排序#include<stdio.h>#include<stdlib.h>#defineMaxSize9//折半插入排序voidZBInsertSort(intA[],intn){ inti,j,high,low,mid; for(i=2;i<=n;i++){ A[0]=A[i]; low=1;high=i-1; while(low<=high){ mid=(low+high)/2......
  • 第十四节 数论
    $$\text{建议阅读}$$A.优美子数列题目描述数学家小\(Q\)得到了一个长度为\(n\)的数列{\(a_n\)}。小\(Q\)的幸运数字是\(k\),所以他认为,若一个子数列\(a_l\),\(a_l+1\),…,\(a_r\)的和为\(k\)的倍数,则该子数列是优美子数列。小\(Q\)现在想考考你,{\(a_n\)}......