数论---扩展欧几里得算法

简介: 数论---扩展欧几里得算法

文章目录



欧几里得算法(辗转相除法)

欧几里得算法是用于求最大公约数

任何一个数a都可以表示成

a=pb+r

如果r=0则b就是其最大公约数

如果r!=0,就转化为b,r的

a,q,p,r均为整数

gcd表示最大公约数

gcd(a,b)=gcd(b,r)=gcd(b,a%b)

因此结束条件就是r=0,即b=0

typedef long long ll;
//最大公约数
int gcd(int a, int b)
{
  return b==0?a:gcd(b, a % b);
}

最小公倍数

我们知道a和b的最小公倍数是a和b的乘积除以gcd(a,b)

但是我们如果用两数相乘的话有可能会溢出

//最小公倍数a*b/gcd(a,b),为了避免溢出应该用a/gcd(a,b)*b
 int lcm(int a, int b)//
{
  return a / gcd(a, b) * b;
}

贝祖定理

ax+by称a,b的线性组合,

ax+by=m有解,当且仅当m为gcd(a,b)的倍数

ax+by=1时,说明a,b互质

如8和12的最大公约数是4

8x+12y=4,x=-1,y=1为其的一组解

扩展欧几里得算法

ll exgcd(ll a, ll b, ll& x, ll& y)//通过计算出gcd求得解
{
  if (b == 0ll)
  {
    //此时ax+by=g
    //gcd=a
    //x=1,y=0/1/2………任意数
    //x=1,y=0为其中的一组解
    x = 1;
    y = 0;
    return a;//到达递归边界开始向上一层返回
  }
  //gcd(a,b)=gcd(b,a%b)
  ll x1=0, y1=0;
  ll g = exgcd(b, a % b, x1, y1);//最大公约数,g为最大公约数
  //b*x1+(a%b)*y1=gcd(b,a%b)=gcd(a,b);
  //(x1,y1)->(x,y)
  x = y1;//x等于上一轮的y1
  y = x1 - (a / b) * y1;
  return g;//g就是最大公约数
}
int main()
{
  ll a, b;
  while (cin >> a >> b)
  {
    //先判断是否有解
    //(a,b),的最大公约数为1,有解
    if (gcd(a, b) != 1ll)//无解,不为互质数
    {
      cout << "sorry" << endl;
      continue;
    }
    ll x, y;//x和y就是解
    //求ax+by的一组解,用引用传就可以把x和y给解出来
    ll g = exgcd(a, b, x, y);
    //x = (x % b + b) % b;//以正数形式表现
    cout <<"x=" << x << "  y=" << y << endl;
  }
  return 0;
}

相关文章
|
4月前
|
算法
class072 最长递增子序列问题与扩展【算法】
class072 最长递增子序列问题与扩展【算法】
43 0
|
4月前
|
算法
class071 子数组最大累加和问题与扩展-下【算法】
class071 子数组最大累加和问题与扩展-下【算法】
41 0
|
4月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
550 1
|
3月前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
7天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
28天前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
3月前
|
算法 安全 数据挖掘
解锁编程之门:数论在算法与加密中的实用应用
解锁编程之门:数论在算法与加密中的实用应用
|
4月前
|
算法 数据安全/隐私保护
什么是扩展欧几里得算法?
【5月更文挑战第13天】什么是扩展欧几里得算法?
64 3
|
4月前
|
算法 Python
Python欧几里得算法找最大公约数
Python欧几里得算法找最大公约数
34 0
|
4月前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
55 0