关于GCD和Fibonacci【Lamé定理】
opencell吧
全部回复
仅看楼主
level 11
IveArthur 楼主
一楼防被吞
2014年02月06日 11点02分 1
level 11
IveArthur 楼主
都知道怎么写求GCD(最大公约数)和Fibonacci数列的算法,那么我先给出我的方法:
int Eculid(double x,double y)
{
if((x/y)%1==0)
return x/y;
else
Eculid(y,x%y);
}
//上面的算法是简化过的
long long Fib(int x)
{
if(x==1||x==2)
return 1;
else
return Fib(x-1)+Fib(x-2);
}
//同样,也是简化过的
//
那么就提出一个证明:
如果Ecuclid算法需要k步来计算两个数的GCD,那么这两个数之中较小的一个必然大于等于Fibonacci数列的第k项。
2014年02月06日 11点02分 2
level 11
IveArthur 楼主
翻了一下SICP才找到比较简略的证明:证明如下:
设存在数对序列(ak,bk)//k是脚码,其中ak>bk,假设欧几里得算法在第k步结束。
首先证明一个基础定理:若(ak+1,bk+1),(ak,bk),(ak-1,bk-1)是规约数列中连续的三个数对,那么必有bk+1≥bk+bk-1。//再次声明,式中出现的k,k-1,k+1都是脚码
假设上述定理成立,由算法可知,b≥1,那么当k(算法结束所需步骤)为一时结论成立,因为此时Fib(1)=1
接下来假设所有小于k的整数都成立,那么设法建立对k+1的结果。
令(ak+1,bk+1),(ak,bk),(ak-1,bk-1)是归约数对连续三个数对,我们有 bk≥Fib(k)和bk-1≥Fib(k-1),这样,应用已证明的定理和Fibonacci的定义,可以给出bk+1≥bk+bk-1≥Fib(k+1),这就完成了拉密定理的证明
2014年02月06日 11点02分 3
level 11
IveArthur 楼主
如何证明基础的定理呢,证明如下:
我们需要注意到,这里的每个归约步骤都是通过应用变换ak-1=bk,bk-1=ak除以bk的余数。第二个等式意味着ak=qbk+bk-1,其中q是某个正整数,因为q至少是一,所以应该有ak=qbk+bk-1≥bk+bk-1,但前面有一个归约步骤bk+1=ak,因而bk+1=ak≥bk+bk-1,便证明了上述定理
2014年02月06日 11点02分 4
这两个定理我都扩充了内容,方便大家理解,有问题提问
2014年02月06日 11点02分
level 6
O.O不明觉厉,算法纯小白路过,”算法导论”至今放家沾灰
2014年02月06日 12点02分 5
这个只是一个证明而已。。。不过好多地方会用到eculid算法。。感觉必修三里教的求GCD的算法就是个渣
2014年02月06日 12点02分
@IveArthur 江苏高考跟你们不一样。。看不懂。。
2014年02月06日 12点02分
回复 regexepx :你们高中不教算法的么
2014年02月06日 12点02分
@IveArthur 只是最简单的if,while;for都很少考
2014年02月06日 12点02分
level 6
我们学校的各种竞赛资格都属于重点班的学生(实际上他们怎么会有空)。我成绩不算重点
2014年02月06日 13点02分 6
正解,不过我学习不错,而且我总有空(不知道为什么)
2014年02月06日 13点02分
@IveArthur 不一样,尤其是高三,重点班要跟其他学校联考,自己进行”提高”考,还要跟我们”普通”考,还要教大学知识应付能力题。。。
2014年02月06日 13点02分
回复 regexepx :没办法呢~现状呢~说多了都是泪(我们这也是这样),不过我只是拿别人写作业的时间花在学习编程上,所以时间比较充足(因为我有一群好基友会帮我做作业)
2014年02月06日 13点02分
1