欧几里德算法及其扩展Word下载.docx

上传人:b****6 文档编号:20043524 上传时间:2023-01-16 格式:DOCX 页数:8 大小:43.35KB
下载 相关 举报
欧几里德算法及其扩展Word下载.docx_第1页
第1页 / 共8页
欧几里德算法及其扩展Word下载.docx_第2页
第2页 / 共8页
欧几里德算法及其扩展Word下载.docx_第3页
第3页 / 共8页
欧几里德算法及其扩展Word下载.docx_第4页
第4页 / 共8页
欧几里德算法及其扩展Word下载.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

欧几里德算法及其扩展Word下载.docx

《欧几里德算法及其扩展Word下载.docx》由会员分享,可在线阅读,更多相关《欧几里德算法及其扩展Word下载.docx(8页珍藏版)》请在冰豆网上搜索。

欧几里德算法及其扩展Word下载.docx

a=mc=(qx+y)dc,b=xdc,这时a,b的最大公约数变成dc,与前提矛盾,

所以

n,m-qn一定互质)

贝Ugcd(b,r)=c=gcd(a,b)

得证。

算法的实现:

最简单的方法就是应用递归算法,代码如下:

日巳

1intgcd(inta,intb)

2(

3if(b==0)

4returna;

5return

6gcd(b,a%b);

7}

代码可优化如下:

3returnb?

gcd(b,a%b):

a;

4}

当然你也可以用迭代形式:

日电

1intGcd(inta,intb)

4

{

5

intr=b;

6

b=a%b;

7

a=r;

8

}

9

returna;

10}

3

while(b!

=0)

扩展欧几里德算法

对丁不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y,使得gcd(a,b)=ax+by。

证明:

设a>

b。

1,显然当b=0,gcd(a,b)=a。

此时x=1,y=0;

2,ab!

=0时

设ax1+by1=gcd(a,b);

bx2+(amodb)y2=gcd(b,amodb);

根据朴素的欧几里德原理有gcd(a,b)=gcd(b,amodb);

则:

ax1+by1=bx2+(amodb)y2;

即:

ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;

根据包等定理得:

x1=y2;

y1=x2-(a/b)*y2;

这样我们就得到了求解x1,y1的方法:

x1,y1的值基丁x2,y2.

扩展欧几里德的递归代码:

日由

Iintexgcd(inta,intb,int&

x,int&

y)

4(

5x=1;

6y=0;

7returna;

8}

9intr=exgcd(b,a%b,x,y);

10intt=x;

IIx=y;

12y=t-a/b*y;

13returnr;

14}

扩展欧几里德非递归代码:

日晶

1intexgcd(intm,intn,int&

3intx1,y1,x0,y0;

x0=1;

y0=0;

x1=0;

y1=1;

x=0;

y=1;

intr=m%n;

intq=(m-r)/n;

while(r)

10

16

18}

扩展欧几里德算法的应用主要有以下三方面:

(1)求解不定方程;

(2)求解模线性方程(线性同余方程);

(3)求解模的逆元;

(1)使用扩展欧几里德算法解决不定方程的办法:

对丁不定整数方程pa+qb=c,若cmodGcd(p,q)=0,则该方程存在整数解,

否则不存在整数解。

上面已经歹0出找一个整数解的方法,在找到p*a+q*b=Gcd(p,q)的一组

解p0,q0后,p*a+q*b=Gcd(p,q)的其他整数解满足:

p=p0+b/Gcd(p,q)*t

q=q0-a/Gcd(p,q)*t(其中t为任意整数)

至丁pa+qb=c的整数解,只需将p*a+q*b=Gcd(p,q)的每个解乘上c/Gcd(p,q)即可。

在找到p*a+q*b=Gcd(a,b)的一组解p0,q0后,应该是得到p*a+q*b

=c的一组解pl=p0*(c/Gcd(a,b)),q1=q0*(c/Gcd(a,b)),

p*a+q*b=c的其他整数解满足:

p=pl+b/Gcd(a,b)*t

q=q1-a/Gcd(a,b)*t(其中t为任意整数)

p、q就是p*a+q*b=c的所有整数解。

相关证明可参考:

