Euklids algoritme: Forskelle mellem versioner

Fra Wikipedia, den frie encyklopædi
Content deleted Content added
skifter illustration, fordi den er uforståelig, se diskussionssiden
m lidt tegnsætning og sprog
Linje 3: Linje 3:


== Algoritmens princip ==
== Algoritmens princip ==
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 [[Euklids udvidede algoritme|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]].
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 [[Euklids udvidede algoritme|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]].


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 [[Division med rest|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 ([[Grundtal|base]] 10) i det mindste heltal. Dette blev bevist af [[Gabriel Lamé]] i 1844 og markerer begyndelsen på [[Tidskompleksitet|kompleksitetsteori]] . Yderligere metoder til forbedring af algoritmens effektivitet blev udviklet i det 20. århundrede.
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 [[Division med rest|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 ([[Grundtal|base]] 10) i det mindste heltal. Dette blev bevist af [[Gabriel Lamé]] i 1844 og markerer begyndelsen på [[Tidskompleksitet|kompleksitetsteori]] . Yderligere metoder til forbedring af algoritmens effektivitet blev udviklet i det 20. århundrede.


Euklids algoritme har mange teoretiske og praktiske anvendelser. Det bruges til at gøre brøker uforkortelige og til at foretage [[Division (matematik)|division]] i [[kongruensregning]]. Beregninger der bruger denne algoritme, indgår i [[kryptografi]]ske protokoller, der bruges til at sikre [[internet]]kommunikation, og i metoder til at bryde disse kryptosystemer ved at [[Primtalsopløsning|primtalsfaktorisere]] store tal. Euklids algoritme kan bruges til at løse [[Diofantisk ligning|Diofantiske ligninger]], såsom at finde tal der tilfredsstiller flere kongruenser samtidig som i den [[kinesiske restklassesætning]], til at konstruere [[kædebrøk]]er, og til at finde gode [[Diofantisk approksimation|rationelle tilnærmelser]] til reelle tal. Endelig kan det bruges som et grundlæggende værktøj til at bevise sætninger i [[talteori]] såsom [[Lagranges fire-kvadratsætning]] og at [[Aritmetikkens fundamentalsætning|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 helttal|Gaussiske heltal]] og [[Polynomium|polynomier]] i en variabel. Dette førte til udviklingen af koncepter i moderne [[abstrakt algebra]] såsom [[Euklidisk ring|euklidiske ringe]].
Euklids algoritme har mange teoretiske og praktiske anvendelser. Det bruges til at gøre brøker uforkortelige og til at foretage [[Division (matematik)|division]] i [[kongruensregning]]. Beregninger, der bruger denne algoritme, indgår i [[kryptografi]]ske protokoller, der bruges til at sikre [[internet]]kommunikation, og i metoder til at bryde disse kryptosystemer ved at [[Primtalsopløsning|primtalsfaktorisere]] store tal. Euklids algoritme kan bruges til at løse [[Diofantisk ligning|Diofantiske ligninger]] såsom at finde tal, der tilfredsstiller flere kongruenser samtidig som i den [[kinesiske restklassesætning]] til at konstruere [[kædebrøk]]er og til at finde gode [[Diofantisk approksimation|rationelle tilnærmelser]] til reelle tal. Endelig kan det bruges som et grundlæggende værktøj til at bevise sætninger i [[talteori]] såsom [[Lagranges fire-kvadratsætning]] og at [[Aritmetikkens fundamentalsætning|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 helttal|Gaussiske heltal]] og [[Polynomium|polynomier]] i en variabel. Dette førte til udviklingen af koncepter i moderne [[abstrakt algebra]] såsom [[Euklidisk ring|euklidiske ringe]].


== Baggrund: største fælles divisor ==
== Baggrund: største fælles divisor ==
Euklids algoritme beregner den [[største fælles divisor]] (GCD eller SFD) af to [[Naturligt tal|naturlige tal]] ''a'' og ''b''. Den største fælles divisor ''g'' er det største naturlige tal, hvor der ikke er nogen rest, når man dividerer ''a'' og ''b'' med tallet. Synonymer til ''største fælles divisor'' er den ''største fælles faktor'' og det ''største fælles mål''. Den største fælles divisor skrives ofte som sfd(''a'',''b'') eller base som (''a'',''b''),<ref>{{Harvnb|Stark|1978|p=16}}</ref> skønt den sidstnævnte notation er tvetydig da den også bruges for et [[Ideal (ringteori)|ideal]] i heltalsringen, som er tæt knyttet til SFD.
Euklids algoritme beregner den [[største fælles divisor]] (GCD eller SFD) af to [[Naturligt tal|naturlige tal]] ''a'' og ''b''. Den største fælles divisor ''g'' er det største naturlige tal, hvor der ikke er nogen rest, når man dividerer ''a'' og ''b'' med tallet. Synonymer til ''største fælles divisor'' er den ''største fælles faktor'' og det ''største fælles mål''. Den største fælles divisor skrives ofte som sfd(''a'',''b'') eller base som (''a'',''b''),<ref>{{Harvnb|Stark|1978|p=16}}</ref> skønt den sidstnævnte notation er tvetydig, da den også bruges for et [[Ideal (ringteori)|ideal]] i heltalsringen, som er tæt knyttet til SFD.


Hvis sfd(''a'',''b'') = 1, så siges ''a'' og ''b'' at være [[indbyrdes primisk]]e.<ref>{{Harvnb|Stark|1978|p=21}}</ref> Denne egenskab indebærer ikke, at ''a'' eller ''b'' i sig selv er [[primtal]].<ref>{{Harvnb|LeVeque|1996|p=32}}</ref> For eksempel er hverken 6 eller 35 primtal, da de begge har to primfaktorer: 6 &nbsp; = &nbsp; 2 &nbsp; × &nbsp; 3 og 35 &nbsp; = &nbsp; 5 &nbsp; × &nbsp; 7. Ikke desto mindre er 6 og 35 indbyrdes primiske. Intet andet naturligt antal end 1 går op i både 6 og 35, da de ikke har nogen primfaktorer til fælles.
Hvis sfd(''a'',''b'') = 1, så siges ''a'' og ''b'' at være [[indbyrdes primisk]]e.<ref>{{Harvnb|Stark|1978|p=21}}</ref> Denne egenskab indebærer ikke, at ''a'' eller ''b'' i sig selv er [[primtal]].<ref>{{Harvnb|LeVeque|1996|p=32}}</ref> For eksempel er hverken 6 eller 35 primtal, da de begge har to primfaktorer: 6 &nbsp; = &nbsp; 2 &nbsp; × &nbsp; 3 og 35 &nbsp; = &nbsp; 5 &nbsp; × &nbsp; 7. Ikke desto mindre er 6 og 35 indbyrdes primiske. Intet andet naturligt antal end 1 går op i både 6 og 35, da de ikke har nogen primfaktorer til fælles.
Linje 16: Linje 16:
Lad ''g'' = sfd ( ''a'', &nbsp; ''b'' ). Da ''a'' og ''b'' begge er multipla af ''g'', kan de skrives ''a'' &nbsp; = &nbsp; ''mg'' og ''b'' &nbsp; = &nbsp; ''ng'', og der er ikke et større tal ''G'' &nbsp; > &nbsp; ''g,'' som dette er sandt for. De naturlige tal ''m'' og ''n'' skal være indbyrdes primiske, da enhver fælles faktor ellers ville kunne flyttes ud af ''m'' og ''n for'' at gøre ''g'' større. Derfor skal ethvert andet ''tal c,'' der går op i både ''a'' og ''b'', også gå op i ''g''. Den største fælles divisor ''g'' af ''a'' og ''b'' er den unikke (positive) fælles divisor af ''a'' og ''b,'' der er deleligt med enhver anden fælles divisor ''c''. <ref>{{Harvnb|LeVeque|1996|p=31}}</ref>
Lad ''g'' = sfd ( ''a'', &nbsp; ''b'' ). Da ''a'' og ''b'' begge er multipla af ''g'', kan de skrives ''a'' &nbsp; = &nbsp; ''mg'' og ''b'' &nbsp; = &nbsp; ''ng'', og der er ikke et større tal ''G'' &nbsp; > &nbsp; ''g,'' som dette er sandt for. De naturlige tal ''m'' og ''n'' skal være indbyrdes primiske, da enhver fælles faktor ellers ville kunne flyttes ud af ''m'' og ''n for'' at gøre ''g'' større. Derfor skal ethvert andet ''tal c,'' der går op i både ''a'' og ''b'', også gå op i ''g''. Den største fælles divisor ''g'' af ''a'' og ''b'' er den unikke (positive) fælles divisor af ''a'' og ''b,'' der er deleligt med enhver anden fælles divisor ''c''. <ref>{{Harvnb|LeVeque|1996|p=31}}</ref>


Den største fælles divisor kan visualiseres som følger:<ref>{{cite book | last = Grossman|first= J. W. | year = 1990 | title = Discrete Mathematics | publisher = Macmillan | location = New York | isbn = 0-02-348331-8 | page = 213}}</ref> Forestil dig et rektangulært område ''a'' gange ''b'', og en hvilken som helst fælles divisor ''c,'' der går op i både ''a'' og ''b''. Rektanglets sider kan opdeles i segmenter med længde ''c'', der deler rektanglet i et gitter af firkanter med sidelængde ''c'' . Den største fællesdeler ''g'' er den største værdi af ''c,'' som dette er muligt for. Som illustration kan et rektangulært område 24 x 60 opdeles i et gitter med: 1 x 1 firkanter, 2 x 2 firkanter, 3 x 3 firkanter, 4 x 4 firkanter, 6 x 6 firkanter, eller 12 x 12 firkanter. Derfor er 12 den største fælles divisor af 24 og 60. Et 24 x 60 rektangulært område kan opdeles i et gitter med 12 x 12 kvadrater med to firkanter langs den ene kant (24/12 &nbsp; = &nbsp; 2) og fem firkanter langs den anden (60/12 &nbsp; = &nbsp; 5).
Den største fælles divisor kan visualiseres som følger:<ref>{{cite book | last = Grossman|first= J. W. | year = 1990 | title = Discrete Mathematics | publisher = Macmillan | location = New York | isbn = 0-02-348331-8 | page = 213}}</ref> Tag udgangspunkt i et rektangulært område ''a'' gange ''b'', og en hvilken som helst fælles divisor ''c,'' der går op i både ''a'' og ''b''. Rektanglets sider kan opdeles i segmenter med længde ''c'', der deler rektanglet i et gitter af firkanter med sidelængde ''c'' . Den største fællesdeler ''g'' er den største værdi af ''c,'' som dette er muligt for. Som illustration kan et rektangulært område 24 x 60 opdeles i et gitter med: 1 x 1 firkanter, 2 x 2 firkanter, 3 x 3 firkanter, 4 x 4 firkanter, 6 x 6 firkanter, eller 12 x 12 firkanter. Derfor er 12 den største fælles divisor af 24 og 60. Et 24 x 60 rektangulært område kan opdeles i et gitter med 12 x 12 kvadrater med to firkanter langs den ene kant (24/12 &nbsp; = &nbsp; 2) og fem firkanter langs den anden (60/12 &nbsp; = &nbsp; 5).


SFD for to tal ''a'' og ''b'' er produktet af de primfaktorer, de to tal har til fælles, hvor den samme primfaktor kan bruges flere gange, men kun så længe produktet af disse faktorer deler både ''a'' og ''b''. <ref name="Schroeder_21">{{Harvnb|Schroeder|2005|pp=21–22}}</ref> F.eks. eftersom 1386 kan primtalsopløses til 2 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 7 &nbsp; × &nbsp; 11 og 3213 kan primtalsopløses til 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 7 &nbsp; × &nbsp; 17, er den største fælles divisor af 1386 og 3213 netop 63 &nbsp; = &nbsp; 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 7, produktet af deres fælles primtalsfaktorer. Hvis to tal ikke har nogen primtalsfaktorer til fælles, er deres største fælles divisor 1 (som her kommer fra [[det tomme produkt]]), med andre ord er de indbyrdes primiske. En vigtig fordel ved Euklids algoritme er, at den kan finde SFD effektivt uden at skulle beregne primtalsfaktorerne.<ref>{{Harvnb|Schroeder|2005|p=19}}</ref> [[Primtalsopløsning|Faktorisering]] af store heltal antages at være et beregningsmæssigt meget vanskeligt problem, og sikkerheden i mange bredt anvendte [[Kryptografisk protokol|kryptografiske protokoller]] er baseret på at det er uoverkommeligt.<ref name="Schroeder_216">{{Harvnb|Schroeder|2005|pp=216–219}}</ref>
SFD for to tal ''a'' og ''b'' er produktet af de primfaktorer, de to tal har til fælles, hvor den samme primfaktor kan bruges flere gange, men kun så længe produktet af disse faktorer deler både ''a'' og ''b''. <ref name="Schroeder_21">{{Harvnb|Schroeder|2005|pp=21–22}}</ref> F.eks. eftersom 1386 kan primtalsopløses til 2 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 7 &nbsp; × &nbsp; 11 og 3213 kan primtalsopløses til 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 7 &nbsp; × &nbsp; 17, er den største fælles divisor af 1386 og 3213 netop 63 &nbsp; = &nbsp; 3 &nbsp; × &nbsp; 3 &nbsp; × &nbsp; 7, produktet af deres fælles primtalsfaktorer. Hvis to tal ikke har nogen primtalsfaktorer til fælles, er deres største fælles divisor 1 (som her kommer fra [[det tomme produkt]]), med andre ord er de indbyrdes primiske. En vigtig fordel ved Euklids algoritme er, at den kan finde SFD effektivt uden at skulle beregne primtalsfaktorerne.<ref>{{Harvnb|Schroeder|2005|p=19}}</ref> [[Primtalsopløsning|Faktorisering]] af store heltal antages at være et beregningsmæssigt meget vanskeligt problem, og sikkerheden i mange bredt anvendte [[Kryptografisk protokol|kryptografiske protokoller]] er baseret på, at det er uoverkommeligt.<ref name="Schroeder_216">{{Harvnb|Schroeder|2005|pp=216–219}}</ref>


En anden definition af SFD er nyttig i avanceret matematik, især [[Ring (matematik)|ringteori]].<ref name="Leveque_p33">{{Harvnb|LeVeque|1996|p=33}}</ref> Den største fælles divisor ''g'' af to tal ''a'' og ''b'', som begge er forskellig fra nul, er også den mindste positive lineære kombination med heltalskoefficienter af de to tal, det vil sige det mindste positive tal i formen ''ua'' &nbsp; + &nbsp; ''vb'' hvor ''u'' og ''v'' er heltal. [[Mængde]]n med alle lineære kombinationer med heltalskoefficienter af ''a'' og ''b'' er faktisk den samme som mængden med alle multipler af ''g'' ( ''mg'', hvor ''m'' er et heltal). I moderne matematisk sprog er det [[Ideal (ringteori)|ideal]] der genereres af ''a'' og ''b'' lig det ideal der genereres af ''g'' alene (et ideal genereret af et enkelt element kaldes et [[hovedideal]], og alle idealer af heltal er hovedidealer). Nogle egenskaber ved SFD er faktisk lettere at se med denne definition, for eksempel det faktum, at enhver fælles divisor af ''a'' og ''b'' også deler den største fælles divisor (den deler begge udtryk for ''ua'' &nbsp; + &nbsp; ''vb'' ). Ækvivalensen af denne SFD-definition med de andre definitioner er beskrevet nedenfor.
En anden definition af SFD er nyttig i avanceret matematik, især [[Ring (matematik)|ringteori]].<ref name="Leveque_p33">{{Harvnb|LeVeque|1996|p=33}}</ref> Den største fælles divisor ''g'' af to tal ''a'' og ''b'', som begge er forskellig fra nul, er også den mindste positive lineære kombination med heltalskoefficienter af de to tal, det vil sige det mindste positive tal i formen ''ua'' &nbsp; + &nbsp; ''vb'' hvor ''u'' og ''v'' er heltal. [[Mængde]]n med alle lineære kombinationer med heltalskoefficienter af ''a'' og ''b'' er faktisk den samme som mængden med alle multipler af ''g'' ( ''mg'', hvor ''m'' er et heltal). I moderne matematisk sprog er det [[Ideal (ringteori)|ideal]], der genereres af ''a'' og ''b'', lig det ideal, der genereres af ''g'' alene (et ideal genereret af et enkelt element kaldes et [[hovedideal]], og alle idealer af heltal er hovedidealer). Nogle egenskaber ved SFD er faktisk lettere at se med denne definition for eksempel det faktum, at enhver fælles divisor af ''a'' og ''b'' også deler den største fælles divisor (den deler begge udtryk for ''ua'' &nbsp; + &nbsp; ''vb'' ). Ækvivalensen af denne SFD-definition med de andre definitioner er beskrevet nedenfor.


Den største fælles divisor af tre eller flere tal er lig med produktet af de primfaktorer, der er fælles for alle tallene, <ref>{{Harvnb|Stark|1978|p=25}}</ref> men det kan også beregnes ved gentagne gange at beregne SFD af talpar.<ref>{{Harvnb|Ore|1948|pp=47–48}}</ref> F.eks.
Den største fælles divisor af tre eller flere tal er lig med produktet af de primfaktorer, der er fælles for alle tallene, <ref>{{Harvnb|Stark|1978|p=25}}</ref> men det kan også beregnes ved gentagne gange at beregne SFD af talpar.<ref>{{Harvnb|Ore|1948|pp=47–48}}</ref> F.eks.
Linje 51: Linje 51:
Hvis ''a'' er mindre end ''b'', vil det første trin i algoritmen bytte om på tallene. For eksempel, hvis ''a'' &nbsp; < &nbsp; ''b'' vil den oprindelige kvotient ''q'' <sub>0</sub> være nul, og resten ''r'' <sub>0</sub> være ''a''. Således er ''r'' <sub>''k''</sub> mindre end sin forgænger ''r'' <sub>''k'' −1</sub> for alle ''k'' &nbsp; ≥ &nbsp; 0.
Hvis ''a'' er mindre end ''b'', vil det første trin i algoritmen bytte om på tallene. For eksempel, hvis ''a'' &nbsp; < &nbsp; ''b'' vil den oprindelige kvotient ''q'' <sub>0</sub> være nul, og resten ''r'' <sub>0</sub> være ''a''. Således er ''r'' <sub>''k''</sub> mindre end sin forgænger ''r'' <sub>''k'' −1</sub> for alle ''k'' &nbsp; ≥ &nbsp; 0.


Da resterne falder i hvert trin, men aldrig kan være negative, vil en rest ''r'' <sub>''N''</sub> til sidst blive lig med nul og så stopper algoritmen.<ref>{{Harvnb|Stark|1978|p=18}}</ref> Den sidste ''r'' <sub>''N'' −1</sub> 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 ''r'' <sub>0</sub> og nul.
Da resterne falder i hvert trin, men aldrig kan være negative, vil en rest ''r'' <sub>''N''</sub> til sidst blive lig med nul og så stopper algoritmen.<ref>{{Harvnb|Stark|1978|p=18}}</ref> Den sidste ''r'' <sub>''N'' −1</sub>, 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 ''r'' <sub>0</sub> og nul.


=== Bevis for korrekthed ===
=== Bevis for korrekthed ===
Linje 116: Linje 116:
: {{Math|1=''r''<sub>''k''−2</sub> = ''q''<sub>''k''</sub> ''r''<sub>''k''−1</sub> + ''r''<sub>''k''</sub>}}
: {{Math|1=''r''<sub>''k''−2</sub> = ''q''<sub>''k''</sub> ''r''<sub>''k''−1</sub> + ''r''<sub>''k''</sub>}}


hvor ''r''<sub>''k''</sub> er ikke-negativ og strengt mindre end [[Numerisk værdi|størrelsen]] på ''r'' <sub>''k''−1</sub>. 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.<ref>{{Cite book|title=Abstract Algebra|last=Dummit|first=David S.|last2=Foote|first2=Richard M.|publisher=John Wiley & Sons, Inc.|year=2004|isbn=978-0-471-43334-7|location=|pages=270-271}}</ref>
hvor ''r''<sub>''k''</sub> er ikke-negativ og strengt mindre end [[Numerisk værdi|størrelsen]] på ''r'' <sub>''k''−1</sub>. 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.<ref>{{Cite book|title=Abstract Algebra|last=Dummit|first=David S.|last2=Foote|first2=Richard M.|publisher=John Wiley & Sons, Inc.|year=2004|isbn=978-0-471-43334-7|location=|pages=270-271}}</ref>


I Euklids originale version af algoritmen findes kvotienten og resten ved gentagen subtraktion; dvs. ''r'' <sub>''k''−1</sub> trækkes fra ''r''<sub>''k''−2</sub>, indtil resten ''r'' <sub>''k''</sub> er mindre end ''r'' <sub>''k''−1</sub> . Derefter byttes der om på ''r'' <sub>''k''</sub> og ''r''<sub>''k''−1</sub> (så ''r''<sub>''k''</sub> næste gang trækkes fra ''r''<sub>''k''−1</sub>), 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 [[modulo]]operationen, der kun giver resten. Således bliver hver iteration af Euklids algoritme simpelthen
I Euklids originale version af algoritmen findes kvotienten og resten ved gentagen subtraktion; dvs. ''r'' <sub>''k''−1</sub> trækkes fra ''r''<sub>''k''−2</sub>, indtil resten ''r'' <sub>''k''</sub> er mindre end ''r'' <sub>''k''−1</sub> . Derefter byttes der om på ''r'' <sub>''k''</sub> og ''r''<sub>''k''−1</sub> (så ''r''<sub>''k''</sub> næste gang trækkes fra ''r''<sub>''k''−1</sub>), 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 [[modulo]]operationen, der kun giver resten. Således bliver hver iteration af Euklids algoritme simpelthen

Versionen fra 24. feb. 2020, 12:02

Euklid som den flamske maler Justus van Gent (ca. 1410 - ca. 1480) forestillede sig ham omkring 1474.

Euklids algoritme[a] er en matematisk algoritme. 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.

Algoritmens princip

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.

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.

Euklids algoritme har mange teoretiske og praktiske anvendelser. Det 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 det 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.

Baggrund: største fælles divisor

Euklids algoritme beregner den største fælles divisor (GCD eller SFD) af to naturlige tal a og b. Den største fælles divisor g er det største naturlige tal, hvor der ikke er nogen rest, når man dividerer a og b med tallet. Synonymer til største fælles divisor er den største fælles faktor og det største fælles mål. Den største fælles divisor skrives ofte som sfd(a,b) eller base som (a,b),[1] skønt den sidstnævnte notation er tvetydig, da den også bruges for et ideal i heltalsringen, som er tæt knyttet til SFD.

Hvis sfd(a,b) = 1, så siges a og b at være indbyrdes primiske.[2] Denne egenskab indebærer ikke, at a eller b i sig selv er primtal.[3] For eksempel er hverken 6 eller 35 primtal, da de begge har to primfaktorer: 6   =   2   ×   3 og 35   =   5   ×   7. Ikke desto mindre er 6 og 35 indbyrdes primiske. Intet andet naturligt antal end 1 går op i både 6 og 35, da de ikke har nogen primfaktorer til fælles.

"Tall, slender rectangle divided into a grid of squares. The rectangle is two squares wide and five squares tall."
Et 24 x 60 rektangel er dækket med ti 12 x 12 firkantede fliser, hvor 12 er SFD for 24 og 60. Mere generelt kan et a-gange-b rektangel være dækket med firkantede fliser i sidelængde c kun hvis c er en fælles divisor af a og b.

Lad g = sfd ( a,   b ). Da a og b begge er multipla af g, kan de skrives a   =   mg og b   =   ng, og der er ikke et større tal G   >   g, som dette er sandt for. De naturlige tal m og n skal være indbyrdes primiske, da enhver fælles faktor ellers ville kunne flyttes ud af m og n for at gøre g større. Derfor skal ethvert andet tal c, der går op i både a og b, også gå op i g. Den største fælles divisor g af a og b er den unikke (positive) fælles divisor af a og b, der er deleligt med enhver anden fælles divisor c. [4]

Den største fælles divisor kan visualiseres som følger:[5] Tag udgangspunkt i et rektangulært område a gange b, og en hvilken som helst fælles divisor c, der går op i både a og b. Rektanglets sider kan opdeles i segmenter med længde c, der deler rektanglet i et gitter af firkanter med sidelængde c . Den største fællesdeler g er den største værdi af c, som dette er muligt for. Som illustration kan et rektangulært område 24 x 60 opdeles i et gitter med: 1 x 1 firkanter, 2 x 2 firkanter, 3 x 3 firkanter, 4 x 4 firkanter, 6 x 6 firkanter, eller 12 x 12 firkanter. Derfor er 12 den største fælles divisor af 24 og 60. Et 24 x 60 rektangulært område kan opdeles i et gitter med 12 x 12 kvadrater med to firkanter langs den ene kant (24/12   =   2) og fem firkanter langs den anden (60/12   =   5).

SFD for to tal a og b er produktet af de primfaktorer, de to tal har til fælles, hvor den samme primfaktor kan bruges flere gange, men kun så længe produktet af disse faktorer deler både a og b. [6] F.eks. eftersom 1386 kan primtalsopløses til 2   ×   3   ×   3   ×   7   ×   11 og 3213 kan primtalsopløses til 3   ×   3   ×   3   ×   7   ×   17, er den største fælles divisor af 1386 og 3213 netop 63   =   3   ×   3   ×   7, produktet af deres fælles primtalsfaktorer. Hvis to tal ikke har nogen primtalsfaktorer til fælles, er deres største fælles divisor 1 (som her kommer fra det tomme produkt), med andre ord er de indbyrdes primiske. En vigtig fordel ved Euklids algoritme er, at den kan finde SFD effektivt uden at skulle beregne primtalsfaktorerne.[7] 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.[8]

En anden definition af SFD er nyttig i avanceret matematik, især ringteori.[9] Den største fælles divisor g af to tal a og b, som begge er forskellig fra nul, er også den mindste positive lineære kombination med heltalskoefficienter af de to tal, det vil sige det mindste positive tal i formen ua   +   vb hvor u og v er heltal. Mængden med alle lineære kombinationer med heltalskoefficienter af a og b er faktisk den samme som mængden med alle multipler af g ( mg, hvor m er et heltal). I moderne matematisk sprog er det ideal, der genereres af a og b, lig det ideal, der genereres af g alene (et ideal genereret af et enkelt element kaldes et hovedideal, og alle idealer af heltal er hovedidealer). Nogle egenskaber ved SFD er faktisk lettere at se med denne definition for eksempel det faktum, at enhver fælles divisor af a og b også deler den største fælles divisor (den deler begge udtryk for ua   +   vb ). Ækvivalensen af denne SFD-definition med de andre definitioner er beskrevet nedenfor.

Den største fælles divisor af tre eller flere tal er lig med produktet af de primfaktorer, der er fælles for alle tallene, [10] men det kan også beregnes ved gentagne gange at beregne SFD af talpar.[11] F.eks.

sfd(abc) = sfd(a, gcd(bc)) = sfd(gcd(ab), c) = gcd(gcd(ac), b).

Således er Euklids algoritme, der beregner SFD for to heltal, tilstrækkelig til at beregne SFD for vilkårligt mange heltal.

Beskrivelse

Procedure

Euklids algoritme foregår i en række trin, 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 r k − 1 og r k − 2 . Da algoritmen sikrer, at resterne falder støt med hvert trin, er r k − 1 mindre end dens forgænger r k − 2 . Målet med k'te skridt er at finde en kvotient q k og resten r k, der opfylder ligningen

og hvor der skal gælde at 0 ≤r k   <   r k − 1. Med andre ord fratrækkes det mindste tal r k − 1 gentagne gange fra det største tal r k − 2, indtil resten r k er mindre end r k − 1 .

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

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 q 0 være nul, og resten r 0 være a. Således er r k mindre end sin forgænger r k −1 for alle k   ≥   0.

Da resterne falder i hvert trin, men aldrig kan være negative, vil en rest r N til sidst blive lig med nul og så stopper algoritmen.[12] Den sidste r N −1, 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 r 0 og nul.

Bevis for korrekthed

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

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

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

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 går op i alle de foregående rester, inklusive og . Ingen af de foregående rester , osv. går op i og , da de efterlader en rest. Da er en fælles divisor af og , må

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

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

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

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

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

Gennemregnet eksempel

Animation in which progressively smaller square tiles are added to cover a rectangle completely.
Animation af Euklids algoritme baseret på substraktion. Den indledende rektangel har dimensioner a   =   1071 og b   =   462. Kvadrater i størrelse 462 × 462 anbringes inden i den, og efterlader et 462 × 147 rektangel. Dette rektangel belægges med 147 × 147 kvadrater, indtil der er et 21 × 147 rektangel tilbage, som så igen belægges, denne gang med 21 × 21 kvadrater, hvilket ikke efterlader noget udækket område. Det mindste firkantede størrelse, 21, er 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. Til at begynde med trækkes 462 fra 1071, indtil resten er mindre end 462. Dettte kan gøres to gange ( q 0   =   2), hvilket efterlader en rest af 147:

1071 = 2 × 462 + 147.

Derefter trækkes 147 fra 462, indtil resten er mindre end 147. Det kan gøres tre gange ( q 1   =   3), hvilket efterlader en rest af 21:

462 = 3 × 147 + 21.

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

147 = 7 × 21 + 0.

Da den sidste rest er nul, slutter algoritmen med 21 som 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 er trinnene:

Trin k Ligning Kvotient og resten
0 1071 = q0 462 + r0 q0 = 2 og r0 = 147
1 462 = q1 147 + r1 q1 = 3 og r1 = 21
2 147 = q2 21 + r2 q2 = 7 og r2 = 0; algoritmen slutter

Visualisering

Euklids algoritme kan visualiseres ved hjælp af den flisebelagte analogi, der er givet ovenfor for den største fælles divisor. Antag, at vi ønsker at dække et a x b rektangel med firkantede fliser nøjagtigt, 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 x b fliser, men dette efterlader en resterende r0 x b rektangel ubelagt, hvor r 0   <   b . Vi forsøger derefter at fliselægge den resterende rektangel med kvadratiske r0 x r0 fliser. Dette efterlader et andet rektangel r1 x r0 ubelagt, som vi forsøger at fliselægge vha. kradratiske r1 x r 1 fliser, og så videre. Sekvensen slutter, når der ikke er noget resterende rektangel, dvs. når de kvadratiske fliser dækker hele det forrige rektangel. Sidelængden på den mindste flise er SFD for dimensionerne på det originale rektangel. For eksempel er den mindste firkantede flise i den tilstødende figur 21 x 21 (vist i rødt), og 21 er SFD for 1071 og 462, dimensionerne på det originale rektangel (vist i grønt).

Division med rest

Ved hvert trin k beregner Euklids algoritme en kvotient qk og resten rk fra to tal rk−1 og rk−2

rk−2 = qk rk−1 + rk

hvor rk er ikke-negativ og strengt mindre end størrelsenr k−1. 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.[15]

I Euklids originale version af algoritmen findes kvotienten og resten ved gentagen subtraktion; dvs. r k−1 trækkes fra rk−2, indtil resten r k er mindre end r k−1 . Derefter byttes der om på r k og rk−1 (så rk næste gang trækkes fra rk−1), 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 = rk−2 mod rk−1.

Implementeringer

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

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.[17] 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 [18] 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);

Noter

  1. ^ I nogle populære lærebøger, såsom I. N. Hersteins Topics in Algebra og Serge Langs Algebra, refererer den engelske term "Euclidean algorithm" til divisionsalgoritmen.

Kildehenvisninger

  1. ^ Stark 1978, s. 16
  2. ^ Stark 1978, s. 21
  3. ^ LeVeque 1996, s. 32
  4. ^ LeVeque 1996, s. 31
  5. ^ Grossman, J. W. (1990). Discrete Mathematics. New York: Macmillan. s. 213. ISBN 0-02-348331-8.
  6. ^ Schroeder 2005, s. 21–22
  7. ^ Schroeder 2005, s. 19
  8. ^ Schroeder 2005, s. 216–219
  9. ^ LeVeque 1996, s. 33
  10. ^ Stark 1978, s. 25
  11. ^ Ore 1948, s. 47–48
  12. ^ Stark 1978, s. 18
  13. ^ Stark 1978, s. 16–20
  14. ^ Knuth 1997, s. 320
  15. ^ Dummit, David S.; Foote, Richard M. (2004). Abstract Algebra. John Wiley & Sons, Inc. s. 270-271. ISBN 978-0-471-43334-7.
  16. ^ Knuth 1997, s. 319–320
  17. ^ Knuth 1997, s. 318–319
  18. ^ Stillwell 1997, s. 14

Litteratur

Oversættelse
Oversættelse
Denne artikel eller en tidligere version er helt eller delvist oversat fra den engelsksprogede Wikipedia, der er tilgængelig under Creative Commons Kreditering-Deling på samme vilkår 3.0. Se versionshistorik for oplysninger om oprindelig(e) bidragyder(e).