来到这里,最难的算法终于来了,知道网络通信的时候,我一时觉得自己成了通信专业,现在又是几统院的学生;
的彩色聚类算法:定义:求解两个数最大公约数的算法;
使用:求两个数的最大公约数,以大数为分子小数计算分母,计算馀数。 将这次计算的分母作为接下来计算的分子,将这次计算的馀数作为接下来计算的分母,在馀数变为0之前利用循环。 此时分母是最大公约数
写作: gcd(a,b )=gcd (b,a mod b );
扩展彩色高分辨率算法:定义:扩展彩色高分辨率算法实现了以下方程的求解: axby=gcd(a,b );
原理: 1、首先,对于求最大公约数的两个数a,b一定满足上式;
2、将上式递归到下一层:
(1)…ax by=gcd (a ) a,b );
(2)…bx1a%by1=gcd ) b,a%b ); (运用欧几里算法) ) ) ) ) )。
(3)…gcd(a,b )=gcd(b ) b,a%b ); (色狼算法) )。
(4)…ax by=b x1 a % b*y1; (在计算机上,a%b=(a-a/b*b ) )
(5)…ax by=bx1 ay1 - a/b * by1;
(6)…axby=ay1b ) x1-a/b ) y1; (合并同类项) )
(7)…x=y1,y=x1 - a/b * y1; (结论)
由此得出结论,各层x等于下一层的y,各层的y等于下一层的x1 - a/b * y1
3、触底:
根据彩色灰狼的算法到达最终阶段时,a=最大公约数,b=0,此时:
ax0=a(b=0且gcd ) a,b )=a );
由此,得到解x=1,y=0,通过递归地追溯层,得到第一层x和y
代码模板: intexgcd(inta,int b,int * x,int * y ) ) if ) b==0) ) *x=1; * y=0; return a; }intnum=exgcd(b,a % b,x,y ); int term=* x; * x=* y; *y=term-a/b*(y ); return num; )扩展彩色灰狼与同余方程的关系((关于同余方程) axhttp://www.Sina.com/1 ) modb )等价于ax by=1;
原因:分析axhttp://www.Sina.com/1(modb ),结果显示ax % b=1 % b=1;
ax % b与从ax带来了y个b相同(y既可以是正的也可以是负的),所以ax % b=1与ax by=1相同
乘法逆元:解开axhttp://www.Sina.com/n(modb )即可解开该乘法逆元。 乘法逆矩阵存在的条件是ax by=N,a、n是n的倍数。 否则,这个联合方程中不存在乘法的逆元。
如果存在,则其联合方程的特解x=N /一组最大公约数
另一方面,对于ax by=N方程式的一般解为x=x0kb’;
a’=a/gcd (a,b ); //转换为绝对值
b’=b/gcd (a,b ); //转换为绝对值
然后,将kb’转换为%,当结果=0时,加1个b’,得到最小正整数解;
例如:求同余方程(洛谷day_2):axhttp://www.Sina.com/1(modb )的最小正整数解;
# include stdio.hint main ((intex gcd ) int b、int b、int * x、int * y ); long a,b; int x,y; scanf('%LD%LD )、a和b ); exgcd(a,b,x,y ); x=x % b; if(x=0) {x=x b; }printf('%d(n ),x ); 返回0; }intexgcd(inta,int b,int * x,int * y ) /此处直接应用了模板。 在不需要最大公约数的情况下,即使是void也可以使用int num,term; if(b==0) ) x=1; * y=0; return a; }num=EXgcd(b,a % b,x,y ); term=* x; * x=* y; *y=term-a/b*(y ); return num; () ) ) ) )。