用扩展欧几里得算法解不定方程ax+by=c;

代码如下:

1boollinear_equation(inta,intb,intc,int&

2{

3intd=exgcd(a,b,x,y);

4if(c%d)

5returnfalse;

6intk=c/d;

7x*=k;

y*=k;

//求得的只是其中一组解

8returntrue;

(2)用扩展欧几里德算法求解模线性方程的方法:

同余方程ax=b(modn)对丁未知数x有解,当且仅当gcd(a,n)|b。

且方程有解时,方程有gcd(a,n)个解。

求解方程ax=b(modn)相当丁求解方程ax+ny=b,(x,y为整数)

设d=gcd(a,n),假如整数x和y,满足d=ax+ny(用扩展欧几里德得出)。

如果d|b,则方程

a*x0+n*y0=d,方程两边乘以b/d,(因为d|b,所以能够整除),得

到a*x0*b/d+n*y0*b/d=b。

所以x=x0*b/d,y=y0*b/d为ax+ny=b的一个解,所以x=x0*b/d为ax=b(modn)的解。

ax=b(modn)的一个解为x0=x*(b/d)modn,且方程的d个解分别

为xi=(x0+i*(n/d))modn{i=0...d-1}。

设ans=x*(b/d),s=n/d;

方程ax=b(modn)的最小整数解为:

(ans%s+s)%s;

相关证明:

证明方程有一解是:

x0=x'

(b/d)modn;

由a*x0=a*x'

(b/d)(modn)

a*x0=d(b/d)(modn)(由于ax'

=d(modn))

=b(modn)

证明方程有d个解:

xi=x0+i*(n/d)(modn);

由a*xi(modn)=a*(x0+i*(n/d))(modn)

=(a*x0+a*i*(n/d))(modn)

=a*x0(modn)(由于d|a)

=b

首先看一个简单的例子:

5x=4(mod3)

解得x=2,5,8,11,14.......

由此可以发现一个规律,就是解的间隔是3.

那么这个解的间隔是怎么决定的呢?

如果可以设法找到第一个解,并且求出解之间的间隔,那么就可以求出模的线性方程的解集了.

我们设解之间的间隔为dx.

那么有

a*x=b(modn);

a*(x+dx)=b(modn);

两式相减,得到:

a*dx(modn)=0;

也就是说a*dx就是a的倍数,同时也是n的倍数,即a*dx是a和n的公倍数.为了求出dx,我们应该求出a和n的最小公倍数,此时对应的dx是最小的.

设a和n的最大公约数为d,那么a和n的最小公倍数为(a*n)/d.

即a*dx=a*n/d;

所以dx=n/d.

因此解之间的间隔就求出来了

代码如下:

1boolmodular_linear_equation(inta,intb,intn)

3intx,y,x0,i;

4intd=exgcd(a,n,x,y);

5if(b%d)

6returnfalse;

7x0=x*(b/d)%n;

//特解

8for(i=1;

i<

d;

i++)

9printf("

%d\n"

(x0+i*(n/d))%n);

10returntrue;

11}

(3)用欧几里德算法求模的逆元:

同余方程ax=b(modn),如果gcd(a,n)==1,则方程只有唯一解。

在这种情况下,如果b==1,同余方程就是ax=1(modn),gcd(a,n)=1

这时称求出的x为a的对模n乘法的逆元。

对丁同余方程ax=1(modn),gcd(a,n)=1的求解就是求解方程

ax+ny=1,x,y为整数。

这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的x。

Poj2115

X=(b-a)/c(mod2Ak);

intmain()

{]

__int64s,p,a,b,c,k,d,e;

while(scanf("

%I64d%I64d%I64d%I64d"

&

a,&

b,&

c,&

k)!

=EOF&

&

!

(a==0&

b==0&

c==0&

k==0))

s=(int64)1<

<

k;

d=b-a;

e=exGcd(c,s,x,y);

if(d%e==0)

x=(x*(d/e))%s;

//方程ax=b(modn)的最小解

x=(x%(s/e)+s/e)%(s/e);

//方程ax=b(modn)的最整数小

cout<

x<

endl;

else

printf("

FOREVER\n"

);

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1