Кіріспе

Толық сандарды факторлау алгоритмі
Квадраттық сүзгі алгоритмі (QS) – бүтін сандарды факторлау алгоритмі және практикада екінші ең жылдам әдіс болып табылады (жалпы сандық өріс сүзгісінен кейін). Бұл әлі де 100 ондық таңбадан аспайтын сандар үшін ең жылдам әдіс саналады және сандық өріс сүзгісіне қарағанда әлдеқайда қарапайым. Бұл жалпы мақсаттағы факторлау алгоритмі, яғни оның жұмыс істеу уақыты факторланатын санның мөлшеріне ғана байланысты, ал ерекше құрылымына немесе қасиеттеріне емес. Оны Карл Померанс 1981 жылы Шропелдің сызықтық сүзгісін жақсарту ретінде ойлап тапты.

Негізгі мақсат

Алгоритм n бүтін санын (факторланатын санды) модуль бойынша квадраттардың конгруэнттілігін орнатуға тырысады, бұл көбінесе n-ді факторлауға әкеледі. Алгоритм екі кезеңде жұмыс істейді: деректерді жинау кезеңі, онда квадраттардың конгруэнттілігіне алып келуі мүмкін ақпарат жиналады; және деректерді өңдеу кезеңі, онда жиналған барлық деректер матрицаға салынып, квадраттардың конгруэнттілігін алу үшін шешіледі. Деректерді жинау кезеңін көптеген процессорларға оңай параллельдеуге болады, бірақ деректерді өңдеу кезеңіне көп жад қажет, және оны көптеген түйіндерге тиімді параллельдеу қиын, әсіресе егер өңдеу түйіндерінің әрқайсысында матрицаны толығымен сақтауға жеткілікті жад болмаса. Матрицаны ұстауға қабілетті бірнеше жүйе болған жағдайда блок Видеманн алгоритмін қолдануға болады. Квадраттардың конгруэнттілігін табудың қарапайым тәсілі – кездейсоқ санды таңдап, оны квадраттап, n-ге бөліп, ең кіші теріс емес қалдықтың толық квадрат болатынына үмітттену. Мысалы, бұл тәсіл үлкен n үшін квадраттардың конгруэнттілігін сирек табады, бірақ ол бірін тапқанда, көбінесе конгруэнттілік маңызды болып шығады және факторлау аяқталады. Бұл Ферманың факторлау әдісінің негізгі принципі. Квадраттық елеуіш – Диксонның факторлау әдісінің өзгешелігі болып табылады. Квадраттық елеуіштің (n бүтін санын факторлау үшін) қажетті жалпы жұмыс уақыты L нотациясында көрсетіледі. e тұрақтысы – табиғи логарифмнің негізі.

QS конгруенцияларды табуды қалай оңтайландырады

Квадраттық сырға x² ≡ y² (mod n) шартынан әлдеқайда әлсіз шартты қанағаттандыратын x және y(x) бүтін сандарының жұптарын табуға тырысады. Ол факторлық негіз деп аталатын алғашқы сандар жиынтығын таңдайды және y(x) = x² mod n қалдығының ең кіші абсолютті мәні факторлық негізге толық бөлінетіндей x-ті табуға тырысады. Мұндай y мәндері факторлық негізге қатысты тегіс деп аталады. y(x) мәнінің факторлық негізге бөлінген факторлық жіктелуі, x мәнімен бірге қатынас деп аталады. Квадраттық сырғалау x-ті n-нің квадрат түбіріне жақын алып, қатынастарды табу процесін жылдамдатады. Бұл y(x) кішірек болатынын және демек, тегіс болу мүмкіндігі жоғары болатынын қамтамасыз етеді. Бұл y шамамен 2x-ке тең екенін білдіреді. Алайда, бұл y-нің x есе n-нің квадрат түбірімен сызықтық өсетінін де білдіреді. Тегіс болу мүмкіндігін арттырудың тағы бір жолы – факторлық негіздің мөлшерін ұлғайту. Бірақ, сызықтық тәуелділіктің болуын қамтамасыз ету үшін факторлық негіздегі жай сандар санынан кем дегенде бір тегіс қатынасты табу қажет.

Сырлау арқылы тегістікті тексеру

Мұздың тегіс болуын тексерудің бірнеше тәсілі бар. Ең айқын тәсіл – сынаққа бөлу, бірақ бұл деректерді жинау кезеңіндегі жұмыс уақытын ұзартады. Тағы бір қабылданған әдіс – эллиптік қисық әдісі (ECM). Іс жүзінде, көбінесе «сілемдеу» деп аталатын процесс қолданылады. Егер f(x) біздің полиномымыз болса, онда f(x) ≡ 0 (mod p) теңдеуін x үшін шешу, y = f(x) болатын y сандарының тізбегін тудырады, олардың барлығы p-ге бөлінеді. Бұл жай санға қатысты квадрат түбірді табумен байланысты, мұндай жағдайда Шенкс-Тонелли алгоритмі сияқты тиімді алгоритмдер бар. (Дәл осы себепті квадраттық сілемдеу атауы берілген: y – x-ке қатысты квадраттық полином, ал сілемдеу процесі Эратоспеннің сілемдесі сияқты жұмыс істейді.) Сілемдеу байттардан тұратын үлкен A[] массивінің әрбір ұяшығын нөлге теңеуден басталады. Әрбір p үшін, екі түбір α және β алу үшін mod p бойынша квадраттық теңдеуді шешіп, содан кейін log(p) жуықтауын y(x) = 0 mod p болатын әрбір ұяшыққа қосыңыз, яғни A[kp + α] және A[kp + β]. Сондай-ақ, негізгі фактордың кіші дәрежештеріне бөлінетін сандарды анықтау үшін p-дің кіші дәрежештері бойынша квадраттық теңдеуді шешу қажет. Факторлық базаның соңында, A[] массивінің кез келген ұяшығында шамамен log(x² - n) шегінен жоғары мән болса, ол факторлық базаға қатысты бөлінетін y(x) мәніне сәйкес келеді. y(x)-ті бөлетін жай сандар туралы ақпарат жоғалып кеткенімен, оның тек кіші факторлары бар, ал кіші факторлары бар санды факторлауға арналған көптеген тиімді алгоритмдер бар, мысалы, кіші жай сандарға сынаққа бөлу, SQUFOF, Pollard rho және ECM, олар көбінесе бірнеше комбинацияда қолданылады. Жұмыс істейтін көптеген y(x) мәндері бар, сондықтан факторлау процесінің соңында толыққанды сенімділік қажет емес; көбінесе процестер кірістердің 5% жағдайында қате жұмыс істейді, бұл қосымша сілемдеуді қажет етеді.

