Domov Technika Euklidovský algoritmus

Euklidovský algoritmus



ThesynonymousdivisionmethodgenerallyreferstotheEuclideanalgorithm.

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)

Soifm=-h1andn=1+h0h1,thend=r1=ma+nb.Podle této metody,whenr0,r1and2areall non-nula,sinced=gcd(a,b)=rn-1rn-3=rn-2hn-1+rn-1weknowd= rn-3-hn-1rn-2.Pomocí předchozí metody odvození víme, že jsou 1,m2,n1,n2 takové, žern-3=m1a+n1bandrn-2=m2a+n2b,takže nahraďte

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ávrh programu

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.

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("Největší commondivizor\(x)a\(y)je\(výsledek)")

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

>Verze jazyka Pascal

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

Jazyková verze

/*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;}

Rubylanguageversion

#VypočítejtenejvětšícommondivisorpoužijteEuklidovskýalgoritmus(vynechání sázení)defgcd(x,y)ify==0vrátí xelsereturngcd(y,x%y)endend

Verze C++

#includeusingnamespacestd;intgcd(inta,intb){if(a%b==0)returnb;elseretungcd(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);}

Verze JavaScriptu

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

Pythonversion

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);}}

Bashverze

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

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

p>

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:

#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;}

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

p>

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

p>

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

Tento článek je ze sítě, nereprezentuje pozici této stanice. Uveďte prosím původ dotisku
HORNÍ