Кіріспе

Тонелли–Шенкс алгоритмі (Шенкс оны RESSOL алгоритмі деп атайды) модульдік арифметикада r² ≡ n (mod p) түріндегі сәйкестікте r-ді табу үшін қолданылады, мұнда p – жай сан: яғни, n-нің p модулі бойынша квадрат түбірін табу үшін. Тонелли–Шенкс алгоритмін құрама модульдер үшін қолдануға болмайды: құрама сандар модулі бойынша квадрат түбір табу, бүтін сандарды жіктеуге тең есептеу мәселесі болып табылады. Осы алгоритмнің эквивалентті, бірақ сәл артық нұсқасын 1891 жылы Альберто Тонелли жасаған. Бұл жерде талқыланатын нұсқаны 1973 жылы Дэниел Шенкс тәуелсіз түрде жасады және былай деп түсіндірді:

Мен осы тарихи сілтемелерді білуге кешіккенімнің себебі, мен Диксонның «Тарихының» 1-томын досыма беріп, ол оны маған қайтарған жоқ. Диксонның сөзіне сүйенсек, Лежандр символының екі есептеуінің орташасы былай түсіндіріледі: – бұл квадраттық қалдық болу ықтималдығы , ол -тан кіші, бірақ -тан үлкен, сондықтан орташа есеппен a-ның квадраттық қалдық екенін екі рет тексеруіміз керек. Бұл, негізінен, Тонелли–Шенкс алгоритмінің модулі кездейсоқ болғанда, яғни егер өте жақсы жұмыс істейтінін көрсетеді. Жоғарыда айтылғандай, Циполла алгоритмі (және тек егер) болса, Тонелли–Шенкс алгоритмінен жақсы жұмыс істейді. Алайда, егер Сазерленд алгоритмін қолданып, -ның 2 Sylow кіші тобындағы дискретті логарифмді есептесек, оны асимптотикалық түрде шектелген өрнекпен алмастыруға болады. Алгоритм бізге квадраттық емес қалдық табуды талап етеді. Мұндай қалдықты табу үшін полиномдық уақытта жұмыс істейтін белгілі детерминистік алгоритм жоқ. Алайда, егер жалпыланған Риман гипотезасы дұрыс болса, онда квадраттық емес қалдық бар, бұл белгілі бір шекке дейін барлық сандарды тексеруге және полиномдық уақыт ішінде қолайлы қалдық табуға мүмкіндік береді. Дегенмен, бұл ең нашар жағдай екенін есте ұстаңыз; жалпы алғанда, жоғарыда айтылғандай, орташа есеппен 2 сынақтан кейін табылады.

Қолданылуы

Тонелли-Шенкс алгоритмі (әдеттегідей) жай сан бойынша модульдік квадрат түбірлер қажет болатын кез келген процесте қолданылуы мүмкін. Мысалы, оны эллиптік қисықтардағы нүктелерді табу үшін пайдалануға болады. Бұл Рабин криптожүйесіндегі және квадраттық елеуіштің іріктеу кезеңіндегі есептеулер үшін де пайдалы.