Euklids algoritme

Fra testwiki
Version fra 21. feb. 2022, 03:31 af imported>InternetArchiveBot imported>InternetArchiveBot (Add 1 book for Wikipedia:Verificerbarhed (20220220)) #IABot (v2.0.8.6) (GreenC bot)
(forskel) ← Ældre version | Nuværende version (forskel) | Nyere version → (forskel)
Spring til navigation Spring til søgning
Euklid som den flamske maler Justus van Gent (ca. 1410 - ca. 1480) forestillede sig ham omkring 1474.

Euklids algoritme er en matematisk algoritme og iterativ metode. Det er en effektiv metode til at beregne den største fælles divisor (forkortet SFD eller GCD efter greatest common divisor). For to tal er SFD det største tal, der går op i begge tal. Algoritmen er opkaldt efter den græske matematiker Euklid, der først beskrev det i sine Elementer (ca. 300 f.Kr.). Det er et eksempel på en algoritme, en trin-for-trin-procedure til udførelse af en beregning i henhold til veldefinerede regler, og er en af de ældste algoritmer i almindelig brug. Den kan bruges til at forkorte brøker så meget som muligt og er blot en af mange talteoretiske og kryptografiske beregningsmetoder. En vigtig fordel ved Euklids algoritme er, at den kan finde SFD effektivt uden at skulle beregne primtalsfaktorerne.[1] Faktorisering af store heltal antages at være et beregningsmæssigt meget vanskeligt problem, og sikkerheden i mange bredt anvendte kryptografiske protokoller er baseret på, at det er uoverkommeligt.[2] Euklids algoritme, der beregner SFD for to heltal, er tilstrækkelig til at beregne SFD for vilkårligt mange heltal.Skabelon:Kilde mangler

Algoritmen

Euklids algoritme er baseret på princippet om, at den største fælles divisor af to tal ikke ændres, hvis det større tal erstattes af forskellen mellem de to tal. For eksempel er 21 SFD for 252 og 105 (eftersom 252 = 21 × 12 og 105 = 21 × 5), og det samme tal, 21, er også SFD for 105 og 252 - 105 = 147. Da denne erstatning formindsker det største af de to tal, giver gentagelse af denne proces successivt mindre talpar, indtil de to tal bliver ens. Når dette sker, er de SFD for de oprindelige to tal. Ved at invertere processen, kan SFD udtrykkes som en sum af de to originale tal, der ganges med et positivt eller negativt heltal, f.eks. 21 = 5 × 105 + (−2) × 252. Det, at SFD altid kan udtrykkes på denne måde, er kendt som Bézouts identitet.Skabelon:Kilde mangler

Den version af Euklids algoritme, der er beskrevet ovenfor (og af Euklid), kan tage mange trin for at finde SFD, når et af de givne tal er meget større end det andet. En mere effektiv version af algoritmen tager en genvej, hvor man i stedet erstatter det største af de to tal med dets rest, når det divideres med den mindste af de to (i denne version stopper algoritmen, når det største tal er deleligt med det mindste). Med denne forbedring kræver algoritmen aldrig flere trin end fem gange antallet af cifre (base 10) i det mindste heltal. Dette blev bevist af Gabriel Lamé i 1844 og markerer begyndelsen på kompleksitetsteori . Yderligere metoder til forbedring af algoritmens effektivitet blev udviklet i det 20. århundrede.Skabelon:Kilde mangler

Procedure

Euklids algoritme er en iterativ metode, således at outputtet fra hvert trin bruges som input til det næste. Lad k være et helt tal, der tæller trinnene i algoritmen, og start med at tælle fra nul. Det første trin svarer således til k=0, det næste trin svarer til k=1 osv.

Hvert trin begynder med to ikke-negative rester rk1 og rk2. Da algoritmen sikrer, at resterne falder støt med hvert trin, er rk1 mindre end dens forgænger rk2. Målet med k'ne skridt er at finde en kvotient qk og resten rk, der opfylder ligningen

rk2=qkrk1+rk

og hvor der skal gælde at

0rk<rk1

Med andre ord fratrækkes det mindste tal rk1 gentagne gange fra det største tal rk2, indtil resten rk er mindre end rk1.

I det indledende trin (k=0) er resterne r2 og r1 lig med a og b, de tal, som SFD søges for. I det næste trin (k=1) er resterne b og resten r0 i det indledende trin, og så videre. Algoritmen kan således skrives som en sekvens af ligninger

a=q0b+r0b=q1r0+r1r0=q2r1+r2r1=q3r2+r3

Hvis a er mindre end b, vil det første trin i algoritmen bytte om på tallene. For eksempel, hvis a<b vil den oprindelige kvotient q0 være nul, og resten r0 være a. Således er rk mindre end sin forgænger rk1 for alle k0.

