~》》_《《~

咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!!

  Begin !

~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不重要,重要的她代表的含义,其实呢,gcd(a,b)就表示 非负整数 a 和 b(不同时为0) 的最大公约数,(数论概论上说:计算 a 与 b 的最大公因数的更低效方法是我女儿四年级老师教的方法,老师要求学生求出 a 与 b 的所有因数,然后找出同时出现在两个表中的最大数字。 YES!A good idea for 小学生!) 。如今呢,我们自然不能这样算啦!

好吧!从求 gcd (a,b) 开始!

  一般的有下列式子:

a = b * q1 + R1  ;

b = R1 *q2 + R2 ;

R1 = R2 * q3 + R3 ;

R2 = R3 * q4 + R4 ;

。。。。。。

。。。。。。

  这样写下去什么时候才是个头啊~_~。。。

  很显然 必然会有结束的地方的,因为肯定会有一个 R  为 0 (R2 >= R4 >= R6 ....,R1 >= R3 >= R5 ...),好吧,继续往下写:

Rn-1 = Rn * qn+1  +   Rn+1  ;

Rn = Rn+1 * qn+2  +  Rn+2 ;假设 Rn+2 == 0

。。。。。。。。。。。。。 ok!^_^  。。。。。。。。。。。。。。

Rn+2 = 0了,那么由最后一个式子得 Rn+1整除Rn,接着,Rn+1 整除 Rn-1,,,,很显然的,这个递推可以推到第一个式子,so,Rn+1 整除 a,Rn+1 整除 b, 也就是说 Rn+1 是 a 与 b 的公约数了,是不是最大的呢?先把 Rn+1 记为 g,设 d 为 a 与 b  的任意一个公约数,由第一个

式子(a = b * q1 + R1)可以知道,d 整除 R1 ,再代入到第二个式子里得, d 整除 R2,推啊推,推啊推,最后知道了 d 整除 Rn+1,即 d 整除 g,

因为 d 是任意的公约数 , d 整除 g ,那么 取 d 为 最大公约数,则 g 既是公约数,又是最大公约数的倍数,只能是 :g 就是最大公约数。

  在前面“,,,,递推 。。”里隐藏了一个惊天大秘密,那就是 gcd(a,b) = gcd(b,a%b),这个秘密啊,十分的奇妙!为啥有这个结论呢?从第一个式子(a = b * q1 + R1) 显然, gcd (a,b) = g; 再显然 gcd(b,r1) = g ; 。。。。。 显然嘛,gcd (a,b) = gcd(b,a%b),

 。。。。。。。。。。。ok。这个问题算是解决了。代码附上。。。。。。。。。。。。。。。。。。。

 int gcd(int a,int b)
{
return b==?a:gcd(b,a%b) ;
}

gcd

~2~,好吧,其实前面只是闲扯!不过我可以赌五毛钱前面的东西没有偏题!

  下面来正面解决这个问题:a*x + b*y = gcd(a,b) ;

  一般的有下列式子:

a = b * q1 + R1  ;     R1 = a - q1 * b ;

b = R1 *q2 + R2 ;    R2 = b - q2 * R1 ;

R1 = R2 * q3 + R3 ;   R3 = R1 - q3 * R2 ;

R2 = R3 * q4 + R4 ;

。。。。。。

  值得注意的是右边的式子。可以发现每一个 R 都可以表示成 a 和 b 的倍数(把R1记作 (1,-q1)),可以定义一个结构体 A, B(好吧,是两个),

A.x ,A.y 分别表示 a, b 的系数,初始化一下A = a = (1,0),B = b = (0,1), 那么,R1 = A - q1*B ; 可以看到下面还要用到R1,而且用不到 A 了,

直接 令 A = R1 多好呢! A = A - B*q1 ; 再看R2 , R2 = B - q2*R1 = B - q2*A ; 同样 令 B = R2;则 B = B - A*q2;下面 R3 = A - q3*B ;也就是

A = A - q3*B ;再接着: B = B - A*q 。。。。。。等等,什么时候终止呢?在“再看R2"之前,考虑这样一个问题,若 R1 == g 呢?显然这个时候就要终止了,伪代码如下:

while(1) {

  q = a/b;

  r = a%b;

  A = A - B*q;

  (a,b) = (b,a%b);

  (A,B) = (B,A) //这样更容易写代码

  if (a%b == 0) break;

}

: 0 需特判。

代码如下:

 void sol(int a,int b,int &g)
{
A.x = B.y = ;
A.y = B.x = ;
if (a == ) {
g = b ;
A.x = ;
A.y = ;
return ;
}
if (b == ) {
g = a;
A.x = ;
A.y = ;
return ;
}
Node C ;
int q, r ;
while () {
q = a/b ;
r = a%b ;
A.x = A.x - B.x*q;
A.y = A.y - B.y*q;
a = b;
b = r;
if (a%b == ) break;
C = A;
A = B;
B = C;
}
g = b ;
}

