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

欧几里得算法

时间:2024-01-25 12:00:12浏览次数:40  
标签:frac gcd cdot 欧几里得 int 算法 ax bmod

欧几里得算法

用于求解两个数 \(a,b\) 的最大公约数,\(\gcd(a,b) = \gcd(b,a \bmod b)\),为了方便证明,我们约定 \(a > b\),证明:

设 \(r = a \bmod b = a - k \cdot b\),\(d \mid a\) 且 \(d \mid b\),显然 \(a = k \cdot b + r\),那么 \(\frac{r}{d} = \frac{a}{d} - \frac{k \cdot b}{d}\),因为 \(\frac{a}{d} - \frac{k \cdot b}{d}\) 显然为整数,所以 \(\frac{r}{d}\) 也为整数,所以可证 \(\gcd(a,b) = \gcd(b,a \bmod b)\)。\(\Box\)

所以我们就可以写出如下代码:

$\tt{Link}$
il int gcd(int a,int b) {
	return b ? gcd(b,a % b) : a;
}

因为每次进行取模再递归,所以时间复杂度为 \(\mathcal{O(\log a)}\)。

扩展欧几里得算法

用于求 \(ax + by = \gcd(a,b)\) 的一组可行解。

前置知识:裴蜀定理:对于任意整数 \(a,b\),存在一对整数 \(x,y\),满足 \(ax+by=\gcd(a,b)\)。

推导:

由欧几里得算法,可得 \(ax_1 + by_1 = \gcd(a,b)\) 等同于 \(bx_2 + (a \bmod b)y_2 = \gcd(b,a \bmod b)\)。

所以 \(ax_1 + by_1 = bx_2 + (a \bmod b)y_2\),将 \(a \bmod b\) 转换,得到 \(ax_1 + by_1 = bx_2 + (a - \left \lfloor \frac{a}{b} \right \rfloor \cdot b)y_2\)。

把式子拆开 \(ax_1 + by_1 = bx_2 + ay_2 - \left \lfloor \frac{a}{b} \right \rfloor \cdot b \cdot y_2\),

合并 \(ax_1 + by_1 = ay_2 + b \cdot (x_2 - \left \lfloor \frac{a}{b} \right \rfloor \cdot y_2)\),

得到 \(x_1 = y_2,y_1 = (x_2 - \left \lfloor \frac{a}{b} \right \rfloor \cdot y_2)\),那么我们就可以根据这个,不断递归求解,当递归到 \(b = 0\) 时,返回 \(a\) 的值即可,为了方便操作,可以将 \(x,y\) 取地址。

可以写出如下代码:

$\tt{Link}$
il 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;
}

一般的,对于 \(ax + by = c\),我们可以知道,该方程有整数解当且仅当 \(\gcd(a,b) \mid c\)

此时我们可以优先求解 \(ax' + by' = \gcd(a,b)\),令 \(d = \gcd(a,b)\),我们可以得到方程的通解为

\[\left\{ \begin{array}{**lr**} x = x' \times \cfrac{c}{d} + \cfrac{b}{d} \cdot k\\ y = y' \times \cfrac{c}{d} - \cfrac{a}{d} \cdot k \end{array} \right. \]

标签:frac,gcd,cdot,欧几里得,int,算法,ax,bmod
From: https://www.cnblogs.com/songszh/p/17986791/oujilidesuanfa

相关文章

  • java中双指针算法(快指针与慢指针)
    双指针法:设置两个指针,分别是快指针和慢指针,分别是i和j。  设置一个变量temp用来储存第一个数据nums[0] 过程:1.nums[0]  temp  他们两个相等  那么temp不需要改变,i=i+1,j变,i=1,j=1   2.nums[i=1],temp  他们两个相等,temp不变,i=i+1,j不......
  • 文心一言 VS 讯飞星火 VS chatgpt (186)-- 算法导论14.1 3题
    三、用go语言,写出OS-SELECT的非递归版本。文心一言:下面是使用Go语言编写的OS-SELECT的非递归版本:funcOS_SELECT(T*Node,kint)*Node{//找到最小秩的节点minRankNode:=findMinRankNode(T)//如果最小秩的节点就是目标节点,则返回该节点if......
  • Unity3D Rts游戏里的群体移动算法是如何实现的详解
    实时战略(RTS)游戏是一种以管理和控制虚拟军队为主题的游戏类型。在这类游戏中,玩家需要控制大量的单位进行战斗、资源采集和建设等操作。其中,群体移动算法是实现这些操作的关键之一。本文将详细介绍Unity3DRTS游戏中群体移动算法的实现原理和代码实现。对啦!这里有个游戏开发交流小......
  • Tarjan 算法(超详细!!)
    Tarjan算法前言说来惭愧,这个模板仅是绿的算法至今我才学会。我还记得去年CSP2023坐大巴路上拿着书背Tarjan的模板。虽然那年没有考连通分量类似的题目。现在做题遇到了Tarjan,那么,重学,开写!另,要想学好此算法的第一件事——膜拜Tarjan爷爷。Tarjan算法到底是什么其......
  • 2024/1/24 算法笔记
    1.快速幂模板虽然前面可能写过了,但是遇到了就再贴一下。LLqmi(LLa,LLk,LLp){LLres=1%p;while(k){if(k&1)res=res*a%p;a=a*a%p;k=k>>1;}returnres;}2.最大子段和给一个数组,求其中元素总和最大......
  • PPO算法——PPOxFamily
    1.决策智能目的就是搜索最优解,方法主要有两种:从模仿中学习、从试错中学习从模仿中学习通过棋谱来学棋优势:简洁直观劣势:数据要求高,可迁移性差从试错中学习通过对弈来学习优势:可以不断提升和强化劣势:过程复杂,效率和稳定性有待提高深度强化学习——更强大、更通用、更稳定......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html简单的二分查找法,核心是认识区间的意义,注意以下几点:middle=low+(low+high)/2;这种写法可以防止溢出。注意low和high的循环条件判断,如果是左闭右闭......
  • 重写SpringCloudGateway路由查找算法,性能提升100倍!
    如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发背景先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中,会偶现部分接口从发起请求到业务应用处理间隔了大概5秒的时间,经排查后发现是SpringCloudGateway底层在查找对应的R......
  • day25 代码随想录算法训练营 216. 组合总和 III
    题目:216.组合总和III我的感悟:还是按照之前的套路来。多了一个参数path_sum应该是有两处剪枝,1处横线剪枝,1处纵向剪枝?或者说1处求和剪枝?1处范围剪枝?【疑问】理解难点:不剪枝的已经模的差不多了,剪枝的再看看 自己听了一遍写的:[未剪枝]classSolution:defcombina......
  • 字符串算法
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllN=1e6+10;chars1[N],s2[N];lln1,n2,nt[N],f[N];intmain(){ cin>>(s1+1)>>(s2+1); n1=strlen(s1+1),n2=strlen(s2+1); for(lli=2,j=0;i<=n2;i++){ while(j......