有关欧几里德算法整理:


1.一些相关概念: <1>.整除性与约数: ①一个整数可以被另外一个整数整除即为d|a(表示d整除a,通俗的说是a可以被d整除),其含义也可以说成,存在某个整数k,使得a=kd.
②如果d|a且d>=0,则称d是a的约数。
③如果d|a,则-d|a,即a的任何约数的负数同样可以整除a.但一般规定,约数为非负数。非零整数a的约数应至少为1,且d<=|a|.
④因子:整数a的非平凡约数(除了1和它本身的约数)称为a的因子。 <2>.素数和合数. <3>.除法定理:
对于任何整数a和任何正整数n,存在唯一整数q和r,满足0<=r<n,且a=qn+r.
        等模:               
根据整数模n的余数,我们可以将所有的整数划分成n个等分类。包含整数a的模n等价类为:[a]n={a+kn}
   <4>.公约数与最大公约数:
①概念:
公约数:如果d是a的约数并且d也是b的约数,则d是a与b的公约数;
两个不同时为0的整数a与b的公约数种最大的称为其最大公约数,记作gcd(a,b);
②基本性质:
公约数的重要性质:若d是a,b的公约数,则d|(a+b)且d|(a-b);且对任意整数x,y,有d|(ax+by);
gcd函数的基本性质略简单不提; 若任意整数a,b不都为0,则gcd(a,b)为a与b的线性组合集{ax+by:x,y属于Z}的最小正整数。
 这里略带证明一下:

       设s是a与b的线性组合集合中的最小正元素,并且对某个x,y属于Z,有s=ax+by,设q=a/s.
a mod s=a-qs;
由于0<=a mod s<s
=>a mod s=
=>s|a;
同理,s|b
=>s是a与b的公约数,满足gcd(a,b)>=s;
又gcd(a,b)|s,s>0
=>gcd(a,b)<=s;
结合以上,gcd(a,b)=s;

2.欧几里德算法:

  <1>.基本原理:gcd(a,b)=gcd(b,a mod b)

  <2>.代码:
欧几里德算法://递归
int gcd(int a,int b)
{
if (b==0) return a;
else return gcd(b,a mod b);
} 最小公倍数:
int gbs(int m,int n)
{
return m*n/gcd(m,n);
}

 3.扩展欧几里德算法:

<1>.形式:d=gcd(a,b)=ax+by;

<2>.推导:

设 ax1+by1=gcd(a,b);

  bx2+(a mod b)y2=gcd(b,a mod b);

  根据欧几里德原理有 gcd(a,b)=gcd(b,a mod b);

  则:ax1+by1=bx2+(a mod b)y2;

  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;

  根据:x1=y2; y1=x2-(a/b)*y2;

   上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

代码如下

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

  

如果您不太理解以上的程序,可以试着看看算法导论的伪代码:

这个代码是实现起来和上面是一样的,只是在这里可以帮助理解

EXTENDED-EUCLID(a,b)
if(b=0)
then return (a,1,0)
(d1,x1,y1) <- (d1,y1,x1-a/b*y )
return (d,x,y)

  

个人觉得,要真正理解这个算法,还是需要通过刷题来领会


           

欧几里德算法及其扩展(推导&&模板)的更多相关文章

  1. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  2. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  3. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  4. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  5. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...

  6. HDU 1576 A/B 扩展欧几里德算法

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. ACM_扩展欧几里德算法

    <pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表 ...

  8. 扩展欧几里德算法(递归及非递归实现c++版)

    今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...

  9. 欧几里德算法gcd及其拓展终极解释

    这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解   扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...

随机推荐

  1. 第11章 享元模式(Flyweight Pattern)

    原文 第11章 享元模式(Flyweight Pattern) 概述:   面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时 ...

  2. 并查集(Union-Find)算法介绍

    原文链接:http://blog.csdn.net/dm_vincent/article/details/7655764 本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构 ...

  3. linux_ubuntu 16.04 更新wifi驱动_无法链接wifi问题

    ubuntu kylin ubuntu kylin ubuntu kylin wifi 这个很好解决的,16.04 默认 没有使用wifi驱动设备,默认选择的是:不使用设备1.进入到,软件和更新 -- ...

  4. 项目中经常使用的JS方法汇总,非常有用

    // 对Date的扩展,将 Date 转化为指定格式的String   // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符,   // 年(y)可以用 1- ...

  5. 玩转Vim-札记

    玩转Vim-札记 距上篇博文已有一周有余,上次主要介绍了编辑器之神Vim的起源.安装并介绍了两种模式以及一些简单的操作.本次将继续对Vim的使用进行介绍. 登堂入室 首先接着说移动吧: 1 0 → 数 ...

  6. Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)

    创Android Applicationproject:采用Eclipse的Android插入ADT创Androidproject,project名字Gpio,创建完成后,project文件夹pack ...

  7. Uva 409-Excuses, Excuses!(串)

    Judge Ito is having a problem with people subpoenaed for jury duty giving rather lame excuses in ord ...

  8. [Attila GPU] ATTILA GPU Streamer Unit (D3D Input Assambler) 结构分析

    http://www.opengpu.org/forum.php?mod=viewthread&tid=40&highlight=Attila 查看: 7488|回复: 26    [ ...

  9. API帮助页面

    ASP.NET Web API 2:创建API帮助页面        当你新建了一个web API服务之后,再建一个API帮助页面是很有好处的,这样其他开发人员就会很清楚地知道如何调用你的API接口. ...

  10. Ejb in action(七)——message与JMS

    我们扩大MDBs学前,我们需要理解message(新闻)与JMS(Java Message Service)的概念. 我们在Java EE中谈论消息,实际上就是意味着实现一个松耦合的过程.系统组件之间 ...