Da resterne falder i hvert trin, men aldrig kan være negative, vil en rest rN til sidst blive lig med nul og så stopper algoritmen.[3] Den sidste rN1, som er forskellig fra nul, er den største fælles divisor af a og b. Tallet N kan ikke være uendeligt, fordi der kun er et begrænset antal ikke-negative heltal mellem den oprindelige rest r0 og 0.Skabelon:Kilde mangler

Bevis for korrekthed

Gyldigheden af Euklids algoritme kan bevises ved et to-trins argument.[4] I det første trin vises, at den sidste rest rN1, der altså er forskellig fra nul, går op i både a og b. Da det er en fælles divisor, skal den være mindre end eller lig med den største fælles divisor g. I det andet trin vises det, at enhver fælles divisor af a og b, inklusiv g, skal gå op i rN1, og derfor skal g være mindre end eller lig med rN1. Disse to konklusioner betyder sammen, at

rN1=g

For at vise at rN1 går op i både a og b (det første trin), ses først, at rN1 går op i sin forgænger rN2

rN2=qNrN1

da den sidste rest rN er nul. rN1 går også op i den næste forgænger rN3

rN3=qN1rN2+rN1

fordi den går op i begge led på højre side af ligningen. Ved at gentage dette argument igen og igen, ses det at rN1 går op i alle de foregående rester, inklusive a og b. Ingen af de foregående rester rN2, rN3 osv. går op i a og b, da de efterlader en rest. Da rN1 er en fælles divisor af a og b, må

rN1g

I det andet trin vises det at ethvert naturligt tal c der går op i både a og b (med andre ord enhver fælles divisor af a og b), også går op i alle resterne rk. Pr. definition kan a og b skrives som multipla af c:

a=mcb=nc

hvor m og n er naturlige tal. Derfor går c op i den indledende rest r0, da

r0=aq0b=mcq0nc=(mq0n)c

Et analogt argument viser, at c også går op i de efterfølgende rester r1, r2 osv. Derfor skal den største fælles divisor g gå op i rN1, hvilket indebærer, at

grN1

Da den første del af argumentet viste det omvendte (rN1g), følger det, at

g=rN1

Således er g den største fælles divisor af alle de efterfølgende par:[5]

g=sfd(a,b)=sfd(b,r0)=sfd(r0,r1)=...=sfd(rN2,rN1)=rN1

Gennemregnet eksempel

Animation in which progressively smaller square tiles are added to cover a rectangle completely.
Animation af Euklids algoritme baseret på substraktion. Det indledende rektangel (grønt) har dimensionerne a=1071 og b=462. Kvadrater (orange) i størrelsen 462×462 anbringes inden i, hvilket efterlader et 462×147 rektangel. Dette rektangel belægges med 147×147 kvadrater (blå), indtil der er et 21×147 rektangel tilbage, som så igen belægges, denne gang med 21×21 kvadrater (røde), hvilket ikke efterlader noget udækket område. Den mindste firkantede størrelse, 21, er dermed SFD for 1071 og 462.

Til illustration kan Euklids algoritme bruges til at finde den største fælles divisor af a=1071 og b=462. Først trækkes 462 fra 1071 et antal gange indtil resten er mindre end 462. Dette kan gøres to gange (q0=2), hvilket efterlader en resten 147:

1071=2×462+147

Derefter trækkes 147 fra 462 et antal gange indtil resten bliver mindre end 147. I dette tilfælde kan det gøres tre gange ( q 1   =   3), hvilket efterlader resten 21:

Skabelon:Math

Derefter trækkes 21 fra 147 nogle gange indtil resten er mindre end 21. Dette kan gøres syv gange ( q 2   =   7) uden at efterlade nogen rest:

Skabelon:Math

Da den sidste rest er nul, slutter algoritmen med 21, som derfor er den største fælles divisor for 1071 og 462. Dette stemmer overens med sfd(1071, 462), som beregnet overfor ved hjælp af primfaktorisering. I tabelform ser er den herover beskrevne algoritme for talparret (1071, 462) sådan ud:

Trin k Ligning Kvotient og resten
0 Skabelon:Math Skabelon:Math og Skabelon:Math
1 Skabelon:Math Skabelon:Math og Skabelon:Math
2 Skabelon:Math Skabelon:Math og Skabelon:Math;

resten er 0 og algoritmen slutter derfor her.

Visualisering

Euklids algoritme kan visualiseres ved hjælp af en analogi: Man skal forestille sig, at man skal afdække et område med fliser på den særlige måde, at man hele tiden vælger den størst mulige kvadratiske flise (de to sidelængder er som bekendt ens for en kvadratisk flise). Denne såkaldte "fliselæggermetode" er vist som animation på figuren, hvor det grønne område med sidelængderne a og b skal dækkes med kvadratiske fliser, og hvor a er det største af de to tal. Vi forsøger først at fliselægge rektanglet ved hjælp af kvadratiske b · b fliser, men dette efterlader en resterende r0 · b rektangel ubelagt, hvor r 0   <   b . Vi forsøger derefter at fliselægge den resterende rektangel med kvadratiske r0 · r0 fliser. Dette efterlader et andet rektangel r1 · r0 ubelagt, som vi forsøger at fliselægge med kvadratiske r1 · r 1 fliser. Vi fortsætter på samme måde. Sekvensen slutter, når der ikke er noget resterende rektangel, det vil sige, når de kvadratiske fliser dækker hele det forrige rektangel. Sidelængden på den mindste flise er SFD, det vil sige den Største Fælles Divisor, for dimensionerne på det originale rektangel. I eksemplet er den mindste kvadratiske flise i animationen 21 · 21 og disse fliser bliver vist med rød farve. Denne animation viser altså, at tallet 21 er SFD for talparret (1071, 462). Størrelsen af det originale rektangel er 1071 · 462 og er vist med grøn farve.

