浅谈关于欧几里得的一系列算法

浅谈关于欧几里得的一系列算法

--------- 这里有个叫分界线的家伙说,本章的所有讨论均在整数的范围中,所有除法都为带余除法o----------------

朴素欧几里得算法

又名辗转相除法,代码实现如下:

int gcd(int a, int b) // a >= b
{
      if(b == 0)    return a;
      return gcd(b, a % b)
}

想一想为什么可以这样计算?

我们设

\(a=k_1m, \ b=k_2m \ ,gcd(a,b)=m,\ gcd(k_1,k_2)=1\)

很容易发现,当我们进行加减运算的时候,他们的和或者差一定是 \(m\) 的倍数,也就是说最大公约数不改变

既然这样,那么当 \(a\ mod\ b=0\) 的时候可以发现此时的 \(b\) 一定就是最大公约数 \(m\)

而我们为了造出这个特殊情况,我们可以像代码中展示的那样不停的迭代,由于我们始终保证了 \(a>b\) ,所以我们最后一定能得到我们想要的情况,从而得到 \(gcd\)

扩展欧几里得算法

这个算法的用处是用来解形如 \(ax + by = c\) 的不定方程

首先,如果你进行过一点思考的话就为发现必须满足条件 \(c \mid \ gcd(a,b)\) 原方程才有整数解

因此,我们可以把原式变成一个更容易讨论的形式

\(ax+by=gcd(a,b)\ \ (a>=b)\)

由于上面的思考,不难发现

\(\because gcd(a,b)=gcd(b,a\ mod\ b)\)

同上,我们依然讨论一下它的特殊情况,当 \(b=0\) 时,也就是 \(ax + by=a\) 时,显然 \(x=1,\ y=0\)

那么我们要做的就是通过这个临界情况,反推出原方程的一组解

\(\therefore\ \) 我们假设

\(ax_1+by_1=gcd(a,b)\)

\(bx_2+(a\ mod\ b)y_2=gcd(b,a\ mod\ b)\)

然后对这个形式做一些变形

\(\Rightarrow\ ax_1+by_1=bx_2+(a\ mod\ b)y_2\)

\(\Rightarrow\ ax_1+by_1=bx_2+(a-\frac{a}{b}b)y_2\)

\(\Rightarrow\ ax_1+by_1=b(x_2-(\frac{a}{b})y_2)+ay_2\)

又由于恒等定理可得

\(x_1=y_2,\ y_1=x_2-(\frac{a}{b})y_2\)

这样,我们就可以通过 \(x_2,\ y_2\) ,推断出 \(x_1,\ y_1\)

同样的道理,我们也就这样迭代下去,就可以得出那组特殊的解了

由于它的方法和朴素欧几里得算法有莫大的关联,所以我们可以在原来的代码上加上一些神秘的东西,变成扩展欧几里得算法

int exgcd(int aaa, int bbb, int &x, int &y)
{
    if(bbb == 0)
    {
        x = 1;
        y = 0;
        return aaa;
    }
    g = exgcd(bbb, aaa % bbb);
    int temp = x; x = y; y = temp - aaa / bbb * y;
    return g;
}

类欧几里得算法

这个算法其实可以衍生出好几种,接下来我们所讲解的是最基础,也是最经典的那一种

