Dua contoh: faktorisasi dan GCD
Komputer klasik yang ada saat ini sangat cepat, dan kecepatannya tampaknya terus meningkat. Karena alasan ini, beberapa orang mungkin cenderung percaya bahwa komputer begitu cepat sehingga tidak ada masalah komputasi yang berada di luar jangkauannya.
Kepercayaan itu salah. Beberapa masalah komputasi sangat rumit secara inheren sehingga, meskipun ada algoritma untuk menyelesaikannya, tidak ada komputer di planet Bumi saat ini yang cukup cepat untuk menjalankan algoritma-algoritma ini hingga selesai bahkan pada input berukuran sedang dalam seumur hidup manusia β atau bahkan dalam seumur hidup Bumi itu sendiri.
Untuk menjelaskan lebih lanjut, mari perkenalkan masalah faktorisasi bilangan bulat.
Dengan faktorisasi prima dari yang kita maksudkan adalah daftar faktor prima dari dan pangkat yang harus dipangkatkan untuk mendapatkan melalui perkalian. Misalnya, faktor prima dari adalah dan dan untuk mendapatkan kita harus mengambil hasil kali pangkat dan pangkat
Hingga urutan faktor primanya, hanya ada satu faktorisasi prima untuk setiap bilangan bulat positif yang merupakan fakta yang dikenal sebagai teorema dasar aritmatika.
Beberapa demonstrasi kode sederhana dalam Python akan sangat membantu untuk menjelaskan lebih lanjut faktorisasi bilangan bulat dan konsep-konsep lain yang berkaitan dengan diskusi ini. Impor berikut diperlukan untuk demonstrasi-demonstrasi ini.
# Added by doQumentation β required packages for this notebook
!pip install -q sympy
import math
from sympy.ntheory import factorint
Fungsi factorint dari paket matematika simbolis SymPy untuk Python menyelesaikan masalah faktorisasi bilangan bulat untuk input apa pun yang kita pilih. Misalnya, kita bisa mendapatkan faktorisasi prima untuk 12, yang tentu saja sesuai dengan faktorisasi di atas.
N = 12
print(factorint(N))
{2: 2, 3: 1}
Memfaktorkan angka kecil seperti mudah, tapi ketika angka yang akan difaktorkan semakin besar, masalahnya menjadi lebih sulit.
Misalnya, menjalankan factorint pada angka yang jauh lebih besar menyebabkan keterlambatan singkat tapi nyata pada komputer pribadi biasa.
N = 3402823669209384634633740743176823109843098343
print(factorint(N))
{3: 2, 74519450661011221: 1, 5073729280707932631243580787: 1}
Untuk nilai yang bahkan lebih besar, hal-hal menjadi mustahil dilakukan, setidaknya sejauh yang kita tahu. Misalnya, RSA Factoring Challenge, yang dijalankan oleh RSA Laboratories dari 1991 hingga 2007, menawarkan hadiah uang tunai sebesar $100.000 untuk memfaktorkan angka berikut, yang memiliki 309 digit desimal (atau 1024 bit ketika ditulis dalam biner). Hadiah untuk angka ini tidak pernah diklaim dan faktor primanya tetap tidak diketahui.
RSA1024 = 135066410865995223349603216278805969938881475605667027524485143851526510604859533833940287150571909441798207282164471551373680419703964191743046496589274256239341020864383202110372958725762358509643110564073501508187510676594629205563685529475213500852879416377328533906109750544334999811150056977236890927563
print(RSA1024)
135066410865995223349603216278805969938881475605667027524485143851526510604859533833940287150571909441798207282164471551373680419703964191743046496589274256239341020864383202110372958725762358509643110564073501508187510676594629205563685529475213500852879416377328533906109750544334999811150056977236890927563
Kita tidak perlu repot menjalankan factorint pada RSA1024, itu tidak akan selesai dalam seumur hidup kita.
Algoritma tercepat yang diketahui untuk memfaktorkan bilangan bulat besar dikenal sebagai number field sieve. Sebagai contoh penggunaan algoritma ini, angka tantangan RSA250, yang memiliki 250 digit desimal (atau 829 bit ketika ditulis dalam biner), difaktorkan menggunakan number field sieve pada tahun 2020. Komputasi tersebut membutuhkan ribuan CPU core-years, didistribusikan di puluhan ribu mesin di seluruh dunia. Di sini kita bisa menghargai upaya ini dengan memeriksa solusinya.
RSA250 = 2140324650240744961264423072839333563008614715144755017797754920881418023447140136643345519095804679610992851872470914587687396261921557363047454770520805119056493106687691590019759405693457452230589325976697471681738069364894699871578494975937497937
p = 64135289477071580278790190170577389084825014742943447208116859632024532344630238623598752668347708737661925585694639798853367
q = 33372027594978156556226010605355114227940760344767554666784520987023841729210037080257448673296881877565718986258036932062711
print(RSA250 == p * q)
True
Keamanan sistem kriptografi kunci publik RSA didasarkan pada kesulitan komputasi faktorisasi bilangan bulat, dalam arti bahwa algoritma yang efisien untuk faktorisasi bilangan bulat akan merusaknya.
Selanjutnya mari kita pertimbangkan masalah yang terkait tapi sangat berbeda, yaitu menghitung pembagi persekutuan terbesar (atau GCD) dari dua bilangan bulat.
Pembagi persekutuan terbesar dari dua bilangan adalah bilangan bulat terbesar yang membagi keduanya secara merata.
Masalah ini mudah diselesaikan dengan komputer β biayanya kira-kira sama dengan mengalikan dua bilangan input bersama-sama.
Fungsi gcd dari modul Python math menghitung pembagi persekutuan terbesar dari angka-angka yang jauh lebih besar dari RSA1024 dalam sekejap mata. (Faktanya, RSA1024 adalah GCD dari dua angka dalam contoh ini.)
N = 4636759690183918349682239573236686632636353319755818421393667064929987310592347460711767784882455889983961546491666129915628431549982893638464243493812487979530329460863532041588297885958272943021122033997933550246447236884738870576045537199814804920281890355275625050796526864093092006894744790739778376848205654332434378295899591539239698896074
M = 5056714874804877864225164843977749374751021379176083540426461360945653967249306494545888621353613218518084414930846655066495767441010526886803458300440345782982127522212209489410315422285463057656809702949608368597012967321172325810519806487247195259818074918082416290513738155834341957254558278151385588990304622183174568167973121179585331770773
print(math.gcd(N, M))
135066410865995223349603216278805969938881475605667027524485143851526510604859533833940287150571909441798207282164471551373680419703964191743046496589274256239341020864383202110372958725762358509643110564073501508187510676594629205563685529475213500852879416377328533906109750544334999811150056977236890927563
Ini dimungkinkan karena kita memiliki algoritma yang sangat efisien untuk menghitung GCD, yang paling terkenal adalah algoritma Euclid, yang ditemukan lebih dari 2.000 tahun yang lalu.
Bisakah ada algoritma cepat untuk faktorisasi bilangan bulat yang belum kita temukan, memungkinkan angka besar seperti RSA1024 difaktorkan dalam sekejap mata? Jawabannya adalah ya. Meskipun kita mungkin mengharapkan bahwa algoritma efisien untuk faktorisasi sesederhana dan seanggun algoritma Euclid untuk menghitung GCD sudah ditemukan pada saat ini, tidak ada yang menghalangi keberadaan algoritma klasik yang sangat cepat untuk faktorisasi bilangan bulat, selain fakta bahwa kita gagal menemukannya sejauh ini. Satu bisa ditemukan besok β tapi jangan menahan napas. Generasi matematikawan dan ilmuwan komputer telah mencari, dan memfaktorkan angka seperti RSA1024 tetap di luar jangkauan kita.