Introductiontothealgorithm
TheEuclideanalgorithmisanalgorithmusedtofindthegreatestcommondivisoroftwopositiveintegers.TheancientGreekmathematicianEuclidfirstdescribedthisalgorithminhisbook"TheElements",soitwasnamedEuclid'salgorithm.
TheextendedEuclideanalgorithmcanbeusedinfieldssuchasRSAencryption.
Ifyouneedtorequestthegreatestcommondivisorofthetwopositiveintegers1997and615,useEuclid'salgorithmtoproceedlikethis:
1997/615=3(loput 152)
615/152=4(jäljellä 7)
152/7=21(jäljellä 5)
7/5=1(jäljellä 2)
5/2=2(jäljellä1)
2/1=2(jäljellä 0)
Toistaiseksi suurin yleissivistäjä1
Repeatthedivisionoperationwiththedivisorandremainder.Whentheremainderis0,takethedivisorofthecurrentformulaasthegreatestcommondivisor,sothegreatestcommondivisorof1997and615isobtained.
Laskentatodistus
Laskentaperiaate riippuu seuraavasta lauseesta:
Theorem:ThegreatestcommondivisoroftwointegersisequaltothesmallernumberandtwoThegreatestcommondivisoroftheremainderafterdividinganumber.TheGreatestCommonDivisorisabbreviatedasGCD.
gcd(a,b)=gcd(b,amodb)(Let'sseta>bandr=amodb,risnot0)
ProofMethodOne
voidaan ilmaista=kb+r(a,b,k,harvinaisetpositiiviset kokonaisluvut,andr
Olettaen, että se ei ole yleisimm.
Andr=a-kb,jaa molemmat puoletsaman ajan mukaan,r/d=a/d-kb/d,Yhtälön oikealta puolelta voimme nähdä, ettäm=r/disaninteger,sod|r
Sodisalsothecommondvisorofb,amodb.
Koska(a,b)Jos(b,amodb)yhteisvastuuluku on yhtä suuri,suurin yhteismäärä on yhtä suuri,jatodistussaataa.
Todistus2
Oletetaan 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;
Sittenbandamodb:n yleismies;
Oletetaan d=gcd(n,m-kn), sitten on,y,sothatn=xd,m-kn=yd;som=yd+kn=yd+kxd=(y+kx)d;
soa=mc=(y+kx)dc,b=nc=xdc;voimme saadagcd(a,b)=gcd((y+kx)dc,xdc)=dc;
Koskacd(a,b)=c,sod=1;
gcd(n,m-kn)=1.
Huomaa:kaksi menetelmää on erilainen.
Algoritmin periaate
Lemma1.3.1Ifa,banda=bh+r,jossah,r,thengcd(a,b)=gcd(b,r).
Todistus.Oletettu1=gcd(a,b)jad2=gcd(b,r),todistamme, ettäd1|d2jad2|d1,sowevoimmekäyttää Lausetusta1.1.3⑵jad1,d2ovat positiiviset luvut todistamaan,että d1=d2.
Koska1|aandd1|buseCorollary1.1.2,weknowthatd1|a-bh=r.Becaused1|b,d1|randd2=gcd(b,r),määritetään lauseella1.2.5Tietä1|d2. Toisaalta, koska2r,d2|d2|d |bh+r=a.Sod2|d1voidaan saada.
Lemma1.3.1kertoi llkatsotaanlasku- ja jakamismenetelmä.Koskagcd(a,b)=gcd(-a,b)Tarvitaan vain pohdittavakohtaa ja molemmat positiiviset kokonaisluvut.
Lause 1.3.2(Euklidinen algoritmi)Olettaessaan,kaista>b.Jakoperiaatteesta tiedämme, että on olemassa0,r0niin että
a=bh0+r0, missär0<b.
Ifr0>0,thereareh1,r1suchthat
b=r0h1+r1, missä0r1<r0.
Ifr1>0,thereareh2,r2suchthat
r0=r1h2+r2, missä0r2<r1.
Tämä jatkuuuntilrn=0,ifn=0(ier0=0),thengcd(a,b)=b.Ifn1,thengcd(a,b)=rn-1.
Todiste.Ensinnäkinhuomaa,ettäfr00,koskaus0>r1>r2>...on jyrkästi laskeva,koskaus0and0voi vainsyöttää suurimman 0-1positiivisen kokonaisluvun,Kylväkää,että pitää saadar0suchthatrn=0.
Ifr0=0,eli,a=bh0,tietäen,että kaksinkertainen tekijäfa,voidaan todistaa,että on suurin yhteinen tekijäfa,b.Ifr0>0,tunnetaan kohdastaLemma1.3.1
gcd(a,b)=gcd(b,r0)=gcd(r0,r1)=...=gcd(rn-1,rn)=gcd(rn-1,0)=rn-1.
Nowlet’slookatanexampleoffindingthegreatestcommonfactorbydividingbytossingandturning
Esimerkki 1.3.3Löydämme suurimman yhteisen tekijänfa=481andb=221.Ensin,jakoperiaatteen mukaan,weget481=2,221+39,weknowthatr0=39.Soconsidederb=221dividedbyr0=6t, 3+221=36,w. thenr0=39isdividedbyr1=26antaa39=1,26+13, knowingr2=13.Lopuksi, koska jakaja2=13jakaja1=26,weknowr3=0,sofromTheorem1.3.2weknowgcd(481,221)=r2=13.
Kun käytätlasku-jakäännösjakomenetelmääsuurimman yhteisen tekijän löytämiseen, sinun ei todellakaan tarvitse löytäädrn=0.Esimerkki,edellä olevassa esimerkissä voidaan havaita, ettäsuurin yhteinen tekijäfr0=39andr1=26is13.Käytetään.
Edellisessä osiossa,Corollary1.2.5todosta,ettäfgcd(a,b)=d,on olemassa olemista,nsuchthatd=ma+nb.Tuolloin emme maininneet kuinkalöydämme tämän,n,käytämmehankaa jajakomenetelmääottaaksemme käyttöön2menetelmän thistimed=gcd(a, b)=bSoifm=0,n=1,niin meillä oli=b=ma+nb.Kunr00butr1=0,weknowthatd=gcd(a,b)=r0.Siksi,usinga=bh0+r0,ifm=1,n=-h0 ,tend=r0=ma+nb.Samalla tavalla,ifr00,r10butr2=0,sitten=gcd(a,b)=r1.Sousea=bh0+r0andb=r0h1+r1toknow
r1=b-r0h1=b-(a-bh0)h1=-h1a+(1+h0h1)b.
Euklideanalgoritmi (2 kuvaa)
Soifm=-h1andn=1+h0h1,tend=r1=ma+nb.Tämän menetelmän mukaan,kunr0,r1andr2ovat ei-nolla,sinced=gcd(a,b)=rn-1rn-3=rn-2hn-1+rn-1weknowd= rn-3-hn-1rn-2.Käyttäen aikaisempaa johtamismenetelmää, tiedämme, että siellä on 1,m2,n1,n2suchthatrn-3=m1a+n1bandrn-2=m2a+n2b,sokorviked=(m1a+n1b)-hn+ n2b)=(m1-hn-1m2)a+(n1-hn-1n2)b.
Soifm=m1-hn-1m2andn=n1-hn-1n2, sitten=ma+nb.
Ylläolevat kuvaukset näyttävät siltä, kun lyysätty takaisin =ma+nb.Katso seuraava esimerkki.
Esimerkki 1.3.4Kosketaesimerkki1.3.3tulosta löytääksesim,nmakes13=gcd(481,221)=481m+221n.Ensimmäisenä meillä on13=r2=39-26=r0-r1.Andr1=221-53r,09,nmakes13=gcd(481,221)=481m+221n. -5r0)=6r0-b.Alkaen0=481-2,221=a-2b, tiedämme, että 13=6(a-2b)-b=6a-13b.Som=6jan=-13tyydyttävä13=481m+221n.
On otettava huomioon, että ne,nlöydetyttästäeiolevainjoukkoratkaisuja, jotkatyydyttävät=ma+nb.Vaikka yllämainitulla vähennysprosessilla on vain yksi joukko ratkaisuja,sitä voidaan sanoa vainylempänä.Menetelmäsaajoukkoratkaisuja,m=ei voi ollahyvinvoimainen. b,n'=n-a, sittenm'a+n'b=(m+b)a+(n-a)b= ma+nb=d.Som',ei tule myös olemaan muita ratkaisuja,keskustellessaan tulevaisuuden ainutlaatuisuudesta,että saa sanoa, että se on johdettu edellisestä ilman riittävää syytä. tavat löytääsuhteen kahden välillä. Katsotaanpaseuraavia käytäntöjä.
Lausketus 1.3.5Oletetaan, kaista = gcd(a, b). Jos x = m0, y = n0 on d=ax+by,henforanyt,x=m0+bt/d,y=n0-at/disasetofd=ax+byIntegersolutions ,andallintegersolutionsofd=ax+bymustbex=m0+bt/d,y=n0-at/dwheressellyform.
Todiste.Oletetaan, ettäx=m,y=liuosjoukkod=ax+by.Koska on oletettu, ettäx=m0,y=n0on myös ratkaisujoukko,soam+bn=am0+bn0.Thatisa(m-m0)=b(n0-n)cdin. (a,b),voimmeolettaa,että=a'd,b=b'dwherea',b'Andgcd(a',b')=1(katso Seuraus1.2.3).Siksi,a'(m-m0)=b'( n0-n).Käytä'|a'(m-m0),gcd(a',b')=1andProposition1.2.7⑴toadbtainb'|m-m0.Toisin sanoen, on olemassa niin, ettäm-m0=b't.Soweknowm=m0+b 't=m0+bt/d.Substitutem=m0+bt/dbacktoam+bn=am0+bn0togetn=n0-at/d,sowevoimme todistaa, että d=ax+byTheintegersolutionsarex=m0+bt/d,y=n0-at/d, missä on muoto .Lopuksi meidän on vain vahvistettava, että jokaiselle,x=m0+bt/d,y=n0-at/d.Asettaa kokonaislukuratkaisut d=ax+by,mutta korvaamallax=m0+bt/d,y=n0-at/dintoax+bytoobtaina(m0+bt/d )+b(n0-at/d)=am0+bn0=d, joten tämä teoreettinen todiste.
Propositiolla 1.3.5 voimme käyttääesimerkkiä 1.3.4joukkokokonaislukuratkaisuja 13=481x+221yx=6,y=-13togetx=6+17t,y=-13-37tjossa kaikki kokonaislukuratkaisut 13=481x+221y.
Ohjelman suunnittelu
Seuraavaa ominaisuutta käytetään kahden positiivisen kokonaisluvun ja b:n suurimman yhteisen tekijän määrittämiseen:
⒈IfrisaRemainderof÷b,andrisnot0,niin
gcd(a,b)=gcd(b,r)
⒉moninpleisan suurin yhteinen tekijä.
Toinen tapa kirjoittaa on:
⒈Oletaanjäljellä/b(0≤r
Ifr=0,algoritmit;bisOn vastaus.
⒉Vaihda:seta←b,b←r,ja palaa ensimmäiseen vaiheeseen.
Algoritmiversio
Swift-kieliversio
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("Suurin yhteinen tekijä\(x)ja\(y)on\(tulos)")
Kieliversio
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 .Kieliversio
/*EuropeJiLid'salgorithm:theprincipleofmaindeandremainder:gcd(a,b)=gcd(b,amodb)Whenbis0,kahden numeron suurin yleisluontomerkki()jahyväksyycarriagerepaluun 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("%dand%dis":n suurin yhteinen tekijä",a,b);printf("%d\n",Gcd(a,b));printf("rekursio: %d\n",MaxCommonFactor(a,b));return0;}Rubyylikieliversio
#Laskeasuurin yleiskäyttäenEuclideanalgorithm(typesettingomitted)defgcd(x,y)ify==0returnxelsereturngcd(y,x%y)endendC++-versio
#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-versio
functiongcd(a,b){a,%b==0)returnb;returngcd(b,a%b);Python-versio
defgcd(a,b):whilea!=0:a,b=b%a,areturnbErlang-versio
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);}}Bashversio
functiongcd(){if[!-n"$2"];thenreturnfiif["$2"=="0"];thenecho"$1"returnfigcd"$2""$[$1%$2]"}ModuloPMultiplicatiivinen käänteiselementti
Forintegersaandp,ifthereisanintegerbthatsatisfiesabmodp=1,itissaidthatbisthemodulopmultiplicativeinverseelementofa.
Lause:Tarvittava ja riittävä ehto monen käänteisen käänteismoduulin olemassaololle cd(a,p)=1
Todiste:
Todista ensin riittävyys
Ifgcd(a,p)=1,Eulerin lauseen mukaan,aφ(p)≡1modp,so
Ilmeisestiaφ(p)-1modpisthemodulopmultiplicative käänteinenofa.
Jälleen osoitus välttämättömyydestä
Assumingthatthemultiplicativeinverseofamodulopisb
ab≡1modp
p>tenab=kp+1,so1=ab-kp
Koskacd(a,p)=d
sod|1
Sodcanlybe1
Steinaalgoritmi
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,eli,numeron ja omistajiensa yhteinen tunnus on itsekseen
gcd(ka,kb)=kgcd(a,b),toisin sanoen,suurin yhteinenlaskutusoperaatio ja kertolaskuoperaatio voidaan vaihtaa,erityinen,whenk=2,se tarkoittaa kahta parillista numeroaSuurin yhteisvastuun on jaettava2:lla
C++/java-toteutus
//c++/javasteinalgoritm
intgcd(inta,intb)
{if(ab
{inttemp=a;a=b;b=temp;}
if(0==b)//perustapaus
palautus;
if(a%2==0&&b%2==0)//aandbareeven
paluu2*gcd(a/2,b/2);
jos(a%2==0)//vainseitsemän
returngcd(a/2,b);
jos(b%2==0)//vainseitsemän
returngcd(a,b/2);
returngcd((ab)/2,b);//aandbareodd
}
Algoritmilaajennus
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**2 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;}//Euclid'sextendedalgorithmin kielitoteutus//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;}LaajennettuEuklidinenanalgorithmforthestavercommondivisorLaskenta onyhdenmukainen tavallisen Euklideanalgoritmin kanssa. .
Ensimmäinen toisto kielteisen jaon väitteistä:
Jos fgcd(a,b)=d,niin on olemassa,n,jottad=ma+nb,kutsuu tätä suhdettaa,byhdistettykokonaisluku,m,eikutsuttu yhdistelmäkertoimia.Whend=1,thereisma+nb=1.Tällä hetkellä se voidaan havaita
Jilitalgoritmin laskennan jälkeen jokainen rivi täyttää t1, t2, t3 ja t1, t2, t3.
Ensimmäinen rivi:1×a+0×b=aisestablished
SecondRow:0×a+1×b=bholds
Jos olettaen, että ensimmäinen kohtaus on totta, tutki ek+1 heitto
Fork-1rowandkrow
p>t1(k-1)t2(k-1)t3(k-1)
t1(k)t2(k)t3(k)
Täyttää vastaavasti:
t1(k-1)×a+t2(k-1)×b=t3(k-1)
t1(k)×a+t2(k)×b=t3(k)
Laajennetun Euklidisen analyysin mukaan olettaen, että 3(k-1)=jt3(k)+r
siis:
t3(k+1)=r
t2(k+1)=t2(k-1)-j×t2(k)
t1(k+1)=t1(k-1)-j×t1(k)
siis
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)
Sertifioitu
Tästä syystä, kunlopullinen3siteratiivisesti lasketaan 1:ksi, on1×a+t2×b=1.Ilmeisestikin t1 onmodulobin kertova käänteiselementti ja t2 onbmoduloa:n kertova käänteiselementti.