Karena operasi modulus integer adalah cincin homomorfisme ( Wikipedia ) dari ℤ -> ℤ / nℤ,
(X * Y) mod N = (X mod N) * (Y mod N) mod N
Anda dapat memverifikasi ini sendiri dengan sedikit aljabar sederhana. (Perhatikan bahwa final mod
di sisi kanan muncul karena definisi multiplikasi dalam cincin modular.)
Komputer menggunakan trik ini untuk menghitung eksponensial dalam cincin modular tanpa harus menghitung sejumlah besar digit.
/ 1 I = 0,
|
(X ^ I) mod N = <(X * (X ^ (I-1) mod N)) mod NI aneh,
|
\ (X ^ (I / 2) mod N) ^ 2 mod NI even & I / = 0.
Dalam bentuk algoritmik,
-- compute X^I mod N
function expmod(X, I, N)
if I is zero
return 1
elif I is odd
return (expmod(X, I-1, N) * X) mod N
else
Y <- expmod(X, I/2, N)
return (Y*Y) mod N
end if
end function
Anda dapat menggunakan ini untuk menghitung (855^2753) mod 3233
hanya dengan register 16-bit, jika Anda mau.
Namun, nilai X dan N di RSA jauh lebih besar, terlalu besar untuk masuk dalam register. Panjang modulus biasanya 1024-4096 bit! Sehingga Anda dapat memiliki komputer melakukan perkalian dengan cara "panjang", cara yang sama kita lakukan perkalian dengan tangan. Hanya alih-alih menggunakan angka 0-9, komputer akan menggunakan "kata-kata" 0-2 16 -1 atau sesuatu seperti itu. (Menggunakan hanya 16 bit berarti kita bisa mengalikan dua angka 16 bit dan mendapatkan hasil 32 bit penuh tanpa menggunakan bahasa assembly. Dalam bahasa assembly, biasanya sangat mudah untuk mendapatkan hasil 64 bit penuh, atau untuk komputer 64-bit , hasil 128-bit penuh.)
-- Multiply two bigints by each other
function mul(uint16 X[N], uint16 Y[N]):
Z <- new array uint16[N*2]
for I in 1..N
-- C is the "carry"
C <- 0
-- Add Y[1..N] * X[I] to Z
for J in 1..N
T <- X[I] * Y[J] + C + Z[I + J - 1]
Z[I + J - 1] <- T & 0xffff
C <- T >> 16
end
-- Keep adding the "carry"
for J in (I+N)..(N*2)
T <- C + Z[J]
Z[J] <- T & 0xffff
C <- T >> 16
end
end
return Z
end
-- footnote: I wrote this off the top of my head
-- so, who knows what kind of errors it might have
Ini akan mengalikan X dengan Y dalam jumlah waktu yang kira-kira sama dengan jumlah kata dalam X dikalikan dengan jumlah kata dalam Y. Ini disebut waktu O (N 2 ). Jika Anda melihat algoritme di atas dan membedakannya, itu adalah "perkalian panjang" yang sama dengan yang mereka ajarkan di sekolah. Anda tidak memiliki tabel yang dihafal hingga 10 digit, tetapi Anda masih bisa melipatgandakan 1.926.348 x 8.192.004 jika Anda duduk dan menyelesaikannya.
Perkalian panjang:
1,234
x 5,678
---------
9,872
86,38
740,4
6,170
---------
7,006,652
Sebenarnya ada beberapa algoritma yang lebih cepat di sekitar untuk mengalikan ( Wikipedia ), seperti metode cepat Fourier Strassen, dan beberapa metode sederhana yang melakukan penambahan dan pengurangan tambahan tetapi perkalian lebih sedikit, dan akhirnya secara keseluruhan lebih cepat. Perpustakaan numerik seperti GMP mampu memilih algoritma yang berbeda berdasarkan seberapa besar angka-angkanya: Transformasi Fourier hanya yang tercepat untuk angka terbesar, angka yang lebih kecil menggunakan algoritma yang lebih sederhana.