Tonelli-Shanks-algoritmi (Shanks kutsuu sitä RESSOL-algoritmiksi) kuuluu modulaariseen aritmetiikkaan ja sitä käytetään vertailujen ratkaisemiseen.
missä on neliöllinen jäännös modulo ja on pariton alkuluku .
Tonelli-Shanks-algoritmia ei voi käyttää yhdistelmämoduuleille; Modulokomposiitin neliöjuuren etsiminen vastaa laskennallisesti tekijöiden jakamista [1] .
Alberto Tonelli kehitti vastaavan mutta hieman monimutkaisemman version tästä algoritmista vuonna 1891. Tässä käsitellyn algoritmin version kehitti itsenäisesti Daniel Shanks vuonna 1973.
Syöttötiedot : — pariton alkuluku, — kokonaisluku , joka on neliöllinen jäännös modulo , toisin sanoen , jossa on Legendre-symboli .
Algoritmin tulos : jäännös , joka tyydyttää vertailun .
Kun vertailuratkaisu on löydetty, toinen vertailuratkaisu löytyy muodossa .
Tehdään vertailu . on pariton, ja koska , 10 on neliöllinen jäännös Eulerin kriteerin mukaan .
Koska , täältä saamme tietysti 2 vertailuratkaisua.
Anna . Anna nyt ja huomioi se . Viimeinen vertailu pysyy totta algoritmin pääsilmukan jokaisen iteraation jälkeen. Jos jossain vaiheessa , niin algoritmi päättyy .
Jos , Harkitse neliöllistä ei- jäännösmoduulia . Olkoon , sitten ja , mikä osoittaa, että järjestys on .
Vastaavasti saamme sen , joten järjestys jakautuu , joten järjestys on . Koska on neliö modulo , niin se on myös neliö, mikä tarkoittaa, että .
Oletetaan, että ja , ja . Kuten ennenkin, se säilytetään; kuitenkin tässä rakentamisessa sekä ja on järjestys . Tästä seuraa, että on järjestys , missä .
Jos , niin , ja algoritmi pysähtyy palauttaen . Muussa tapauksessa käynnistetään silmukka uudelleen samanlaisilla määritelmillä , kunnes saadaan , joka on yhtä suuri kuin 0. Koska naturalien sekvenssi on tiukasti pienenevä, algoritmi päättyy.
Tonelli-Shanks-algoritmi toimii keskimäärin (kaikilla mahdollisilla syötteillä (neliölliset jäännökset ja ei-jäännökset))
modulo kertolasku, jossa on binääriesityksen numeroiden lukumäärä ja binääriesityksen numeroiden lukumäärä . Jos vaadittu neliöllinen ei-jäännös lasketaan tarkistamalla satunnaisesti valitusta , onko se neliöllinen ei-jäännös, niin tämä vaatii keskimäärin kahden Legendre-symbolin laskemisen [2] . Kaksi laskettujen Legendre-symbolien keskimääräisenä lukumääränä selitetään seuraavasti: todennäköisyys, että se on neliöllinen jäännös on - todennäköisyys on suurempi kuin puolet, joten keskimäärin kestää noin kaksi tarkistusta, onko se neliöllinen jäännös.
Tämä osoittaa, että käytännössä Tonelli-Shanks-algoritmi toimii erittäin hyvin, jos moduuli on satunnainen, eli kun se ei ole erityisen suuri suhteessa binääriesityksen numeroiden määrään . Cipolla-algoritmi toimii paremmin kuin Tonelli-Shanks-algoritmi silloin ja vain jos . Jos sen sijaan Sutherlandin algoritmia käytetään diskreetin logaritmin suorittamiseen 2- Sylow-aliryhmälle , tämä sallii lausekkeen kertolaskujen määrän korvaamisen asymptoottisesti rajatulla arvolla [3] . Todellakin, riittää löytää sellainen , joka tyydyttää silloinkin (huomaa, että se on 2:n kerrannainen, koska se on neliöllinen jäännös).
Algoritmi vaatii neliöllisen ei-jäännöksen löytämisen . Tällä hetkellä ei ole olemassa determinististä algoritmia , joka löytäisi sellaisen pituuden polynomiajassa . Jos yleistetty Riemannin hypoteesi kuitenkin pitää paikkansa, on olemassa neliöllinen ei-jäännös , [4] , joka on helppo löytää tarkistamalla määrätyissä rajoissa polynomiajassa . Tämä on tietysti pahimman tapauksen arvio, koska, kuten yllä on esitetty, riittää, että tarkastetaan keskimäärin 2 satunnaista neliöllisen ei-jäämän löytämiseksi.
Tonelli-Shanks-algoritmia voidaan käyttää pisteiden etsimiseen jäännöskentän elliptisellä käyrällä . Sitä voidaan käyttää myös laskelmiin Rabinin salausjärjestelmässä .
Tonelli-Shanks-algoritmi voidaan yleistää mihin tahansa sykliseen ryhmään (sen sijaan ) ja :nnen asteen juurien löytämiseen mielivaltaiselle luonnolliselle , erityisesti : nnen asteen juurien laskemiseen äärellisessä kentässä [5] .
Jos samassa syklisessä ryhmässä on useita laskettavia neliöjuuria, jotka eivät ole kovin suuria, voidaan algoritmin parantamiseksi ja yksinkertaistamiseksi ja sen nopeuden lisäämiseksi tehdä taulukko elementtien neliöiden neliöjuurista seuraavasti:
Lukuteoreettiset algoritmit | |
---|---|
Yksinkertaisuustestit | |
Alkulukujen löytäminen | |
Faktorisointi | |
Diskreetti logaritmi | |
GCD:n löytäminen |
|
Modulo-aritmetiikka | |
Lukujen kerto- ja jakolasku | |
Neliöjuuren laskeminen |