首页 > 其他分享 >乘法逆元

乘法逆元

时间:2023-12-28 21:46:07浏览次数:19  
标签:lfloor frac pmod bmod times 逆元 乘法

概念

若关于整数 \(a,b\) 的线性同余方程 \(ax≡1\pmod{b}\) 存在解,则将 \(x\) 称作 \(a \bmod b\) 的乘法逆元(简称逆元),记作 \(a^{-1} \pmod{b}\),在不会引起误解时常记作 \(a^{-1}\)


  • 当 \(b|a\)(整除)时,不存在 \(a\) 的逆元 \(a^{-1} \pmod{b}\)
  • 特别的,有\(1^{-1}≡1 \pmod{b}\)
    • 证明:对于整数 \(b\),有 \(1 \times 1≡1 \pmod{b}\),故 \(1 \bmod b\) 的逆元为 \(1\)

性质

  • 若 \(n\) 为正整数,则 \(a^{-1}≡n+1 \pmod{2n+1}\)
    • 证明:已知 \(2x≡1\pmod{2n+1}\),设 \(2x=(2n+1)k+1\),又因为 \(2x\) 为偶数,\(k\) 的最小整数解为 \(1\),代入得 \(x=n+1\)
  • 若 \(b\) 为质数,且 \(a<b\),则 \(a^{-1}≡a^{b-2}\pmod{b}\)
    • 证明:需要用到费马小定理,暂时不会,学了回来再写

求法

1. \(exgcd\)

详见 \(\huge{exgcd学习笔记}\)

例题:同余方程

  • 时间复杂度 \(O(\log\max(a,b))\)

2.线性求 \(1\sim n\) 或单个数的逆元(递推/递归)

限制条件:\(b\) 为质数


证明:

设 \(k=\lfloor{\frac{b}{i}}\rfloor\),\(r=b\bmod i\),则有:

\(b=k\times i+r≡0\pmod{b}\)

两边同时乘上 \(i^{-1}\times r^{-1}\) 得:

\(k\times r^{-1}+i^{-1}\pmod{b}\)

移项得 \(i^{-1}≡-k\times r^{-1}\pmod{b}\)

将 \(k=\lfloor{\frac{b}{i}}\rfloor\),\(r=b\bmod i\) 代入得:

\(i^{-1}≡-\lfloor{\frac{b}{i}}\rfloor\times (b\bmod i)^{-1}\pmod{b}\)

考虑消除负数取模对答案的影响,故推出逆元:

\[i^{-1}=\begin{cases} 1&i=1\\ (b-\lfloor{\frac{b}{i}}\rfloor)\times (b\bmod i)^{-1}&i\neq 1\\ \end{cases} \]

  • 递推求 \(1\sim n\) 的逆元,\(O(n)\) 预处理,\(O(1)\) 查询
  • 递归求任意数的逆元,时间复杂度 \(O(n^{\frac{1}{3}})\)

例题

\(\huge{乘法逆元}\)

代码如下(递推):

#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
using namespace std;
template<typename Tp> inline void read(Tp&x)
{
    x=0;register bool z=1;
    register char c=getchar();
    for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;
    for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
    x=(z?x:~x+1);
}
void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');}
void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);}
int n,p,inv[10000010];
void niyuan(int n)
{
    inv[1]=1;
    for(int i=2;i<=n;i++) inv[i]=((p-p/i)*inv[p%i])%p;
}
signed main()
{
	#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    read(n),read(p);
    niyuan(n);
    for(int i=1;i<=n;i++)
        write(inv[i]),puts("");
}

标签:lfloor,frac,pmod,bmod,times,逆元,乘法
From: https://www.cnblogs.com/Charlieljk/p/17933641.html