设 \(f(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor\)

我们要求的这个函数其实可以换个角度来观察

\(f(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{a}{c}i+\frac{b}{c}\rfloor\)

其实这个函数的几何意义是一次函数下 \(x\in [0,n]\) 整点的个数(包含直线上的点,但是不包含 \(y=0\) 的点)

所以我们就可以在这个思想上在进行一些变化

设 \(m=\lfloor\frac{an+b}{c}\rfloor\)

\(f(a,b,c,n)=\sum_{i=0}^n\ \sum_{j=1}^m\ [\frac{ai+b}{c}>=j]\)

\(f(a,b,c,n)=\sum_{i=0}^n\ \sum_{j=0}^{m-1}\ [\frac{ai+b}{c}>=j+1]\)

\(f(a,b,c,n)=\sum_{i=0}^n\ \sum_{j=0}^{m-1}\ [ai>=cj+c-b]\)

\(f(a,b,c,n)=\sum_{i=0}^n\ \sum_{j=0}^{m-1}\ [ai>cj+c-b-1]\)

\(f(a,b,c,n)=\sum_{i=0}^n\ \sum_{j=0}^{m-1}\ [i>=(\frac caj+\frac{c-b-1}a)]\)

\(f(a,b,c,n)=\sum_{j=0}^{m-1}\ [n-(\frac caj+\frac{c-b-1}a)]\)

\(f(a,b,c,n)=nm-\sum_{j=0}^{m-1}\ [\frac caj+\frac{c-b-1}a]\)

\(f(a,b,c,n)=nm-f(c,c-b-1,a,m-1)\)

通过这个变化,就可以递归求解了,时间复杂度和朴素欧几里得算法类似

原文地址:https://www.cnblogs.com/LLppdd/p/8428349.html

时间: 2024-10-11 17:59:46

浅谈关于欧几里得的一系列算法的相关文章

浅谈A/B测试里常见的辛普森悖论,企业决策者必看

A/B测试背后有着高深的统计学知识,今天我们就来讲讲常见的辛普森悖论. 辛普森悖论 (Simpson's Paradox) 是英国统计学家 E.H.辛普森 (E.H.Simpson) 于1951年提出的悖论,即在某个条件下的两组数据,在分别讨论时都会满足某种性质,可是一旦合并起来进行考虑,却可能导致相反的结论. 举一个辛普森悖论的简单小例子:一个大学里有商学院和法学院两个学院.这两个学院的女生都抱怨"男生录取率比女生录取率高",有性别歧视.但是学校做总录取率统计,却发现总体来说女生录取

浅谈HTML5中meta里面的viewport属性

<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> 1.width : 控制viewport的大小,可以指定一个值,如600, 或者特殊的值,如device-width为设备的宽度(单位为缩放为100%的CSS的像素) 2.height : 和width相对应,指定高度

浅谈压缩感知(四):恢复算法

主要内容: 1.L1 minimization 2.Matching Pursuit 3.Iterative thresholding 4.Total-variation minimization 1.L1 minimization 这是一个凸优化问题,类似于统计学中的LASSO. 优化算法有: 特点: L1最小化的其他形式: 2.Matching Pursuit 匹配追踪:参考http://www.cnblogs.com/AndyJee/p/3849200.html 算法步骤: 特点: 3.I

浅谈php随机不重复数的两种算法

先引入别人的一个秒表计时类(counttime.class.php): 1.先看第一个例子(大数中取少数): 1 <? 2 /* 3 @描述: Stopwatch这个类用户获取脚本执行时间 4 @作者: Klesti Hoxha <[email protected]> 5 */ 6 7 class Stopwatch { 8 private $start; 9 private $end; 10 private $markup_start = array(); 11 private $ma

欧几里得最大公约数算法

最大公约数 想必大家小学就学过什么事最大公约数吧,现在给出一个数学上的定义:定义$g$是整数$a$和$b$的最大公约数,当且仅当$g$是同时整除$a$和$b$的数中最大的那个. 欧几里得算法 欧几里得算法可以写成如下简单的形式: $$gcd(a,b) =\begin{cases} a, & \mbox{if }b=0 \\gcd(b,a\ mod\ b), & \mbox{if }b\ne0\end{cases}$$ 算法的证明 算法的过程可以写成如下的形式: $$a=q_0b+r_0$$

UVA 1347(POJ 2677)Tour(双调欧几里得旅行商问题)

Tour                 Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John mus

[ACM] POJ 2677 Tour (动态规划,双调欧几里得旅行商问题)

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3585   Accepted: 1597 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

浅谈Exgcd(扩展欧几里得)

我们已知,求最大公约数的方法: 求A,B两数的最大公约数,递归求解,递归边界是B==0. gcd(a,b)=gcd(b,a%b) 我们进一步来求Ax+By=Gcd(A,B)的解. 尝试套用欧几里得求法? 我们希望,有整数X,Y,使得: bX+(a%b)Y=Gcd(a,b). 那么我们有: bX+(a-a/b*b)Y=Gcd(a,b). 整理上式得:aY+b(X-a/bY)=Gcd(a,b) 这个式子可以提公因式,展开括号得到. 那我们就可以递归求解了. 代码: inline void Exgcd

浅谈欧拉函数【复习】

浅谈欧拉函数[复习] 定义: φ(n)表示小于n的正整数中和n互质的个数; 性质: 1.积性函数:φ(n×m)=φ(n)×φ(m)(感性理解) 2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1(感性理解) 3.[1,n]中与n互质的数的和为n×φ(n)/2 4.Σφ(d)=n,其中(d|n)(感性理解) 5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数) 证明: 这里插入个游戏: 问题:求正整数3^83^的最后两位数 回到正题 一:√n求单个数的欧拉函数