ex_gcd

  其实呢?还有一个代码比较简短,用的是递归,附上如下:

 void ex_gcd(int a,int b,int &g,int &x,int &y)
{
if (!b) {
g = a;
x = ;
y = ;
}
else {
ex_gcd(b,a%b,g,y,x) ;
y -= x*(a/b) ;
}
}

递归版的ex_gcd

显然, a*x+b*y = gcd(a,b)的解不止一个((x,y)),事实上,此方程的每一个解都可由 (x+k*(b/g),y-k*(a/g))得出,其中 k 可取任意整数。

数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)的更多相关文章

  1. 五一DAY1数论学习笔记

    by ruanxingzhi 整除性 如果a能把b除尽,也就是没有余数,则我们称a整除b,亦称b被a整除.(不是除以,是整除!!) 记作:\(a|b\) |这个竖杠就是整除符号 整除的性质 自反性 对 ...

  2. 《Fluid Engine Development》 学习笔记1-求解线性方程组

    我个人对基于物理的动画很感兴趣,最近在尝试阅读<Fluid Engine Development>,由于内容涉及太多的数学问题,而单纯学习数学又过于枯燥,难以坚持学习(我中途放弃好多次了) ...

  3. ES6-个人学习笔记二--解构赋值

    第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或 ...

  4. mybatis 学习笔记 -详解mybatis 及实例demo

    快速入门1 要点: 首先明白mybatis 是什么 这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. 首先, ...

  5. linux学习笔记-10.解压与压缩

    1.gzip压缩 gzip a.txt 2.解压 gunzip a.txt.gzgzip -d a.txt.gz 3.bzip2压缩 bzip2 a 4.解压 bunzip2 a.bz2bzip2 - ...

  6. 1.JasperReports学习笔记1-了解JasperReports

    转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html JasperReports是一个开源的java报表制作引擎,官网地址:h ...

  7. ES6学习笔记之解构赋值

    1.数组的解构赋值 简单用法 { // 旧 let a=1,b=3; //新 let [a,b]=[1,3]; console.log(a,b);// 1 3 } 只要等号两边的模式相同,左边的变量就 ...

  8. sql注入学习笔记 详解篇

    sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...

  9. C#学习笔记--详解委托,事件与回调函数

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等.“protected void Pag ...

随机推荐

  1. 无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。

    在删除northwindcs表时,发生报错,消息 3726,级别 16,状态 1,第 2 行,无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用.此时判断是因为有其他表的外键 ...

  2. KEGG数据库

    参考:KEGG数据库中文教程 - 博奥  &[学习笔记]KEGG数据库 - 微信 学习一个技能最主要的事情你必须知道,那就是能通过它来做什么? KEGG数据库里面有什么? 如何查询某一特定的代 ...

  3. MYSQL 模糊查询

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  4. django 模型

    一.project 与app之间的关系 1个project中可包含多个app eg:包含两个app的project的结构

  5. VMware8.0虚拟机中安装Ubuntu12.04使用NAT设置连接网络

    之前一直尝试使用“桥接”的方法,但是一打开虚拟机,本机windows就断网.最后不得不换种方法,还好尝试了很多遍终于使用NAT设置成功的联网了. 说明:本机windows连接的是无线网. 1.检查自己 ...

  6. JavaScipt 数据交互

    标准的w3c直接提供了XMLHttpRequest方法,我们主要站在设计的角度来理解,如何设计出低耦合高内聚的代码jquery对Ajax的处理主要体现在对浏览器兼容,数据的处理过滤以及各种事件的封装上 ...

  7. python类中super()和__init__()的区别

    class Base(object):     def __init__(self): print 'Base create' class childB(Base): def __init__(sel ...

  8. memcached 的简介、安装、命令

    一.memcached 概述 Memcache(内存,缓存) : 是一个高性能的分布式的内存对象缓存系统.通过在内存里维护一个巨大的hash表.(key=value) Hash表 key(键) val ...

  9. MVC5+EF6 入门完整教程八

    本篇是相对独立的一篇,主要讲解不丢失数据进行数据库结构升级. 前面我们讲解EF功能时,已经介绍过一种更新数据库的方式: EF比较model和database,如果两边不一致,程序将会drop and ...

  10. 隔壁信概大作业xjb写——同化棋ATAXX

    话说泥萌北大信科啊,助教是有多懒...去年黑白棋今年同化棋,顺带打ai都不用自己写标程... 好吧..我知道泥萌重点在各种sb的辅助操作上..什么悲剧的可以随时暂停载入...有毒吧 [据说泥萌上课没讲 ...