Home Tekniikka Euklidisen algoritmi

Euklidisen algoritmi



ThesynonymousdivisionmethodgenerallyreferstotheEuclideanalgorithm.

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,sokorvike

d=(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)endend

C++-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,areturnb

Erlang-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.

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