Негізгі сырғаның үлгісі

Бұл мысал логарифмдік оңтайландырулар немесе жай санның дәрежелері қолданбастан стандартты квадраттық елеуді көрсетеді. Бөлінетін сан N = 15347 болсын, демек N түбірінің жоғары шегі 124-ке тең. N кішкентай болғандықтан, қарапайым көпмүшелік жеткілікті: y(x) = (x + 124)2 − 15347.

Көптік көптік

Іс жүзінде y үшін көптеген түрлі полиномиалдар қолданылады, себебі әдетте бір ғана полиномиал факторлық негізге тегіс жеткілікті (x, y) жұптарды қамтамасыз ете алмайды. Қолданылатын полиномиалдардың арнайы түрі болуы керек, өйткені олар n модулі бойынша квадраттар болуы тиіс. Полиномиалдардың бәрі бастапқы y(x) = x² − n түріне ұқсас болуы керек: Егер A-ның еселігі деп есептесек, онда y(x) полиномиалын былай жазуға болады. Егер A квадрат болса, онда тек сол факторды қарастыру жеткілікті. Бұл тәсіл (MPQS, Көпполиномиалды квадраттық елеу) параллель өңдеуге өте ыңғайлы, себебі факторлауға қатысатын әрбір процессорға n, факторлық негіз және полиномиалдар жиынтығы беріледі, ал ол өзінің полиномиалдарын аяқтамайынша орталық процессормен байланысқа түсудің қажеті болмайды.

Бір үлкен пропорционалды сан

Егер А-дан кіші барлық көбейткіштерге бөлгеннен кейін санның қалған бөлігі (кофактор) А²-ден кіші болса, онда бұл кофактор жай сан болуы керек. Іс жүзінде, оны кофактор бойынша қатынастар тізімін реттеу арқылы факторлық базаға қосуға болады. Егер y(a) = 7*11*23*137 және y(b) = 3*5*7*137 болса, онда y(a)y(b) = 3*5*11*23 * 7² * 137². Бұл, іріктеу массивіндегі жазбалардың шекті мәнін төмендету арқылы жұмыс істейді, одан жоғары толық факторлау орындалады.

Үлкен жай сандар

Шешімді одан да төмендету және y(x) мәндерін тіпті салыстырмалы түрде үлкен жай сандардың көбейтінділеріне жіктеу үшін тиімді әдіс қолдану – ЭКМ осы үшін өте жақсы. Ол факторлық базада көптеген факторлары бар қатынастарды таба алады, бірақ олардың ішінде екі немесе тіпті үш үлкен жай сан да болуы мүмкін. Циклді табу бірнеше жай санмен ортақ қатынастар жиынтығын бір қатынасқа біріктіруге мүмкіндік береді.

Факторингті есепке алу

Сандық өріс сырғалау (NFS) ашылғанға дейін QS асимптотикалық тұрғыдан ең жылдам жалпы мақсаттағы факторлау алгоритмі болды. Қазір Ленстра эллиптік қисық факторлауы QS-пен бірдей асимптотикалық жұмыс уақытына ие (егер n дәл екі тең өлшемдегі жай санға ие болса), бірақ практикада QS жылдамырақ, себебі ол эллиптік қисық әдісінде қолданылатын көп дәлдік операцияларының орнына бір дәлдік операцияларын қолданады. 1994 жылдың 2 сәуірінде QS арқылы RSA 129 санының факторлары табылды. Бұл 129 таңбалы сан, екі үлкен жай санның көбейтіндісі, біреуі 64 таңбалы, екіншісі 65 таңбалы. Осы факторлау үшін факторлық база 524339 жай санды қамтыды. Деректерді жинау кезеңі 5000 MIPS жылға созылды және ол Интернет арқылы үлестірілген түрде жүзеге асырылды. Жиналған деректердің көлемі 2 ГБ құрады. Деректерді өңдеу кезеңі Bellcore (қазір Telcordia Technologies) MasPar (массивті параллель) суперкомпьютерінде 45 сағатқа созылды. Бұл NFS арқылы RSA 130 санының факторлары табылғанға дейін жалпы мақсаттағы алгоритммен ең үлкен жарияланған факторлау болды, ол 1996 жылдың 10 сәуірінде аяқталды. Содан бері факторланған барлық RSA сандары NFS арқылы факторланды. Қазіргі QS факторлау рекорды – 140 таңбалы (463 бит) RSA 140 саны, оны Патрик Консор 2020 жылдың маусым айында 6 күн ішінде шамамен 6000 процессорлық сағатты пайдаланып факторлады.