কারণ পূর্ণসংখ্যা মডুলাস অপারেশনটি ring -> ℤ / nℤ এর একটি রিং হোমোমর্ফিিজম ( উইকিপিডিয়া ),
(X * Y) mod N = (X mod N) * (Y mod N) mod N
আপনি নিজেকে সাধারণ বীজগণিতের কিছুটা দিয়ে যাচাই করতে পারেন। (নোট করুন যে mod
কোনও মডুলার রিংয়ে গুণনের সংজ্ঞা দেওয়ার কারণে ডানদিকে চূড়ান্ত উপস্থিত হবে))
কম্পিউটারগুলি এই কৌশলটি প্রচুর সংখ্যার অঙ্ক গণনা না করে মডুলার রিংগুলিতে সূচকগুলি গণনা করতে ব্যবহার করে।
/ 1 আই = 0,
|
(এক্স ^ আই) মোড এন = <(এক্স * (এক্স ^ (আই -১) মোড এন)) মোড এনআই বিজোড়,
|
X (এক্স ^ (আই / 2) মোড এন) mod 2 মোড এনআই সমান এবং আমি / = 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 টি বিট ব্যবহারের অর্থ আমরা দুটি ভাষা বিট সংখ্যাকে গুণিত করতে পারি এবং সমাবেশের ভাষাটি না নিয়েই পুরো 32 বিট ফলাফল পেতে পারি assembly , পূর্ণ 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 এর সমান পরিমাণে X দ্বারা গুণন করবে This এটিকে 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
গুণনের জন্য চারদিকে কিছু দ্রুত অ্যালগরিদম রয়েছে ( উইকিপিডিয়া ) যেমন স্ট্রেসেনের দ্রুত ফুরিয়ার পদ্ধতি এবং কিছু সহজ পদ্ধতি যা অতিরিক্ত সংযোজন এবং বিয়োগফলকে কম গুণ করে এবং তাই সামগ্রিকভাবে দ্রুত শেষ হয়। জিএমপির মতো সংখ্যাযুক্ত গ্রন্থাগারগুলি সংখ্যাটি কত বড় তার ভিত্তিতে বিভিন্ন অ্যালগরিদম নির্বাচন করতে সক্ষম: ফুরিয়ার ট্রান্সফর্মটি বৃহত্তম সংখ্যার জন্য কেবল দ্রুততম, ছোট সংখ্যা সরল অ্যালগরিদম ব্যবহার করে।