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)endendC++версия
#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,areturnbErlangversion
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.