Home Техника Алгоритъм на Евклид

Алгоритъм на Евклид



ThesynonymousdivisionmethodgenerallyreferstotheEuclideanalgorithm.

Introductiontothealgorithm

TheEuclideanalgorithmisanalgorithmusedtofindthegreatestcommondivisoroftwopositiveintegers.TheancientGreekmathematicianEuclidfirstdescribedthisalgorithminhisbook"TheElements",soitwasnamedEuclid'salgorithm.

TheextendedEuclideanalgorithmcanbeusedinfieldssuchasRSAencryption.

Ifyouneedtorequestthegreatestcommondivisorofthetwopositiveintegers1997and615,useEuclid'salgorithmtoproceedlikethis:

1997/615=3(остават 152)

615/152=4(Оставащи 7)

152/7=21 (Оставащи 5)

7/5=1(Оставащи2)

5/2=2(остава 1)

2/1=2(оставащи0)

Досега най-добрият комонделител е1

Repeatthedivisionoperationwiththedivisorandremainder.Whentheremainderis0,takethedivisorofthecurrentformulaasthegreatestcommondivisor,sothegreatestcommondivisorof1997and615isobtained.

Доказателство за изчисление

Принципът на изчислението зависи от следната теорема:

Theorem:ThegreatestcommondivisoroftwointegersisequaltothesmallernumberandtwoThegreatestcommondivisoroftheremainderafterdividinganumber.TheGreatestCommonDivisorisabbreviatedasGCD.

gcd(a,b)=gcd(b,amodb)(Нека сета>bandr=amodb,risnot0)

ProofMethodOne

