首页 > 其他分享 >同余

同余

时间:2024-07-18 10:07:08浏览次数:8  
标签:gcd int bmod Exgcd times ax 同余

欧几里得算法(exgcd)

简介

用于求解 \(ax+by=gcd(a,b)\),在求 \(gcd\) 的过程中进行求解。

原理

由辗转相除法的过程我们可以得到:

\[ax_1+by_1=gcd(a,b)\\ bx_2+(a \bmod b)y_2=gcd(b,a\bmod b)\\ 由欧几里得定理可知:gcd(a,b)=gcd(b,a\bmod b)\\ 所以 ax_1+by_1=bx_2+(a\bmod b)y_2\\ 又因为 a \bmod b=a-(\lfloor \frac{a}{b} \rfloor\times b )\\ 所以 ax_1+by_1=bx_2+(a-(\lfloor \frac{a}{b} \rfloor)\times b)y_2\\ 化简得 ax_1+by_1=ay_2+b(x_2 - \lfloor \frac{a}{b} \rfloor y_2)\\ 因为 a=a,b=b,所以 x_1=y_2,y_1=x_2- \lfloor \frac{a}{b} \rfloor y_2\\ 将 x_2,y_2不断带入递归求解直至gcd为0是递归x=1,y=0回去求解。 \]

模板

  1. 带gcd
int Exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }//正常求解gcd
    int g=Exgcd(b,a%b,x,y);
    //---------------//求解 exgcd
    int t=x;
    x=y;
    y=t-(a/b)*y;
    //---------------//
    return g;
}
  1. 不带gcd
void Exgcd(int a,int b,int &x,int &y)
{
    if(!b)x=1,y=0;
    else Exgcd(b,a%b,y,x),y-=a/b*x;
}

值域分析

\(ax+by=gcd(a,b)\)的解有无数个,有的会爆 long long,但当 \(b\ne 0\) 时,可行解必有 \(\lvert x \rvert\le b,\lvert y\rvert\le a\)


乘法逆元

定义

若 \(a\times x≡1(\bmod b)\) 且 \(a\) 与 \(b\) 互质,则称 \(x\) 为 \(a\) 的逆元,记做 \(a^{-1}\),也称 \(x\) 为 \(a\) 在 \(\bmod b\) 意义下的倒数。
所以 \(a/b(\bmod p)=(b^{-1}\times a)\bmod p\)

求法

扩展欧几里得

当 \(a,p\) 互质,\(p\) 不是质数时可用。

void Exgcd(int a,int b,int &x,int &y) {
    if(!b)x=1,y=0;
    else Exgcd(b,a%b,y,x),y-=a/b*x;
}
int main()
{
    int x,y;
    Exgcd(a,p,x,y);
    x=(x%p+p)%p;
    printf("%d\n",x);//x是a在mod p下的逆元
}

线性算法

首先我们知道 \(1^{-1}≡1(\bmod p)\\\)
设 \(k\times i+r=p(1<r<i<p)\\\)

\[k\times i+r≡0(\bmod p)\\ k\times r^{-1}+i^{-1}≡0(\bmod p)\\ i^{-1}≡-k\times r^{-1}(\bmod p)\\ i^{-1}=-⌊p/i⌋\times(p\bmod i)^{-1}(mod p) \]

于是我们可以写出如下代码

    a[1]=1;
    for(int i=2;i<p;i++)
        a[i]=(p-p/i)*a[p%i]%p;

标签:gcd,int,bmod,Exgcd,times,ax,同余
From: https://www.cnblogs.com/GCSG01/p/18308855

