首页 > 其他分享 >扩展欧几里得

扩展欧几里得

时间:2023-08-05 22:33:06浏览次数:33  
标签:gcd int 欧几里得 扩展 exgcd y1 ax x1

求解 $ax + by = d$ 的解x和y。有解的条件为 d | gcd(a, b)

算法原理

假设现在我们已经得知了 $by + (a % b)x = d$ 的解 y 和 x 将 $by + (a % b)x = d$ 等价变形可以得到 $ax + b(y - \lfloor \frac{a}{b} \rfloor x) = d$ 所以说如果我们先计算了$by + (a % b)x = d$ 的解 y 和 x,就可以得到我们最初想要计算的 $ax + by = d$ 中的x和y 设 $by + (a % b)x = d$ 的解 y 和 x分别为 y1 和 x1, 那么$ax + by = d$ 中的 x = x1, y = y1 - a / b * x1

易错点

扩展欧几里得的解并不唯一,假设 $ax + by = d$ 的一组解为 x1 和 y1,那么 $x1 + k * \frac{b}{gcd(a,b)}$ 和 $y1 - k * \frac{a}{gcd(a,b)}$ 则是方程的通解,代入即可验证其正确性 为了后续叙述的方便,我们用$t$代替$\frac{b}{gcd(a,b)}$。 $x1 + k * t$是解,那么$x1 - k * t$自然也是解,只需要y的解对应变化即可。那么当题目中要求我们求解x的最小正整数解时,接下来我们考虑应如何计算 分类讨论:

  1. 当$x_1$为正数时,如果$x_1<t$,此时的$x_1$就是最小正整数解,因为如果再减$t$答案就会变为负数了;如果$x_1>t$,操作应为while (x > t) x -= t;,等价于x %= t
  2. 当$x_1$为负数时,如果操作应为while (x < 0) x += t;,等价于x = x % t + t,这里的操作是很巧妙的,第一次%t将$x$变化到绝对值小于$t$,这样再加t就能保证答案一定是正数且是最小的 综上所述,可以发现,负数比正数多了一个$+t$的操作,为了统一两者,$+t$之后只需要再%t一次即可。最终操作为x = (x % t + t) % t

代码实现

/**
 * 求解ax + by = d
 * 无解输出impossible
 */
#include <iostream>

using namespace std;

// 不管题目怎么变化,exgcd只负责求解 ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    int gcd = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return gcd;
}
int main()
{
    int a, b, d, x, y;
    cin >> a >> b >> d;
    int t = exgcd(a, b, x, y);

    // 有解的条件为m是gcd(a, b)的倍数
    if (d % t) cout << "impossible" << endl;
    else cout << d / t * x << ' ' << d / t * y << endl;
    
    return 0;
}

用途

计算乘法逆元

标签:gcd,int,欧几里得,扩展,exgcd,y1,ax,x1
From: https://blog.51cto.com/u_14882565/6978640

相关文章

  • 记一次因为C#官方扩展导致自动补全出错的情况 (C# & Godot)
    现象最近使用Vscode结合Godot使用时突然发现自动补全出问题了,发现一部分自动补全能弹出补全项目,但是确认后不起作用,还会吞掉弹出自动补全后输入的字符。大概是下图这样的感觉(截图时已修好,图为演示摆拍)线索找了很多办法,有一瞬间我突然发现C#官方扩展的评论区在短期内......
  • 介绍Sping Boot的5个扩展点
    1、初始化器ApplicationContextInitializer我们在启动SpringBoot项目的时候,是执行这样一个方法来启动的我们一层一层往下点,最终发现执行的是这个方法所以我们在启动项目的时候也可以这样启动newSpringApplication(SpringbootExtensionPointApplication.class).run(args);老的只......
  • 中国剩余定理及其扩展
    $$\left{\begin{aligned}x_1=a_1\(mod\m_1)\x_2=a_2\(mod\m_2)\.\qquad\qquad\.\qquad\qquad\.\qquad\qquad\x_n=a_k\(mod\m_k)\end{aligned}\right.$$中国剩余定理算法流程计算所有模数的积M;对于第i个方程:a.计算$n_i\=......
  • 扩展Django:实现自己的manage命令
    我们都用过Django的django-admin.py和manage.py。django-admin.py是一个命令行工具,可以执行一些管理任务,比如创建Django项目。而manage.py是在创建每个Djangoproject时自动添加在项目目录下的,只是对manage.py的一个简单包装,其功能是将Djangoproject放到sys.path目录中,同时设置DJ......
  • 如何导出 Visual Studio Code 的扩展应用,并离线安装?
    如何导出VisualStudioCode的扩展应用,并离线安装?warrior210已于2022-08-0810:37:51修改2262收藏5文章标签:vscodeide编辑器版权1.离线情形VisualStudioCode的扩展应用安装位置在文件夹.vscode/extensions下。不同平台,它位于:Windows%USERPROFILE%\.vscode\exte......
  • Spring 容器里 Bean 生命周期中可扩展的 SpringBoot 接口
    Gitee:Demo源码1.ApplicationContextInitializer这是整个spring容器在刷新之前初始化ConfigurableApplicationContext的回调接口。@Slf4jpublicclassTestApplicationContextInitializerimplementsApplicationContextInitializer{@Overridepublicvoidi......
  • 爷情节!终于可以离线安装浏览器扩展了~
    现在基本只用Chrome浏览器,身边很多同事也一样。上次装了一个视频录制扩展,可能是因为扩展文件太大,同步扩展花了好长时间。有时不想把账号登得导出都是,又想使用扩展。所以能下载到.crx文件就很重要。昨天听说bejson上线了crx下载地址解析功能,于是迫不及待地去体验了一下,一个字“牛鼻......
  • 【设计模式】装饰器模式Decorator:在基础组件上扩展新功能
    (目录)装饰器模式看上去和适配器模式、桥接模式很相似,都是使用组合方式来扩展原有类的,但其实本质上却相差甚远呢。简单来说,适配器模式侧重于转换,而装饰模式侧重于动态扩展;桥接模式侧重于横向宽度的扩展,而装饰模式侧重于纵向深度的扩展。原理装饰模式的原始定义是:允许动态地向......
  • WebRTC研究:RTP报头扩展
    RTPHeaderRTP协议中,RTPHeader(报头)包括固定报头(FixedHeader)与报头扩展(Headerextension,可选)。RTPFixedHeader结构如下,其中前12字节是每个RTP包必须包含的。01230123456789012345678......
  • flask闪现,请求扩展,g对象
    1闪现#一个请求---》假设出错了---》重定向到另一个地址---》把错误信息在另一个返回中看到错误信息放个位置----》另一个请求过来,去那个位置拿#把一些数据,放在某个位置---》后期可以去取出来----》取完不用删除,就没了defindex():s='xx错位了'returnredirect(......