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

扩展欧几里得算法

时间:2023-12-10 18:23:14浏览次数:33  
标签:return int 欧几里得 扩展 exgcd 算法 y1 ax x1

扩欧代码(时间复杂度O(logn))

求ax+by=gcd(a,b)的一组整数解

 

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

扩欧的应用

 

求解不定方程

求不定方程ax+by=c的一组整数解

思路

若gcd(a,b)|c(gcd(a,b)是c的因子),则有整数解

先用扩欧求ax+by=gcd(a,b)的解

再乘以c/gcd(a,b),即得原方程的特解

代码

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
    
int exgcd(int a,int b,int &x,int &y)
{
  if(b == 0) {x=1, y=0; return a;}
  int x1, y1, d;
  d = exgcd(b, a%b, x1, y1);
  x = y1, y = x1-a/b*y1;
  return d;
}
int main()
{
  int a, b, c, x, y;
  cin >> a >> b >> c;
  int d = exgcd(a,b,x,y);
  if(c%d == 0)printf("%d %d",c/d*x,c/d*y);
  else puts("none");
  return 0;
}

求解同余方程

给定整数a,b,m,求解同余方程ax≡b(mod m),如果x存在整数解,输出任意一个,不存在输出none

思路

把同余方程转化为不定方程,

由ax≡b(mod m)

得ax=m(-y)+b

ax+my=b

代码

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
    
int exgcd(int a,int b,int &x,int &y){
  if(b == 0){x = 1, y = 0; return a;}
  int x1, y1, d;
  d = exgcd(b, a%b, x1, y1);
  x = y1, y = x1-a/b*y1;
  return d;
}
int main(){
  int a, b, m, x, y;
  scanf("%d%d%d", &a, &b, &m);
  int d = exgcd(a, m, x, y);
  if(b%d == 0) 
    printf("%d", 1ll*x*b/d%m);
  else puts("none");
  return 0;
}

求解模的逆元

a与m互质时,对于方程ax≡1(mod m),求a的乘法逆元x(0<x<m)

思路

转化为同余方程,等价于ax+my=1

(x%m+m)%m即为答案,这是为了得到最小正整数

代码

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
    
int exgcd(int a,int b,int &x,int &y){
  if(b == 0){
    x = 1, y = 0; return a;
  }
  int x1, y1, d;
  d = exgcd(b, a%b, x1, y1);
  x = y1, y = x1-a/b*y1;
  return d;
}
int main(){
  int a, m, x, y;
  scanf("%d%d", &a, &m);
  exgcd(a, m, x, y);
  printf("%d", (x%m+m)%m);
  return 0;
}

 


标签:return,int,欧几里得,扩展,exgcd,算法,y1,ax,x1
From: https://www.cnblogs.com/modemingzi-csy/p/17893014.html

相关文章

  • 算法竞赛模板整理
    图论最短路structSPFA{vector<i64>dis;vector<bool>vis;vector<int>from;intn;SPFA(vector<vector<pair<int,i64>>>&g,ints):n(g.size()){dis.assign(n,INF),vis.assign(n,false),f......
  • 学C笔记归纳 第十篇——循环算法优化
    练习1:求1!+2!+...+10!一般算法:双层循环,外层1~10,内层计算每个数的阶乘,在外层把阶乘相加。intmain(){inti=0;intj=0;intjc=1;intsum=0;for(i=1;i<=10;i++){jc=1;//for(j=1;j<=i;j++){......
  • python算法
    目录: 回溯算法:  回溯算法:一般模型:results=[]defbacktrack(路径,选择列表):passif路径结束,满足约束条件:results.append(路径)#保存结果return#注意,返回到上一个分支,而不是返回结果,退出回溯if路径结束,不满足约束条件:......
  • 人工智能基础 - 机器学习算法分类
    监督学习在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不......
  • .net中加解密用BouncyCastle就够了,支持常用的各种加密解密算法
    BouncyCastle是一个流行的Java加解密库,也支持在.NET平台上使用。下面是BouncyCastle在.NET下使用的一些常见功能,包括AES、RSA、MD5、SHA1、DES、SHA256、SHA384、SHA512等。在开始之前,请确保你已经将BouncyCastle的NuGet包安装到你的项目中。你可以通过NuGet......
  • 深度解读DBSCAN聚类算法:技术与实战全解析
    探索DBSCAN算法的内涵与应用,本文详述其理论基础、关键参数、实战案例及最佳实践,揭示如何有效利用DBSCAN处理复杂数据集,突破传统聚类限制。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里......
  • Java之包装类的算法小题的练习
     算法小题练习一:需求:键盘录入一些1~10日之间的整数,并添加到集合中。直到集合中所有数据和超过200为止。代码示例:publicclassTest1{publicstaticvoidmain(String[]args){/*键盘录入一些1~10日之间的整数,并添加到集合中。直到集合中所有数据和超......
  • 贪心算法
    1.贪心算法1.电台覆盖区域求最优解问题题目:假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有的地区都可以接收到信号广播台覆盖地区K1“北京”,“上海”,“天津”K2“广州”,“北京”,“深圳”K3“成都”,......
  • 代码随想录算法训练营第7天 | lc344、lc541、卡码54、lc151、卡码55
    (本合集全部为Go语言实现)相关文章链接:344题解541题解卡码54题解151题解卡码55题解相关视频链接:Leetcode344状态:秒了实现过程中的难点:对撞双指针个人写法funcreverseString(s[]byte){fori,j:=0,len(s)-1;i<j;i,j=i+1,j-1{s[i],s[j]......
  • 基于PSD-ML算法的语音增强算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022A 3.算法理论概述      PSD-ML(PowerSpectralDensityMaximumLikelihood)算法是一种基于最大似然估计的语音增强算法,通过对语音信号的功率谱密度进行估计,并利用估计结果对原始语音信号进行滤波处理,以达......