死了吗小枫~ 死了吗小枫~ 死|

GCSG01

园龄:1年3个月粉丝:2关注:20

同余

欧几里得算法(exgcd)

简介

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

原理

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

ax1+by1=gcd(a,b)bx2+(amodb)y2=gcd(b,amodb)gcd(a,b)=gcd(b,amodb)ax1+by1=bx2+(amodb)y2amodb=a(ab×b)ax1+by1=bx2+(a(ab)×b)y2ax1+by1=ay2+b(x2aby2)a=a,b=bx1=y2,y1=x2aby2x2,y2gcd0x=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,但当 b0 时,可行解必有 |x|b,|y|a


乘法逆元

定义

a×x1(modb)ab 互质,则称 xa 的逆元,记做 a1,也称 xamodb 意义下的倒数。
所以 a/b(modp)=(b1×a)modp

求法

扩展欧几里得

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下的逆元
}

线性算法

首先我们知道 111(modp)
k×i+r=p(1<r<i<p)

k×i+r0(modp)k×r1+i10(modp)i1k×r1(modp)i1=p/i×(pmodi)1(modp)

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

    a[1]=1;
    for(int i=2;i<p;i++)
        a[i]=(p-p/i)*a[p%i]%p;
posted @   GCSG01  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
漂浮磁力线/鼠标吸铁石特效
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起