Lehmanin algoritmi (tai Sherman Lehmanin algoritmi ) jakaa tietyn luonnollisen luvun deterministisesti aritmeettisissa operaatioissa . Ensimmäisen algoritmin ehdotti amerikkalainen matemaatikko Sherman Lehman vuonna 1974 [1] . Tämä algoritmi oli ensimmäinen deterministinen kokonaislukufaktorointialgoritmi, jonka arvio oli pienempi kuin . Tällä hetkellä se on puhtaasti historiallisesti kiinnostava, eikä sitä pääsääntöisesti käytetä käytännössä. [2]
Lehmannin menetelmä kehittää Fermatin faktorointimenetelmän ajatuksia ja etsii luvun jakajia käyttämällä yhtälöä jollekin kokonaisluvulle . Se perustuu seuraavaan lauseeseen. [2]
Oletetaan, että se on positiivinen pariton kokonaisluku ja on sellainen kokonaisluku, että . Jos , missä ja ovat yksinkertaisia ja
sitten on ei-negatiivisia kokonaislukuja , Ja Sellainen, että
, , , jos outoa,ja
.Jos on alkuluku, tällaisia numeroita , ja ei ole olemassa.
Olkoon komposiittiluku, joka on kahden epäyhtälöt tyydyttävän parittoman koprimeluvun tulo . Sitten on luonnollisia lukuja ja sellaisia
Olkoon lauseen ehdot täyttyvät. Sitten on luonnollisia lukuja , että ja .
[3] Todiste lemastaJos , eli , niin lauseen väite pätee . Seuraavaksi lasketaan .
Laajennetaan se jatkuvaksi murto - osaksi . Merkitään th konvergentti k :llä . Sitten
... _ _
koska . Valitsemme ensimmäisen numeron siten
, .
Sellainen luku varmasti löytyy, sillä viimeisellä sopivalla murtoluvulla on nimittäjä . Todistakaamme tämä ja hyväksykäämme lemman väite. On selvää, että . Edelleen,
sopivien fraktioiden ominaisuudet.
Tarkastellaanpa tapausta ensin . Tässä tapauksessa
,
Q.E.D.
Harkitse nyt tapausta . Sitten käännämme eriarvoisuudet , mistä . Siksi jatkuvien murtolukujen ominaisuuksien perusteella epäyhtälöt
. Täältä
Lemma on todistettu. [3]
Antaa ja olla parittomia jakajia . Antaa ja , Jos ja täyttää lausunnon Lemma, niin tasa-arvo pätee , Missä . Lemman mukaan kokonaisluku täyttää epäyhtälön . Näin ollen lauseen ensimmäinen väite täyttyy.
Todistaaksemme toisen väitteen, asetamme , Koska , Sitten ja . Käyttämällä ylempää arviota saamme . Mistä se seuraa . Lause on todistettu. [neljä]
Olkoon outo ja .
Vaihe 1. Tilan tarkistaminen . Jos tekijöiden lisääminen ei ollut mahdollista tässä vaiheessa , siirry vaiheeseen 2.
Vaihe 2. Jos vaiheessa 1 jakajaa ei löydy ja se on yhdistetty , niin , missä ovat alkuluvut , ja . Tarkista sitten kaikille , onko luku luonnollisen luvun neliö. Jos on, niin vertailu tehdään ja :
tai .Tässä tapauksessa epäyhtälö tarkistetaan . Jos se täyttyy, se on jakaminen kahteen tekijään.
Jos algoritmi ei ole löytänyt jakautumista kahdeksi tekijäksi, se on alkuluku. [5]
Tämä algoritmi tarkistaa ensin, onko sillä alkujakajia, jotka eivät ylitä , ja sitten järjestää arvojen haun ja tarkistaa seuraavan lauseen toteutettavuuden. Jos haluttuja arvoja ja ei löydy, saamme, että luku on alkuluku. Näin ollen voimme pitää tätä algoritmia yksinkertaisuuden testinä [6]
Ensimmäinen askel on suorittaa jakooperaatiot luvun pienten jakajien löytämiseksi .
Toisen vaiheen monimutkaisuus arvioidaan operaatioissa, joissa luku testataan , onko se täydellinen neliö. Toisen vaiheen monimutkaisuus arvioidaan ylhäältä arvon avulla
.
Siten kaiken monimutkaisuus on arvo .
[6]
Useimmissa tapauksissa suoritusajan riippuvuus tutkittavan luvun bittisyvyydestä on tärkeämpi rooli. Kun arvolle on polynomiriippuvuus, saamme Lehmannin menetelmän suoritusajan eksponentiaalisen riippuvuuden faktoroidun luvun sanan pituudesta. [7]
, missä on bitin syvyys.
Fermatin menetelmän parannuksena Lehmannin menetelmä riippuu myös merkittävästi luvun tekijöiden välisestä etäisyydestä, sen suoritusaika riippuu lineaarisesti etäisyydestä. Kuitenkin, jos tekijöiden välinen etäisyys on pieni, Lehmannin menetelmä häviää merkittävästi Fermat-menetelmälle .
Lukujen, joissa on pieni alkujakaja, tilanne on päinvastainen - Lehmann-menetelmä valitsee nopeasti alkutekijän peräkkäisten jakojen ansiosta vaiheessa yksi. [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
Selitykset:
tarkoittaa, että on kokonaisluku jaollinen .
Funktio palauttaa jos on täydellinen neliö ja muuten.
Funktio palauttaa lukujen ja :n suurimman yhteisen jakajan . [7]
Rinnakkaistoteutus perustuu seuraavaan lähestymistapaan: [7]
Vaihe 1:
Jokaiselle tekijöihin jakamiseen liittyvälle laskennalliselle prosessille annetaan oma joukko mahdollisia jakajia joukosta . Laskennallinen prosessi tarkistaa vuorotellen jaollisuuden jakajajoukon elementeillä. Tietyin aikavälein pääkoordinaattoriprosessi " kyseenalaistaa" laskennalliset prosessit jakajan määrittämiseksi. Siinä tapauksessa, että yksinkertaisuuden tarkistaminen riittää , koordinaattoriprosessi, saatuaan tiedon jakajan sijainnista, lähettää signaalin muille prosesseille työn lopettamiseksi. Jos jakajaa ei löydy tai tavoitteena on löytää kaikki jakajat, jakajien haku jatkuu.
Vaihe 2:
Jokaiselle laskentaprosessille, kuten vaiheelle 1, annetaan oma numerosarja joukosta . Laskennallinen prosessi tarkistaa vuorotellen kaikki algoritmissa kuvatut ehdot ja määrittää, löytyykö ei-triviaali tekijä. Vastaavasti vaiheessa 1 koordinaattoriprosessi kyselyt ajoittain prosesseille jakajaa etsiessään ja päättää suorittaako laskelmat loppuun vai ei.
Tämän lähestymistavan soveltaminen mahdollistaa lineaarisen kiihtyvyyden saavuttamisen prosessien lukumäärän kasvaessa koneessa, jossa on hajautettu muisti.
[7]
Jotta GPGPU -tekniikkaa käyttävä algoritmi voidaan toteuttaa onnistuneesti , on ratkaistava kaksi ongelmaa: [8]
1. Päätä jokaiselle algoritmin toiminnalle, kannattaako se suorittaa CPU :lla vai GPU :lla .
2. Määritä käytettyjen GPU -ytimien määrä .
Yllä kuvattua lähestymistapaa voidaan käyttää ongelman jakamiseen. [kahdeksan]
Vaihe 1:
Kaikki tämän vaiheen toiminnot tulee suorittaa GPU :lla .
Olkoon käytettävissä olevien GPU - ytimien lukumäärä , joukon elementtien lukumäärä . Harkitse kahta tapausta:
1. : Käytämme GPU- ytimiä .
2 .: Järjestä iteraatiot . Jokaisessa iteraatiossa suoritamme seuraavat jaot ytimille. Jokaisen iteraation lopussa päätämme, viedäänkö suoritus loppuun vai jatketaanko sitä.
Vaihe 2:
Jaa GPU - ytimien kesken samalla tavalla kuin vaiheessa 1. Suorita vaiheet 1-3
jokaiselle GPU -ytimelle: 1. Tarkista, onko luku luonnollisen luvun neliö.
2. Jos saat positiivisen tuloksen edellisestä kappaleesta, laske ja .
3. Katso arvot ja tarkista kunto .
4. Tarkista arvoille ja , jotka läpäisivät viimeisen tarkistuksen, että kaksoisehto täyttyy .
On suositeltavaa suorittaa viimeinen piste CPU :lla , koska näiden toimintojen suorittamisen todennäköisyys on pieni ja GPU :n haaratarkistus on melko hidasta. [kahdeksan]
Analysoidaan esimerkkiä , sitten , missä , tarkistamme, onko luku luvun jakaja . On helppo varmistaa, että niitä ei ole, sitten siirrymme seuraavaan kappaleeseen.
Tarkistamme kaikille ja kaikille , onko luku luonnollisen luvun neliö. Meidän tapauksessamme on olemassa ja sellaisia, että lauseke on täydellinen neliö ja on yhtä suuri kuin . Siksi ja . Sitten , täyttää epäyhtälön ja on luvun jakaja . Tämän seurauksena jaoimme luvun kahteen tekijään: ja .
Lukuteoreettiset algoritmit | |
---|---|
Yksinkertaisuustestit | |
Alkulukujen löytäminen | |
Faktorisointi | |
Diskreetti logaritmi | |
GCD:n löytäminen |
|
Modulo-aritmetiikka | |
Lukujen kerto- ja jakolasku | |
Neliöjuuren laskeminen |