类欧几里得算法乱搞记

这三个f,g,h让我的脑子快要爆炸,还是终于推了出来,记录一下。

记得初一的时候就无意间在ZJY的PPT翻到了这个东西,当时和WYT推了一波,到现在连个印象都没有。

据说有几何推法,我这么渣肯定是不会的了。

参考博客:Xdl.


定义:

f(a,b,c,n)=ni=0ai+bc
g(a,b,c,n)=ni=0iai+bc
h(a,b,c,n)=ni=0ai+bc2


f的推导:

a=a mod c,b=b mod c

f(a,b,c,n)=ni=0ai+bc+aci+bc
=f(a,b,c,n)+n(n+1)/2ac+(n+1)bc

进过上面这个调整后可以使 a,b<c ,这也是为什么它叫类欧几里得算法的原因,从最终的式子可以看出来这点。

m=an+bc

f(a,b,c,n)
=ni=0ai+bc
=mj=1ni=0[ai+bc>=j]
=m1j=0ni=0[ai+bc>=j+1]
=m1j=0ni=0[ai>=jc+cb]
=m1j=0ni=0[ai>jc+cb1]
=m1j=0ni=0[i>jc+cb1a]
=m1j=0njc+cb1a
=nmm1j=0jc+cb1a
=nmf(c,cb1,a,m1)

这个可以直接递归去求。我设的边界是m=0。

发现a,c的位置互换了。因为a是已经mod过c的了,所以这和欧几里得算法的复杂度是一模一样的。


g的推导:

g(a,b,c,n)=ni=0ni=0iai+bc+aci2+bci
=g(a,b,c,n)+n(n+1)(2n+1)/6ac+n(n+1)/2bc
接下来的变换和f类似,跳一下步:
g(a,b,c,n)
=m1j=0ni=0i[i>jc+cb1a]
到这里,实际上可以用个等差数列搞搞。
=m1j=0(njc+cb1a)(n+jc+cb1a+1)/2
=12m1j=0n(n+1)jc+cb1ajc+cb1a2
=12(mn(n+1)f(c,cb1,a,m1)h(c,cb1,a,m1))


h的推导:

h(a,b,c,n)=(ni=0ai+bc+aci+bc)2
=h(a,b,c,n)
+n(n+1)(2n+1)/6ac+(n+1)bc
+2bcf(a,b,c,n)+2acg(a,b,c,n)
+n(n+1)acbc

一种有用的写法: x2=(2xi=0i)x

h(a,b,c,n)=ni=0(2(ai+bcj=1j)ai+bc)
=2(m1j=0(j+1)ni=0[ai+bc>=j+1])f(a,b,c,n)
=2(m1j=0jni=0[ai+bc>=j+1])+2(m1j=0ni=0[ai+bc>=j+1])f(a,b,c,n)
=2(m1j=0jni=0[i>jccb1a])+2(m1j=0ni=0[i>jccb1a])f(a,b,c,n)
=2(m1j=0j(njccb1a)+2(m1j=0njccb1a)f(a,b,c,n)
=m(m1)n2g(c,cb1,a,m1)+2mn2f(c,cb1,a,m1)f(a,b,c,n)
=m(m+1)n2g(c,cb1,a,m1)2f(c,cb1,a,m1)f(a,b,c,n)

至此,三种常见的形式已经弄完。

实现的话只求f还好,由于g和h相互调用,可能要用结构体来存。

代码的话暂时没有。

你可能感兴趣的:(模版,类欧几里得)