Кіріспе
Екі санды көбейту алгоритмі – екі санды көбейтуге арналған алгоритм (немесе әдіс). Сандардың өлшеміне байланысты, әртүрлі алгоритмдер басқаларынан тиімдірек болуы мүмкін. Тиімді көбейту алгоритмдері ондық санау жүйесі пайда болғаннан бері қолданылып келеді.
A multiplication algorithm is an algorithm (or method) to multiply two numbers. Depending on the size of the numbers, different algorithms are more efficient than others. Efficient multiplication algorithms have existed since the advent of the decimal numeral system.
Қолмен көбейту алгоритмдері
Стандартты ұзын көбейтуден өзге, қолмен көбейтуді орындау үшін бірнеше әдіс бар. Мұндай алгоритмдер жылдамдық, есептеудің қарапайымдылығы немесе оқу құндылығы үшін құрастырылуы мүмкін, әсіресе компьютерлер мен көбейту кестелері қолжетімді болмаған жағдайда.
Желілік көбейту
Желілік немесе сырғалы көбейту алгоритмдік тұрғыдан ұзын көбейтумен теңдес. Ол есептеуді басшылыққа алатын және барлық көбейтулерді қосудан бөлетін желіні (қағазға салынған тор) дайындауды қажет етеді. 1202 жылы Фибоначчидің "Либер Абаци" еңбегінде Еуропаға енгізілді. Фибоначчи бұл амалды ойша орындауға болады, оң және сол қолдарын аралық есептеулер үшін пайдалануға болатынын айтқан. Матраки Насух осы әдістің 6 түрлі нұсқасын 16 ғасырдағы "Умдет ул-Хисаб" кітабында ұсынды. Бұл әдіс Осман империясының Эндерун мектептерінде кеңінен қолданылды. Нейпердің сүйектері немесе Нейпердің таяқтары да осы әдісті пайдаланды, оны Нейпер 1617 жылы, өлімінен бір жыл бұрын жариялаған. Мысалда көрсетілгендей, көбейтілмелі және көбейткіш желінің немесе сырғаның үстінде және оң жағында жазылады. Бұл әл-Хорезмидің "Арифметика" еңбегінде кездеседі, бұл Фибоначчидің "Либер Абаци" кітабының авторы Сиглердің 2002 жылы атап өткен Леонардоның деректерінің бірі. Көбейту кезеңінде желі әр қатар мен бағанға сәйкес келетін сандардың екі таңбалы көбейтулерімен толтырылады: ондық таңба жоғарғы сол бұрышта орналасады. Қосу кезеңінде желі диагональдар бойынша қосылады. Егер тасымалдау қажет болса, желінің сол және төменгі жағында көрсетілген жауап, ұзын қосу немесе көбейтудегідей ондық таңбаларды тасымалдау арқылы қалыпты түріне келтіріледі.
Ресейлік шаруалардың көбеюі
Бинарлық әдіс сонымен қатар шаруа көбейтуі деп те аталады, себебі оны шаруалар деп саналатын, сондықтан ұзақ көбейтуге қажетті көбейту кестелерін жаттамаған адамдар кеңінен қолданған. Бұл алгоритм ежелгі Египетте қолданылған. Оның басты артықшылықтары – оны жылдам үйретуге болады, жаттау қажет емес, сондай-ақ қағаз бен қалам болмаған жағдайда покер чиптері сияқты заттарды пайдаланып есептеуге мүмкіндік береді. Кемшілігі – ұзақ көбейтуге қарағанда көбірек қадамдар қажет, сондықтан үлкен сандармен жұмыс істегенде қолайсыз болуы мүмкін.
Сипаттама
Қағазға бір бағанға көбейтуші санды қайта-қайта екіге бөлгенде шығатын, қалдықты назарға алмайтын сандарды жазыңыз. Оның қасындағы бағанға көбейтілмелі санды қайта-қайта екі еселендіріңіз. Бірінші санның соңғы таңбасы жұп сан болатын әрбір қатарды сызып тастаңыз, ал екінші бағанда қалған сандарды қосып, көбейтіндіні шығарыңыз.
Төртінші квадратты көбейтудің тарихы
Тарихқа дейінгі кезеңде төрттен бір квадратты көбейту еден функциясымен байланысты; кейбір дереккөздер бұл амалды Вавилон математикасына (б.з.д. 2000–1600 ж.) жатқызады. Антуан Воазин 1817 жылы көбейтуге көмектесу үшін 1 мен 1000 аралығындағы төрттен бір квадраттардың кестесін жариялады. Сэмюэл Ланди 1856 жылы 1-ден 100000-ға дейінгі төрттен бір квадраттардың үлкен кестесін, ал Джозеф Блатер 1888 жылы 1-ден 200000-ға дейінгі кестесін жариялады. Төрттен бір квадратты көбейтуге арналған құрылғылар аналогты есептеу машиналарында екі аналогтық сигналдың көбейтіндісін құру үшін қолданылды. Бұл қолданыста екі кіріс кернеуінің қосындысы мен айырмасы операциялық күшейткіштер арқылы есептеледі. Олардың әрқайсысының квадраты кезеңдік сызықтық схемалар арқылы жуықталады. Содан кейін екі квадраттың айырмасы есептеліп, тағы бір операциялық күшейткіштің көмегімен төрттен бірге көбейтіледі. 1980 жылы Эверетт Л. Джонсон цифрлық көбейтуде төрттен бір квадрат әдісін қолдануды ұсынды. Мысалы, екі 8 биттік бүтін санның көбейтіндісін есептеу үшін цифрлық құрылғы қосынды мен айырманы есептейді, екі шаманы да квадраттар кестесінен іздейді, нәтижелердің айырмасын алады және екі битті оңға жылдыру арқылы төртке бөледі. 8 биттік бүтін сандар үшін төрттен бір квадраттар кестесі 29−1=511 жазбадан тұрады (мүмкін болатын қосындылардың 0–510 толық диапазоны үшін бір жазба, айырмашылықтар 0–255 диапазонындағы алғашқы 256 жазбаны ғана пайдаланады) немесе 29−1=511 жазбадан тұрады (жағымсыз айырмашылықтар үшін 2-нің толықтыруы және 9 биттік маскалау әдісі қолданылады, бұл айырмашылықтардың таңбасын тексеру қажеттілігінен құтылуға мүмкіндік береді), әр жазба 16 бит кеңдігінде (жазба мәндері (0²/4)=0-ден (510²/4)=65025-ке дейін). Төрттен бір квадратты көбейту әдісі аппараттық көбейтуге қолдау көрсетілмейтін 8 биттік жүйелерге пайдалы болды. Чарльз Путни бұл әдісті 6502 процессорлары үшін іске асырды.
Көбейтудің есептеулік күрделілігі
Теориялық компьютерлік ғылымдағы зерттеулердің бір бағыты – екі биттік бүтін сандарды көбейту үшін қажетті бір биттік арифметикалық операциялардың саны. Бұл көбейтудің есептеу күрделілігі деп аталады. Қолмен орындалатын әдеттегі алгоритмдердің асимптотикалық күрделілігі , бірақ 1960 жылы Анатолий Карацуба күрделілікті жақсарту мүмкін екенін ашты (Карацуба алгоритмі арқылы). Қазіргі уақытта ең жақсы есептеу күрделілігіне ие алгоритм – Дэвид Харви мен Жорис ван дер Ховеннің 2019 жылғы алгоритмі. Ол Schönhage–Strassen алгоритмімен енгізілген сандық-теориялық түрлендірулер стратегиясын пайдаланады, тек операцияларды қолдана отырып бүтін сандарды көбейтуге мүмкіндік береді. Бұл ең жақсы мүмкін алгоритм деп есептеледі, бірақ -қа тең немесе одан жоғары төменгі шекаралар әлі белгісіз.
Тарих
Каратсубаның алгоритмі ұзақ көбейтуден асимптотикалық тұрғыдан жылдам болатын алғашқы белгілі көбейту алгоритмі еді, осылайша оны жылдам көбейту теориясының бастауы деп қарастыруға болады.
Тоом Кук
Көбейтудің тағы бір әдісі Toom–Cook немесе Toom 3 деп аталады. Toom–Cook әдісі көбейтілуі тиіс әр санды бірнеше бөлікке бөледі. Toom–Cook әдісі – Каратсуба әдісінің жалпылама нұсқаларының бірі. Үш бөлікті қолданатын Toom–Cook көбейтуді 3N өлшеммен 5N өлшемдегі көбейтулер арқылы жүзеге асыруға мүмкіндік береді. Бұл операцияны 9/5 есеге жылдамдатады, ал Каратсуба әдісі оны 4/3 есеге жылдамдатады. Бөліктер санын арттыру рекурсивті көбейтулерге жұмсалатын уақытты одан әрі қысқартуға мүмкіндік берсе де, қосымша операциялар мен цифрларды басқаруға байланысты қосымша шығындар да артады. Осы себепті, Фурье түрлендіруінің әдісі бірнеше мың цифры бар сандар үшін көбінесе жылдам, ал одан да ірі сандар үшін асимптотикалық жағынан жылдам болады.
Тарих
Алгоритмдер Страссен (1968) жылы ойлап табылды. 1971 жылы Шёнаге мен Страссен бұл алгоритмді қолдануға ыңғайлы етіп, оның теориялық негіздерін дәлелдеді, нәтижесінде Шёнаге–Страссен алгоритмі құрылды.
Қосымша жақсартулар
2007 жылы швейцариялық математик Мартин Фюрер (Пенсильвания мемлекеттік университеті) күрделі сандардағы Фурье түрлендірулерін пайдалана отырып, бүтін сандарды көбейтудің асимптотикалық күрделілігін n log(n) 2Θ(log*(n))-ге дейін жақсартты, мұнда log* – итерацияланған логарифмді білдіреді. 2008 жылы Аниндья Де, Чандан Саха, Пиюш Курур және Рампрасад Саптарши модульдік арифметиканы қолдана отырып, ұқсас алгоритм ұсынды, ол да сол орындалу уақытын қамтамасыз етеді. Жоғарыда аталған материалдар контекстінде, соңғы авторлардың жеткені – N-ді 23k + 1-ден әлдеқайда кіші табу, сонда Z/NZ-де (2m)-інші дәрежелі бірлік түбірі болады. Бұл есептеулерді жылдамдатып, уақыт күрделілігін азайтады. Дегенмен, бұл соңғы алгоритмдер Schönhage–Strassen алгоритмінен тек өте үлкен кірістер үшін ғана жылдам. 2014 жылы Харви, Жорис ван дер Ховен және Лесерф көрсеткіштегі жасырын тұрақтыны нақтылайтын орындалу уақытын жететін жаңа алгоритм ұсынды. Олар сондай-ақ өз алгоритмінің нұсқасын ұсынды, ол жетеді, бірақ оның дұрыстығы Мерсенн сандарының таралуы туралы стандартты болжамдарға байланысты. 2016 жылы Кованов пен Томе Ферма сандарының обобщениесіне негізделген бүтін сандарды көбейту алгоритмін ұсынды, ол күрделілік шегіне жетеді. Бұл Харви, ван дер Ховен және Лесерфтің 2015 жылғы шартты нәтижесімен сәйкес келеді, бірақ басқа алгоритмді қолданады және басқа болжамға сүйенеді. 2018 жылы Харви мен ван дер Ховен Минковский теоремасымен кепілдендірілген қысқа тор векторларының бар екендігіне негізделген тәсілді қолданып, шартсыз күрделілік шегін дәлелдеді. 2019 жылдың наурыз айында Дэвид Харви мен Жорис ван дер Ховен O(n log n) көбейту алгоритмін ашқанын жариялады. Бұл жұмыс 2021 жылы «Математика анналында» жарияланды. Шенхаге мен Страссен n log(n) – «мүмкін болатын ең жақсы» нәтиже деп болжағандықтан, Харви былай деді: «Біздің жұмысымыз осы мәселенің соңғы шешімі болуы мүмкін, бірақ оны қатаң түрде қалай дәлелдеу керектігін әлі білмейміз».
In March 2019, David Harvey and Joris van der Hoeven announced their discovery of an O(n log n) multiplication algorithm. It was published in the Annals of Mathematics in 2021. Because Schönhage and Strassen predicted that n log(n) is the "best possible" result, Harvey said: " our work is expected to be the end of the road for this problem, although we don't know yet how to prove this rigorously."
Төменгі шектер
Бір процессорда екі n биттік санды көбейту үшін Ω(n) қарапайым төменгі шегі бар; дәл сәйкес алгоритм (дәстүрлі машиналарда, яғни Тьюрингке эквивалентті машиналарда) немесе одан да өткір төменгі шегі белгісіз. Көбейту кез келген жай p үшін AC0[p] класының шегінен тыс жатыр, яғни көбейтіндіні есептейтін AND, OR, NOT және MODp қақпаларын қолданатын тұрақты тереңдіктегі, полиномдық (немесе тіпті субекспоненциалды) өлшемді тізбектердің тобы жоқ. Бұл MODq-ны көбейтуге тұрақты тереңдікте келтіруден туындайды. Көбейту үшін кейбір тармақталу бағдарламаларының кластары үшін де төменгі шектері белгілі.