Tamsayı modülü işlemi, ℤ -> ℤ / nℤ 'den bir halka homomorfizmi ( Wikipedia ) olduğu için,
(X * Y) mod N = (X mod N) * (Y mod N) mod N
Bunu kendiniz biraz basit cebir ile doğrulayabilirsiniz. ( mod
Sağ taraftaki finalin , modüler bir halkadaki çarpma tanımı nedeniyle göründüğünü unutmayın.)
Bilgisayarlar bu numarayı modüler halkalardaki üstel sayıları hesaplamak için çok sayıda basamak hesaplamak zorunda olmadan kullanır.
/ 1 I = 0,
|
(X ^ I) mod N = <(X * (X ^ (I-1) mod N)) mod NI tek,
|
\ (X ^ (I / 2) mod N) ^ 2 mod NI, hatta & I / = 0.
Algoritmik formda,
-- 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
İsterseniz, (855^2753) mod 3233
yalnızca 16 bitlik kayıtlarla hesaplamak için bunu kullanabilirsiniz .
Ancak, RSA'daki X ve N değerleri çok daha büyüktür, bir sicile sığmayacak kadar büyüktür. Bir modül tipik olarak 1024-4096 bit uzunluğundadır! Böylece, bir bilgisayarı çarpma işlemini "uzun" yolla, aynı şekilde elle çarpma işlemine sokabilirsiniz. Sadece yerine 0-9 kullanmak yerine, bilgisayar "kelimelerini" 0-2 kullanacağı 16 böyle -1 falan. (Yalnızca 16 bit kullanarak, iki 16 bit sayıyı çarpabileceğimiz ve derleme diline başvurmadan tam 32 bit sonuç alabileceğimiz anlamına gelir. , tam 128 bit sonuç.)
-- 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
Bu, X'i Y ile Y'de çarparak, X'deki kelimelerin sayısına kabaca eşit bir sürede Y'deki kelimelerin sayısı ile çarpacaktır. Buna O (N 2 ) zamanı denir . Yukarıdaki algoritmaya bakarsanız ve ayırırsanız, okulda öğrettikleri aynı "uzun çarpma" olur. 10 haneye kadar hafızaya alınmış zaman çizelgelerine sahip değilsiniz, ancak eğer oturup çalışırsanız hala 1.926.348 x 8,192,004 ile çarpabilirsiniz.
Uzun çarpma:
1,234
x 5,678
---------
9,872
86,38
740,4
6,170
---------
7,006,652
Strassen'in hızlı Fourier yöntemi gibi çarpma ( Wikipedia ) gibi bazı daha hızlı algoritmalar ve daha fazla toplama ve çıkarma yapan, ancak daha az çarpma yapan ve daha genel olarak sonuçlanan daha basit yöntemler var. GMP gibi sayısal kütüphaneler, sayıların ne kadar büyük olduğuna bağlı olarak farklı algoritmalar seçebilir: Fourier dönüşümü yalnızca en büyük sayılar için en hızlıdır, küçük sayılar daha basit algoritmalar kullanır.