Division med rest

Ved hvert trin k beregner Euklids algoritme en kvotient qk og resten rk fra to tal rk1 og rk2

rk2=qkrk1+rk

hvor rk er ikke-negativ og strengt mindre end størrelsenrk1. Dette kaldes division med rest. Den matematiske sætning der ligger bag division med rest, er at en sådan kvotient og resten altid findes og er unikke.[6]

I Euklids originale version af algoritmen findes kvotienten og resten ved gentagen subtraktion; dvs. rk1 trækkes fra rk2, indtil resten rk er mindre end rk1. Derefter byttes der om på rk og rk1 (så rk næste gang trækkes fra rk1), og processen gentages. Euklidisk opdeling reducerer alle trin mellem to opbytninger til et enkelt trin, hvilket er mere effektivt. Desuden er kvotienterne ikke nødvendige, så man kan erstatte division med rest med modulooperationen, der kun giver resten. Således bliver hver iteration af Euklids algoritme simpelthen

rk=rk2modrk1

Implementeringer

Implementeringer af algoritmen kan udtrykkes i pseudocode . F.eks. kan den divisionsbaserede version programmeres som [7]

function sfd (a, b)
    while b ≠ 0
        t := b; 
        b := a mod b; 
        a := t; 
    return a; 

I begyndelsen af den k'te iteration indeholder variablen b den nyeste rest rk-1, hvorimod variablen a holder dens forgænger, rk-2. Trinnet b := a mod b svarer til ovennævnte rekursionsformel r kr k −2 mod r k −1 . Den midlertidige variabel t holder værdien af rk-1 mens den næste rest r k beregnes. Ved slutningen af løkke-iterationen indeholder variablen b resten rk, mens variablen a holder sin forgænger, rk−1 .

I den subtraktionsbaserede version, der var Euklids originale version, er beregningen b = a mod b erstattet af gentagen subtraktion.[8] I modsætning til den divisionsbaserede version, der fungerer med vilkårlige heltal som input, antager den subtraktionsbaserede version, at input består af positive heltal og stopper, når a = b :

function sfd(a,b)
    while a ≠ b
        if a > b
            a := a - b; 
        else
            b := b - a; 
    return a; 

Variablerne a og b veksler med de foregående rester r k −1 og r k −2 . Hvis a er større end b i begyndelsen af en iteration, så er a = r k -2, eftersom r k -2 > r k -1. I løbet af løkkens iteration, bliver a reduceret med den tidligere rest b, indtil a er mindre end b. Så er a den næste rest r k . Derefter reduceres b med a, indtil det igen er mindre end a, hvilket giver den næste rest r k +1, og så videre.

Den rekursive version [9] er baseret på at to rester efter hinanden alle har samme GDC, samt stoptilstanden sfd ( r N −1,   0)   =   r N −1 .

function gcd (a, b)
    if b = 0
        return a; 
    else
        return gcd(b, a mod b);

Anvendelser

Euklids algoritme har mange teoretiske og praktiske anvendelser. Den bruges til at gøre brøker uforkortelige og til at foretage division i kongruensregning. Beregninger, der bruger denne algoritme, indgår i kryptografiske protokoller, der bruges til at sikre internetkommunikation, og i metoder til at bryde disse kryptosystemer ved at primtalsfaktorisere store tal. Euklids algoritme kan bruges til at løse Diofantiske ligninger såsom at finde tal, der tilfredsstiller flere kongruenser samtidig som i den kinesiske restklassesætning til at konstruere kædebrøker og til at finde gode rationelle tilnærmelser til reelle tal. Endelig kan den bruges som et grundlæggende værktøj til at bevise sætninger i talteori såsom Lagranges fire-kvadratsætning, og at primtalsfaktoriseringer er unikke. Den originale algoritme blev kun beskrevet for naturlige tal og geometriske længder (reelle tal), men algoritmen blev generaliseret i det 19. århundrede til andre typer tal såsom Gaussiske heltal og polynomier i en variabel. Dette førte til udviklingen af koncepter i moderne abstrakt algebra såsom euklidiske ringe.Skabelon:Kilde mangler

Kildehenvisninger

Skabelon:Reflist

Litteratur

Skabelon:Oversættelse Skabelon:Autoritetsdata