相关文章

  • 扩展欧几里得详解——同余方程
    对于同余方程的话就是一个经典扩展欧几里得求逆元的题目。这个可以转换成,我们需要求的只是x和k从而得到一组解。通常我们会得到a和b两个元素,假设a是7,b为40,通过扩展欧几里得进行运算。这时也就是,我们第一步先开始从a,b两个数字里找到最大的那个在这里的话是40,然后利用大的......
  • 模与同余
    \(a\equivb\pmodn\Leftrightarrow(a-b)\bmodn=0\Leftrightarrown|(a-b)\)\(a\bmodn<n\)\((a\pmb)\bmodn=((a\bmodn)\pm(b\bmodn))\bmodn\)\((a\cdotb)\bmod=((a\bmodn)\cdot(b\bmodn))\bmodn......
  • 同余
    1.模运算基本性质基本概念:若整数\(a,b\)除以\(p\)的余数相等,则称\(a,b\)在模\(p\)意义下同余,记作\(a\equivb\pmod{p}\)或者\(a\bmodp=b\bmodp\)。模运算的定义:\[a\bmodp=\begin{cases}a-p\lfloor\dfrac{a}{p}\rfloor&a\geq0\\-(-a\bmodp)&a<0......
  • 由AtCoder_ABC357D引发的除法同余学习
    鉴于最近的Atcoder周赛又出现除法求余,下定决心学习逆元相关内容同余概述定义同余定义:若a和b是整数,且m|(a-b),则称a和b模m同余。即两者除以m得到的余数相同。剩余系:一个模m完全剩余系是一个整数集合,任何一个整数恰好与该集合中的一个元素模m同余。例如0,1,...,m-1的集......
  • 从CF1660F2看同余分组
    https://codeforces.com/contest/1660/problem/F2同余分组,树状数组维护逆序对先承继F1的做法,维护一个前缀和数组,让s[i]=='+'为\(1\),s[i]=='-'为\(-1\)。那么要满足两个条件:\(pre_r-pre_l\leq0\)要么加减号相同,要么减号更多(只有减号能减少)\(pre_r-pre_l......
  • P6610 [Code+#7] 同余方程
    P6610[Code+#7]同余方程首先可以中国剩余定理。至于为什么\(a,b\)在满足同余条件后\(a^2+b^2\)仍然满足,是因为根据中国剩余定理的过程,会得到只有当前方程结果为\(a\)的数加起来,所以不管套什么函数都是对的。然后就是推式子了。\[\begin{aligned}ans&=\sum_{a+b\equiv......
  • 线性同余-常见语言编译器参数
    Sourcem(multiplier) a   (increment) coutputbitsofseedin rand() /Random(L)NumericalRecipes23216645251013904223 Borland C/C++232226954771bits30..16in rand(),30..0inlrand()glibc (usedby GCC)[5]231110351524512345b......
  • [学习笔记] 丢番图方程 & 同余 & 逆元 - 数论
    首先,他们几个都是兄弟,有着极大的相似性。另外,他们的各自的思想都能够很好的服务于另外几个,有助于加深理解。线性丢番图方程丢番图不是个图啊!他是个man……——百度百科现在主要说的是二元线性丢番图方程:通用形式为\(ax+by=c\)。其中常数全都为整数。很像不定方程对吧?现在在......
  • 「NOIP2012」同余方程 题解!!
    嗨嗨嗨!又是我想写这道题,我们就需要掌握:拓展欧几里得顾名思义,它就是欧几里得算法(人话:辗转相除法)的proMax版本别告诉我你不会辗转相除法拓展欧几里得的作用是求对于方程\[a*x+b*y=gcd(a,b)\]解出x,y的值。让我们一步步分析!贴个辗转相除板子先:voidojld(inta,intb){ i......
  • 初等数论——同余
    前置模运算定义:\(a\%b(a\modb)\),表示\(a\)除以\(b\)的余数。加法:\((a+b)\%p\)。减法:\((a-b+p)\%p\)。加\(p\)是为了防止负数。乘法:\((a\timesb)\%p\)。除法无法直接运算,要用逆元(在下面会讲到)。平方运算:快速幂模运算满足:结合律,交换律,分配律。......