首页 > 编程语言 >扩展欧几里得算法

扩展欧几里得算法

时间:2023-05-07 20:56:09浏览次数:34  
标签:gcd int 欧几里得 扩展 exgcd 算法 y1 y0 x0

扩展欧几里得算法

前置条件:需要掌握裴蜀定理和欧几里得算法

裴蜀定理:
对于不全为0的整数a, b,一定有整数x, y,使得ax + by = gcd(a, b)


欧几里得算法:
gcd(a, b) == gcd(b, a % b)

假设有组特解x0, y0,使得ax0 + by0 = gcd(a, b)
则必有bx1 + (a % b)y1 = gcd(b, a % b) = gcd(a, b)
其中(a % b) = a - a / b * b
整理得:b(x1 - a / b * y1) + ay1 = ax0 + by0
即:y0 = x1 - a / b * y1, x0 = y1
所以x0 是由 y1转化而来, y0 是由 x1 - a / b * y1转化而来,因此递归时使用exgcd(b, a % b, y, x), y -= a / b * x

若要使ax + by = n(n为ax + by可以取到的数)
设d = gcd(a, b), 那么n % d == 0,n一定是d的倍数
他的特解是x0, y0,而通解则是:
x = n / d * x0 + k * b / d(k为任意整数)
y = n / d * y0 + k * a / d

#include <iostream>

using namespace std;

int exgcd(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

int main() {
    int n;
    cin >> n;
    while (n --) {
        int a, b, x, y;
        cin >> a >> b;
        exgcd(a, b, x, y);
        cout << x << ' ' << y << endl;
    }
    
    return 0;
}

标签:gcd,int,欧几里得,扩展,exgcd,算法,y1,y0,x0
From: https://www.cnblogs.com/lbzbk/p/17380125.html

相关文章

  • 文心一言 VS chatgpt (15)-- 算法导论3.2 4~5题
    四、函数$\lceil\lgn\rceil!$多项式有界吗?函数$\lceil\lg\lgn\rceil!$多项式有界吗?文心一言:chatgpt:对于第一个问题,函数$\lceil\lgn\rceil!$是阶乘的形式,可以证明它是超多项式增长的,因此不是多项式有界的。对于第二个问题,函数$\lceil\lg\lgn\rceil!$......
  • 【算法基础】DFS深度优先算法 —— AcWing 843. n-皇后问题 AcWing 842. 排列数字
    n-皇后问题是一个经典的dfs深度优先遍历的题目,在题解这一题之前,将由浅入深,先讲解一个n-皇后问题的母题。-------AcWing842.排列数字 [AcWing842].排列数字题目概述给定一个整数 n,将数字 1∼n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格......
  • 文心一言 VS chatgpt (15)-- 算法导论3.2 4~5题
    四、函数多项式有界吗?函数多项式有界吗?文心一言:chatgpt:对于第一个问题,函数是阶乘的形式,可以证明它是超多项式增长的,因此不是多项式有界的。对于第二个问题,函数的增长速度比慢很多。虽然不是多项式,但是它是多项式有界的,也就是说,存在一个多项式和常数,使得当足够大时......
  • C语言基础算法
    1、计算Fibonacci数列Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21。C语言实现的代码如下:/* Displaying Fibonacci sequence up to nth term where n is entered by user. */#include <stdio.h>int main(){i......
  • 基于双目图像三维建模算法的测量目标物体体积计算matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要         双目立体视觉(BinocularStereoVision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三......
  • 高密度城市路线规划的遗传优化算法的matlab仿真,城市点数量达到500个
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要       遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按适者生存的原......
  • 面向开发者的ChatGPT提示工程-07.扩展
      第七章扩展扩展是将短文本,例如一组说明或主题列表,输入到大型语言模型中,让模型生成更长的文本,例如基于某个主题的电子邮件或论文。这样做有一些很好的用途,例如将大型语言模型用作头脑风暴的伙伴。但这种做法也存在一些问题,例如某人可能会使用它来生成大量垃圾邮件。......
  • 算法 | 快速排序详解
    1快速排序基本思想从待排序记录序列中选取一个记录(随机选取)作为基点,其关键字设为key,然后将其余关键字小于key的记录移到前面,而将关键字大于key的记录移到后面,结果将待排序记录序列分为两个子表,最后将关键字key的记录插入到分界线的位置。这个过程称为一趟快速排序。经过这一趟......
  • 基础算法
    位运算拆解:例如龟速乘和快速幂。状态压缩:可以用一个数字表示一个状态,不够长还可以用bitset。龟速乘通过对数字的每一位进行拆分,将乘法变成加法。代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;llmul(lla,llb,llp){ llans=0; while(b){ ......
  • m基于POCS算法的空域序列图像超分辨率重建matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       随着信息处理技术和视觉通信技术的高速发展,人们获取的知识量爆炸式增长,因此迫切的要求完善的信息处理技术为人们提供更加方便、快捷服务。数字图像及及其相关技术是信息处理技......