首页 > 编程知识 正文

扩展欧几里得算法求乘法逆元过程,欧几里得算法推导

时间:2023-05-06 20:43:37 阅读:157666 作者:2715

来到这里,最难的算法终于来了,知道网络通信的时候,我一时觉得自己成了通信专业,现在又是几统院的学生;

的彩色聚类算法:定义:求解两个数最大公约数的算法;

使用:求两个数的最大公约数,以大数为分子小数计算分母,计算馀数。 将这次计算的分母作为接下来计算的分子,将这次计算的馀数作为接下来计算的分母,在馀数变为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; () ) ) ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。