क्योंकि पूर्णांक मापांक ऑपरेशन एक रिंग होमोमोर्फिज्म ( विकिपीडिया )> -> ℤ / nℤ, से है
(X * Y) mod N = (X mod N) * (Y mod N) mod N
आप इसे थोड़ा सरल बीजगणित के साथ स्वयं सत्यापित कर सकते हैं। (ध्यान दें कि mod
दाएं हाथ की तरफ अंतिम एक मॉड्यूलर रिंग में गुणा की परिभाषा के कारण दिखाई देता है।)
कंप्यूटर बड़ी संख्या में अंकों की गणना किए बिना मॉड्यूलर रिंगों में घातांक की गणना करने के लिए इस ट्रिक का उपयोग करते हैं।
/ 1 I = 0,
|
(X ^ I) mod N = <(X * (X ^ (I-1) mod N)) mod NI विषम,
|
\ (X ^ (I / 2) mod N) ^ 2 मॉड NI यहां तक कि I / = 0।
एल्गोरिथम रूप में,
-- 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
आप इसे (855^2753) mod 3233
केवल 16-बिट रजिस्टरों के साथ गणना करने के लिए उपयोग कर सकते हैं , यदि आप चाहें।
हालांकि, आरएसए में एक्स और एन के मूल्य बहुत बड़े हैं, एक रजिस्टर में फिट होने के लिए बहुत बड़े हैं। एक मापांक आमतौर पर 1024-4096 बिट्स लंबा होता है! तो आप कंप्यूटर को "लंबे" तरीके से गुणा कर सकते हैं, उसी तरह हम हाथ से गुणा करते हैं। केवल अंक 0-9 का उपयोग करने के बजाय, कंप्यूटर "शब्द" 0-2 16 -1 या ऐसा कुछ उपयोग करेगा । (केवल 16 बिट्स का उपयोग करने का मतलब है कि हम दो 16 बिट संख्याओं को गुणा कर सकते हैं और विधानसभा भाषा का सहारा लिए बिना पूर्ण 32 बिट परिणाम प्राप्त कर सकते हैं। असेंबली भाषा में, पूर्ण रूप से 64 बिट परिणाम प्राप्त करना बहुत आसान है, या 64-बिट कंप्यूटर के लिए पूर्ण 128-बिट परिणाम।)
-- 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
यह X द्वारा Y को समय की मात्रा में लगभग गुणा करेगा, X में शब्दों की संख्या के बराबर लगभग Y में शब्दों की संख्या से गुणा करता है। इसे O (N 2 ) समय कहा जाता है । यदि आप ऊपर दिए गए एल्गोरिथ्म को देखते हैं और उसे अलग करते हैं, तो यह वही "लंबी गुणा" है जो वे स्कूल में पढ़ाते हैं। यदि आपके पास 10 अंकों के लिए समय सारणी नहीं है, लेकिन यदि आप बैठते हैं और इसे काम करते हैं, तब भी आप 1,926,348 x 8,192,004 गुणा कर सकते हैं।
लंबी गुणा:
1,234
x 5,678
---------
9,872
86,38
740,4
6,170
---------
7,006,652
वास्तव में गुणा ( विकिपीडिया ) के लिए आसपास कुछ तेज एल्गोरिदम हैं , जैसे स्ट्रैसेन की फास्ट फूरियर विधि, और कुछ सरल तरीके जो अतिरिक्त जोड़ और घटाव लेकिन कम गुणा करते हैं, और इसलिए तेजी से समग्र रूप से समाप्त होते हैं। GMP जैसी संख्यात्मक लाइब्रेरी विभिन्न संख्याओं के आधार पर विभिन्न एल्गोरिदम का चयन करने में सक्षम हैं: संख्याओं के लिए फूरियर रूपांतरण केवल सबसे तेज़ है, छोटी संख्या सरल एल्गोरिदम का उपयोग करती है।