相关文章

  • 多项式的逆元
    对于多项式\(f(x)=a_0+a_1x+a_2x^2+...+a_nx^n\)若存在\(g(x)=b_0+b_1x+b_2x^2+...+b_mx^m(m\len)\)使得\(f(x)g(x)\equiv1\pmod{x^m}\),称\(g(x)\)为\(f(x)\)在模\(x^m\)下的逆元,记作\(f^{-1}(x)\pmod{x^m}\)多项式存在逆元的充要条件:\(a_0\)在模\(x^m\)下有......
  • 【模版】高精度乘法 (A*B problem)
    和A+Bproblem类似,不多说,直接看代码和注释就好啦!ww感觉这东西只要有个概念就行了...就是在练模拟?www其他语言似乎有大数加减乘除? 这样的高精度算法时间复杂度O(n2),n是数字位数,如果位数过大还是很慢。可以利用快速傅里叶变换的方式加速高精度乘法。(虽然都是我连傅里叶级数都没学......
  • 矩阵乘法和矩阵快速幂
    1机房今天晚上不知道为啥把洛谷也关了,AC自动机没题做了,教练您做的好啊那么就冲一个矩阵乘法和快速幂吧,开了提高OJ之后还有几道需要矩阵乘法的AC自动机没写,后面再冲一下状压虽然已经冲过了矩阵矩阵思想来源于线性方程组如方程组\[\begin{equation}\begin{cases}7x_1+8x_2+9x......
  • 乘法加法和代数计算如何算的快,准
    进位尽量用脑子来记忆,因为每一次进位只保存一个即可.进位跟下一个加完之后就更新了.所以记忆不难,多训练即可.举一个例子:135*87首先写下135  8775=35.所以脑子记住进位3,写下5.然后37=21,所以我们写上4,脑子记住2.1*7=7所以我们写下9就完事了.少写......
  • #P1052. 乘法逆元
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,p;intgcd(inta,intb,int&x,int&y){ if(b==0){ x=1; y=0; returna; } intd=gcd(b,a%b,y,x); y-=a/b*x; returnd;}intinv(inta,intm){ intx,y; gcd(a,m,x......
  • 任意类型多项式乘法
    目录前言前置知识定义与记号单位根分圆多项式Cantor'sAlgorithm规避单位根递归计算卷积做\(\mathcal{I}_p\)上的DFT时间复杂度规避除法实现细节参考资料参考文献参考代码前言所谓“任意类型”,事实上指的是一种代数结构\(\mathcal{A}=(D,+,\cdot)\),满足:\(+:D\timesD\toD......
  • P1527 [国家集训队] 矩阵乘法
    题意给定一个矩阵,每次询问子矩阵的第\(k\)大。Sol考虑把莫队扔到二维上来做。发现复杂度变为:\(O(n^2q^{\frac{3}{4}})\)。卡卡常就过了。Code#include<iostream>#include<algorithm>#include<cstdio>#include<array>#include<cmath>#include<vector>#i......
  • Day26 打印九九乘法表
    打印九九乘法表分以下几步执行:1.我们先打印第一列,这个家应该都会2.我们把固定的1再用一个循环包起米3.去掉重复项,i<=j4.调整样式1.打印第一列packagecom.baixiaofan.struct;/*1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=1......
  • 学C笔记归纳 第九篇——分支循环语句3_for_while_do while(附九九乘法表解析和三种方式
     基础语法模版:while(1 条件控制语句){2 语句序列;}顺序:121212....21 do{ 1语句序列; }while(2 循环控制表达式);顺序:121212....12  for(1 初始化表达式;2 条件控制语句;4 调整表达式){3......
  • SQL 算术运算符:加法、减法、乘法、除法和取模的用法
    SQLServer中的存储过程什么是存储过程?存储过程是一段预先编写好的SQL代码,可以保存在数据库中以供反复使用。它允许将一系列SQL语句组合成一个逻辑单元,并为其分配一个名称,以便在需要时调用执行。存储过程可以接受参数,使其更加灵活和通用。存储过程语法创建存储过程的语法如......