acanbeexpressedasa=kb+r(a,b,k,rareallpositiveintegers,andr

Предполагаме, че disacommondivisorofa,b,markMaked|a,d|b,thatis,bothaandbможе да бъде разделим отd.

Andr=a-kb,разделете двете страни на една и съща дата,r/d=a/d-kb/d,От дясната страна на уравнението можем да видим,че m=r/disaninteger,sod|r

Sodisalso thecommondivisorofb,amodb.

Тъй като (a,b) ако общият делител на (b,amodb) е равен, най-големият общ делител също е равен и доказателството е получено.

Доказателство2

Приемайкиc=gcd(a,b),Thentherearem,n,sothata=mc,b=nc;

Letr=amodb,thatis,thereisk,sothatr=a-kb=mc-knc=(m-kn)c;

Sogcd(b,amodb)=gcd(b,r)=gcd(nc,(m-kn)c)=gcd(n,m-kn)c;

Тогава е общият делител на bandamodb;

Ако приемем d=gcd(n,m-kn),тогава имаrearex,y,така чеn=xd,m-kn=yd;som=yd+kn=yd+kxd=(y+kx)d;

soa=mc=(y+kx)dc,b=nc=xdc;wecangetgcd(a,b)=gcd((y+kx)dc,xdc)=dc;

Защотоgcd(a,b)=c,sod=1;

gcd(n,m-kn)=1.

Забележка: Двата метода са различни.

Принцип на алгоритъма

Лема 1.3.1Ifa,banda=bh+r,къдетоh,r,thengcd(a,b)=gcd(b,r).

Доказателство. Предполага се1=gcd(a,b)иd2=gcd(b,r),ние доказваме,чеd1|d2иd2|d1,така че можем да използваме Предложение1.1.3⑵иd1,d2са положителни числа за доказване,чеd1=d2.

Понеже1|aиd1|buseследствие1.1.2,ние знаем,чеd1|a-bh=r.Понеже1|b,d1|randd2=gcd(b,r),се определя от Предложение1.2.5Knowd1|d2.От друга страна,защото2|bandd2|r,d2 |bh+r=a.Sod2|d1може да бъде получен.

Лема 1.3.1 казва, че когато>b>0, се изисква най-големият общ делител на fa и b. Можем първо да разделим на b. Ако остане r, тогава bisНай-големият общ делител е равен на най-големия общ делител на лентата. Тъй като<b<a, разбира се, изчислението е опростено, и след това ще разгледаме метода на хвърляне и деление. Тъй като gcd(a,b)=gcd(-a,b)Така че трябва да вземем предвид само случая, при който aи да имаме и двете положителни цели числа.

Теорема 1.3.2 (Евклидовият алгоритъм) Ако приемем a, banda>b. От принципа на деленето ние знаем, че има0,r0такива, които

a=bh0+r0,където 0<b.

Ако fr0>0,има1,r1такива

b=r0h1+r1, където0r1<r0.

Ако fr1>0, има h2, r2 такова

r0=r1h2+r2, където0r2<r1.

Това продължава до rn=0,ifn=0(ier0=0),thengcd(a,b)=b.Ifn1,thengcd(a,b)=rn-1.

Доказателство. Първо обърнете внимание, че fr00, тъй като user0>r1>r2>...е строго намаляващ, тъй като user0and0може да вмъкне само най-много0-1 положително цяло число, Така че знайте, че трябва да имаr0такова, че rn=0.

Ако fr0=0, това е, a = bh0, като се знае, че bisaфактор на a, може да се докаже, че bisa най-големият общ фактор на, b. Ако fr0 > 0, е известно от Лема 1.3.1

gcd(a,b)=gcd(b,r0)=gcd(r0,r1)=...=gcd(rn-1,rn)=gcd(rn-1,0)=rn-1.

Nowlet’slookatanexampleoffindingthegreatestcommonfactorbydividingbytossingandturning

Пример1.3.3Ние намираме най-големия общ коефициент на=481иb=221.Първо,по принципа на деленето,получаваме481=2,221+39,знаем,чеtr0=39.Така че смятаме,b=221разделено наr0=39,за да получим221=5,39+26,знаем,чеtr1=26,и enr0=39се дели на r1=26дава39=1,26+13, знаейки r2=13. И накрая, тъй като user2=13дели r1=26, знаемr3=0, така че от Теорема 1.3.2 знаемgcd(481,221)=r2=13.

Когато използвате метода на делене на tosandrturns за намиране на най-големия общ делител, наистина не трябва да намирате drn=0. Например в горния пример може да се види, че най-големият общ делител на fr0=39andr1=26 е 13. Използвайки лема 1.3.1, ние знаем, че gcd(a,b)=13.

В предишния раздел Следствие 1.2.5 каза, че ако gcd(a,b)=d,тогава има тереизъм,nтакъв,чеd=ma+nb.По това време не споменахме как да намерим тозиизъм,n,използваме методаtossanddividemethod,за да въведемметодзанамиранеm,n,продължаваме да използвамеTheorem1.3.2notation,seer0=0, atthistimed=gcd(a, b)=bSoifm=0,n=1,тогава имахме=b=ma+nb.Когатоr00butr1=0,ние знаем,чеd=gcd(a,b)=r0.Следователно използвамеa=bh0+r0,ifm=1,n=-h0 ,thend=r0=ma+nb.По същия начин,ifr00,r10butr2=0,thend=gcd(a,b)=r1.Sousea=bh0+r0andb=r0h1+r1toknow

r1=b-r0h1=b-(a-bh0)h1=-h1a+(1+h0h1)b.

Евклидов алгоритъм (2 снимки)

Soifm=-h1andn=1+h0h1,thend=r1=ma+nb. Съгласно този метод, когато r0,r1andr2 са наистина не-нула,sinced=gcd(a,b)=rn-1rn-3=rn-2hn-1+rn-1weknowd= rn-3-hn-1rn-2. Използвайки предишния метод за извличане, ние знаем, че има rem1,m2,n1,n2такива, че rn-3=m1a+n1bandrn-2=m2a+n2b, така че заместете

d=(m1a+n1b)-hn-1(m2a+ n2b)=(m1-hn-1m2)a+(n1-hn-1n2)b.

Soifm=m1-hn-1m2andn=n1-hn-1n2,thend=ma+nb.

Горното описание изглежда така, когатоr00,foreachi{0,1,...,n-2}трябвапърво да пишемasri=mia+nib,и накраяd=rn-1можем да пишемнасма+nb.Всъщност,това е простоудобствозааргументация.При действителна операция,всъщност пишетеeachriasmi'ri-2+ni'Theformofri-1се бавно обръща dbacktod =ma+nb. Моля, вижте следния пример.

Пример 1.3.4 Опитайте се да използваме резултата от Пример 1.3.3, за да намеримm, n прави 13=gcd(481,221)=481m+221n. Първо имаме13=r2=39-26=r0-r1.Andr1=221-5.39=b-5r0,so13=r0-(b -5r0)=6r0-b.Отr0=481-2.221=a-2b,ние знаем,че13=6(a-2b)-b=6a-13b.Som=6иn=-13ще задоволи13=481m+221n.

Трябва да се отбележи, че те, nнамерени тук, няма да бъдат единственият набор от решения, които отговарят на d=ma+nb. Въпреки че горният процес на намаляване изглежда има само един набор от решения, може да се каже, че е само горният. Методът ще получи набор от решения и не гарантира, че могат да бъдат намерени всички решения. Например, ако =m+b,n'=n-a,след товаm'a+n'b=(m+b)a+(n-a)b= ma+nb=d.Som',n'ще бъде още един набор от решения, така че когато обсъждате уникалността в бъдеще, не трябва да казвате, че е получено от предишното без достатъчно основание. Процесът вижда, че само едното е само едно. набори от решения се срещат, за да намерят връзката между двете. Нека да разгледаме следните практики.

Твърждение 1.3.5Assumea,bandd=gcd(a,b).Ifx=m0,y=n0isasetofintegersolutionsofd=ax+by,thenforanyt,x=m0+bt/d,y=n0-at/disasetofd=ax+byIntegersolutions ,andallintegersolutionsofd=ax+bymustbex=m0+bt/d,y=n0-at/dwheretissuchaform.

Доказателство. Да приемем, чеx=m,y=nisasetofsolutionsofd=ax+by. Тъй като се приема, чеx=m0,y=n0е също така набор от решения, soam+bn=am0+bn0.Това е(m-m0)=b(n0-n).Sinced=gcd (a,b),можем да предположим, чеta=a'd,b=b'dкъдетоa',b'Andgcd(a',b')=1(виж Следствие 1.2.3). Следователно,a'(m-m0)=b'( n0-n). Използвайте b'|a'(m-m0),gcd(a',b')=1и Предложение1.2.7⑴за получаванеb'|m-m0.Иначе казано, има такова, чеm-m0=b't.Soweknowm=m0+b 't=m0+bt/d.Substitutem=m0+bt/dbacktoam+bn=am0+bn0togetn=n0-at/d,така можем да докажем,чеd=ax+byTheintegersolutionsarex=m0+bt/d,y=n0-at/d,където е във формата .Накрая, трябва само да потвърдим, че за всеки, x=m0+bt/d,y=n0-at/d.Изразява се на целочислени решения наd=ax+by,но замествайки x=m0+bt/d,y=n0-at/dintoax+by,за да получим(m0+bt/d )+b(n0-at/d)=am0+bn0=d, така че тази теория е грешно доказана.

Използвайки Предложение1.3.5, можем да използваме Пример1.3.4, за да намерим набор от цели числа решения на 13=481x+221yx=6,y=-13за получаване наx=6+17t,y=-13-37t, където са всички цели числа решения на 13=481x+221y.

Програмен дизайн

Следното свойство е използвано за определяне на най-големия общ коефициент на две положителни цели числаaиb:

⒈IfrisaTheremainderof÷b,andrisnot0,тогава

gcd(a,b)=gcd(b,r)

⒉най-големият общ коефициент на фа и неговата множествена плейс.

Друг начин на писане е:

⒈Letrbetheremainderofa/b(0≤r

Ifr=0,thealgorithmends;bistheanswer.

⒉Размяна:seta←b,b←r,и връщане къмпървата стъпка.

Algorithmversion

Swiftlanguageversion

p>
importFoundationfuncgcd(a:Int,b:Int)->Int{varx=a,y=bwhiley!=0{(x,y)=(y,x%y)}returnx}letx=75 ,y=100letresult=gcd(a:x,b:y)print("Най-големият общ делител на\(x)и\(y)е\(резултат)")

Golanguageversion

packagemainimport"fmt"funcmain(){varx,yint=18,12result:=gcd(x,y)fmt.Printf("x,yThegreatestcommondivisoris:%d",result)}funcgcd(x,yint)int{ fory!=0{x,y=y,x%yreturn

>Pascallanguageversion

vara,b,c:integer;beginreadln(a,b);c:=amodb;whilec<>0dobegina:=b;b:=c;c:=amodb;end;write(b);end .

Езикова версия

/*EuropeJiLid'algorithm:theprincipleofremainderandremainder:gcd(a,b)=gcd(b,amodb)Whenbis0,най-големият общ делител на двете числаsisagetchar()и ще приеме връщането на кареткатанапредишнияcanfSymbol*/#includeunsignedintMaxCommonFactor(inta, intb){if(b<=0)returna;returnMaxCommonFactor (b,a%b);}unsignedintGcd(unsignedintM,unsignedintN){unsignedintRem;while(N>0)Rem=M%N;void(Mrem)M=N;intRem;intrem;,b;scanf("%d) %d",&a,&b);printf("thegreatestcommonfactorof%dand%dis",a,b);printf("%d\n",Gcd(a,b));printf("рекурсия: %d\n",MaxCommonFactor(a,b));return0;}

Rubylanguageversion

#CalculatethegreatestcommondivisorusingEuclideanalgorithm(typesettingomitted)defgcd(x,y)ify==0returnxelsereturngcd(y,x%y)endend

C++версия

#includeusingnamespacestd;intgcd(inta,intb){if(a%b==0)returnb;elsereturngcd(b,a%b);}intx,y;intmain(){cin>>x>> y;cout<<gcd(x,y);return0;}

JavaEdition

intgcd(intm,intn){if(n==0){returnm;intr=m%n;returngcd(n,r);}

JavaScriptверсия

functiongcd(a,b){a,%b==0)returnb;returngcd(b,a%b);

Версия на Python

defgcd(a,b):whilea!=0:a,b=b%a,areturnb

Erlangversion

gcd(A,0)->A;gcd(A,B)->gcd(B,AremB).

RustEdition

pubfngcd(x:u64,y:u64)->u64{letremainder=x%y;ifremainder==0{returny;}else{returngcd(y,remainder);}}#[cfg(test)] modtests{usesuper::*;#[test]fngcd_works(){assert_eq!(gcd(2,4),2);assert_eq!(gcd(6,27),3);assert_eq!(gcd(4,_2) ,2);eq(gcd(27,6),3);}}

Версия на Bash

functiongcd(){if[!-n"$2"];thenreturnfiif["$2"=="0"];thenecho"$1"returnfigcd"$2""$[$1%$2]"}

ModuloPМножествен обратен елемент

Forintegersaandp,ifthereisanintegerbthatsatisfiesabmodp=1,itissaidthatbisthemodulopmultiplicativeinverseelementofa.

Теорема: Необходимото и достатъчно условие за съществуването на мултипликативен инверсен модул pisgcd(a,p)=1

Доказателство:

Първо докажетедостатъчността

Ако gcd(a,p)=1, съгласно теоремата на Ойлер, aφ(p)≡1modp, така че

Очевидно φ(p)-1modpisthemodulopmultiplicativeinverseofa.

Докажете необходимостта отново

Assumingthatthemultiplicativeinverseofamodulopisb

ab≡1modp

p>

thenab=kp+1,so1=ab-kp

Защотоgcd(a,p)=d

земя|1

Sodcanonlybe1

Алгоритъм на Stein

Euclideanalgorithmisatraditionalalgorithmforcalculatingthegreatestcommondivisoroftwonumbers,regardlessofBoththeoreticallyandefficiencyareverygood.Buthehasafatalflaw,thisflawwillonlyshowupwhenlargeprimenumbers.

Forhardwareplatforms,generallyintegersareupto64bits.Forsuchintegers,itisverysimpletocalculatethemodulusbetweentwonumbers.Forplatformswithawordlengthof32bits,itonlytakesoneinstructioncycletocalculatethemodulusoftwointegersthatdonotexceed32bits,anditonlytakesafewcyclestocalculatetheintegermodulusof64bitsorless.However,forlargerprimenumbers,suchacalculationprocesshastobedesignedbytheuser.Inordertocalculatethemodulusoftwointegersexceeding64bits,theusermayhavetoadoptatrialbusinessmethodsimilartothemanualcalculationprocessofmulti-digitdivision.Theprocessisnotonlycomplicated,butalsoconsumesalotofCPUtime.Formoderncryptographicalgorithms,therearemanysituationsthatrequirethecalculationofprimenumberswithmorethan128bits.Thedesignofsuchaprogramiseagertoabandondivisionandmodulus.

TheSteinalgorithmwasproposedbyJ.Steinin1961.Thismethodalsocalculatesthegreatestcommondivisoroftwonumbers.UnlikeEuclid'salgorithm,Stein'salgorithmonlyhasintegershiftandadditionandsubtraction,whichisaboonforprogrammers.

InordertoillustratethecorrectnessoftheSteinalgorithm,wemustfirstpayattentiontothefollowingconclusions:

gcd(a,a)=a,това е,общият делител на числото и тойсебе си притежава

gcd(ka,kb)=kgcd(a,b),това операцията на най-големия общ делител и операцията на умножение могат да бъдат разменени,специално,whenk=2,това означава две четни числаНай-големият общ делител трябва да се дели на 2

C++/java изпълнение

//c++/javasteinalgorithm

intgcd(inta,intb)

{if(ab

{inttemp=a;a=b;b=temp;}

if(0==b)//thebasecase

връщане;

ако(a%2==0&&b%2==0)//aandbareeven

връщане2*gcd(a/2,b/2);

ако(a%2==0)//само дори

returngcd(a/2,b);

ако(b%2==0)//само биседем

returngcd(a,b/2);

returngcd((ab)/2,b);//aandbareodd

}

Разширение за алгоритъм

TheextendedEuclideanalgorithmcannotonlycalculatethegreatestcommondivisorof(a,b),butalsocalculatethemultiplicativeinverseelementofamodulobandbmoda,whichisdescribedinClanguageasfollows:

#includeunsignedintgcdExtended(inta,intb,int*x,int*y);intmain(void){inta,b,GCD;intx,y;a=1232,b=cd,573;1232,b=cd, 573;573),x=20andy=-431232x+573y=124640-24639=1orgcdExtended(573,1232),x=-43,y=20+1573x+1232y=1-43*573*573**20=- 24639+57640=1gcdExtended(9151,5787)Whenx=2011,y=-3180*/GCD=gcdExtended(a,b,&x,&y);printf("gcdExtended(%d,%d)x= %d,=%d,y=%d\n",a,b,GCD,x,y);return0;}//Езикова реализация на sextendedalgorithm на Евклид//ax+by=1unsignedintgcdExtended(inta,intb,int*x, int*y){if(a==0){*x=0;*y=1;returnb;cd=cd,intb,cd,intg,intx1,y1;a,&x1,&y1); *x=y1-(b/a)*x1;*y=x1;returngcd;}

Разширен Евклидов алгоритъм за най-големия общ делител Изчисляването на е в съответствие с обикновения Евклидов алгоритъм. Изчисляването на мултипликативното обратно е трудно за разбиране. им.

Първо повторете един от аргументите в тромавата дивизия:

Ако gcd(a,b)=d,тогаваимаem,n,така чеd=ma+nb,извикайте тази връзкаa,bcombinedintegerd,m,narecalcombinationcoefficients.Whend=1,thereisma+nb=1.В този момент може да се види, че е мултипликативният обратен елемент на famodulob и е мултипликативният обратен елемент на bmoduloa.

За да докажат горното заключение, в горното изчисление бяхме взети под внимание като първоначална итеративна стойност на ti, изследвахме набор от числа (t1, t2, t3) и използвахме индукция, за да докажем: След изчислението на алгоритъма Jilital, всеки ред отговаря на a×t1+b×t2=t3

Първата линия: 1×a+0×b=aisestablished

Този ред:0×a+1×b=b се държи

Ако приемем, че първият кроус е наистина верен, прегледайте thek+1throw

Fork-1rowandkrow

p>

t1(k-1)t2(k-1)t3(k-1)

t1(k)t2(k)t3(k)

Съответно удовлетворява:

t1(k-1)×a+t2(k-1)×b=t3(k-1)

t1(k)×a+t2(k)×b=t3(k)

Съгласно разширения Евклидов алгоритъм, като се приеме, че t3(k-1)=jt3(k)+r

след това:

t3(k+1)=r

t2(k+1)=t2(k-1)-j×t2(k)

t1(k+1)=t1(k-1)-j×t1(k)

тогава

t1(k+1)×a+t2(k+1)×b

=t1(k-1)×a-j×t1(k)×a+

t2(k-1)×b-j×t2(k)×b

p>

=t3(k-1)-jt3(k)=r

=t3(k+1)

Сертифициран

Следователно, когато finalt3 е итеративно изчислено до 1, има 1×a+t2×b=1. Очевидно t1 е мултипликативен обратен елемент на famodulob, а t2 е мултипликативен обратен елемент на bmoduloa.

This article is from the network, does not represent the position of this station. Please indicate the origin of reprint
TOP