Kvadraattinen seula-algoritmi ( lyhenne QS) on Pomeranzin vuonna 1981 kehittämä suurilukuisten tekijöiden laskentamenetelmä. Se ylitti pitkään muut tekijöiden jakamismenetelmät yleisen muodon kokonaisluvuille, joilla ei ole alkujakajia, joiden järjestys on paljon pienempi (lukujen , joiden alkujakajat ovat paljon pienemmät, tekijöihin jakomenetelmä elliptisille käyrille on nopeampi ). Neliöllinen seulamenetelmä on muunnelma tekijäpohjamenetelmästä (yleistys Fermat'n faktorointimenetelmästä ). Tätä menetelmää pidetään toiseksi nopeimpana ( yleisen lukukenttäseulamenetelmän jälkeen ). Ja toistaiseksi se on nopein kokonaisluvuille 100 desimaalin numeroon asti ja on paljon yksinkertaisempi kuin yleinen lukukenttäseulamenetelmä . Tämä on universaali tekijöiden jakamisalgoritmi, koska sen suoritusaika riippuu yksinomaan faktoroidun luvun koosta, ei sen erityisestä rakenteesta ja ominaisuuksista. [yksi]
Algoritmi yrittää löytää sellaisia lukujen neliöitä, joiden moduuli on yhtä suuri (kerroitettava luku), mikä usein johtaa tekijöihin . Algoritmi toimii kahdessa vaiheessa: tiedonkeruuvaihe, jossa se kerää tietoa, joka voi johtaa neliöiden yhtäläisyyteen; ja tietojenkäsittelyvaihe, jossa se laittaa kaiken kerätyn tiedon matriisiin ja käsittelee sen neliöiden yhtäläiseksi saamiseksi. Ensimmäinen vaihe voidaan rinnastaa helposti monien prosessien kesken, mutta toinen vaihe vaatii suuria määriä muistia ja sitä on vaikea rinnastaa.
Yksi yksinkertainen tapa löytää yhtäläiset neliöt on valita satunnaisluku, neliöttää se ja toivoa, että jakojäännös on jonkun muun luvun neliö. Esimerkiksi . Tämä menetelmä löytää yhtä suuret neliöt vain harvoissa tapauksissa , mutta jos se löytää nämä luvut, voimme olettaa, että tekijöiden jakaminen on valmis. Tämä menetelmä on samanlainen kuin Fermatin tekijöiden jakomenetelmä .
Kvadraattinen seulamenetelmä on muunnos Dixonin tekijöiden jakamismenetelmästä .
Laskennan kesto kvadraattiselle seulalle ( - tekijöiksi muutettava luku):
. [2]
Olkoon x mod y jäännös x:stä jaettuna y:llä. Fermat - faktorointimenetelmässä valitaan yksittäin luku a niin, että 2 mod n on neliö. Mutta sitä numeroa on vaikea saada. Laskemme neliöseulassa 2 mod n jollekin a ja etsimme sitten osajoukon, jonka tulo on neliö. Tämä vertaa neliöitä.
Esimerkiksi 41 2 mod 1649 = 32, 42 2 mod 1649 = 115 ja 43 2 mod 1649 = 200. Kumpikaan tulos ei ole neliö, vaan tuotteen tulos (32)(200) = 6400 = 80 2 . Toisaalta, kun otetaan huomioon edellinen tuotemodi 1649, saadaan, että (32)(200) = (41 2 )(43 2 ) = ((41)(43)) 2 . Koska (41)∙(43) mod 1649 = 114, meillä on neliövertailu: 114 2 ≡ 80 2 (mod 1649).
Mutta kuinka ratkaisemme ongelman korjaamalla joukon lukuja ja etsimällä osajoukon, alkioiden tulon, jonka neliö on? Aloitetaan eksponenttivektorin käsitteestä . Esimerkiksi meillä on luku 504. Sen hajoaminen alkutekijöiksi on seuraava 504 = 2 3 3 2 5 0 7 1 . Voisimme esittää tämän laajennuksen eksponenttivektorina (3,2,0,1), joka kaappaa laajennukseen osallistuvien alkulukujen 2, 3, 5 ja 7 potenssit. Numerolla 490 olisi analogisesti vektori (1,0,1,2). Lukujen kertolasku on sama kuin niiden eksponenttivektoreiden elementtikohtainen yhteenlasku, eli tulolla 504 ∙ 490 on vektori (4,2,1,3).
Huomaa nyt, että luku on neliö, jos jokainen sen eksponenttivektorin elementti on parillinen . Esimerkiksi lisäämällä vektorit (3,0,0,1) ja (1,2,0,1) saadaan (4,2,0,2). Tämä kertoo meille, että lukujen 56 ∙ 126 tulo on neliö. Itse asiassa emme välitä tarkoista arvoista, jotka saamme vektorissa, kunhan jokainen elementti tuloksena olevassa vektorissa on parillinen. Tästä syystä otamme jokaisen elementin mod 2 ja lisäämme elementit mod 2: (1,0,0,1) + (1,0,0,1) = (0,0,0,0).
Siten ongelmamme on saanut seuraavan muodon: jos on annettu joukko vektoreita (0,1), etsi osajoukko, joka on täydennetty nollavektoriksi mod 2 -lisäyksen avulla. Tämä on lineaarinen algebratehtävä, eli on tarpeen löytää lineaarisesti riippuvat vektorit. Lineaarialgebran lauseesta seuraa, että niin kauan kuin vektorien lukumäärä on suurempi kuin kunkin vektorin elementtien lukumäärä, tällaisen riippuvuuden on oltava olemassa. Voimme löytää tehokkaasti lineaarisesti riippuvia vektoreita esimerkiksi sijoittamalla alkuperäiset vektorit matriisin sarakkeiksi ja käyttämällä Gaussin menetelmää , joka on helppo mukauttaa toimimaan kokonaislukujen mod 2 kanssa. Kun olemme löytäneet lineaarisesti riippuvat vektorit, kerromme yksinkertaisesti numeroita, jotka vastaavat näitä vektoreita, ja saamme etsimämme neliön.
Kuitenkin satunnaislukujoukon mod n neliöinti johtaa suureen määrään erillisiä alkutekijöitä, pitkiä vektoreita ja suuren matriisin. Päästäksemme eroon tästä ongelmasta etsimme erityisesti lukuja, joissa 2 mod n : llä on vain pienet alkutekijät (tällaisia lukuja kutsutaan sileiksi lukuiksi ). Niitä on vaikea löytää, mutta tällaisten lukujen avulla vältetään suuret vektorit ja matriisit.
Tekijäkannaksi otamme joukon alkulukuja, jotka koostuvat ja kaikista sellaisista parittomista alkuluvuista , jotka eivät ylitä tiettyä rajaa (joka valitaan optiminäkökohdista), joka on neliöllinen jäännös modulo .
Kokonaislukujoukko , josta haetaan -lukuja ( -luku on kokonaisluku, joka on jaollinen vain alkuluvuilla alkaen ) näyttää tältä:
Lisäksi sen sijaan, että otettaisiin yksitellen ja jaettaisiin se alkuluvuilla luvusta , kukin otetaan yksitellen ja jaollisuus arvolla (ja sen potenssit) tarkistetaan samanaikaisesti kaikille . Voit käyttää Eratosthenesin seulaa muodostamaan luettelon kaikista alkuluvuista, jotka eivät ylitä .
1. Rajat ja suuruusluokat valitaan (jäljempänä ) siten, että .
2. Jos , ,…, kokonaisluvut kirjoitetaan sarakkeeseen .
3. Jokaiselle parittomalle alkuluvulle lasketaan Legendre-symboli - ehto tarkistetaan . Jos se ei täyty, se poistetaan tekijäkannasta.
4. Jos oletetaan, että tämä on niin pariton alkuluku, joka on neliöllinen jäännösmoduuli , yhtälö 1,2,… on ratkaistu. Arvot otetaan nousevassa järjestyksessä, kunnes käy ilmi, että yhtälöllä ei ole moduuliltaan vertailukelpoisia ratkaisuja minkään alueen luvun kanssa .
Antaa olla suurin sellaisista luvuista, joille on olemassa numero omaisuuden kanssa .
Anna ja ratkaisut ja .
5. Samalla arvolla näytetään vaiheessa 2 saatujen arvojen luettelo . Aseta sarakkeessa 1 kaikki arvot , jotka eroavat arvosta jollakin kerrannaisuudella . Sen jälkeen 1 korvataan 2:lla kaikille sellaisille arvoille , jotka eroavat monikerrasta , ja niin edelleen, kunnes . Sitten sama tehdään kanssa . Suurin mahdollinen luku sarakkeessa on .
6. Kun vaiheessa 5 lisätään toinen yksikkö sarakkeen numeroon, vastaava luku jaetaan ja tulos tallennetaan.
7. Alle at: n sarakkeessa yksinkertaisesti laitetaan 1 vastaan pariton ja vastaava jaetaan 2:lla. Kun yhtälö on ratkaistu ja ratkaisu jatkuu samaan tapaan kuin pariton kanssa .
8. Kun kaikki ilmoitetut toimenpiteet suoritetaan kaikille alkuluvuille, jotka eivät ylitä , kaikki luvut tulee hylätä lukuun ottamatta niitä, jotka muuttuivat 1:ksi sen jälkeen, kun ne on jaettu kaikilla potenssilla, jotka eivät ylitä . Tämän seurauksena saamme taulukon, jossa sarake sisältää kaikki tällaiset arvot väliltä , joka on -luku, ja loput sarakkeet vastaavat niitä arvoja , joille - neliöllinen jäännös.
9. Seuraavaksi käytetään yleistettyä Fermat-faktorointimenetelmää (factor base method ).
Neliöllinen seulamenetelmä yrittää löytää kokonaislukupareja x ja y(x) (missä y(x) on x:n funktio ) , jotka täyttävät paljon heikomman ehdon kuin x 2 ≡ y 2 (mod n ). Hän valitsee alkulukujoukon, jota kutsutaan tekijäkantaiseksi , ja yrittää löytää x : n siten, että pienin jäännös y(x) = x 2 mod n tekee tekijäkannan tekijöille. Tällaisten y :iden sanotaan olevan tasaisia tekijäkannan suhteen.
Y(x):n arvon faktorointia tekijäkannan yli yhdessä x:n arvon kanssa kutsutaan riippuvuudeksi . Neliöseula nopeuttaa riippuvuuksien etsintäprosessia valitsemalla x :n lähellä n: n neliöjuurta . Tämä takaa, että luku y(x) on pienempi ja siksi todennäköisemmin tasainen .
Toinen tapa lisätä todennäköisyyttä olla tasainen luku on suurentaa tekijäkannan kokoa. Tällöin on kuitenkin tarpeen löytää vähintään yksi tasaisempi yhteys kuin kantalukujen lukumäärä, jotta voidaan varmistaa lineaarisen suhteen olemassaolo.
Tämä esimerkki esittää standardin neliöllisen seulan ilman logaritmisia optimointeja. Oletetaan, että meidän täytyy kertoa luku N = 15347, joten pienin luku, jonka neliö on suurempi kuin N , on 124. Joten y ( x ) = ( x + 124) 2 − 15347.
Koska N on pieni, tarvitaan vain 4 alkulukua. Ensimmäiset 4 alkulukua p , joille 15347:llä on neliöjuuren modulo p , ovat 2, 17, 23 ja 29 (toisin sanoen 15347 on näiden alkulukujen neliöllinen jäännös ). Nämä luvut muodostavat neliöllisen seulan perustan.
Rakennamme nyt siivilämme ja aloitamme seulomalla prosessin jokaiselle kantaluvun alkuluvulle valitsemalla seulomaan ensimmäisen Y(X) 0 ≤ X < 100 :
Seuraava vaihe on seulonta . Ratkaisemme yhtälön jokaiselle p: lle tekijäkannassamme
löytääksesi taulukosta V merkintöjä, jotka ovat jaollisia p :llä .
Sillä päätämme löytää ratkaisun .
Joten alkaen X=1 askeleella 2, jokainen merkintä on jaollinen 2:lla. Kunkin merkinnän jakaminen kahdella antaa
Vastaavasti jäljellä oleville alkuluvuille p yhtälö on ratkaistu. Huomaa, että jokaiselle p > 2 tulee 2 tuloksena olevaa lineaariyhtälöä, koska modulo on 2 neliöjuurta.
Jokainen yhtälö johtaa siihen, että se on jaollinen p :llä, kun x = a , a + p , a +2 p jne. V : n jakaminen p : llä a , a + p , a +2 p , a +3 p jne. alkuluku perusteesta löydämme sileät luvut .
V :n alkio, joka on yhtä suuri kuin 1, vastaa tasaista lukua. Koska , , ja kierretään luvulla 1, niin:
X +124 | Y | tekijät |
---|---|---|
124 | 29 | 2 0 • 17 0 • 23 0 • 29 1 |
127 | 782 | 2 1 • 17 1 • 23 1 • 29 0 |
195 | 22678 | 2 1 • 17 1 • 23 1 • 29 1 |
Harkitse tasa-arvoja:
ja kirjoita alkulukujen indikaattorit matriisin muodossa ja ratkaise järjestelmä :
Hänen ratkaisunsa:
Siten kaikkien kolmen yhtälön tulo on neliö (mod N).
ja
algoritmi löytää
Nyt lasketaan GCD(3070860 - 22678, 15347) = 103, ei-triviaali jakaja on 15347, toinen on 149.
Ennen yleisen numerokentän seulan (NFS) löytämistä QS tunnettiin nopeimpana yleiskäyttöisenä tekijänlaskenta-algoritmina. Tällä hetkellä elliptisen käyrän faktorointialgoritmilla on sama ajoaika kuin QS:llä (jos n on vain kahden alkuluvun tulo), mutta käytännössä QS on nopeampi, koska se käyttää yksittäisiä tarkkuusoperaatioita pitkien aritmeettisten operaatioiden sijaan , joita käytetään elliptisen käyrän menetelmässä.
2. huhtikuuta 1994 RSA -129 faktorisoitiin käyttämällä QS-menetelmää. Se oli pituuden luku 129, tulos kahden alkuluvun tulosta, joista toisen pituus on 64 ja toisen pituuden 65. Tässä tapauksessa tekijäkanta koostui 524339 alkuluvusta. Tiedonkeruuvaihe tuotti 5 000 MIPS . Kerätyt tiedot veivät 2 Gt . Matriisikäsittelyvaihe kesti 45 tuntia Bellcoressa-ovsky (nyt Telcordia Technologies) MasPar- supertietokoneessa . Se oli tuolloin suurin luku, jonka yleiskäyttöinen algoritmi pystyi kertomaan. Vasta 10. huhtikuuta 1996 he pystyivät kertomaan luvun, jonka pituus oli 130 RSA , käyttämällä NFS-menetelmää.