এই পর্বে যা শিখবেন
- Modular inverse কখন থাকে, প্রমাণসহ, আর extended Euclid-এর ছক দিয়ে হাতে তার হিসাব
- ax ≡ b (mod m)-এর সব সমাধান বের করা আর “কয়টি সমাধান” প্রশ্নের প্রমাণিত উত্তর
- Chinese Remainder Theorem-এর বক্তব্য, গঠনমূলক প্রমাণ আর অনন্যতার প্রমাণ
- Back-substitution পদ্ধতি, আর modulus সহমৌলিক না হলে সমাধান আছে কি না বোঝার শর্ত
- সময়সূচি, প্যাকিং আর বড় সংখ্যার হিসাবে CRT-এর ব্যবহার, পরীক্ষার ধাঁচের পূর্ণ অঙ্কসহ
১ · Modulo-র জগতে ভাগ — modular inverse
বাজারঘরের এক কর্মী একটি হিসাব মেলাচ্ছেন। প্রতিটি অর্ডারের id-কে 17 দিয়ে গুণ করে 3120 দিয়ে ভাগ করলে যে ভাগশেষ থাকে, সেটি invoice-এ ছাপা হয়। একটি invoice-এ ছাপা আছে 9. মূল id-এর ভাগশেষ কত ছিল? সাধারণ পাটিগণিতে আমরা লিখতাম 17x = 9, তাই x = 9/17. কিন্তু এখানে আমরা পূর্ণসংখ্যার জগতে, modulo 3120-এ; 9/17 কোনো পূর্ণসংখ্যা নয়। তাহলে “17 দিয়ে ভাগ” বলতে কী বোঝাবে?
পর্ব ২২ “Modular arithmetic — ঘড়ির গণিত আর modular exponentiation”-এ দেখেছেন, mod m-এ যোগ, বিয়োগ আর গুণ নির্ভয়ে করা যায়। ভাগ আলাদা। সাধারণ সংখ্যায় 17 দিয়ে ভাগ মানে 1/17 দিয়ে গুণ, আর 1/17 হলো সেই সংখ্যা, যাকে 17 দিয়ে গুণ করলে 1 হয়। Modulo-র জগতে একই প্রশ্ন করা যায়: এমন কোনো পূর্ণসংখ্যা s আছে কি, যাতে 17s-এর ভাগশেষ 1? থাকলে 17x ≡ 9-এর দুই পাশকে s দিয়ে গুণ করলেই x বেরিয়ে আসবে।
প্রথমে চিহ্নগুলো মনে করিয়ে দিই। m ≥ 1 একটি পূর্ণসংখ্যা হলে a ≡ b (mod m) পড়া হয় “a congruent b modulo m”, আর এর অর্থ m ∣ (a − b), অর্থাৎ m দিয়ে ভাগ করলে a আর b-এর ভাগশেষ সমান। এই সম্পর্কটির নাম congruence; m-কে বলে modulus. “∣” চিহ্নের অর্থ “নিঃশেষে ভাগ করে” (divisibility). আর gcd(a, m) হলো a আর m-এর গরিষ্ঠ সাধারণ গুণনীয়ক (gcd); gcd(a, m) = 1 হলে a আর m সহমৌলিক (coprime).
m ≥ 2 আর a একটি পূর্ণসংখ্যা। যদি এমন পূর্ণসংখ্যা s থাকে যাতে as ≡ 1 (mod m), তবে s-কে a-এর modular inverse (mod m) বলে, আর লেখা হয় a−1 mod m. যেমন 3 · 5 = 15 ≡ 1 (mod 7), তাই mod 7-এ 3−1 = 5.
সব সংখ্যার inverse থাকে না। mod 6-এ 2-কে নিন: 2 · 0, 2 · 1, …, 2 · 5-এর ভাগশেষ 0, 2, 4, 0, 2, 4. কখনো 1 আসে না, কারণ 2s সবসময় জোড় আর 6-এর গুণিতকও জোড়, তাই 2s − 1 (বিজোড়) কখনো 6-এর গুণিতক হতে পারে না। সমস্যাটি 2 আর 6-এর সাধারণ গুণনীয়ক 2. এই পর্যবেক্ষণই পুরো উত্তর।
m ≥ 2 হলে a-এর inverse mod m থাকে ⇔ gcd(a, m) = 1. আর inverse থাকলে তা mod m-এ অনন্য: s আর s′ দুটিই inverse হলে s ≡ s′ (mod m).
প্রমাণ: এখানে Bézout-এর অভেদ লাগবে: যেকোনো পূর্ণসংখ্যা a, m (দুটিই শূন্য নয়) হলে এমন পূর্ণসংখ্যা s, t আছে যাতে as + mt = gcd(a, m). এর প্রমাণ (well-ordering দিয়ে) পর্ব ২১ “GCD আর Euclid-এর algorithm — Bézout আর extended Euclid”-এ।
- (⇐) ধরি gcd(a, m) = 1. Bézout অনুযায়ী as + mt = 1 এমন s, t আছে। তাহলে as − 1 = −mt, যা m-এর গুণিতক, তাই as ≡ 1 (mod m). — Bézout, congruence-এর সংজ্ঞা
- (⇒) ধরি as ≡ 1 (mod m). তাহলে কোনো পূর্ণসংখ্যা k-এর জন্য as − 1 = mk, অর্থাৎ as − mk = 1. — congruence-এর সংজ্ঞা
- d = gcd(a, m) হলে d ∣ a আর d ∣ m, তাই d ∣ (as − mk) = 1. ধনাত্মক d-এর জন্য এর অর্থ d = 1. — ভাজক দুটি সংখ্যাকে ভাগ করলে তাদের যেকোনো পূর্ণসংখ্যা-সমন্বয়কেও ভাগ করে
- (অনন্যতা) as ≡ 1 আর as′ ≡ 1 হলে s ≡ s · 1 ≡ s(as′) = (sa)s′ ≡ 1 · s′ = s′ (mod m). ∎ — congruence গুণ মানে (পর্ব ২২), আর পূর্ণসংখ্যার গুণ associative ও commutative
উপপাদ্যটির দুটি তাৎক্ষণিক ফল মনে রাখার মতো। প্রথমত, p মৌলিক (prime) হলে 1, 2, …, p − 1 প্রত্যেকটি p-এর সঙ্গে সহমৌলিক, তাই mod p-এ প্রতিটি অশূন্য ভাগশেষের inverse আছে: মৌলিক modulus-এ ভাগ সবসময় চলে। দ্বিতীয়ত, gcd(a, m) > 1 হলে কোনো চালাকিতেই inverse পাওয়া যাবে না; mod 26-এ 13-এর inverse খোঁজা সময় নষ্ট। প্রথম ফলটির ওপর ভর করে পর্ব ৩০ “Finite field আর elliptic curve-এর পরিচয়”-এ ℤp-কে একটি field হিসেবে দেখা হবে।
ঘড়ির কাঁটার কথা ভাবুন। একটি অদ্ভুত ঘড়িতে ১২টি দাগ, আর কাঁটা প্রতিবার ৫ দাগ করে লাফায়। কয়েক লাফে কি কাঁটা ঠিক এক দাগ এগোনো অবস্থায় আসবে? হ্যাঁ: ৫টি লাফে ২৫ দাগ, যা এক পাক ঘুরে ঠিক ১ দাগ সামনে (25 ≡ 1 mod 12). কিন্তু কাঁটা যদি ৪ দাগ করে লাফায়, তবে সে শুধু 0, 4, 8-এ বসে; ১ দাগে কখনো পৌঁছায় না। লাফের মাপ আর দাগের সংখ্যার সাধারণ গুণনীয়ক থাকলে ঘড়ির কিছু দাগ চিরকাল অধরা থাকে।
২ · Inverse হাতে বের করা — extended Euclid-এর ছক
উপপাদ্য ১.২-এর প্রমাণটি গঠনমূলক: Bézout-এর s-ই inverse. সেই s বের করে extended Euclidean algorithm. সাধারণ Euclid-এর algorithm gcd(a, b) = gcd(b, a mod b) বারবার লাগিয়ে gcd দেয়; এর সঠিকতা আর সময় (Lamé-এর সীমা) পর্ব ১৩ “Program-এর সঠিকতা — loop invariant আর Hoare logic-এর ধারণা”-এ প্রমাণ করা হয়েছে। Extended সংস্করণ প্রতিটি ভাগশেষের পাশে একটি সহগ t রাখে, যাতে একটি loop invariant সবসময় সত্য থাকে:
প্রতিটি সারিতে: r ≡ t · a (mod m)
শুরুর দুটি সারি r = m, t = 0 (কারণ m ≡ 0 · a) আর r = a, t = 1. তারপর প্রতিটি নতুন সারি আগের দুটি থেকে আসে: q = আগের r ÷ এখনকার r-এর ভাগফল, নতুন r = আগের r − q · এখনকার r, আর নতুন t = আগের t − q · এখনকার t. দুটি সারিতে invariant সত্য হলে এই রৈখিক সমন্বয়েও সত্য থাকে। r যখন 1 হয়, তখন 1 ≡ t · a, অর্থাৎ t-ই inverse. r = 1-এ না পৌঁছে যদি 0-তে পৌঁছায়, তবে শেষ অশূন্য r = gcd > 1, আর inverse নেই। এখন শুরুর প্রশ্নের 17-এর inverse mod 3120 ছকে বের করা যাক।
1 r q t23120 — 03 17 — 14 9 183 −1835 8 1 1846 1 1 −36772753 = −367 + 3120
| এই ধাপে | |
| হিসাব | |
| যাচাই t·17 mod 3120 |
- শুরু। প্রথম সারি r = 3120, t = 0; দ্বিতীয় সারি r = 17, t = 1. দুটিতেই r ≡ t · 17 (mod 3120) সত্য: 3120 ≡ 0, আর 17 = 1 · 17. পুরো algorithm এই invariant রক্ষা করে।
- প্রথম ভাগ। 3120 = 183 · 17 + 9, তাই q = 183. নতুন r = 9, নতুন t = 0 − 183 · 1 = −183. যাচাই: −183 · 17 = −3111, আর −3111 + 3120 = 9.
- দ্বিতীয় ভাগ। 17 = 1 · 9 + 8, তাই q = 1. নতুন r = 8, নতুন t = 1 − 1 · (−183) = 184. যাচাই: 184 · 17 = 3128 = 3120 + 8.
- তৃতীয় ভাগ। 9 = 1 · 8 + 1, তাই q = 1. নতুন r = 1, নতুন t = −183 − 184 = −367. r = 1 মানে gcd(17, 3120) = 1, আর invariant বলছে 1 ≡ −367 · 17 (mod 3120).
- উত্তর। −367-কে 0 থেকে 3119-এর মধ্যে আনতে 3120 যোগ করি: 2753. যাচাই: 17 · 2753 = 46801 = 15 · 3120 + 1. তাই 17−1 ≡ 2753 (mod 3120). ∎
এবার শুরুর invoice-এর প্রশ্ন: 17x ≡ 9 (mod 3120)-এর দুই পাশকে 2753 দিয়ে গুণ করলে x ≡ 9 · 2753 = 24777 ≡ 2937 (mod 3120). যাচাই: 17 · 2937 = 49929 = 16 · 3120 + 9. লক্ষ করুন, গুণের ধাপটি উল্টানোও যায় (17 দিয়ে গুণ করলে আগের সমীকরণ ফেরে), তাই নতুন সমীকরণটি মূলটির সমতুল্য, শুধু একটি পরিণতি নয়।
Python-এ এই সবকিছু এক লাইনে হয়: Python 3.8 থেকে pow(a, -1, m) inverse দেয়, আর inverse না থাকলে ValueError তোলে। Python-এর int-এর আকারের কোনো নির্দিষ্ট সীমা নেই (Python প্রোগ্রামিং কোর্সের পর্ব ০৭), তাই কয়েকশো অঙ্কের modulus-এও এটি কাজ করে। নিচের ব্লক extended Euclid শূন্য থেকে লেখে (recursive রূপে), স্টেপারের ফল মেলায়, তারপর mod 26-এর পুরো inverse-তালিকা ছাপে। mod 26 বেছে নেওয়ার কারণ: ইংরেজি বর্ণমালার ২৬টি অক্ষর, আর পর্ব ২৭ “Classical cipher — shift, affine আর frequency analysis”-এর affine cipher-এ ঠিক এই তালিকাটিই লাগবে। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।
from math import gcd
def ext_gcd(a, b): # returns (g, x, y) with a*x + b*y == g
if b == 0:
return a, 1, 0
g, x, y = ext_gcd(b, a % b)
return g, y, x - (a // b) * y
def inverse(a, m):
g, x, _ = ext_gcd(a % m, m)
if g != 1:
return None # no inverse because gcd(a, m) > 1
return x % m
print("ext_gcd(17, 3120) =", ext_gcd(17, 3120))
print("inverse(17, 3120) =", inverse(17, 3120), " pow:", pow(17, -1, 3120))
print("check: 17 * 2753 % 3120 =", 17 * 2753 % 3120)
m = 26
units = [a for a in range(1, m) if gcd(a, m) == 1]
print(f"mod {m}: {len(units)} of {m - 1} values have an inverse")
pairs = [f"{a}->{inverse(a, m)}" for a in units]
for i in range(0, len(pairs), 4):
print(" ".join(pairs[i:i + 4]))
print("self-inverse:", [a for a in units if inverse(a, m) == a])
print("13 * x mod 26 takes only:", sorted({13 * x % m for x in range(m)}))
try:
pow(13, -1, 26)
except ValueError as e:
print("pow(13, -1, 26) -> ValueError:", e)আসল আউটপুট (ব্রাউজারের Python):
ext_gcd(17, 3120) = (1, -367, 2)
inverse(17, 3120) = 2753 pow: 2753
check: 17 * 2753 % 3120 = 1
mod 26: 12 of 25 values have an inverse
1->1 3->9 5->21 7->15
9->3 11->19 15->7 17->23
19->11 21->5 23->17 25->25
self-inverse: [1, 25]
13 * x mod 26 takes only: [0, 13]
pow(13, -1, 26) -> ValueError: base is not invertible for the given modulus
প্রথম লাইন Bézout-এর সহগ দেখায়: 17 · (−367) + 3120 · 2 = 1, স্টেপারের −367-ই। mod 26-এ ২৫টি অশূন্য ভাগশেষের মধ্যে ঠিক ১২টির inverse আছে: যেগুলো বিজোড় আর 13 নয়, কারণ 26 = 2 · 13. inverse-গুলো জোড়ায় জোড়ায় আসে (3 আর 9, 5 আর 21 …), কারণ s যদি a-এর inverse হয় তবে a-ও s-এর inverse. শুধু 1 আর 25 (অর্থাৎ −1) নিজেরাই নিজেদের inverse. শেষ দুই লাইন উপপাদ্য ১.২-এর “⇒” দিক হাতেনাতে দেখায়: 13x-এর ভাগশেষ শুধু 0 আর 13, কখনো 1 নয়, আর Python-ও তাই inverse দিতে অস্বীকার করে।
৩ · Linear congruence ax ≡ b (mod m) — কখন সমাধান, আর কয়টি
a, b পূর্ণসংখ্যা আর m ≥ 1 হলে ax ≡ b (mod m) আকারের সমীকরণকে linear congruence বলে; অজানা x-এর ঘাত 1, তাই “linear”. gcd(a, m) = 1 হলে কাজ সহজ: দুই পাশকে a−1 দিয়ে গুণ করলে x ≡ a−1b, mod m-এ ঠিক একটি সমাধান। কিন্তু gcd(a, m) > 1 হলে কী? mod 21-এ 9x ≡ 12 নিন। 9-এর inverse নেই (gcd(9, 21) = 3), তবু x = 6 কাজ করে: 9 · 6 = 54 = 2 · 21 + 12. আবার 8x ≡ 5 (mod 12)-এর কোনো সমাধানই নেই, কারণ 8x − 5 সবসময় বিজোড়, আর 12-এর গুণিতক জোড়। এই দুই আচরণের পেছনে একটিই নিয়ম।
m ≥ 1 আর d = gcd(a, m) ধরি (a ≠ 0). তাহলে (ক) ax ≡ b (mod m)-এর সমাধান আছে ⇔ d ∣ b. (খ) d ∣ b হলে mod m-এ ঠিক d-টি সমাধান আছে: x0, x0 + m/d, x0 + 2m/d, …, x0 + (d − 1)m/d, যেখানে x0 হলো (a/d)x ≡ b/d (mod m/d)-এর একমাত্র সমাধান (0 ≤ x0 < m/d).
প্রমাণ:
- (প্রয়োজনীয়তা) x একটি সমাধান হলে ax − b = mq কোনো q-এর জন্য, তাই b = ax − mq. d ∣ a আর d ∣ m, তাই d ∣ b. — congruence-এর সংজ্ঞা, ভাজকের রৈখিক সমন্বয়
- (যথেষ্টতা) এখন ধরি d ∣ b. লিখি a = da′, m = dm′, b = db′. Bézout থেকে as + mt = d, d দিয়ে ভাগ করে a′s + m′t = 1; তাই gcd(a′, m′) = 1 (উপপাদ্য ১.২-এর ধাপ ৩-এর যুক্তি)। — Bézout
- m ∣ (ax − b) ⇔ dm′ ∣ d(a′x − b′) ⇔ m′ ∣ (a′x − b′). অর্থাৎ ax ≡ b (mod m) ⇔ a′x ≡ b′ (mod m′). — দুই পাশ থেকে ধনাত্মক d বাদ দেওয়া যায়
- gcd(a′, m′) = 1, তাই উপপাদ্য ১.২ অনুযায়ী a′-এর inverse u আছে (m′ = 1 হলে সব x-ই সমাধান, x0 = 0). a′x ≡ b′ (mod m′) ⇔ x ≡ ub′ (mod m′), কারণ u দিয়ে গুণ আর a′ দিয়ে গুণ একে অপরকে উল্টায়। x0 = ub′ mod m′. — উপপাদ্য ১.২
- তাই সমাধানগুলো ঠিক সেই x, যেখানে x ≡ x0 (mod m′). 0 থেকে m − 1-এর মধ্যে এরা x0 + km′, k = 0, 1, …, d − 1, কারণ m = dm′. এরা mod m-এ আলাদা, কারণ যেকোনো দুটির পার্থক্য অশূন্য আর পরম মানে m-এর চেয়ে ছোট। মোট d-টি। ∎ — গণনা
19x ≡ 12 (mod 21)2d = gcd(9, 21) = 3, 3 ∣ 1233x ≡ 4 (mod 7)43 · 5 = 15 ≡ 1 (mod 7)5x ≡ 4 · 5 = 20 ≡ 6 (mod 7)6x ∈ {6, 13, 20} (mod 21)
| কাজ | |
| ফল | |
| যাচাই |
- d বের করুন। gcd(9, 21) = 3, আর 3 ∣ 12. উপপাদ্য ৩.১(ক) অনুযায়ী সমাধান আছে, আর (খ) অনুযায়ী mod 21-এ ঠিক ৩টি। d ∤ b হলে এখানেই থামতাম: “সমাধান নেই”।
- সব কিছু d দিয়ে ভাগ। a, b আর modulus তিনটিই 3 দিয়ে ভাগ করে 3x ≡ 4 (mod 7). Modulus-কেও ভাগ করা জরুরি; শুধু a আর b ভাগ করলে ভুল সমীকরণ হয় (§৭-এর ভুল প্রমাণে দেখবেন)। এখন gcd(3, 7) = 1.
- Inverse. 3 · 5 = 15 = 2 · 7 + 1, তাই mod 7-এ 3−1 = 5. বড় সংখ্যায় এই ধাপটিই extended Euclid করে।
- x0. দুই পাশকে 5 দিয়ে গুণ: x ≡ 20 ≡ 6 (mod 7). যাচাই: 3 · 6 = 18 = 2 · 7 + 4.
- mod 21-এ ফেরা। x ≡ 6 (mod 7) মানে x = 6, 13, 20, 27, …; mod 21-এ আলাদা শুধু প্রথম তিনটি। তিনটিই মূল সমীকরণ মানে: 54, 117, 180 প্রত্যেকটির 21 দিয়ে ভাগশেষ 12. ∎
উপপাদ্য ৩.১-এর একটি পার্শ্বফল প্রতিদিনের হিসাবে খুব কাজে লাগে: কাটাকাটির নিয়ম। ca ≡ cb (mod m) হলে a ≡ b (mod m/gcd(c, m)). বিশেষ করে gcd(c, m) = 1 হলে c নির্ভয়ে কাটা যায়, কিন্তু অন্যথায় modulus-ও ছোট হয়ে যায়। উদাহরণ: 2 · 1 ≡ 2 · 4 (mod 6), কারণ 2 আর 8-এর পার্থক্য 6; কিন্তু 1 ≢ 4 (mod 6). সঠিক উপসংহার 1 ≡ 4 (mod 3). প্রমাণ উপপাদ্যের ধাপ ৩ আর ৪-এর মতোই; অনুশীলন ১-এ নিজে লিখে দেখুন।
৪ · Chinese Remainder Theorem — একসঙ্গে কয়েকটি ভাগশেষ
প্রাচীন চীনা গণিত-গ্রন্থ Sunzi Suanjing (“সুনজির গণিত-গ্রন্থ”, সাধারণত খ্রিস্টীয় তৃতীয় থেকে পঞ্চম শতাব্দীর মধ্যে রচিত বলে ধরা হয়; সঠিক সাল অনিশ্চিত) একটি ধাঁধা দেয়, মোটামুটি এমন: “কিছু জিনিস আছে, সংখ্যা জানা নেই। তিনটি করে গুনলে দুটি বাকি থাকে, পাঁচটি করে গুনলে তিনটি, সাতটি করে গুনলে দুটি। জিনিস কয়টি?” আধুনিক ভাষায়:
x ≡ 2 (mod 3), x ≡ 3 (mod 5), x ≡ 2 (mod 7)
গ্রন্থের উত্তর 23. প্রশ্নটির বাজারঘর-সংস্করণ সহজেই বানানো যায়: গুদামে কতগুলো প্যাকেট আছে কেউ জানে না, কিন্তু ৩টির বাক্সে ভরলে ২টি, ৫টির বাক্সে ভরলে ৩টি, ৭টির বাক্সে ভরলে ২টি বেঁচে যায়। কয়েকটি ছোট modulus-এর ভাগশেষ জানলে একটি বড় modulus-এর ভাগশেষ কি পুরোপুরি জানা যায়? উত্তর দেয় এই পর্বের কেন্দ্রীয় উপপাদ্য। এখানে m1, …, mk-কে জোড়ায় জোড়ায় সহমৌলিক বলা হয়, যদি i ≠ j হলে gcd(mi, mj) = 1. যেমন 3, 5, 7 জোড়ায় জোড়ায় সহমৌলিক, কিন্তু 4, 6, 7 নয় (gcd(4, 6) = 2), যদিও তিনটির একসঙ্গে gcd 1.
m1, m2, …, mk জোড়ায় জোড়ায় সহমৌলিক ধনাত্মক পূর্ণসংখ্যা, আর M = m1m2⋯mk. তাহলে যেকোনো পূর্ণসংখ্যা r1, …, rk-এর জন্য
x ≡ r1 (mod m1), x ≡ r2 (mod m2), …, x ≡ rk (mod mk)
এই system-এর একটি সমাধান আছে, আর যেকোনো দুটি সমাধান mod M-এ congruent. অর্থাৎ 0 ≤ x < M পরিসরে ঠিক একটি সমাধান।
এটি একটি existence আর uniqueness উপপাদ্য, পর্ব ০৯ “প্রমাণের কৌশল — case, existence, uniqueness আর counterexample”-এর ধাঁচে, তাই প্রমাণেও দুটি অংশ। অস্তিত্বের প্রমাণটি গঠনমূলক: শুধু “আছে” বলে না, সূত্র দিয়ে বানিয়ে দেখায়। নামটি এই Chinese Remainder Theorem (CRT) সংক্ষেপেও বহুল প্রচলিত।
প্রমাণ (অস্তিত্ব): প্রতিটি i-এর জন্য Mi = M/mi লিখি, অর্থাৎ mi ছাড়া বাকি সব modulus-এর গুণফল।
- gcd(Mi, mi) = 1. কারণ, কোনো মৌলিক p যদি mi আর Mi দুটিকেই ভাগ করে, তবে p গুণফল Mi-এর কোনো একটি উৎপাদক mj (j ≠ i)-কে ভাগ করে, আর তখন gcd(mi, mj) ≥ p > 1, যা অনুমানের বিরোধী। — Euclid-এর lemma (p ∣ ab ⇒ p ∣ a বা p ∣ b), পর্ব ২১
- উপপাদ্য ১.২ অনুযায়ী yi = Mi−1 mod mi আছে: Miyi ≡ 1 (mod mi). — উপপাদ্য ১.২
- x = r1M1y1 + r2M2y2 + ⋯ + rkMkyk নিই। একটি নির্দিষ্ট j ধরুন। i ≠ j হলে mj হলো Mi-এর একটি উৎপাদক, তাই সেই পদ ≡ 0 (mod mj). — Mi-এর সংজ্ঞা
- বাকি থাকে j-তম পদ: x ≡ rjMjyj ≡ rj · 1 = rj (mod mj). প্রতিটি j-এর জন্য এটি সত্য, তাই x একটি সমাধান। — ধাপ ২, congruence গুণ আর যোগ মানে
প্রমাণ (অনন্যতা):
- x আর x′ দুটিই সমাধান হলে প্রতিটি i-তে x ≡ ri ≡ x′, তাই mi ∣ (x − x′). — congruence-এর transitivity
- সহায়ক দাবি: u ∣ n, v ∣ n আর gcd(u, v) = 1 হলে uv ∣ n. কারণ n = uw; v ∣ uw আর gcd(u, v) = 1, তাই Bézout-এর us + vt = 1-কে w দিয়ে গুণ করে w = uws + vwt, যার দুটি পদই v দিয়ে বিভাজ্য, তাই v ∣ w, আর uv ∣ uw = n. — Bézout
- m1 ∣ (x − x′) আর m2 ∣ (x − x′) থেকে m1m2 ∣ (x − x′). তারপর gcd(m1m2, m3) = 1 (অস্তিত্বের ধাপ ১-এর যুক্তি), তাই m1m2m3 ∣ (x − x′). এভাবে k পর্যন্ত (k-এর ওপর induction, পর্ব ১০) M ∣ (x − x′). — সহায়ক দাবি, induction
- উল্টোভাবে, x সমাধান হলে x + tM-ও সমাধান, কারণ প্রতিটি mi ∣ M. তাই সমাধানের সেট ঠিক একটি congruence class mod M. ∎
1x ≡ 2 (3), 3 (5), 2 (7)2M = 3·5·7 = 1053i=1: m=3, M₁=35, y₁=?4i=2: m=5, M₂=21, y₂=?5i=3: m=7, M₃=15, y₃=?6x = Σ rᵢ·Mᵢ·yᵢ7x mod 105
| i = 1 (mod 3) | |
| i = 2 (mod 5) | |
| i = 3 (mod 7) |
- M আর Mi. 3, 5, 7 জোড়ায় জোড়ায় সহমৌলিক, তাই CRT খাটে। M = 105. প্রতিটি modulus বাদ দিয়ে বাকিদের গুণফল: M1 = 5 · 7 = 35, M2 = 3 · 7 = 21, M3 = 3 · 5 = 15.
- y1. mod 3-এ 35 ≡ 2, আর 2 · 2 = 4 ≡ 1, তাই y1 = 2. বড় সংখ্যায় এখানে extended Euclid লাগত; এখানে ছোট বলে চোখেই দেখা যায়।
- y2, y3. mod 5-এ 21 ≡ 1, mod 7-এ 15 ≡ 1, তাই দুটি inverse-ই 1. প্রতিটি Miyi একটি “সুইচ”: নিজের modulus-এ 1, বাকিদের modulus-এ 0.
- যোগফল। x = 2 · 35 · 2 + 3 · 21 · 1 + 2 · 15 · 1 = 140 + 63 + 30 = 233. প্রতিটি পদ নিজের modulus-এ দরকারি ভাগশেষ দেয়, আর অন্য modulus-এ শূন্য, ঠিক প্রমাণের ধাপ ৩ আর ৪-এর মতো।
- mod 105-এ নামানো। 233 − 210 = 23. যাচাই: 23 = 7 · 3 + 2 = 4 · 5 + 3 = 3 · 7 + 2. সব সমাধান 23 + 105t: 23, 128, 233, …; সুনজির উত্তর সবচেয়ে ছোট ধনাত্মকটি। ∎
CRT-কে একটি ফাংশন হিসেবেও দেখা যায়। f(x) = (x mod m1, …, x mod mk) নিয়মে {0, 1, …, M − 1} থেকে সব সম্ভাব্য ভাগশেষ-তালিকার সেটে একটি ফাংশন পাই। অনন্যতা বলে f one-to-one; দুই সেটেরই ঠিক M-টি উপাদান, তাই সসীম সেটের নিয়মে f onto-ও, অর্থাৎ একটি bijection, যার সংজ্ঞা পর্ব ১৬ “ফাংশন — one-to-one, onto, inverse আর composition”-এ দেখেছেন। এটি অস্তিত্বের একটি দ্বিতীয়, অগঠনমূলক প্রমাণ: শুধু গুনেই জানা যায় যে প্রতিটি তালিকার জন্য একটি x আছে, যদিও x-টি কী, তা বলে না। নিচের ছবি M = 15-এ এই bijection দেখায়, আর পাশে দেখায় modulus সহমৌলিক না হলে কী ভাঙে।
CRT একটি ছকে: প্রতিটি সংখ্যা তার দুই ভাগশেষের ঘরে
সারি = x mod m1, কলাম = x mod m2; ঘরে x
৫ · Back-substitution, আর modulus সহমৌলিক না হলে
সূত্র-পদ্ধতি সুন্দর, কিন্তু হাতে কষার সময় প্রায়ই আরেকটি পদ্ধতি সহজ: back-substitution, একবারে একটি congruence. প্রথমটি থেকে x-এর সাধারণ রূপ লিখি, পরেরটিতে বসাই, নতুন অজানার জন্য একটি linear congruence সমাধান করি, আবার সাধারণ রূপ লিখি। সুনজির ধাঁধায়:
- x ≡ 2 (mod 3) ⇒ x = 2 + 3k, যেকোনো পূর্ণসংখ্যা k.
- দ্বিতীয়টিতে বসাই: 2 + 3k ≡ 3 (mod 5) ⇒ 3k ≡ 1 (mod 5). 3 · 2 = 6 ≡ 1, তাই k ≡ 2 (mod 5), k = 2 + 5j, আর x = 2 + 3(2 + 5j) = 8 + 15j.
- তৃতীয়টিতে বসাই: 8 + 15j ≡ 2 (mod 7). 8 ≡ 1 আর 15 ≡ 1, তাই 1 + j ≡ 2, j ≡ 1 (mod 7). তাই x = 8 + 15 = 23, আর সাধারণ সমাধান x = 23 + 105t.
প্রতিটি ধাপ উপপাদ্য ৩.১-এর একটি linear congruence. এই পদ্ধতির বড় সুবিধা হলো এটি modulus সহমৌলিক না হলেও চলে, আর না চললে ঠিক কোথায় আটকায় তা দেখিয়ে দেয়। ধরুন x ≡ 1 (mod 4) আর x ≡ 2 (mod 6). x = 1 + 4k বসালে 4k ≡ 1 (mod 6). gcd(4, 6) = 2 আর 2 ∤ 1, তাই উপপাদ্য ৩.১ বলে সমাধান নেই। কারণটা সহজ: প্রথম শর্তে x বিজোড়, দ্বিতীয় শর্তে x জোড়। §৪-এর ছবির নিচের ছকে (সারি 1, কলাম 2) ঘরটি খালি। সাধারণ নিয়মটি:
m1, m2 ধনাত্মক আর d = gcd(m1, m2). তাহলে x ≡ r1 (mod m1), x ≡ r2 (mod m2)-এর সমাধান আছে ⇔ d ∣ (r1 − r2). সমাধান থাকলে তা mod L-এ অনন্য, যেখানে L = lcm(m1, m2) = m1m2/d.
প্রমাণ:
- (প্রয়োজনীয়তা) সমাধান x হলে x = r1 + m1s = r2 + m2t কোনো s, t-এর জন্য, তাই r1 − r2 = m2t − m1s, যা d দিয়ে বিভাজ্য। — ভাজকের রৈখিক সমন্বয়
- (যথেষ্টতা) x = r1 + m1k দ্বিতীয় শর্ত মানে ⇔ m1k ≡ r2 − r1 (mod m2). এর সহগ m1 আর modulus m2-এর gcd হলো d, আর d ∣ (r2 − r1), তাই উপপাদ্য ৩.১ অনুযায়ী এমন k আছে। — উপপাদ্য ৩.১
- (অনন্যতা) x, x′ দুটিই সমাধান হলে m1 আর m2 দুটিই x − x′-কে ভাগ করে, অর্থাৎ x − x′ একটি সাধারণ গুণিতক, আর প্রতিটি সাধারণ গুণিতক lcm দিয়ে বিভাজ্য। তাই x ≡ x′ (mod L). উল্টোভাবে x + tL-ও সমাধান। ∎ — lcm-এর ধর্ম (পর্ব ২১)
দুইয়ের বেশি congruence থাকলে প্রতিটি জোড়ার জন্য gcd(mi, mj) ∣ (ri − rj) শর্তটি প্রয়োজনীয় (ধাপ ১ প্রতিটি জোড়ায় খাটে), আর জানা ফল হলো এটি যথেষ্টও; back-substitution-এ উপপাদ্য ৫.১ বারবার লাগিয়ে induction দিয়ে প্রমাণ করা যায়, আর তখন সমাধান সব modulus-এর lcm-এর modulo-তে অনন্য। লক্ষ করুন, d = 1 হলে উপপাদ্য ৫.১ ঠিক দুই modulus-এর CRT. নিচের ব্লক উপপাদ্য ৩.১ আর ৫.১-কে সরাসরি কোডে রূপ দেয়: solve_linear সব সমাধানের তালিকা দেয়, crt2 দুটি congruence জোড়ে (না জোড়া গেলে None), আর crt_all back-substitution চালায়। প্রতিটি উত্তর মূল শর্তে বসিয়ে যাচাই করা হয়।
from math import gcd
def solve_linear(a, b, m): # every x in 0..m-1 with a*x ≡ b (mod m)
d = gcd(a, m)
if b % d:
return []
a1, b1, m1 = a // d, b // d, m // d
x0 = b1 * pow(a1, -1, m1) % m1 if m1 > 1 else 0
return [x0 + k * m1 for k in range(d)]
def crt2(r1, m1, r2, m2): # x ≡ r1 (mod m1) and x ≡ r2 (mod m2)
d = gcd(m1, m2)
if (r2 - r1) % d:
return None # inconsistent system
k = solve_linear(m1, r2 - r1, m2)[0]
L = m1 // d * m2 # lcm(m1, m2)
return (r1 + m1 * k) % L, L
def crt_all(system): # back-substitution, one congruence at a time
x, M = 0, 1
for r, m in system:
res = crt2(x, M, r, m)
if res is None:
return None
x, M = res
return x, M
for a, b, m in [(9, 12, 21), (14, 30, 100), (8, 5, 12), (17, 9, 3120)]:
sols = solve_linear(a, b, m)
print(f"{a}x ≡ {b} (mod {m}): {sols} check", all((a * x - b) % m == 0 for x in sols))
for system in [[(2, 3), (3, 5), (2, 7)], [(3, 6), (5, 8)], [(1, 4), (2, 6)], [(5, 8), (1, 12), (9, 18)]]:
res = crt_all(system)
ok = res is None or all(res[0] % m == r for r, m in system)
print(system, "->", res, " check", ok)আসল আউটপুট (ব্রাউজারের Python):
9x ≡ 12 (mod 21): [6, 13, 20] check True
14x ≡ 30 (mod 100): [45, 95] check True
8x ≡ 5 (mod 12): [] check True
17x ≡ 9 (mod 3120): [2937] check True
[(2, 3), (3, 5), (2, 7)] -> (23, 105) check True
[(3, 6), (5, 8)] -> (21, 24) check True
[(1, 4), (2, 6)] -> None check True
[(5, 8), (1, 12), (9, 18)] -> None check True
প্রথম চার লাইন উপপাদ্য ৩.১: gcd যথাক্রমে 3, 2, 4 আর 1, তাই সমাধানের সংখ্যা 3, 2, 0 (কারণ 4 ∤ 5) আর 1. শেষটি §২-এর invoice-এর উত্তর 2937. পরের চার লাইনে system: সুনজির উত্তর 23 (mod 105); x ≡ 3 (mod 6), x ≡ 5 (mod 8)-এ gcd 2 আর 3 − 5 = −2 জোড়, তাই সমাধান আছে, কিন্তু mod 48-এ নয়, mod lcm = 24-এ: x = 21. তৃতীয়টি জোড়-বিজোড়ের সংঘাত। শেষটি সূক্ষ্ম: (8, 12) জোড়ায় gcd 4 ∣ 5 − 1 = 4, (8, 18) জোড়ায় gcd 2 ∣ −4, কিন্তু (12, 18) জোড়ায় gcd 6 ∤ 1 − 9 = −8, তাই সমাধান নেই। একটি জোড়া ব্যর্থ হলেই পুরো system ব্যর্থ।
৬ · প্রয়োগ — ডেলিভারির সময়সূচি, residue number system আর RSA
সময়সূচি। বাজারঘরের তিনটি ভ্যান তিন জেলায় যায়: সিলেটে প্রতি ৩ দিনে, খুলনায় প্রতি ৫ দিনে, রাজশাহীতে প্রতি ৭ দিনে। মাসের হিসাব বাদ দিয়ে দিনগুলো 0, 1, 2, … গুনলে সিলেটের ভ্যান গেছে দিন 1-এ, খুলনার দিন 2-এ, রাজশাহীর দিন 3-এ। তিনটি ভ্যান একই দিনে বের হলে একজন তদারককারীই যথেষ্ট; সেই দিন কবে? শর্ত x ≡ 1 (mod 3), x ≡ 2 (mod 5), x ≡ 3 (mod 7), আর CRT বলে উত্তর mod 105-এ ঠিক একটি: দিন 52, তারপর প্রতি ১০৫ দিনে। যাচাই: 52 = 17 · 3 + 1 = 10 · 5 + 2 = 7 · 7 + 3. এখন ধরুন রাজশাহীর ভ্যান প্রতি ৬ দিনে যায় আর শেষবার গেছে দিন 3-এ। সিলেট (x ≡ 1 mod 3) আর রাজশাহী (x ≡ 3 mod 6) কখনো এক দিনে পড়বে না: দ্বিতীয় শর্তে x তিনের গুণিতক, প্রথম শর্তে নয়; উপপাদ্য ৫.১-এর ভাষায় gcd(3, 6) = 3 ∤ 1 − 3. পরিকল্পনাকারীর জন্য শিক্ষা: পর্যায়গুলো সহমৌলিক হলে সব সমন্বয় একসময় আসে; না হলে কিছু সমন্বয় কখনোই আসে না।
Residue number system. CRT বলে, জোড়ায় জোড়ায় সহমৌলিক modulus m1, …, mk নিলে 0 থেকে M − 1-এর প্রতিটি সংখ্যা তার ভাগশেষ-তালিকা দিয়ে পুরোপুরি চেনা যায়। আর যোগ, বিয়োগ, গুণ ভাগশেষে ভাগশেষে আলাদাভাবে করা যায়, কারণ congruence এই অপারেশনগুলো মানে। এভাবে সংখ্যা রাখার পদ্ধতির নাম residue number system (RNS). সুবিধা: প্রতিটি ভাগশেষ ছোট, আর এক ভাগশেষের হিসাব অন্যটির ওপর নির্ভর করে না, তাই সাধারণ যোগের মতো “হাতে রাখা” (carry) এক ঘর থেকে আরেক ঘরে যায় না; সবগুলো একসঙ্গে সমান্তরালে চলতে পারে। অসুবিধা: দুটি সংখ্যার কোনটি বড়, ভাগ, বা ফল M ছাড়িয়েছে কি না, এগুলো ভাগশেষ দেখে সহজে বলা যায় না; তখন CRT দিয়ে পুরো সংখ্যায় ফিরতে হয়। তাই RNS সাধারণ কম্পিউটারের মূল পাটিগণিত নয়, তবে কিছু বিশেষ ক্ষেত্রে (signal processing-এর hardware, বড় সংখ্যার cryptography) এর ব্যবহার নিয়ে গবেষণা আর প্রয়োগ আছে বলে জানা যায়।
RSA দ্রুত করা। পর্ব ২৮ “RSA-এর গণিত — key, encryption আর কেন কাজ করে”-এ দেখবেন, RSA-র decryption-এ একটি বিশাল ঘাত cd mod n নিতে হয়, যেখানে n = pq দুটি বড় মৌলিকের গুণফল। গোপন key-এর মালিক p আর q জানেন, তাই তিনি হিসাবটি mod p আর mod q-এ আলাদা করে (প্রতিটি অর্ধেক মাপের সংখ্যায়) করে CRT দিয়ে জুড়তে পারেন। এতে decryption কয়েক গুণ দ্রুত হয়; সাধারণত প্রায় চার গুণের কথা বলা হয়, যদিও সঠিক লাভ বাস্তবায়নের ওপর নির্ভর করে। মনে রাখবেন, ছোট সংখ্যার “textbook RSA” শুধু বোঝার জন্য; বাস্তবে padding, বড় key আর পরীক্ষিত লাইব্রেরি লাগে (সাইবার সিকিউরিটি কোর্সের পর্ব ১০)।
নিচের ব্লক তিনটি জিনিস দেখায়। প্রথমত, প্রমাণের সূত্র (crt_coprime) আর brute force, অর্থাৎ 0, 1, 2, … একে একে চেষ্টা, পাশাপাশি। প্রতিটি পরীক্ষায় ভাগশেষ হিসেবে m − 2 নেওয়া হয়েছে, যাতে উত্তর M − 2 হয়, brute force-এর জন্য প্রায় সবচেয়ে খারাপ ক্ষেত্র। দ্বিতীয়ত, ফলটি SymPy লাইব্রেরির crt-এর সঙ্গে মেলানো (প্রথমবার SymPy নামতে কয়েক সেকেন্ড বেশি লাগে)। তৃতীয়ত, modulus 7, 11, 13 (M = 1001) নিয়ে একটি ছোট RNS-এ গুণ আর যোগ।
from math import prod
from sympy.ntheory.modular import crt as sympy_crt
def crt_coprime(rs, ms): # the constructive proof, pairwise coprime moduli
M = prod(ms)
x = 0
for r, m in zip(rs, ms):
Mi = M // m
x += r * Mi * pow(Mi, -1, m)
return x % M, M
def brute(rs, ms): # try 0, 1, 2, ... until every remainder fits
x = 0
while any(x % m != r for r, m in zip(rs, ms)):
x += 1
return x, x + 1 # answer, numbers tried
print("Sunzi:", crt_coprime([2, 3, 2], [3, 5, 7]), " vans:", crt_coprime([1, 2, 3], [3, 5, 7]))
for ms in ([3, 5, 7], [11, 13, 17], [11, 13, 17, 19], [17, 19, 23, 29]):
rs = [m - 2 for m in ms]
x, M = crt_coprime(rs, ms)
bx, tried = brute(rs, ms)
print(f"moduli {ms}: CRT {x} (mod {M}), brute force {bx} after {tried} tries")
print("sympy agrees:", sympy_crt([17, 19, 23, 29], [5, 7, 1, 20]) == crt_coprime([5, 7, 1, 20], [17, 19, 23, 29]))
big = [10**9 + 7, 998244353, 10**9 + 9] # three primes near 10^9
x, M = crt_coprime([1, 2, 3], big)
print("near 1e9: M has", len(str(M)), "digits; x mod each:", [x % m for m in big])
rns = (7, 11, 13) # residue number system, M = 1001
ra, rb = [123 % m for m in rns], [7 % m for m in rns]
mul = [u * v % m for u, v, m in zip(ra, rb, rns)]
add = [(u + v) % m for u, v, m in zip(ra, rb, rns)]
print("123 ->", ra, " 7 ->", rb)
print("product", mul, "->", crt_coprime(mul, rns)[0], " sum", add, "->", crt_coprime(add, rns)[0])আসল আউটপুট (ব্রাউজারের Python):
Sunzi: (23, 105) vans: (52, 105)
moduli [3, 5, 7]: CRT 103 (mod 105), brute force 103 after 104 tries
moduli [11, 13, 17]: CRT 2429 (mod 2431), brute force 2429 after 2430 tries
moduli [11, 13, 17, 19]: CRT 46187 (mod 46189), brute force 46187 after 46188 tries
moduli [17, 19, 23, 29]: CRT 215439 (mod 215441), brute force 215439 after 215440 tries
sympy agrees: True
near 1e9: M has 27 digits; x mod each: [1, 2, 3]
123 -> [4, 2, 6] 7 -> [0, 7, 7]
product [0, 3, 3] -> 861 sum [4, 9, 0] -> 130
প্রথম লাইনে সুনজির 23 আর ভ্যানের দিন 52. পরের চার লাইনে দুই পদ্ধতির উত্তর এক, কিন্তু brute force-এর চেষ্টার সংখ্যা M-এর সমান হারে বাড়ে: চারটি দুই-অঙ্কের modulus-এই দুই লক্ষের বেশি। সূত্র-পদ্ধতিতে কাজ লাগে modulus-প্রতি একটি inverse, অর্থাৎ কয়েকটি Euclid. তাই তিনটি প্রায়-109 মৌলিকে (M-এর ২৭টি অঙ্ক, যেখানে brute force কার্যত অসম্ভব) সূত্রটি মুহূর্তে উত্তর দেয়, আর তিনটি ভাগশেষই ঠিক 1, 2, 3. শেষ দুই লাইন RNS: 123 · 7 = 861 আর 123 + 7 = 130, ভাগশেষে ভাগশেষে হিসাব করে CRT দিয়ে ফেরানো, যা 1001-এর চেয়ে ছোট বলে সঠিক। ফল 1001 ছাড়ালে শুধু mod 1001 মান ফিরত, RNS-এর মূল সীমা।
৭ · পরীক্ষার অঙ্ক আর একটি ভুল প্রমাণ
বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর লিখিত পরীক্ষায় এই বিষয়ের যে ধাঁচের অঙ্ক আসে, তার চারটি পূর্ণ সমাধান। প্রতিটি সংখ্যা উপরের ব্লক বা scratch-এ Python দিয়ে মেলানো। কোনো প্রশ্ন কোনো নির্দিষ্ট পরীক্ষা থেকে নেওয়া নয়।
অঙ্ক ১: 14x ≡ 30 (mod 100)-এর সব সমাধান বের করুন
- d = gcd(14, 100) = 2, আর 2 ∣ 30, তাই ঠিক ২টি সমাধান mod 100.
- 2 দিয়ে ভাগ: 7x ≡ 15 (mod 50). 7 · 43 = 301 = 6 · 50 + 1, তাই 7−1 ≡ 43 (mod 50). (Extended Euclid: 50 = 7 · 7 + 1, তাই 1 = 50 − 7 · 7, অর্থাৎ 7−1 ≡ −7 ≡ 43.)
- x ≡ 15 · 43 = 645 ≡ 45 (mod 50). mod 100-এ সমাধান 45 আর 95. যাচাই: 14 · 45 = 630 ≡ 30, 14 · 95 = 1330 ≡ 30 (mod 100).
অঙ্ক ২: গুদামের প্যাকেট ৫টির বাক্সে ভরলে ৩টি, ৭টির বাক্সে ২টি, ১১টির বাক্সে ৪টি বাঁচে। ৫০০-এর কম কয়টি প্যাকেট হতে পারে?
- x ≡ 3 (mod 5), x ≡ 2 (mod 7), x ≡ 4 (mod 11); 5, 7, 11 মৌলিক, তাই CRT খাটে, M = 385.
- Back-substitution: x = 3 + 5k; 3 + 5k ≡ 2 (mod 7) ⇒ 5k ≡ 6 (mod 7). 5 · 3 = 15 ≡ 1, তাই k ≡ 18 ≡ 4, আর x = 23 + 35j.
- 23 + 35j ≡ 4 (mod 11). 23 ≡ 1 আর 35 ≡ 2, তাই 2j ≡ 3 (mod 11). 2−1 ≡ 6, তাই j ≡ 18 ≡ 7, আর x = 23 + 245 = 268.
- সব সমাধান 268 + 385t. ৫০০-এর কম ধনাত্মক মান শুধু 268 (পরেরটি 653). যাচাই: 268 = 53 · 5 + 3 = 38 · 7 + 2 = 24 · 11 + 4.
অঙ্ক ৩: x ≡ 5 (mod 8), x ≡ 1 (mod 12), x ≡ 9 (mod 18)-এর সমাধান আছে কি?
Modulus সহমৌলিক নয়, তাই প্রতিটি জোড়ার শর্ত দেখতে হবে। (8, 12): gcd 4, আর 5 − 1 = 4, বিভাজ্য। (8, 18): gcd 2, আর 5 − 9 = −4, বিভাজ্য। (12, 18): gcd 6, আর 1 − 9 = −8, যা 6 দিয়ে বিভাজ্য নয়। তাই সমাধান নেই: দ্বিতীয় শর্তে x ≡ 1 (mod 6), তৃতীয় শর্তে x ≡ 9 ≡ 3 (mod 6), দুটি একসঙ্গে অসম্ভব। §৫-এর ব্লকের শেষ লাইন একই কথা বলে।
অঙ্ক ৪: 17-এর inverse mod 3120 ব্যবহার করে 17x ≡ 9 (mod 3120) সমাধান করুন
§২-এর স্টেপার থেকে 17−1 ≡ 2753. তাই x ≡ 9 · 2753 = 24777 = 7 · 3120 + 2937 ≡ 2937 (mod 3120). gcd 1 বলে এটিই একমাত্র সমাধান। যাচাই: 17 · 2937 = 49929 = 16 · 3120 + 9.
প্রমাণের ভুল ধরুন: “6x ≡ 12 (mod 9)-এর একমাত্র সমাধান x = 2”
একজন লিখলেন: “6x ≡ 12 (mod 9). দুই পাশকে 6 দিয়ে ভাগ করে x ≡ 2 (mod 9). তাই 0 থেকে 8-এর মধ্যে একমাত্র সমাধান 2. ∎” পড়ে ভুলটি নিজে খুঁজুন।
ভুল কোথায়: mod 9-এ 6 দিয়ে “ভাগ” মানে 6−1 দিয়ে গুণ, কিন্তু gcd(6, 9) = 3, তাই উপপাদ্য ১.২ অনুযায়ী 6-এর inverse নেই। কাটাকাটির নিয়ম বলে 6x ≡ 6 · 2 থেকে শুধু x ≡ 2 (mod 9/3 = 3) পাওয়া যায়। উপপাদ্য ৩.১-ও একই কথা বলে: d = 3 ∣ 12, তাই ঠিক ৩টি সমাধান, 2, 5, 8. যাচাই: 6 · 5 = 30 ≡ 3 আর 6 · 8 = 48 ≡ 3, আর 12 ≡ 3 (mod 9). প্রমাণটি সমাধান 2 ঠিক পেয়েছে, কিন্তু “একমাত্র” দাবিটি মিথ্যা। শিক্ষা: modulo-র জগতে ভাগের আগে সবসময় gcd দেখুন।
আরও গভীরে: বীজগণিতের ভাষায় CRT বলে, জোড়ায় জোড়ায় সহমৌলিক modulus-এ ℤM আর ℤm1 × ⋯ × ℤmk একই গঠনের (ring isomorphism): §৪-এর bijection যোগ আর গুণ দুটিই মানে। এর একটি তাৎক্ষণিক ফল হলো, mod M-এ invertible সংখ্যার সংখ্যা প্রতিটি mi-এর invertible সংখ্যার গুণফল, যা Euler-এর φ ফাংশনকে multiplicative করে; এর প্রমাণ আসবে পর্ব ২৪ “Fermat-এর ছোট উপপাদ্য আর Euler-এর totient”-এ। একই উপপাদ্য polynomial-এর জন্যও সত্য, আর সেখানে এটি Lagrange interpolation-এর আরেক রূপ।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- mod 26-এ 7-এর inverse কত? 15, কারণ 7 · 15 = 105 = 4 · 26 + 1.
- ax ≡ b (mod m)-এর কয়টি সমাধান? d = gcd(a, m) ∤ b হলে 0; d ∣ b হলে mod m-এ ঠিক d-টি।
- x ≡ 2 (mod 3), 3 (mod 5), 2 (mod 7)? x ≡ 23 (mod 105).
- CRT-এর শর্ত কী? Modulus-গুলো জোড়ায় জোড়ায় সহমৌলিক; সবার একসঙ্গে gcd 1 যথেষ্ট নয়।
- x ≡ 1 (mod 4), x ≡ 2 (mod 6)-এর সমাধান? নেই, কারণ gcd(4, 6) = 2 ∤ 1 − 2.
৮ · AI-এর যুগে — congruence আর CRT-এর উত্তর যাচাই
AI সহকারীকে একটি linear congruence বা CRT-এর system দিলে উত্তর সাধারণত দ্রুত আর আত্মবিশ্বাসী আসে। কিন্তু modular হিসাবে একটি অঙ্কের ভুলই পুরো উত্তর বদলে দেয়, আর বড় সংখ্যায় ভাষা-মডেলের মাথায় গুণ-ভাগ প্রায়ই ভুল হয়। AI-এর কিছু ভুল নিয়মিত:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| gcd(a, m) > 1 হলেও একটি “inverse” দিয়ে দেওয়া | a · s mod m নিজে হিসাব করুন; 1 না এলে উত্তর ভুল। আগে gcd দেখুন |
| Congruence-এর দুই পাশ সাধারণ গুণনীয়ক দিয়ে ভাগ, কিন্তু modulus অপরিবর্তিত | উপপাদ্য ৩.১ অনুযায়ী সমাধানের সংখ্যা d কি না দেখুন; ছোট m-এ সব x brute force করুন |
| d > 1 হলে d-টির বদলে মাত্র একটি সমাধান দেওয়া | “mod m-এ সব সমাধান” স্পষ্ট করে চান, আর তালিকার দৈর্ঘ্য d কি না মেলান |
| সহমৌলিক নয় এমন modulus-এ CRT-এর সূত্র লাগানো, বা উত্তর mod lcm-এর বদলে mod গুণফলে দেওয়া | প্রতিটি জোড়ার gcd আর gcd ∣ (ri − rj) শর্ত নিজে দেখুন |
| বড় সংখ্যার গুণ বা ভাগশেষে অঙ্কের ভুল | উত্তরটি প্রতিটি মূল congruence-এ বসিয়ে Python-এ মেলান; pow(a, -1, m) দিয়ে inverse যাচাই করুন |
| সুনজি, Qin Jiushao বা Gauss নিয়ে বানানো সাল ও উদ্ধৃতি | বিশ্বস্ত পাঠ্যবই বা গণিত-ইতিহাসের উৎসে মিলিয়ে নিন; অনিশ্চিত হলে বাদ দিন |
AI-এর কাছে congruence-এর সমাধান চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে যাচাই করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
সবচেয়ে সস্তা প্রথম পরীক্ষা: AI যে x দিল, সেটি প্রতিটি congruence-এ বসান। এক লাইনের Python-এ এটি করা যায়, আর একটি অমিলই উত্তরটি বাতিল করার জন্য যথেষ্ট। কিন্তু মিললেই কাজ শেষ নয়: “এটিই একমাত্র সমাধান” বা “কোনো সমাধান নেই” ধরনের দাবিও উপপাদ্য ৩.১ বা ৫.১ দিয়ে আলাদা করে যাচাই করুন।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১সুনজির ধাঁধা থেকে Gauss পর্যন্ত: Chinese Remainder Theorem কীভাবে আজকের রূপ পেল?
সবচেয়ে পুরোনো পরিচিত উৎস চীনা গ্রন্থ Sunzi Suanjing, যার রচনাকাল সাধারণত খ্রিস্টীয় তৃতীয় থেকে পঞ্চম শতাব্দীর মধ্যে ধরা হয়; লেখক “সুনজি” সম্পর্কে প্রায় কিছুই জানা নেই। সেখানে 3, 5, 7-এর ধাঁধা আর তার সমাধান-পদ্ধতি আছে, যা আধুনিক চোখে দেখলে ঠিক আমাদের সূত্র: 70, 21 আর 15 সংখ্যাগুলো ব্যবহার করে ভাগশেষগুলোকে গুণ করে যোগ, তারপর 105 বাদ দেওয়া। লক্ষ করুন, 70 = 2 · 35 হলো M1y1, আর 21, 15 হলো M2y2, M3y3: স্টেপারের সেই “সুইচ” সংখ্যাগুলো। তবে গ্রন্থটি একটি নির্দিষ্ট উদাহরণ দেয়, সাধারণ প্রমাণ নয়।
ভারতীয় গণিতেও একই ধরনের সমস্যা গুরুত্ব পেয়েছিল। আর্যভট (খ্রিস্টীয় পঞ্চম-ষষ্ঠ শতাব্দী, তাঁর গ্রন্থ সাধারণত ৪৯৯ সালের বলে উল্লেখিত) “কুট্টক” নামে একটি পদ্ধতি দেন, যা ax + by = c ধাঁচের সমীকরণ সমাধান করে; পরে ব্রহ্মগুপ্ত আর ভাস্কর এটি বিস্তৃত করেন বলে জানা যায়। এর পেছনে মূলত Euclid-এর ধাঁচের পরপর ভাগ, তাই এটি আমাদের extended Euclid-এর আত্মীয়। জ্যোতির্বিজ্ঞানে গ্রহের পর্যায় মেলানোর সমস্যা এই আগ্রহের একটি বড় কারণ ছিল বলে মনে করা হয়।
চীনে Qin Jiushao ১২৪৭ সালের গ্রন্থ Shushu Jiuzhang-এ একটি সাধারণ পদ্ধতি (“dayan” পদ্ধতি নামে পরিচিত) দেন, যা modulus সহমৌলিক না হলেও কাজ করার চেষ্টা করে, আর inverse বের করার একটি ধাপে-ধাপে প্রক্রিয়া রাখে। ইউরোপে Euler আর Lagrange-এর মতো গণিতবিদেরা অষ্টাদশ শতাব্দীতে এমন সমস্যা নিয়ে কাজ করেন, আর Carl Friedrich Gauss ১৮০১ সালের Disquisitiones Arithmeticae-এ congruence-এর ≡ চিহ্ন চালু করে পুরো তত্ত্বকে আজকের পরিষ্কার রূপ দেন; CRT সেখানে স্পষ্ট বক্তব্য আর প্রমাণসহ আসে। “Chinese Remainder Theorem” নামটি অনেক পরের, পশ্চিমা লেখায় সুনজির উৎস স্বীকার করে দেওয়া।
এই ইতিহাসের একটি শিক্ষা আছে: একই গাণিতিক ধারণা বিভিন্ন সভ্যতায়, ভিন্ন প্রয়োজনে (ক্যালেন্ডার, জ্যোতির্বিজ্ঞান, সৈন্য গোনা) প্রায় স্বাধীনভাবে এসেছে; আর একটি নির্দিষ্ট উদাহরণ থেকে সাধারণ উপপাদ্য ও প্রমাণে পৌঁছাতে শতাব্দী লেগেছে।
মূল উপলব্ধি: CRT-এর সূত্র প্রায় দেড় হাজার বছর পুরোনো উদাহরণে লুকিয়ে ছিল, কিন্তু সাধারণ বক্তব্য, শর্ত আর প্রমাণ আসে অনেক পরে; উদাহরণ ধারণা দেয়, প্রমাণ দেয় নিশ্চয়তা।
প্র ০২mod m-এ ভাগ সবসময় চলে না কেন, আর m মৌলিক হলে কী বদলে যায়? এর ব্যবহারিক ফল কোথায় দেখা যায়?
সাধারণ সংখ্যায় ab = 0 হলে a = 0 বা b = 0. mod m-এ এই নিয়ম ভাঙতে পারে: mod 6-এ 2 · 3 = 6 ≡ 0, অথচ 2 আর 3 কোনোটিই শূন্য নয়। এমন অশূন্য a, যার সঙ্গে কোনো অশূন্য b গুণ করলে শূন্য হয়, তাকে zero divisor বলে। একটি zero divisor-এর কখনো inverse থাকতে পারে না: as ≡ 1 হলে b ≡ (as)b = s(ab) ≡ 0, যা b অশূন্য হওয়ার বিরোধী। mod m-এ gcd(a, m) = d > 1 হলে a · (m/d) ≡ 0, তাই a একটি zero divisor. উপপাদ্য ১.২ তাই ℤm-কে দুই ভাগে ভাগ করে: gcd 1 হলে invertible, নইলে zero divisor (বা শূন্য)। তৃতীয় কোনো দল নেই।
m মৌলিক হলে প্রতিটি অশূন্য ভাগশেষ invertible, তাই ℤp-তে যোগ, বিয়োগ, গুণ আর শূন্য ছাড়া সব কিছু দিয়ে ভাগ চলে: বাস্তব সংখ্যার মতোই একটি “field”, শুধু সসীম। এই সসীম field-ই আধুনিক cryptography আর error-correcting code-এর ভিত্তি, যা পর্ব ৩০ “Finite field আর elliptic curve-এর পরিচয়”-এ আসবে। অনেক সমস্যায় তাই ইচ্ছা করে মৌলিক modulus বাছা হয়: ভাগের দরকার পড়লে আর কোনো শর্ত নিয়ে ভাবতে হয় না।
ব্যবহারিক ফল কয়েকটি জায়গায় সরাসরি দেখা যায়। Affine cipher (পর্ব ২৭)-এ একটি অক্ষর x থেকে ax + b mod 26 বানানো হয়; decryption-এর জন্য a−1 mod 26 লাগে, তাই a-কে 26-এর সঙ্গে সহমৌলিক হতে হয়, আর এ কারণেই বৈধ a মাত্র ১২টি (আমাদের প্রথম ব্লকের তালিকা)। Hash table-এর double hashing-এ খালি ঘর খুঁজতে একটি ধাপ-মাপ s নিয়ে বারবার এগোনো হয়; s আর টেবিলের আকার সহমৌলিক না হলে কিছু ঘর কখনো দেখা হয় না, ঠিক ৪ দাগ করে লাফানো ঘড়ির কাঁটার মতো (DSA কোর্সের পর্ব ৩২)। একই কারণে অনেক পাঠ্যবই টেবিলের আকার মৌলিক রাখার পরামর্শ দেয়।
Competitive programming-এ “উত্তর 109 + 7 দিয়ে ভাগশেষ দিন” ধাঁচের প্রশ্নে এই modulus বাছার একটি কারণও এটি: সংখ্যাটি মৌলিক, তাই সংমিশ্রণের সূত্রে ভাগ দরকার হলে inverse সবসময় পাওয়া যায় (DSA কোর্সের পর্ব ৬২)।
মূল উপলব্ধি: mod m-এ প্রতিটি অশূন্য সংখ্যা হয় invertible, নয় zero divisor, আর কোনটি তা ঠিক করে gcd; মৌলিক modulus-এ zero divisor থাকে না বলে ভাগ নিশ্চিন্তে চলে।
প্র ০৩Residue number system-এ carry নেই, তবু সাধারণ কম্পিউটার এটি ব্যবহার করে না কেন? CRT কোথায় সত্যিই গণনা দ্রুত করে?
সাধারণ binary যোগে নিচের bit-এর carry ওপরের bit-এ যায়, তাই n-bit যোগের ফল জানতে carry-কে পুরো সংখ্যা জুড়ে চলতে দিতে হয়; দ্রুত যোগের সার্কিট (কম্পিউটার আর্কিটেকচার কোর্সে আসে) এই সমস্যার চারপাশে নানা কৌশল খাটায়। RNS-এ এই সমস্যা নেই: modulus 7, 11, 13-এ প্রতিটি ভাগশেষের যোগ বা গুণ নিজের ছোট ঘরে, অন্যদের থেকে স্বাধীন। তাই যোগ আর গুণ পুরোপুরি সমান্তরালে চলতে পারে। এই ধারণা নিয়ে ১৯৫০-এর দশকে গবেষণা শুরু হয় বলে উল্লেখিত; H. L. Garner-এর ১৯৫৯ সালের একটি প্রবন্ধ প্রায়ই উদ্ধৃত হয়, আর ভাগশেষ থেকে সংখ্যায় ফেরার একটি পদ্ধতি তাঁর নামে “Garner-এর algorithm” বলে পরিচিত।
কিন্তু কয়েকটি অপারেশন RNS-এ কঠিন। দুটি সংখ্যার কোনটি বড়, তা ভাগশেষ দেখে বলা যায় না: (4, 2, 6) আর (0, 7, 7) দেখে 123 > 7 বোঝার কোনো সোজা উপায় নেই। ফল M ছাড়িয়েছে কি না (overflow), ভাগ, আর ঋণাত্মক সংখ্যার চিহ্ন, সবগুলোতেই প্রায় পুরো সংখ্যায় ফিরতে হয়, যা খরচসাপেক্ষ। সাধারণ প্রোগ্রামে তুলনা আর শাখা (if) অনবরত লাগে, তাই সাধারণ প্রসেসরে binary-ই জিতে যায়। যেখানে প্রায় শুধু যোগ আর গুণ, যেমন কিছু digital signal processing বা বড় সংখ্যার modular গুণ, সেখানে RNS-এর প্রয়োগ নিয়ে গবেষণা আর বিশেষ hardware আছে বলে জানা যায়।
CRT সফটওয়্যারে সবচেয়ে বেশি কাজে লাগে “multi-modular” কৌশলে। ধরুন একটি পূর্ণসংখ্যার matrix-এর determinant দরকার, যা বিশাল হতে পারে। মধ্যবর্তী সংখ্যাগুলো ফুলে ওঠা এড়াতে কয়েকটি মৌলিকের modulo-তে আলাদা হিসাব করে, শেষে CRT দিয়ে আসল উত্তর জোড়া হয়, যদি উত্তরের আকারের একটি সীমা আগে থেকে জানা থাকে। Computer algebra system আর competitive programming-এ (কয়েকটি মৌলিকে number-theoretic transform করে জোড়া) এই কৌশল পরিচিত।
মূল উপলব্ধি: CRT একটি বড় সমস্যাকে কয়েকটি স্বাধীন ছোট সমস্যায় ভাঙে; যেখানে শুধু যোগ-গুণ, সেখানে এটি দারুণ, কিন্তু তুলনা আর ভাগে ভাঙা সংখ্যা জোড়ার খরচ লাগে।
প্র ০৪RSA-তে CRT দিয়ে decryption দ্রুত হয় কীভাবে, আর এই গতির কোনো নিরাপত্তা-মূল্য আছে কি?
RSA-তে (পর্ব ২৮-এ পুরো গণিত) n = pq, যেখানে p আর q প্রায় সমান মাপের দুটি বড় মৌলিক। Decryption মানে m = cd mod n বের করা, যেখানে d-ও প্রায় n-এর মাপের। Key-এর মালিক p আর q জানেন, তাই তিনি mp = cd mod p আর mq = cd mod q আলাদা করে বের করেন (Fermat-এর ছোট উপপাদ্য দিয়ে ঘাতকেও ছোট করা যায়, যা পর্ব ২৪-এ আসবে), তারপর CRT দিয়ে m জোড়েন, কারণ gcd(p, q) = 1. অর্ধেক মাপের সংখ্যায় একটি modular গুণ মোটামুটি চার ভাগের এক ভাগ খরচের, আর ঘাতও অর্ধেক দৈর্ঘ্যের; দুটি অর্ধেক-হিসাব মিলিয়ে সাধারণত প্রায় চার গুণ দ্রুততার কথা বলা হয়, যদিও বাস্তব লাভ বাস্তবায়নের ওপর নির্ভর করে। এ কারণে প্রচলিত RSA লাইব্রেরিগুলো গোপন key-এর সঙ্গে p, q আর CRT-এর জন্য আগে থেকে হিসাব করা কিছু মান রাখে বলে জানা যায়।
কিন্তু গতির একটি মূল্য আছে। ১৯৯০-এর দশকের শেষে (Boneh, DeMillo আর Lipton-এর ১৯৯৭ সালের কাজ প্রায়ই উদ্ধৃত হয়) দেখানো হয় যে CRT-ভিত্তিক RSA signature-এ যদি দুটি অর্ধেক-হিসাবের একটিতে hardware-এর একটি ভুল (fault) ঢোকে, তবে ভুল signature আর সঠিক signature-এর পার্থক্য থেকে gcd নিয়েই n-এর একটি উৎপাদক বেরিয়ে আসতে পারে। ধারণাটি সরল: ভুল ফলটি mod p-এ ঠিক কিন্তু mod q-এ ভুল হলে, পার্থক্যটি p দিয়ে বিভাজ্য কিন্তু q দিয়ে নয়, তাই gcd(পার্থক্য, n) = p. এই কারণে বাস্তব বাস্তবায়ন ফল প্রকাশের আগে যাচাই করে।
এখান থেকে দুটি সাধারণ শিক্ষা। প্রথমত, গণিতে যা “সমতুল্য” (সরাসরি ঘাত বনাম CRT), বাস্তব যন্ত্রে তার নিরাপত্তা-চরিত্র আলাদা হতে পারে। দ্বিতীয়ত, এই পর্বের ছোট সংখ্যার উদাহরণ শুধু গণিত বোঝার জন্য; textbook RSA নিরাপদ নয়, আর বাস্তবে padding, বড় key, side-channel থেকে সুরক্ষা আর পরীক্ষিত লাইব্রেরি লাগে। বাস্তব ব্যবহারের দিক সাইবার সিকিউরিটি কোর্সের পর্ব ১০-এ।
মূল উপলব্ধি: CRT গোপন key-এর মালিককে কাজ ভাগ করে দ্রুত হিসাবের সুযোগ দেয়, কিন্তু ভাঙা অংশের একটিতে ভুল হলে সেই ভাঙনই গোপন উৎপাদক ফাঁস করতে পারে।
প্র ০৫CRT কি শুধু পূর্ণসংখ্যার জন্য? ক্যালেন্ডার, polynomial আর secret sharing-এ একই ধারণা কীভাবে আসে?
ক্যালেন্ডার CRT-এর প্রাচীনতম স্বাভাবিক ক্ষেত্র। ইউরোপীয় পণ্ডিত Joseph Scaliger ১৫৮৩ সালে “Julian period” নামে একটি দীর্ঘ পর্যায় প্রস্তাব করেন বলে উল্লেখিত, যা তিনটি পুরোনো চক্র মিলিয়ে তৈরি: ২৮ বছরের সৌরচক্র, ১৯ বছরের চান্দ্র (Metonic) চক্র, আর ১৫ বছরের একটি কর-চক্র, যার নাম indiction. 28, 19, 15 জোড়ায় জোড়ায় সহমৌলিক, তাই প্রতিটি বছরের তিনটি চক্রে অবস্থানের তালিকা 28 · 19 · 15 = 7980 বছরের মধ্যে অনন্য: CRT-এর ভাষায় ঠিক আমাদের bijection. জ্যোতির্বিজ্ঞানের “Julian day” গণনা এই পর্যায় থেকেই এসেছে বলে সাধারণত বলা হয়। বাজারঘরের ভ্যানের সময়সূচিও একই অঙ্ক, শুধু ছোট মাপে।
Polynomial-এ ধারণাটি প্রায় হুবহু খাটে। একটি polynomial f(x)-কে (x − a) দিয়ে ভাগ করলে ভাগশেষ f(a), একটি সংখ্যা। তাই “f(1) = 3, f(2) = 5, f(4) = 1” মানে f-এর তিনটি “modulus”-এ ভাগশেষ জানা, আর (x − 1), (x − 2), (x − 4) জোড়ায় জোড়ায় “সহমৌলিক”। CRT-এর polynomial রূপ বলে, ঘাত 3-এর কম এমন ঠিক একটি f আছে: এটিই Lagrange interpolation, আর তার সূত্রের প্রতিটি পদ আমাদের Miyi “সুইচ”-এর মতো, নিজের বিন্দুতে 1, অন্যগুলোতে 0.
এই polynomial রূপের একটি সুন্দর প্রয়োগ secret sharing: একটি গোপন সংখ্যা কয়েকজনের মধ্যে এমনভাবে ভাগ করা, যাতে যেকোনো নির্দিষ্টসংখ্যক জন একসঙ্গে হলে গোপনটি ফেরানো যায়, কিন্তু তার কম হলে কিছুই জানা যায় না। Adi Shamir ১৯৭৯ সালে polynomial interpolation দিয়ে এমন একটি পদ্ধতি দেন। পূর্ণসংখ্যার CRT দিয়েও এমন পদ্ধতি আছে; ১৯৮০-এর দশকের শুরুতে Mignotte এবং Asmuth ও Bloom-এর নামে এমন পদ্ধতি পরিচিত, যেখানে প্রতিটি ভাগীদার গোপন সংখ্যার একটি modulus-এ ভাগশেষ পান। বাস্তব ব্যবহারে নিরাপত্তার বিস্তারিত শর্ত আছে, যা গবেষণা-সাহিত্যে দেখতে হয়।
আরও বিমূর্তভাবে, CRT যেকোনো commutative ring-এ “পরস্পর সহমৌলিক” ideal-এর জন্য সত্য; পূর্ণসংখ্যা আর polynomial তার দুটি বিশেষ ক্ষেত্র।
মূল উপলব্ধি: CRT-এর মূল কথা “কয়েকটি স্বাধীন ছোট তথ্য জুড়ে একটি বড় তথ্য অনন্যভাবে ফেরানো”; ক্যালেন্ডারের চক্র, polynomial-এর মান আর গোপন সংখ্যার ভাগ, তিনটিই সেই এক কাঠামো।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: (ক) gcd(c, m) = 1 আর ca ≡ cb (mod m) হলে প্রমাণ করুন a ≡ b (mod m). (খ) দেখান যে gcd(c, m) > 1 হলে এই সিদ্ধান্ত মিথ্যা হতে পারে, একটি counterexample দিয়ে। (গ) p মৌলিক হলে প্রমাণ করুন, mod p-এ x2 ≡ 1-এর সমাধান শুধু x ≡ 1 আর x ≡ −1.
- (ক) gcd(c, m) = 1, তাই উপপাদ্য ১.২ অনুযায়ী c-এর inverse s আছে। ca ≡ cb-এর দুই পাশকে s দিয়ে গুণ করে (sc)a ≡ (sc)b, অর্থাৎ 1 · a ≡ 1 · b. ∎ — congruence গুণ মানে
- (খ) m = 6, c = 2: 2 · 1 = 2 আর 2 · 4 = 8 ≡ 2 (mod 6), কিন্তু 1 ≢ 4 (mod 6). সঠিক সিদ্ধান্ত শুধু 1 ≡ 4 (mod 6/2 = 3).
- (গ) x2 ≡ 1 ⇔ p ∣ x2 − 1 = (x − 1)(x + 1). p মৌলিক, তাই Euclid-এর lemma অনুযায়ী p ∣ (x − 1) বা p ∣ (x + 1), অর্থাৎ x ≡ 1 বা x ≡ −1. উল্টো দিক সরাসরি বসিয়ে। ∎ — Euclid-এর lemma (পর্ব ২১)
(গ)-এর অর্থ: mod p-এ শুধু 1 আর p − 1 নিজেরাই নিজেদের inverse. মৌলিক না হলে এটি ভাঙতে পারে: mod 8-এ 1, 3, 5, 7 চারটিরই বর্গ 1, কারণ 8 মৌলিক নয়। এই তথ্য পর্ব ২৫-এর Miller–Rabin test-এ কাজে লাগবে।
-
হিসাব: (ক) 35x ≡ 10 (mod 50)-এর সব সমাধান বের করুন। (খ) x ≡ 1 (mod 3), x ≡ 4 (mod 5), x ≡ 6 (mod 7) সমাধান করুন। (গ) x ≡ 2 (mod 9), x ≡ 5 (mod 12)-এর সমাধান আছে কি? থাকলে কোন modulus-এ অনন্য?
(ক) d = gcd(35, 50) = 5, আর 5 ∣ 10, তাই ঠিক ৫টি সমাধান। 5 দিয়ে ভাগ: 7x ≡ 2 (mod 10). 7 · 3 = 21 ≡ 1, তাই 7−1 ≡ 3, আর x ≡ 6 (mod 10). mod 50-এ: 6, 16, 26, 36, 46.
(খ) Back-substitution: x = 1 + 3k; 1 + 3k ≡ 4 (mod 5) ⇒ 3k ≡ 3 ⇒ k ≡ 1, x = 4 + 15j; 4 + 15j ≡ 6 (mod 7), 15 ≡ 1, তাই j ≡ 2, x = 34. সব সমাধান 34 + 105t. যাচাই: 34 = 11 · 3 + 1 = 6 · 5 + 4 = 4 · 7 + 6.
(গ) gcd(9, 12) = 3, আর 2 − 5 = −3, বিভাজ্য; তাই সমাধান আছে, অনন্য mod lcm(9, 12) = 36 (mod 108-এ নয়)। x = 2 + 9k; 9k ≡ 3 (mod 12) ⇒ 3k ≡ 1 (mod 4) ⇒ k ≡ 3, x = 29. যাচাই: 29 = 3 · 9 + 2 = 2 · 12 + 5. সব সংখ্যা scratch-এ Python দিয়ে যাচাই করা।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
from math import gcd m = 12 print([a for a in range(1, m) if gcd(a, m) == 1]) print([pow(a, -1, m) for a in (5, 7, 11)]) print([x for x in range(m) if 4 * x % m == 8])[1, 5, 7, 11] [5, 7, 11] [2, 5, 8, 11]প্রথম লাইন: 12 = 22 · 3, তাই 12-এর সঙ্গে সহমৌলিক শুধু সেই সংখ্যা, যা জোড় নয় আর 3-এর গুণিতক নয়। দ্বিতীয় লাইন চমকপ্রদ: 25, 49, 121 প্রত্যেকটি ≡ 1 (mod 12), তাই 5, 7, 11 নিজেরাই নিজেদের inverse; অনুশীলন ১(গ)-এর উল্টো চিত্র, কারণ 12 মৌলিক নয়। তৃতীয় লাইন উপপাদ্য ৩.১: d = gcd(4, 12) = 4 ∣ 8, তাই ৪টি সমাধান, x ≡ 2 (mod 3), ব্যবধান 12/4 = 3.
-
প্রমাণের ভুল ধরুন: একজন লিখলেন: “x ≡ 1 (mod 4) আর x ≡ 3 (mod 6). CRT অনুযায়ী M = 4 · 6 = 24, M1 = 6, M2 = 4. y1 = 6−1 mod 4, y2 = 4−1 mod 6, তারপর x = 1 · 6 · y1 + 3 · 4 · y2. তাই mod 24-এ ঠিক একটি সমাধান। ∎” ভুল কোথায়, আর সঠিক উত্তর কী?
- ভুল: CRT-এর শর্ত, modulus জোড়ায় জোড়ায় সহমৌলিক, এখানে ভাঙা: gcd(4, 6) = 2. ফলে gcd(6, 4) = 2 বলে 6−1 mod 4 আর 4−1 mod 6 কোনোটিই নেই (উপপাদ্য ১.২)। শর্ত না মিলিয়ে সূত্র লাগানো হয়েছে।
- সঠিক উত্তর: উপপাদ্য ৫.১: 2 ∣ 1 − 3, তাই সমাধান আছে, অনন্য mod lcm = 12. x = 1 + 4k; 4k ≡ 2 (mod 6) ⇒ 2k ≡ 1 (mod 3) ⇒ k ≡ 2, x = 9. mod 24-এ সমাধান দুটি: 9 আর 21, তাই “mod 24-এ ঠিক একটি” দাবিও মিথ্যা। যাচাই: 9 = 2 · 4 + 1 = 6 + 3; 21 = 5 · 4 + 1 = 3 · 6 + 3.
- শিক্ষা: কোনো উপপাদ্যের সূত্র লাগানোর আগে তার প্রতিটি শর্ত মিলিয়ে নিন; শর্ত না মিললে উপপাদ্য চুপ থাকে, ভুল উত্তর দেয় না।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমax ≡ b (mod m)-এর সব সমাধান বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- d = gcd(a, m) বের করা
- d ∣ b কি না দেখা; না হলে “সমাধান নেই” বলে থামা
- a, b আর m তিনটিকেই d দিয়ে ভাগ করা
- Extended Euclid দিয়ে a/d-এর inverse mod m/d বের করা
- x0 = (b/d) · inverse mod (m/d) বের করা
- x0 + k(m/d), k = 0, …, d − 1 লিখে মূল সমীকরণে বসিয়ে যাচাই করা
mod 26-এ 7-এর modular inverse কত?
- 15
- 19
- 7
- inverse নেই
6x ≡ 4 (mod 10)-এর mod 10-এ কয়টি সমাধান আছে?
- একটিও নেই
- ঠিক একটি
- ঠিক দুটি
- ঠিক ছয়টি
x ≡ 2 (mod 3) আর x ≡ 3 (mod 4) মানে এমন সবচেয়ে ছোট ধনাত্মক x কত?
- 7
- 11
- 14
- 5
নিচের কোন system-এর কোনো সমাধান নেই?
- x ≡ 3 (mod 6), x ≡ 5 (mod 8)
- x ≡ 2 (mod 3), x ≡ 3 (mod 5)
- x ≡ 0 (mod 4), x ≡ 2 (mod 6)
- x ≡ 1 (mod 4), x ≡ 2 (mod 6)
Chinese Remainder Theorem-এ modulus m1, …, mk-এর ওপর কোন শর্তটি থাকে, যাতে যেকোনো ভাগশেষের জন্য সমাধান থাকে আর তা mod m1⋯mk-এ অনন্য হয়?
- প্রতিটি mi মৌলিক হতে হবে
- সব mi-এর একসঙ্গে gcd 1 হতে হবে
- প্রতিটি জোড়া mi, mj সহমৌলিক হতে হবে
- কোনো শর্ত লাগে না
Python-এ pow(4, -1, 10) চালালে কী হয়?
- ValueError ওঠে, কারণ 4-এর inverse mod 10 নেই
- 0.25 ফেরত আসে
- 9 ফেরত আসে
- 4 ফেরত আসে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Inverse: a−1 mod m আছে ⇔ gcd(a, m) = 1; থাকলে অনন্য। Bézout-এর সহগই inverse, বের করে extended Euclid; Python-এ
pow(a, -1, m). - Linear congruence: d = gcd(a, m). ax ≡ b (mod m) সমাধানযোগ্য ⇔ d ∣ b; তখন a, b, m তিনটিই d দিয়ে ভাগ করে একটি সমাধান x0, আর mod m-এ ঠিক d-টি: x0 + k(m/d).
- কাটাকাটি: ca ≡ cb (mod m) ⇒ a ≡ b (mod m/gcd(c, m)). gcd 1 না হলে modulus-ও ছোট হয়।
- CRT: জোড়ায় জোড়ায় সহমৌলিক modulus-এ সমাধান আছে আর mod M-এ অনন্য; x = ∑ riMiyi, যেখানে Mi = M/mi, yi = Mi−1 mod mi.
- সাধারণ modulus: দুটি congruence-এ শর্ত gcd(m1, m2) ∣ r1 − r2, সমাধান mod lcm-এ অনন্য; বেশি congruence-এ প্রতিটি জোড়ায় এই শর্ত। হাতে কষতে back-substitution.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২৪ · Fermat-এর ছোট উপপাদ্য আর Euler-এর totientপরবর্তী পর্ববিশাল ঘাত ছোট করার দুই উপপাদ্য।
- পর্ব ১৩ · Program-এর সঠিকতা — loop invariant আর Hoare logic-এর ধারণাপুনরালোচনাEuclid-এর algorithm-এর সঠিকতা, থামা আর Lamé-এর সীমা।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপুরো কোর্সের মানচিত্র আর ১৪টি মডিউল।
- DSA · পর্ব ৬২ · Number theory — GCD, sieve আর modular arithmeticcontest কৌশলmodular inverse আর CRT-এর দ্রুত কোড, competitive programming-এর চোখে।
- সাইবার সিকিউরিটি · পর্ব ১০ · Public key cryptography — RSA, elliptic curve আর key exchangeবাস্তব cryptographyRSA বাস্তবে কীভাবে নিরাপদে ব্যবহার হয়।
- Python · পর্ব ০৭ · সংখ্যা ও হিসাব — int, float-এর ফাঁদ, Decimalহাতে-কলমেPython-এর সীমাহীন int আর pow-এর ব্যবহার।