Introductiontothealgorithm
TheEuclideanalgorithmisanalgorithmusedtofindthegreatestcommondivisoroftwopositiveintegers.TheancientGreekmathematicianEuclidfirstdescribedthisalgorithminhisbook"TheElements",soitwasnamedEuclid'salgorithm.
TheextendedEuclideanalgorithmcanbeusedinfieldssuchasRSAencryption.
Ifyouneedtorequestthegreatestcommondivisorofthetwopositiveintegers1997and615,useEuclid'salgorithmtoproceedlikethis:
1997/615=3 (zbývajících 152)
615/152=4(Zbývající7)
152/7=21(Zbývající 5)
7/5=1(Zbývající2)
5/2=2(zbývající1)
2/1=2(zbývající0)
Zatím největší commondivisoris1
Repeatthedivisionoperationwiththedivisorandremainder.Whentheremainderis0,takethedivisorofthecurrentformulaasthegreatestcommondivisor,sothegreatestcommondivisorof1997and615isobtained.
Důkaz výpočtu
Princip výpočtu závisí na následující větě:
Theorem:ThegreatestcommondivisoroftwointegersisequaltothesmallernumberandtwoThegreatestcommondivisoroftheremainderafterdividinganumber.TheGreatestCommonDivisorisabbreviatedasGCD.
gcd(a,b)=gcd(b,amodb)(Pojďme>bandr=amodb,risnot0)
ProofMethodOne
acanbeexpressedasa=kb+r(a,b,k,vzácná všechna kladná celá čísla a
Předpokládejme, že se nejedná o kommondivizorfa,b,značkaMaked|a,d|b,to znamená, že obojí ab mohou být dělitelnéd.
Andr=a-kb,rozdělit obě strany datem současně,r/d=a/d-kb/d,Z pravé strany rovnice vidíme, žem=r/disaninteger,sod|r
Sodistakécommondivisorb,amodb.
Protože (a,b)Je-li commondivisor(b,amodb) stejný, největší commondivisor je stejný a důkaz je získán.
Důkaz2
Za předpokladuc=gcd(a,b),Thentherearem,n,sothata=mc,b=nc;
Letr=amodb,this,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;
Poté commondivisor bandamodb;
Předpokládejmed=gcd(n,m-kn),potomex,y,sothatn=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;
Protožegcd(a,b)=c,sod=1;
gcd(n,m-kn)=1.
Poznámka: Tyto dvě metody jsou různé.
Princip algoritmu
Lemma1.3.1Ifa,banda=bh+r,whereh,r,thengcd(a,b)=gcd(b,r).
Důkaz.Předpokládáno1=gcd(a,b)andd2=gcd(b,r),prokázali jsme,žed1|d2ad2|d1,takžemůžemepoužítNárok1.1.3⑵ad1,d2je kladné číslozastavení, kteréd1=d2.
Protože1|aandd1|autobus Důsledek1.1.2,víme,žed1|a-bh=r.Protože1|b,d1|randd2=gcd(b,r),jeurčenoNávrhem1.2.5Znám1|d2.Na druhou stranu,protože2|22d2|r,d |bh+r=a.Sod2|d1lze získat.
Lemma 1.3.1 říká, že když>b>0,vyžadujenejvětšíkomponentnízú Při metodě házení a dělení. Odegcd(a,b)=gcd(-a,b)Pouze je třeba zvážit případ, kde jsou obě kladná celá čísla.
Věta 1.3.2 (Euklidovský algoritmus) Za předpokladu, banda>b. Z principu dělení víme, že existují h0, r0 takové,
a=bh0+r0,kder0 Ifr0>0,tam jeh1,r1takové b=r0h1+r1, kde 0r1 Ifr1>0,thereh2,r2takže r0=r1h2+r2, kde0r2 Toto pokračuje až do 0,ifn=0(ier0=0),thengcd(a,b)=b.Ifn1,thengcd(a,b)=rn-1. Důkaz.Nejprve si všimnete,žefr00,protože0>r1>r2>...přísně klesá,protože uživatel0a0může vložit pouze tatmostr0-1kladné celé číslo, víme, že musí býtr0takto, žern=0. Ifr0=0,to je,a=bh0,znáte-li tento bisfaktorfa, lze dokázat, že je největším společným faktoremfa,b.Ifr0>0,je známo z Lemma1.3.1 gcd(a,b)=gcd(b,r0)=gcd(r0,r1)=...=gcd(rn-1,rn)=gcd(rn-1,0)=rn-1. Nowlet’slookatanexampleoffindingthegreatestcommonfactorbydividingbytossingandturning Příklad1.3.3Našli jsme největší společný faktorfa=481andb=221.Za prvé, podle principu rozdělení,weget481=2,221+39,wknowthattr0=39.Soconsiderb=221dividedbyr0=39toget2621=th,enthis sharedbyr1=26 dává39=1.26+13, knowingr2=13.Nakonec, protože uživatel2=13rozdělujer1=26,weknowr3=0,sofromTheorem1.3.2weknowgcd(481,221)=r2=13. Když použijete metodu dělení tossandturnsrozděleník nalezenínejvětšího společného faktoru,nepotřebujete skutečně najítdrn=0.Například ve výše uvedeném příkladu lze vidět, že největší společný faktorz0=39a1=26 je nyní 13.PoužitíLemma)wek=1.3.1,b V předchozí části, Důsledek 1.2.5, řekl, žeifgcd(a,b)=d,potomexistuje,ntak,žed=ma+nb.V té době,manželská zmínka,jak tentoismus najít,n,používámemetodutossandrozděleníkzavedenímetody,abychom,n,.0.2. ed=gcd(a, b)=bSoifm=0,n=1,thenwehaved=b=ma+nb.Whenr00butr1=0,weknowthatd=gcd(a,b)=r0.Proto,usinga=bh0+r0,ifm=1,n=-h0 ,thend=r0=ma+nb.Similarly,ifr00,r10butr2=0,thend=gcd(a,b)=r1.Sousea=bh0+r0andb=r0h1+r1toknow r1=b-r0h1=b-(a-bh0)h1=-h1a+(1+h0h1)b. Euklidovský algoritmus (2 fotografie) d=(m1a+n1b)-hn-1(m2a+ n2b)=(ml-hn-lm2)a+(nl-hn-ln2)b. Soifm=m1-hn-1m2andn=n1-hn-1n2,thend=ma+nb. Výše uvedený popis se zdá, jako kdyžr00,foreachi{0,1,...,n-2}musíme nejprve napsat riasri=mia+nib,a nakonecd=rn-1může být napsánoasma+nb.Ve skutečnosti je to jen pohodlí pro argumentaci. tod =ma+nb.Podívejte se prosím na následující příklad. Příklad 1.3.4Vyzkoušet pomocí výsledku příkladu 1.3.3 k nalezení m,nmakes13=gcd(481,221)=481m+221n.Firstwehave13=r2=39-26=r0-r1.Andr1=221-5.39=0-(bso,so,so, -5r0)=6r0-b.Odr0=481-2,221=a-2b,víme,že13=6(a-2b)-b=6a-13b.Som=6andn=-13uspokojí13=481m+221n. Mělo by se poznamenat, že nnalezeno zde nebude jedinou sadou řešení, která vyhovuje=ma+nb.Ačkoli se zdá, že výše uvedený proces má pouze jednu sadu řešení, nelze pouze říci, že je výše=Metoda dostane sadu řešení, a to, pokud nelze zaručit, že je možné+všechny,b. -a,pakm'a+n'b=(m+b)a+(n-a)b= ma+nb=d.Som',n'bude také další sadou řešení, takže při diskusi o jedinečnosti v budoucnu nesmíte říkat, že je odvozeno z předchozího bez dostatečného důvodu. musíme najít vztah mezi těmito dvěma. Podívejme se na následující postupy. Propozice 1.3.5 Předpokládejme, pásmo=gcd(a,b).Ifx=m0,y=n0je nastaveno na vícečíselné řešeníofd=ax+by,thenforanyt,x=m0+bt/d,y=n0-at/disasetofd=ax+byIntegersolutions ,andallintegersolutionsofd=ax+bymustbex=m0+bt/d,y=n0-at/dwheretissuchaform. Důkaz.Předpokládejme, žex=m,y=je sada řešeníofd=ax+by.Protože se předpokládá, že x=m0,y=n0jetakésada řešení,soam+bn=am0+bn0.To je(m-m0)=b(n0-cd).Sinced=g (a,b),wecanassumethata=a'd,b=b'dwherea',b'Andgcd(a',b')=1(viz Důsledek1.2.3).Proto a'(m-m0)=b'( n0-n).Useb'|a'(m-m0),gcd(a',b')=1andProposition1.2.7⑴k získáníb'|m-m0.Jinými slovy,thereistsuchthatm-m0=b't.Soweknowm=m0+b 't=m0+bt/d.Substitutem=m0+bt/dbacktoam+bn=am0+bn0togetn=n0-at/d,sowecanprovethatd=ax+byTheintegersolutionsarex=m0+bt/d,y=n0-at/d, kde je ve tvaru .Nakonec musíme potvrdit, že pro všechny,x=m0+bt/d,y=n0-at/d.Isasetofintegersolutionsofd=ax+by,butsubstitutingx=m0+bt/d,y=n0-at/dintoax+bytoobtaina(m0+bt/d )+b(n0-at/d)=am0+bn0=d,tak je tato teorie potvrzena. PomocíNávrhu1.3.5můžemepoužítPříklad1.3.4k nalezení sady mnohačíselných řešení 13=481x+221yx=6,y=-13togetx=6+17t,y=-13-37t, kde jsou všechna celočíselná řešení 13=481x+221y. Následující vlastnost se používá k určení největšího společného faktoru ze dvou kladných celých čísel ab: ⒈Jestliže RisaTheremainderof÷b,andrisnot0,tak gcd(a,b)=gcd(b,r) ⒉největším společným faktorem a jeho vícenásobným výskytem. Další způsob psaní je: ⒈Letrbetheremainderofa/b(0≤r Ifr=0,thealgorithmends;bisIstheodpověď. ⒉Výměna:seta←b,b←r a vraťte se k prvnímu kroku. Swiftlanguageversion Golanguageversion >Verze jazyka Pascal Jazyková verze Rubylanguageversion Verze C++ JavaEdition Verze JavaScriptu Pythonversion Erlangversion RustEdition Bashverze ModuloPMultiplikativní inverzní prvek Forintegersaandp,ifthereisanintegerbthatsatisfiesabmodp=1,itissaidthatbisthemodulopmultiplicativeinverseelementofa. Věta:Nezbytná a dostatečná podmínka pro existenci familiárního inverzního moduluopisgcd(a,p)=1 Důkaz: První důkaz dostatečnosti Ifgcd(a,p)=1,podle Eulerova teorému,aφ(p)≡1modp,tak Zřejměaφ(p)-1modpismodulopmultiplikativ inverzně. Znovu prokázat nezbytnost Assumingthatthemultiplicativeinverseofamodulopisb ab≡1modp thenab=kp+1,so1=ab-kp Protožegcd(a,p)=d sod|1 Sodcanonlybe1 Steinalgoritmus 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,this,commondivisorofačíslaajehovlastníjesamo gcd(ka,kb)=kgcd(a,b),to je,největší dělitel commondoroperaceaoperace násobenílze vyměnit,special,whenk=2,to znamená dvě sudá číslaNejvětší commonddělitelnebo musí být dělitelné 2 Implementace C++/java //c++/javasteinový algoritmus intgcd(inta,intb) {if(ab {inttemp=a;a=b;b=temp;} if(0==b)//základní případ returna; if(a%2==0&&b%2==0)//anebo rovná návrat2*gcd(a/2,b/2); if(a%2==0)//pouzeaiseven returngcd(a/2,b); if(b%2==0)//pouze dvousedm returngcd(a,b/2); returngcd((ab)/2,b);//aandbareodd } Rozšíření algoritmu TheextendedEuclideanalgorithmcannotonlycalculatethegreatestcommondivisorof(a,b),butalsocalculatethemultiplicativeinverseelementofamodulobandbmoda,whichisdescribedinClanguageasfollows: Rozšířený euklidovský algoritmus pro největšího commondivizorVýpočet je v souladu s běžným euklidovským algoritmem. První opakování argumentů v nemotorné divizi: Jestližegcd(a,b)=d,potom je tu,n,takžed=ma+nb,nazývejte tento vztaha,bkombinované celé číslo,m,nevyvolávají se kombinační koeficienty.Kdyžd=1,existujea+nb=1.V současné době lze vidět, že je v opačném případě opačný modul oa. Za účelem ověření výše uvedenéhozávěru bylyxyandyivhorním výpočtu považovány za výchozí hodnotuti, prozkoumejte sadu čísel (t1,t2,t3) a použijte indukci k ověření:Po výpočtu Jilitalgoritmu každý vyhovuje t2×t1+ První řada:1×a+0×b=ustaveno Druhý řádek: 0×a+1×b=bplatí Předpokládejme, že všechny první kroky jsou pravdivé, prozkoumejtethek+1throw Fork-1rowandkrow t1(k-1)t2(k-1)t3(k-1) t1(k)t2(k)t3(k) Respektive vyhovuje: t1(k-1)×a+t2(k-1)×b=t3(k-1) t1(k)×a+t2(k)×b=t3(k) Podle rozšířeného Euklidova algoritmu za předpokladu, že 3(k-1)=jt3(k)+r pak: t3(k+1)=r t2(k+1)=t2(k-1)-j×t2(k) t1(k+1)=t1(k-1)-j×t1(k) pak t1(k+1)×a+t2(k+1)×b =t1(k-1)×a-j×t1(k)×a+ t2(k-1)×b-j×t2(k)×b =t3(k-l)-jt3(k)=r =t3(k+1) Ověřeno Proto, když je konečná hodnota 3 iterativně počítána na 1, existuje 1×a+t2×b=1. Je zřejmé, že t1 je násobný inverzní prvek moduluob a t2 je násobný inverzní prvek modulu bmoduloa.Návrh programu
Algorithmversion
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("Největší commondivizor\(x)a\(y)je\(výsledek)")
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
vara,b,c:integer;beginreadln(a,b);c:=amodb;whilec>0dobegina:=b;b:=c;c:=amodb;end;write(b);end .
/*EuropeJiLid'salgoritmus:princip zbytku azbytku:gcd(a,b)=gcd(b,amodb)Když je0,největším rozdělovníkem ze dvou čísel je getchar()a přijme se vracející se přepravy od předchozího/symbolu#včtvercového(symbolu)* (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("největší společný faktor%dand%dis",a,b);printf("%d\n",Gcd(a,b));printf("rekurze: %d\n",MaxCommonFactor(a,b));return0;}
#VypočítejtenejvětšícommondivisorpoužijteEuklidovskýalgoritmus(vynechání sázení)defgcd(x,y)ify==0vrátí xelsereturngcd(y,x%y)endend
#includeusingnamespacestd;intgcd(inta,intb){if(a%b==0)returnb;elseretungcd(b,a%b);}intx,y;intmain(){cin>>x>> y;cout<<gcd(x,y);return0;}
intgcd(intm,intn){if(n==0){returnm;intr=m%n;returngcd(n,r);}
functiongcd(a,b){a,%b==0)returnb;returngcd(b,a%b);
defgcd(a,b):whilea!=0:a,b=b%a,areturnb
gcd(A,0)->A;gcd(A,B)->gcd(B,AremB).
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);}}
functiongcd(){if[!-n"$2"];thenreturnfiif["$2"=="0"];thenecho"$1"returnfigcd"$2""$[$1%$2]"}
#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** 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;}//Implementace jazyka rozšířeného algoritmu Euclid//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;}