Lehmans algoritme (eller Sherman Lehmans algoritme ) faktoriserer deterministisk et givet naturligt tal i aritmetiske operationer. Algoritmen blev første gang foreslået af den amerikanske matematiker Sherman Lehman i 1974 [1] . Denne algoritme var den første deterministiske heltalsfaktoriseringsalgoritme med et estimat mindre end . I øjeblikket er det af rent historisk interesse og bruges som regel ikke i praksis. [2]
Lehmanns metode udvikler ideerne om Fermats faktoriseringsmetode og leder efter divisorer af tallet ved hjælp af lighed for et eller andet heltal . Den er baseret på følgende teorem. [2]
Antag, at det er et positivt ulige heltal og er et heltal, således at . Hvis , hvor og er enkle og
så er der ikke-negative heltal , og , sådan at
, , , hvis ulige,og
.Hvis er prime, sådanne tal , og eksisterer ikke.
Lad et sammensat tal, der er produktet af to ulige coprimtal, der opfylder ulighederne . Så er der naturlige tal og sådan noget
Lad sætningens betingelser være opfyldt. Så er der naturlige tal sådan, at og .
[3] Bevis for LemmaHvis det vil sige , så gælder sætningens påstand for . Dernæst vil vi tælle .
Lad os udvide det til en fortsat brøk . Vi betegner th konvergent med k . Derefter
... _ _
fordi . Vi vælger det første tal sådan
, .
Et sådant tal er sikker på at blive fundet, da den sidste passende brøk har en nævner . Lad os bevise det og tilfredsstille lemmaets påstand. Det er åbenlyst . Yderligere,
egenskaber af egnede fraktioner.
Lad os overveje sagen først . I dette tilfælde
,
Q.E.D.
Overvej nu sagen . Så vender vi ulighederne , hvorfra . Derfor, ved egenskaberne af fortsatte fraktioner, ulighederne
. Herfra
Lemmaet er bevist. [3]
Lad og være ulige delere af . Lad og , hvor og tilfredsstille Lemma's udsagn, så gælder ligheden , hvor . Ved Lemma opfylder et heltal uligheden . Følgelig er den første påstand i sætningen opfyldt.
For at bevise den anden påstand sætter vi , Siden , derefter og . Ved at bruge det øverste estimat for får vi . Hvorfra følger det . Sætningen er blevet bevist. [fire]
Lad ulige og .
Trin 1. For at kontrollere tilstanden . Hvis det på dette trin ikke var muligt at faktorisere, så gå til trin 2.
Trin 2. Hvis divisoren i trin 1 ikke findes og er sammensat , så , hvor er primtal , og . Så kontroller for alle og alle , om tallet er kvadratet af et naturligt tal. Hvis det er, sammenlignes der for og :
eller .I dette tilfælde kontrolleres uligheden for . Hvis det er opfyldt, så er en faktorisering i to faktorer.
Hvis algoritmen ikke har fundet en dekomponering i to faktorer, så er det et primtal. [5]
Denne algoritme kontrollerer først, om den har primdivisorer, der ikke overstiger , og arrangerer derefter en søgning efter værdier og for at kontrollere gennemførligheden af følgende sætning. Hvis de ønskede værdier og ikke findes, får vi, at tallet er primtal. Således kan vi betragte denne algoritme som en test af et tal for enkelhed [6]
Det første trin er at udføre divisionsoperationer for at finde små divisorer af tallet .
Kompleksiteten af det andet trin estimeres i operationerne med at teste tallet for at se, om det er et perfekt kvadrat. Kompleksiteten af den anden fase estimeres ovenfra af værdien
.
Således er altings kompleksitet værdien .
[6]
I de fleste tilfælde spiller eksekveringstidens afhængighed af bitdybden af det undersøgte nummer en vigtigere rolle. Ved at have en polynomiel afhængighed for værdien får vi en eksponentiel afhængighed af Lehmann-metodens udførelsestid af ordlængden af det faktoriserede tal. [7]
, hvor er bitdybden.
Som en forbedring af Fermats metode afhænger Lehmanns metode også væsentligt af afstanden mellem tallets faktorer, dens udførelsestid afhænger lineært af afstanden. Men hvis afstanden mellem faktorerne er lille, taber Lehmann-metoden betydeligt til Fermat-metoden .
For tal med en lille primtalsdivisor er situationen omvendt - Lehmann-metoden vil takket være successive divisioner i trin et hurtigt vælge en primfaktor. [7]
for to do
if then return end ifend for for to do
for to do if then if then return else if then return end if end if end forend for
Forklaringer:
betyder, at det er heltal deleligt med .
Funktionen returnerer if er et perfekt kvadrat og andet.
Funktionen returnerer den største fælles divisor af tal og . [7]
Den parallelle implementering er baseret på følgende tilgang: [7]
Trin 1:
Hver beregningsproces involveret i faktorisering får sit eget sæt af potentielle divisorer fra sættet . Beregningsprocessen kontrollerer skiftevis for delelighed med elementer i dens sæt af divisorer. Med nogle tidsintervaller "stiller hovedkoordinatorprocessen spørgsmålstegn ved beregningsprocesserne for at bestemme divisoren". I det tilfælde, hvor det er nok at kontrollere for enkelhed, sender koordinatorprocessen, efter at have modtaget information om divisorens placering, et signal til resten af processerne om at afslutte arbejdet. Findes divisoren ikke, eller målet er at finde alle divisorer, fortsætter søgningen efter divisorer.
Trin 2:
Hver beregningsproces, i lighed med trin 1, får sit eget sæt tal fra sættet . Beregningsprocessen kontrollerer på skift alle de betingelser, der er beskrevet i algoritmen, og bestemmer, om der findes en ikke-triviel faktor. På samme måde, med trin 1, poller koordinatorprocessen periodisk processerne på tidspunktet for at finde divisoren og beslutter, om beregningerne skal afsluttes eller ej.
Anvendelsen af denne tilgang gør det muligt at opnå en lineær acceleration med en stigning i antallet af processer på en maskine med distribueret hukommelse.
[7]
For at implementere en algoritme med succes ved hjælp af GPGPU- teknologi , skal to problemer løses: [8]
1. For hver operation af algoritmen skal du beslutte, om det er værd at udføre den på CPU'en eller på GPU'en .
2. Bestem antallet af brugte GPU- kerner .
Fremgangsmåden beskrevet ovenfor kan bruges til at opdele problemet. [otte]
Trin 1:
Alle handlinger i dette trin skal udføres på GPU'en .
Lad være antallet af tilgængelige GPU- kerner , være antallet af elementer i sættet . Overvej to tilfælde:
1. : Vi bruger GPU- kerner .
2 .: Organiser iterationer . Ved hver iteration udfører vi de næste delinger på kernerne. Ved slutningen af hver iteration bestemmer vi, om vi skal fuldføre eller fortsætte eksekveringen.
Trin 2:
Fordel mellem GPU - kerner på samme måde som i trin 1. Udfør trin 1-3
på hver GPU -kerne: 1. Tjek, om tallet er et kvadrat af et naturligt tal.
2. I tilfælde af at opnå et positivt resultat i det foregående afsnit, beregne og .
3. For værdier og tjek tilstanden .
4. For værdierne og , som bestod den sidste kontrol, skal du kontrollere opfyldelsen af den dobbelte betingelse .
Det er tilrådeligt at udføre det sidste punkt på CPU'en , da sandsynligheden for at udføre disse operationer er lille, og grenkontrol på GPU'en er ret langsom. [otte]
Lad os analysere eksemplet med , så for , hvor , vi tjekker om tallet er en divisor af tallet . Det er nemt at sikre sig, at der ikke er nogen, så går vi videre til næste afsnit.
For alle og enhver tjekker vi, om tallet er kvadratet af et naturligt tal. I vores tilfælde er der og sådan, at udtrykket er et perfekt kvadrat og er lig med . Derfor og . Derefter opfylder uligheden og er en divisor af tallet . Som et resultat dekomponerede vi tallet i to faktorer: og .
Talteoretiske algoritmer | |
---|---|
Enkelthedstest | |
At finde primtal | |
Faktorisering |
|
Diskret logaritme | |
Finder GCD | |
Modulo aritmetik | |
Multiplikation og division af tal | |
Beregning af kvadratroden |