এই পর্বে যা শিখবেন
- gcd আর lcm-এর সঠিক সংজ্ঞা, মৌলিক গুণনীয়ক দিয়ে তাদের সূত্র আর gcd · lcm = ab-এর প্রমাণ
- Euclid-এর algorithm কেন ঠিক, কেন দ্রুত, আর হাতে কীভাবে কষবেন
- Well-ordering দিয়ে Bézout-এর অভেদের প্রমাণ, আর extended Euclid-এর টেবিল পদ্ধতি
- Bézout থেকে Euclid-এর লেমা, আর linear Diophantine equation-এর সব সমাধান খোঁজা
- বাজারঘরের বাক্সে প্যাকিং, Frobenius সংখ্যার প্রমাণ, binary gcd আর পরীক্ষার ধাঁচের অঙ্ক
১ · সমান প্যাকেট আর একসঙ্গে ডেলিভারি — gcd আর lcm
বাজারঘরের গুদামে ২৫২টি সাবান আর ১৯৮টি শ্যাম্পু আছে। ঈদের উপহার হিসেবে এগুলো এমন কয়েকটি প্যাকেটে ভাগ করতে হবে, যাতে প্রতিটি প্যাকেট হুবহু এক রকম হয় (একই সংখ্যক সাবান, একই সংখ্যক শ্যাম্পু) আর কিছুই বাকি না থাকে। সবচেয়ে বেশি কয়টি প্যাকেট বানানো যায়? প্যাকেটের সংখ্যা ২৫২ আর ১৯৮ দুটিকেই নিঃশেষে ভাগ করতে হবে, আর আমরা চাই সবচেয়ে বড় এমন সংখ্যা। উত্তর ১৮: প্রতিটি প্যাকেটে ১৪টি সাবান আর ১১টি শ্যাম্পু। এটিই gcd (greatest common divisor, স্কুলের “গসাগু”)।
উল্টো ধরনের প্রশ্নও আছে। বাজারঘরের একটি ভ্যান প্রতি ৬ দিনে একবার সিলেটে যায়, আরেকটি প্রতি ৯ দিনে একবার। আজ দুটিই গেছে; আবার কবে একসঙ্গে যাবে? দিনের সংখ্যাটি ৬ আর ৯ দুটিরই গুণিতক হতে হবে, আর আমরা চাই সবচেয়ে ছোট ধনাত্মকটি: ১৮ দিন পরে। এটি lcm (least common multiple, স্কুলের “লসাগু”)। এই পর্বে দুটি ধারণাকে সঠিক সংজ্ঞায় বাঁধব, আর দেখব gcd বের করার একটি ২,৩০০ বছরের পুরোনো পদ্ধতি কেন আজও কম্পিউটারের প্রতিটি নিরাপদ সংযোগে কাজ করে।
a, b পূর্ণসংখ্যা হলে a ∣ b (“a, b-কে ভাগ করে”) মানে কোনো পূর্ণসংখ্যা k আছে যাতে b = ak. এই বিভাজ্যতা-র সব নিয়ম পর্ব ২০ “বিভাজ্যতা আর মৌলিক সংখ্যা — division algorithm আর unique factorization”-এর বিষয়। d যদি a আর b দুটিকেই ভাগ করে, তবে d হলো a আর b-এর একটি common divisor, অর্থাৎ সাধারণ ভাজক।
a, b দুটিই শূন্য না হলে তাদের gcd(a, b) হলো সবচেয়ে বড় পূর্ণসংখ্যা d, যা a আর b দুটিকেই ভাগ করে। gcd(a, b) = 1 হলে a আর b coprime (পরস্পর মৌলিক)। a, b দুটিই অশূন্য হলে lcm(a, b) হলো সবচেয়ে ছোট ধনাত্মক পূর্ণসংখ্যা, যাকে a আর b দুটিই ভাগ করে।
কয়েকটি ছোট বিষয় খেয়াল করুন। (১) 1 সবসময় একটি সাধারণ ভাজক, আর কোনো অশূন্য সংখ্যার ভাজক তার পরম মানের চেয়ে বড় হতে পারে না; তাই সাধারণ ভাজকের সেট অশূন্য আর ওপরে সীমিত, ফলে gcd সবসময় আছে আর তা ≥ 1. (২) ভাজক চিহ্নের তোয়াক্কা করে না, তাই gcd(a, b) = gcd(|a|, |b|); যেমন gcd(−12, 18) = 6. (৩) gcd(a, 0) = |a|, কারণ প্রতিটি সংখ্যা 0-কে ভাগ করে (0 = d · 0). (৪) gcd(0, 0) সংজ্ঞায়িত নয়, কারণ প্রতিটি পূর্ণসংখ্যাই 0-কে ভাগ করে, সবচেয়ে বড়টি নেই; অনেক প্রোগ্রামিং ভাষা সুবিধার জন্য একে 0 ধরে, Python-এর math.gcd(0, 0)-ও 0 দেয়।
মৌলিক গুণনীয়ক দিয়ে gcd আর lcm
স্কুলে gcd বের করা হয় দুটি সংখ্যাকে মৌলিক গুণনীয়কে ভেঙে। 252 = 22 · 32 · 7 আর 198 = 2 · 32 · 11. দুটিতেই আছে 2 আর 3; প্রতিটির ছোট ঘাত নিলে gcd = 21 · 32 = 18. সব মৌলিক সংখ্যার বড় ঘাত নিলে lcm = 22 · 32 · 7 · 11 = 2772. এই পদ্ধতিকে উপপাদ্য হিসেবে লেখা যাক। প্রতিটি n ≥ 2 মৌলিক সংখ্যার গুণফল, তা আমরা পর্ব ১১-এ strong induction দিয়ে প্রমাণ করেছি; এই ভাঙন যে একভাবেই হয়, তা পর্ব ২০-এর fundamental theorem of arithmetic.
ধনাত্মক a, b-কে লিখুন a = ∏ pαp আর b = ∏ pβp, যেখানে গুণফল চলে a বা b-এর যেকোনো একটিতে থাকা সব মৌলিক p-এর ওপর, আর যে মৌলিক কোনো সংখ্যায় নেই তার ঘাত 0. তাহলে
gcd(a, b) = ∏ pmin(αp, βp), lcm(a, b) = ∏ pmax(αp, βp), আর gcd(a, b) · lcm(a, b) = ab.
এখানে ∏ হলো গুণফলের চিহ্ন (∑-এর মতো, কিন্তু যোগের বদলে গুণ), আর min, max মানে দুটির ছোট আর বড়টি।
প্রমাণ:
- একটি ধনাত্মক d, a-কে ভাগ করে ⇔ d = ∏ pδp, যেখানে প্রতিটি p-তে 0 ≤ δp ≤ αp. কারণ a = dk হলে d আর k-এর ভাঙন একসঙ্গে a-এর ভাঙন দেয়, আর ভাঙন অনন্য বলে ঘাতগুলো যোগ হয়ে αp হয়; উল্টো দিকে k = ∏ pαp − δp নিলেই চলে। — অনন্য factorization
- তাই d সাধারণ ভাজক ⇔ প্রতিটি p-তে δp ≤ min(αp, βp). প্রতিটি ঘাত সর্বোচ্চ নিলে সবচেয়ে বড় সাধারণ ভাজক পাওয়া যায়, তাই gcd-এর সূত্রটি। — ধাপ ১, দুবার
- একইভাবে m-কে a আর b দুটিই ভাগ করে ⇔ প্রতিটি p-তে m-এর ঘাত ≥ max(αp, βp). প্রতিটি ঘাত সর্বনিম্ন নিলে সবচেয়ে ছোট এমন m, তাই lcm-এর সূত্রটি। — ধাপ ১
- যেকোনো দুটি সংখ্যায় min(α, β) + max(α, β) = α + β (একটি ছোটটি, অন্যটি বড়টি). প্রতিটি p-তে ঘাত যোগ করলে gcd · lcm-এর ঘাত αp + βp, যা ঠিক ab-এর ঘাত। ∎ — ঘাতের যোগ
উদাহরণে: 18 · 2772 = 49896 = 252 · 198. আর ভ্যানের প্রশ্নে lcm(6, 9) = 6 · 9 / gcd(6, 9) = 54 / 3 = 18, আগের উত্তরই। কিন্তু একটি সতর্কতা। এই প্রমাণ দাঁড়িয়ে আছে factorization অনন্য হওয়ার ওপর, আর প্রথাগত পথে সেই অনন্যতার প্রমাণে লাগে Euclid-এর লেমা, যা আমরা §৫-এ প্রমাণ করব; পর্ব ২০ অবশ্য অন্য পথে, minimal counterexample দিয়ে, লেমা ছাড়াই অনন্যতা প্রমাণ করেছে। যুক্তিটি বৃত্তাকার নয়, কারণ §৫-এর প্রমাণ factorization একেবারেই ব্যবহার করে না; শুধু Bézout, আর Bézout শুধু well-ordering. ছবি ৫.১-এ এই নির্ভরতার শিকলটি দেখবেন। আর একটি ব্যবহারিক সমস্যা: বড় সংখ্যাকে মৌলিক গুণনীয়কে ভাঙা খুবই কঠিন, যা পর্ব ২৫ “Primality test আর factoring”-এর বিষয়। তাই gcd বের করতে আমাদের এমন একটি পদ্ধতি লাগবে, যা factorization ছাড়াই কাজ করে।
২ · Euclid-এর algorithm — কেন gcd(a, b) = gcd(b, a mod b)
মূল পর্যবেক্ষণটি সহজ। ২৫২টি সাবান আর ১৯৮টি শ্যাম্পুকে যদি d-টি সমান প্যাকেটে ভাগ করা যায়, তবে “সাবান বিয়োগ শ্যাম্পু”, অর্থাৎ ৫৪-কেও d ভাগ করে। উল্টো দিকে, d যদি ১৯৮ আর ৫৪-কে ভাগ করে, তবে তাদের যোগফল ২৫২-কেও ভাগ করে। তাই (252, 198) আর (198, 54)-এর সাধারণ ভাজক হুবহু এক, ফলে gcd-ও এক। একবার বিয়োগের বদলে যতবার সম্ভব বিয়োগ করলে, অর্থাৎ ভাগশেষ নিলে, একই যুক্তি খাটে। x mod y মানে x-কে y দিয়ে ভাগ করার ভাগশেষ (modulo), যা division algorithm দেয়: y > 0 হলে অনন্য q, r আছে যাতে x = qy + r আর 0 ≤ r < y (অস্তিত্বের প্রমাণ পর্ব ১১-এ)।
a একটি পূর্ণসংখ্যা আর b > 0 হলে gcd(a, b) = gcd(b, a mod b).
প্রমাণ: (এর লুপ-রূপটি পর্ব ১৩-এর লেমা ৬.২-এ invariant হিসেবে এসেছে; এখানে সংখ্যাতত্ত্বের ভাষায়।)
- Division algorithm দিয়ে a = qb + r, যেখানে r = a mod b. — division algorithm
- d ∣ a আর d ∣ b হলে r = a − qb, যা d-এর দুটি গুণিতকের পূর্ণসংখ্যা-সমন্বয়, তাই d ∣ r. — a = dk, b = dl ⇒ r = d(k − ql)
- উল্টো দিকে d ∣ b আর d ∣ r হলে a = qb + r, তাই d ∣ a. — একই যুক্তি
- ফলে (a, b) আর (b, r)-এর সাধারণ ভাজকের সেট একই। b > 0, তাই দুটি জোড়াই (0, 0) নয়, আর একই সেটের সবচেয়ে বড় উপাদান একই। ∎
লেমাটি বারবার লাগালেই Euclid-এর algorithm: (a, b) থেকে (b, a mod b), তারপর আবার, যতক্ষণ না দ্বিতীয় সংখ্যাটি 0 হয়। তখন gcd(x, 0) = x. প্রতিবার দ্বিতীয় সংখ্যা কঠোরভাবে কমে কিন্তু ঋণাত্মক হয় না, তাই well-ordering অনুযায়ী লুপটি থামে; এই termination-এর পূর্ণ প্রমাণ পর্ব ১৩-এ। পর্ব ১২-এ একই নিয়মকে আমরা gcd-এর recursive সংজ্ঞা হিসেবে দেখেছি। নিচের stepper (252, 198)-এ প্রতিটি ধাপ দেখায়।
1a, b = 252, 1982while b != 0:3 q, r = a // b, a % b4 a, b = b, r5print(a) # gcd
| ভাগ | |
| q, r | |
| নতুন (a, b) |
- শুরু। a = 252, b = 198. b ≠ 0, তাই লুপ চলবে। লক্ষ্য: জোড়াটি ছোট করতে করতে এমন জায়গায় আসা, যেখানে উত্তর চোখে দেখা যায়।
- প্রথম ভাগ। 252 = 1 · 198 + 54. লেমা ২.১ বলে gcd(252, 198) = gcd(198, 54). সাবান-শ্যাম্পুর ভাষায়: ২৫২ থেকে একবার ১৯৮ বাদ দিলে ৫৪ থাকে।
- দ্বিতীয় ভাগ। 198 = 3 · 54 + 36, তাই জোড়া (54, 36). ভাগফল 3: এবার তিনবার একসঙ্গে বিয়োগ হলো, এখানেই ভাগশেষ নেওয়া বারবার বিয়োগের চেয়ে দ্রুত।
- তৃতীয় ভাগ। 54 = 1 · 36 + 18, জোড়া (36, 18). সংখ্যাগুলো দ্রুত ছোট হচ্ছে: 198, 54, 36, 18.
- শেষ। 36 = 2 · 18 + 0, জোড়া (18, 0), আর gcd(18, 0) = 18. শেষ অশূন্য ভাগশেষ 18-ই উত্তর। ভাগফলগুলো 1, 3, 1, 2 মনে রাখুন: ছবি ২.১-এ এরাই বর্গের সংখ্যা।
ছবিতে Euclid: 252 × 198 আয়তক্ষেত্র থেকে বর্গ কেটে নেওয়া
প্রতিবার ছোট বাহুর মাপে যতগুলো সম্ভব বর্গ কাটুন; যে বর্গে শেষে নিখুঁত মিলে যায়, তার বাহুই gcd
কত ধাপ লাগে?
বারবার বিয়োগ করলে gcd(1000001, 1) পেতে দশ লক্ষ ধাপ লাগত। ভাগশেষ নিলে লাগে এক ধাপ। সাধারণভাবে দ্রুততার কারণ নিচের সরল উপপাদ্য।
Euclid-এর algorithm-এ ভাগশেষগুলো r0 = a, r1 = b, r2, … হলে (a ≥ b > 0) প্রতিটি i-তে ri+2 < ri/2. ফলে ধাপের সংখ্যা বড়জোর প্রায় 2 log2 b + 1.
প্রমাণ:
- ri+2 = ri mod ri+1 < ri+1. — ভাগশেষ ভাজকের চেয়ে ছোট
- ক্ষেত্র ১: ri+1 ≤ ri/2. তাহলে ধাপ ১ থেকে ri+2 < ri+1 ≤ ri/2. — proof by cases
- ক্ষেত্র ২: ri+1 > ri/2. তাহলে ri < 2ri+1, তাই ভাগফল ঠিক 1, আর ri+2 = ri − ri+1 < ri − ri/2 = ri/2. — বীজগণিত
- প্রতি দুই ধাপে সংখ্যা অর্ধেকের নিচে নামে, আর ধনাত্মক পূর্ণসংখ্যা log2 b বারের বেশি অর্ধেক হতে পারে না আগে 1-এর নিচে নামার। ∎
আরও সূক্ষ্ম সীমা Gabriel Lamé-এর ১৮৪৪ সালের উপপাদ্য: ধাপের সংখ্যা ছোট সংখ্যাটির দশমিক অঙ্ক-সংখ্যার পাঁচগুণের বেশি নয়, আর সবচেয়ে খারাপ ইনপুট পরপর দুটি Fibonacci সংখ্যা। এর আলোচনা আর পরীক্ষা পর্ব ১৩-এ আছে। মোট কথা: ৩০০ অঙ্কের সংখ্যাতেও Euclid কয়েকশো ধাপে শেষ হয়, অথচ সেই সংখ্যাকে factorize করা আজকের জানা পদ্ধতিতে কার্যত অসম্ভব।
নিচের ব্লক দুটি পদ্ধতিকে পাশাপাশি রাখে: মৌলিক গুণনীয়ক দিয়ে gcd আর lcm (trial division, কতগুলো ভাজক পরীক্ষা হলো তা গুনে), আর Euclid (কয় ধাপ লাগল)। দ্বিতীয় জোড়াটি 10007 · 9973 আর 10007 · 10009, তিনটিই মৌলিক। শেষে ৫,০০০টি এলোমেলো জোড়ায় gcd · lcm = ab পরীক্ষা হয়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।
from math import gcd, lcm
import random
def factor(n): # trial division; also counts the divisors tried
f, p, tries = {}, 2, 0
while p * p <= n:
tries += 1
while n % p == 0:
f[p] = f.get(p, 0) + 1
n //= p
p += 1
if n > 1:
f[n] = f.get(n, 0) + 1
return f, tries
def gcd_lcm_by_factors(a, b): # min of exponents for gcd, max for lcm
(fa, ta), (fb, tb) = factor(a), factor(b)
g = l = 1
for p in fa.keys() | fb.keys():
g *= p ** min(fa.get(p, 0), fb.get(p, 0))
l *= p ** max(fa.get(p, 0), fb.get(p, 0))
return g, l, ta + tb
def euclid(a, b):
steps = 0
while b:
a, b, steps = b, a % b, steps + 1
return a, steps
print("252 =", factor(252)[0], " 198 =", factor(198)[0])
for a, b in [(252, 198), (10007 * 9973, 10007 * 10009)]:
g, l, tries = gcd_lcm_by_factors(a, b)
g2, steps = euclid(a, b)
print(f"a={a} b={b}: gcd {g} (Euclid {g2}), lcm {l}")
print(f" trial divisions: {tries}, Euclid steps: {steps}")
random.seed(7)
pairs = [(random.randint(1, 10**6), random.randint(1, 10**6)) for _ in range(5000)]
print("gcd*lcm == a*b on 5000 pairs:", all(gcd(a, b) * lcm(a, b) == a * b for a, b in pairs))আসল আউটপুট (ব্রাউজারের Python):
252 = {2: 2, 3: 2, 7: 1} 198 = {2: 1, 3: 2, 11: 1}
a=252 b=198: gcd 18 (Euclid 18), lcm 2772
trial divisions: 4, Euclid steps: 4
a=99799811 b=100160063: gcd 10007 (Euclid 10007), lcm 998896308299
trial divisions: 19978, Euclid steps: 4
gcd*lcm == a*b on 5000 pairs: True
প্রথম লাইন উপপাদ্য ১.২-এর ঘাতগুলো দেখায় (dictionary-তে মৌলিক: ঘাত)। ছোট জোড়ায় দুই পদ্ধতির খরচ সমান, ৪টি করে। কিন্তু প্রায় দশ কোটির দুটি সংখ্যায়, যাদের মৌলিক গুণনীয়কগুলো বড়, trial division-কে প্রায় ২০,০০০টি ভাজক পরীক্ষা করতে হয়েছে, আর Euclid তখনও ৪ ধাপে শেষ। সংখ্যা যত বড় হয়, এই ব্যবধান তত বিস্ফোরিত হয়: trial division-এর খরচ বাড়ে √n-এর মতো, Euclid-এর বাড়ে অঙ্ক-সংখ্যার মতো। শেষ লাইনে ৫,০০০টি জোড়াতেই gcd · lcm = ab টিকেছে, যা উপপাদ্য ১.২-এর সঙ্গে মেলে; তবে মনে রাখবেন, পরীক্ষা আস্থা দেয়, প্রমাণ দেয় উপপাদ্য। Python-এর math.gcd আর math.lcm ভেতরে Euclid-ধাঁচের পদ্ধতিই ব্যবহার করে, factorization নয়।
৩ · Bézout-এর অভেদ — gcd একটি linear combination
বাজারঘরের পুরোনো দাঁড়িপাল্লায় মাত্র দুই রকম বাটখারা: ২৪০ গ্রাম আর ৪৬ গ্রাম, যতগুলো খুশি। বাটখারা দুই পাল্লাতেই রাখা যায়। সবচেয়ে ছোট কত ওজন মাপা যায়? এক পাল্লায় ৪৭টি ৪৬ গ্রাম (২,১৬২ গ্রাম), অন্য পাল্লায় ৯টি ২৪০ গ্রাম (২,১৬০ গ্রাম) রাখলে পার্থক্য ঠিক ২ গ্রাম। আর ২-এর কম ধনাত্মক ওজন অসম্ভব, কারণ ২৪০ আর ৪৬ দুটিই জোড়, তাই যেকোনো পার্থক্যও জোড়। লক্ষ করুন, ২ = gcd(240, 46). কাকতালীয় নয়।
a আর b-এর একটি (পূর্ণসংখ্যা) linear combination হলো ax + by আকারের যেকোনো সংখ্যা, যেখানে x, y ∈ ℤ (ঋণাত্মক হতে পারে)। দাঁড়িপাল্লার ভাষায়: x আর y হলো কোন বাটখারা কয়টি, আর চিহ্ন বলে কোন পাল্লায়।
a, b পূর্ণসংখ্যা, দুটিই শূন্য নয়। তাহলে কিছু x, y ∈ ℤ আছে যাতে ax + by = gcd(a, b). আরও শক্তিশালী রূপে: gcd(a, b) হলো a আর b-এর linear combination-গুলোর মধ্যে ক্ষুদ্রতম ধনাত্মক সংখ্যা।
এই ফলের ইংরেজি নাম Bézout's identity, বাংলায় Bézout-এর অভেদ। প্রমাণটি পর্ব ১১-এর well-ordering principle-এর একটি সুন্দর প্রয়োগ: ℕ-এর প্রতিটি অশূন্য উপসেটে একটি ক্ষুদ্রতম উপাদান আছে।
প্রমাণ: S = {ax + by : x, y ∈ ℤ, ax + by > 0} ধরি, অর্থাৎ ধনাত্মক linear combination-গুলোর সেট।
- S অশূন্য: x = a, y = b নিলে a2 + b2 > 0, কারণ a, b দুটিই শূন্য নয়। — সরাসরি উদাহরণ
- S ⊆ ℕ আর অশূন্য, তাই এর একটি ক্ষুদ্রতম উপাদান d আছে; লিখি d = ax0 + by0. — well-ordering
- দাবি d ∣ a. Division algorithm দিয়ে a = qd + r, 0 ≤ r < d. তাহলে r = a − q(ax0 + by0) = a(1 − qx0) + b(−qy0), অর্থাৎ r নিজেও একটি linear combination. — division algorithm, বীজগণিত
- r > 0 হলে r ∈ S আর r < d, যা d ক্ষুদ্রতম হওয়ার বিরোধী। তাই r = 0, অর্থাৎ d ∣ a. একই যুক্তিতে d ∣ b. — proof by contradiction
- তাই d একটি সাধারণ ভাজক। এখন c যেকোনো সাধারণ ভাজক হলে c ∣ ax0 + by0 = d, আর d > 0, তাই c ≤ |c| ≤ d. — ভাজক তার গুণিতকের চেয়ে বড় নয়
- d সাধারণ ভাজক আর সব সাধারণ ভাজকের চেয়ে ছোট নয়, তাই d = gcd(a, b). ∎
প্রমাণের ধাপ ৫ থেকে একটি শক্তিশালী ফল বিনা খরচে আসে, যা পরের সব অংশে লাগবে।
(ক) a, b-এর প্রতিটি সাধারণ ভাজক gcd(a, b)-কে ভাগ করে (শুধু তার চেয়ে ছোট নয়)। (খ) gcd(a, b) = 1 ⇔ কিছু x, y ∈ ℤ আছে যাতে ax + by = 1. (গ) a আর b-এর সব linear combination-এর সেট হুবহু gcd(a, b)-এর সব গুণিতকের সেট।
প্রমাণ: (ক) c ∣ a আর c ∣ b হলে c ∣ ax0 + by0 = gcd(a, b). (খ) (⇒) Bézout সরাসরি। (⇐) ax + by = 1 হলে প্রতিটি সাধারণ ভাজক 1-কে ভাগ করে, তাই সেটি ±1, আর gcd = 1. (গ) d = gcd ভাগ করে a আর b-কে, তাই প্রতিটি ax + by-কে; উল্টো দিকে d-এর গুণিতক kd = a(kx0) + b(ky0). ∎
(খ)-এর (⇐) দিকটি খেয়াল করুন: ax + by = 1 থেকে gcd = 1 আসে, কিন্তু ax + by = 6 থেকে gcd = 6 আসে না, শুধু gcd ∣ 6 আসে। যেমন 4 · (−3) + 9 · 2 = 6, অথচ gcd(4, 9) = 1. এই ভুলটি পরীক্ষায় আর AI-এর উত্তরে প্রায়ই দেখা যায়।
তবে Bézout-এর প্রমাণটি nonconstructive: x0, y0 আছে বলে, কিন্তু খুঁজে দেয় না (পর্ব ০৯-এ existence proof-এর দুই ধরন দেখেছেন)। S অসীম সেট, তার ক্ষুদ্রতম উপাদান একে একে খুঁজে পাওয়া যায় না। পরের অংশে Euclid-এর algorithm-কেই একটু বাড়িয়ে আমরা একটি constructive প্রমাণ পাব।
৪ · Extended Euclid — টেবিলে x আর y খোঁজা
ধারণাটি হলো: Euclid-এর প্রতিটি ভাগশেষকে শুরুর দুটি সংখ্যার linear combination হিসেবে লিখে রাখা। শুরুর দুটি সারি তো সহজ: a = a · 1 + b · 0 আর b = a · 0 + b · 1. এরপর প্রতিটি নতুন ভাগশেষ আগের দুটি থেকে আসে, ri+1 = ri−1 − qiri, আর একই নিয়মে তার সহগগুলোও আসে। শেষ অশূন্য ভাগশেষ gcd, আর তার সারির সহগই Bézout-এর x, y. এই পদ্ধতির নাম extended Euclidean algorithm.
r0 = a, r1 = b, (s0, t0) = (1, 0), (s1, t1) = (0, 1) দিয়ে শুরু করে, ri ≠ 0 যতক্ষণ, qi = ⌊ri−1/ri⌋ আর
ri+1 = ri−1 − qiri, si+1 = si−1 − qisi, ti+1 = ti−1 − qiti
হিসাব করলে প্রতিটি সারিতে ri = asi + bti. তাই শেষ অশূন্য rn = gcd(a, b) = asn + btn.
এখানে ⌊x⌋ হলো x-এর floor, x-এর চেয়ে বড় নয় এমন সবচেয়ে বড় পূর্ণসংখ্যা, যা পর্ব ১৬-এ এসেছে।
প্রমাণ (i-এর ওপর strong induction, পর্ব ১১; প্রতিটি সারি আগের দুটির ওপর নির্ভর করে):
- ভিত্তি i = 0, 1: a · 1 + b · 0 = a = r0, আর a · 0 + b · 1 = b = r1. — শুরুর মান
- Hypothesis: সারি i − 1 আর i-তে দাবিটি সত্য। — অনুমান
- asi+1 + bti+1 = a(si−1 − qisi) + b(ti−1 − qiti) = (asi−1 + bti−1) − qi(asi + bti) = ri−1 − qiri = ri+1. — বণ্টন নিয়ম, hypothesis
- r-গুলো ঠিক Euclid-এর ভাগশেষ, তাই §২ অনুযায়ী শেষ অশূন্যটি gcd. ∎ — লেমা ২.১
এক কথায়, প্রতিটি সারি একটি loop invariant মেনে চলে, যেমন পর্ব ১৩-এ দেখেছেন। নিচের stepper (240, 46)-এ পুরো টেবিলটি এক সারি করে ভরে, আর প্রতি ধাপে invariant মিলিয়ে দেখায়।
1 r q s t2 240 – 1 03 46 – 0 14 10 5 1 −55 6 4 −4 216 4 1 5 −267 2 1 −9 478 0 2 23 −120
| q | |
| নতুন সারি | |
| যাচাই 240s + 46t |
- শুরুর দুই সারি। 240 = 240 · 1 + 46 · 0 আর 46 = 240 · 0 + 46 · 1. এই দুটি সারি invariant r = 240s + 46t স্পষ্টভাবেই মানে। বাকি প্রতিটি সারি আগের দুটি থেকে আসবে।
- q = 5. 240-কে 46 দিয়ে ভাগ: ভাগফল 5, ভাগশেষ 10. একই “আগের আগের − 5 × আগের” নিয়ম s আর t-তে: s = 1, t = −5. যাচাই: 240 − 230 = 10.
- q = 4. 46 = 4 · 10 + 6. s = 0 − 4 · 1 = −4, t = 1 − 4 · (−5) = 21. যাচাই: −960 + 966 = 6. চিহ্ন এক সারি পরপর বদলাচ্ছে, এটি স্বাভাবিক।
- q = 1. 10 = 1 · 6 + 4. s = 1 − (−4) = 5, t = −5 − 21 = −26. যাচাই: 1200 − 1196 = 4. বিয়োগে ঋণাত্মক সংখ্যার চিহ্নে সাবধান: হাতে কষার সবচেয়ে সাধারণ ভুল এখানেই।
- q = 1. 6 = 1 · 4 + 2. s = −4 − 5 = −9, t = 21 − (−26) = 47. যাচাই: −2160 + 2162 = 2. এটিই দাঁড়িপাল্লার উত্তর: ৯টি ২৪০ গ্রাম এক পাল্লায়, ৪৭টি ৪৬ গ্রাম অন্য পাল্লায়।
- q = 2, থামুন। 4 = 2 · 2 + 0. ভাগশেষ 0, তাই শেষ অশূন্য সারি (2, −9, 47) উত্তর: gcd(240, 46) = 2 = 240 · (−9) + 46 · 47. শূন্য সারিটিও তথ্য দেয়: 240 · 23 = 46 · 120, অর্থাৎ 23 = 46/2 আর 120 = 240/2.
হাতে পরীক্ষায় অনেকে অন্য পদ্ধতি ব্যবহার করেন: back-substitution, অর্থাৎ পেছন থেকে প্রতিস্থাপন। Euclid-এর ভাগগুলো লিখে শেষেরটি থেকে উল্টো দিকে যান: 2 = 6 − 1 · 4; 4 = 10 − 1 · 6 বসালে 2 = 2 · 6 − 10; 6 = 46 − 4 · 10 বসালে 2 = 2 · 46 − 9 · 10; 10 = 240 − 5 · 46 বসালে 2 = 47 · 46 − 9 · 240. একই উত্তর। টেবিল পদ্ধতির সুবিধা হলো এটি সামনের দিকে চলে, তাই আগের ভাগগুলো মনে রাখতে হয় না, আর প্রতিটি সারি সঙ্গে সঙ্গে যাচাই করা যায়।
নিচের ব্লক টেবিলটি হুবহু ছাপে, (252, 198)-এর জন্যও, তারপর ১০,০০০টি এলোমেলো বড় জোড়ায় (1012 পর্যন্ত) প্রতিটি সারির invariant আর শেষ gcd যাচাই করে। Python-এর int যত বড় দরকার তত বড় হতে পারে (arbitrary precision), তাই বড় সংখ্যায় overflow-এর ভয় নেই।
from math import gcd
import random
def ext_table(a, b): # rows (r, q, s, t) with r = a*s + b*t on every row
rows = [(a, "", 1, 0), (b, "", 0, 1)]
while rows[-1][0] != 0:
(r0, _, s0, t0), (r1, _, s1, t1) = rows[-2], rows[-1]
q = r0 // r1
rows.append((r0 - q * r1, q, s0 - q * s1, t0 - q * t1))
return rows
for a, b in [(240, 46), (252, 198)]:
rows = ext_table(a, b)
print(f"a = {a}, b = {b}")
print(" r q s t")
for r, q, s, t in rows:
print(f"{r:6} {q!s:>4} {s:5} {t:5}")
d, _, s, t = rows[-2]
print(f"gcd = {d} = {a}*({s}) + {b}*({t})\n")
random.seed(21)
ok = 0
for _ in range(10000):
a, b = random.randint(1, 10**12), random.randint(1, 10**12)
rows = ext_table(a, b)
d, _, s, t = rows[-2]
every_row = all(r == a * s_ + b * t_ for r, _, s_, t_ in rows)
ok += (d == gcd(a, b) and every_row)
print("checked on 10000 random pairs (up to 10^12):", ok, "of 10000")
print("pow(17, -1, 3120) =", pow(17, -1, 3120))আসল আউটপুট (ব্রাউজারের Python):
a = 240, b = 46
r q s t
240 1 0
46 0 1
10 5 1 -5
6 4 -4 21
4 1 5 -26
2 1 -9 47
0 2 23 -120
gcd = 2 = 240*(-9) + 46*(47)
a = 252, b = 198
r q s t
252 1 0
198 0 1
54 1 1 -1
36 3 -3 4
18 1 4 -5
0 2 -11 14
gcd = 18 = 252*(4) + 198*(-5)
checked on 10000 random pairs (up to 10^12): 10000 of 10000
pow(17, -1, 3120) = 2753
প্রথম টেবিল stepper-এর সঙ্গে সারি ধরে মেলে। দ্বিতীয়টি বলে 18 = 252 · 4 + 198 · (−5) = 1008 − 990; সাবান-শ্যাম্পুর ১৮-টি প্যাকেটের সংখ্যাটিও তাহলে দুটি পরিমাণের একটি linear combination. দুই টেবিলেই শূন্য সারির সহগ (23, −120) আর (−11, 14) পরম মানে b/d আর a/d: 46/2 = 23, 240/2 = 120; 198/18 = 11, 252/18 = 14. এটি কাকতালীয় নয়, আর §৬-এ এই সংখ্যাগুলোই সাধারণ সমাধানে আসবে। ১০,০০০টি বড় জোড়ায় প্রতিটি সারির invariant টিকেছে। শেষ লাইন একটি পূর্বাভাস: 17 · 2753 = 46801 = 15 · 3120 + 1, অর্থাৎ 17x + 3120y = 1-এর x = 2753. এমন x-কে 3120-এর সাপেক্ষে 17-এর modular inverse বলে, আর Python-এর pow(a, -1, m) ভেতরে extended Euclid দিয়েই এটি বের করে। এর পূর্ণ তত্ত্ব পর্ব ২৩ “Linear congruence আর Chinese Remainder Theorem”-এ, আর RSA-তে এর ব্যবহার পর্ব ২৮ “RSA-এর গণিত”-এ।
৫ · Euclid-এর লেমা — মৌলিক সংখ্যার বিশেষ ক্ষমতা
12 ∣ 8 · 9 (72 = 12 · 6), কিন্তু 12 ∤ 8 আর 12 ∤ 9. একটি গুণফলকে ভাগ করা মানে কোনো একটি গুণককে ভাগ করা নয়, কারণ 12-এর গুণনীয়কগুলো (4 আর 3) দুটি গুণকে ছড়িয়ে আছে। মৌলিক সংখ্যার ক্ষেত্রে এমন ছড়িয়ে পড়া অসম্ভব, আর সেটিই মৌলিক সংখ্যার সবচেয়ে গুরুত্বপূর্ণ ধর্ম। প্রথমে একটি সাধারণ রূপ।
a ∣ bc আর gcd(a, b) = 1 হলে a ∣ c.
প্রমাণ:
- gcd(a, b) = 1, তাই কিছু x, y আছে যাতে ax + by = 1. — Bézout (উপপাদ্য ৩.২)
- দুই পাশকে c দিয়ে গুণ: c = acx + bcy. — বীজগণিত
- a ∣ acx স্পষ্ট, আর a ∣ bc বলে a ∣ bcy. দুটি গুণিতকের যোগফলও গুণিতক, তাই a ∣ c. ∎ — বিভাজ্যতার নিয়ম
p একটি মৌলিক সংখ্যা আর p ∣ ab হলে p ∣ a অথবা p ∣ b. আরও সাধারণভাবে, p ∣ a1a2⋯an হলে কোনো i-তে p ∣ ai.
প্রমাণ:
- p ∣ a হলে কাজ শেষ। ধরি p ∤ a. — proof by cases
- p-এর ধনাত্মক ভাজক শুধু 1 আর p, তাই gcd(p, a) হয় 1, নয় p. p ∤ a বলে gcd(p, a) ≠ p, তাই gcd(p, a) = 1. — মৌলিকের সংজ্ঞা
- উপপাদ্য ৫.১-এ (a, b, c)-এর জায়গায় (p, a, b) বসালে p ∣ b. — উপপাদ্য ৫.১
- n টি গুণকের জন্য n-এর ওপর induction: p ∣ (a1⋯an−1) · an থেকে দুই-গুণকের রূপ দিয়ে p ∣ a1⋯an−1 বা p ∣ an; প্রথম ক্ষেত্রে hypothesis. ∎ — mathematical induction (পর্ব ১০)
এই লেমার নাম Euclid-এর লেমা, কারণ প্রায় এই রূপে এটি Euclid-এর Elements-এর সপ্তম খণ্ডে আছে। মৌলিক শর্তটি বাদ দেওয়া যায় না: 6 ∣ 4 · 9 = 36, অথচ 6 ∤ 4 আর 6 ∤ 9. ৬ একটি যৌগিক সংখ্যা, আর তার দুটি গুণনীয়ক 2 আর 3 দুটি আলাদা গুণকে বসে আছে। কিছু বইয়ে এই ধর্মকেই মৌলিক সংখ্যার সংজ্ঞা হিসেবে নেওয়া হয় (বীজগণিতের “prime element”), আর “1 আর নিজে ছাড়া ভাজক নেই” ধর্মটিকে বলা হয় irreducible; পূর্ণসংখ্যায় দুটি এক, কিন্তু অন্য সংখ্যা-ব্যবস্থায় আলাদা হতে পারে (ভাবনার প্রশ্ন ৫)।
পরের অংশে আরেকটি ছোট ফল লাগবে, তাই এখনই প্রমাণ করে রাখি।
d = gcd(a, b) হলে gcd(a/d, b/d) = 1. যেমন gcd(6, 9) = 3, আর gcd(2, 3) = 1.
প্রমাণ: Bézout দিয়ে ax + by = d. দুই পাশকে d দিয়ে ভাগ করলে (a/d)x + (b/d)y = 1, যেখানে a/d আর b/d পূর্ণসংখ্যা। অনুসিদ্ধান্ত ৩.৩(খ) অনুযায়ী gcd(a/d, b/d) = 1. ∎
কোন ফল কোনটির ওপর দাঁড়িয়ে
তীর মানে “এটি ব্যবহার করে প্রমাণিত”; কোনো বৃত্ত নেই
৬ · Linear Diophantine equation — ax + by = c-এর সব সমাধান
বাজারঘরে ডিম আসে দুই রকম বাক্সে: ৬টির আর ৯টির। একজন পাইকারি ক্রেতা ঠিক ৩৩টি ডিম চান, বাক্স না খুলে। কয়টি ৬-এর আর কয়টি ৯-এর বাক্স দেবেন? আর ৩২টি চাইলে? প্রশ্নটি হলো 6x + 9y = 33 সমীকরণের এমন সমাধান, যেখানে x আর y পূর্ণসংখ্যা। যে সমীকরণের শুধু পূর্ণসংখ্যা সমাধান খোঁজা হয়, তাকে Diophantine equation বলে, আলেকজান্দ্রিয়ার গণিতবিদ Diophantus-এর নামে (সাধারণত খ্রিস্টীয় তৃতীয় শতাব্দীর বলে ধরা হয়)। ax + by = c আকারেরটি linear Diophantine equation.
a, b অশূন্য পূর্ণসংখ্যা, d = gcd(a, b), আর c পূর্ণসংখ্যা। (ক) ax + by = c-এর পূর্ণসংখ্যা সমাধান আছে ⇔ d ∣ c. (খ) (x0, y0) একটি সমাধান হলে সব সমাধান ঠিক এগুলো:
x = x0 + (b/d)t, y = y0 − (a/d)t, t ∈ ℤ
প্রমাণ:
- (ক, ⇒) d ∣ a আর d ∣ b, তাই প্রতিটি x, y-তে d ∣ ax + by. সমাধান থাকলে ax + by = c, তাই d ∣ c. — বিভাজ্যতার নিয়ম
- (ক, ⇐) c = dk ধরি। Bézout দিয়ে ax' + by' = d; k দিয়ে গুণ করলে a(kx') + b(ky') = c. — Bézout, constructive (§৪)
- (খ) প্রথমে সূত্রের প্রতিটি জোড়া সমাধান: a(x0 + bt/d) + b(y0 − at/d) = ax0 + by0 + abt/d − abt/d = c. — সরাসরি বসানো
- উল্টো দিকে (x, y) যেকোনো সমাধান হলে দুটি সমীকরণ বিয়োগ করে a(x − x0) = b(y0 − y), আর d দিয়ে ভাগ করে (a/d)(x − x0) = (b/d)(y0 − y). — বীজগণিত
- তাই (b/d) ∣ (a/d)(x − x0), আর লেমা ৫.৩ অনুযায়ী gcd(b/d, a/d) = 1. উপপাদ্য ৫.১ বলে (b/d) ∣ (x − x0); লিখি x − x0 = (b/d)t. — লেমা ৫.৩, উপপাদ্য ৫.১
- ধাপ ৪-এ বসালে (a/d)(b/d)t = (b/d)(y0 − y). b ≠ 0, তাই b/d দিয়ে ভাগ করা যায়: y = y0 − (a/d)t. ∎ — শূন্য নয় এমন সংখ্যা দিয়ে ভাগ
ধাপ ৬-এ “b ≠ 0, তাই ভাগ করা যায়” লেখাটি অলংকার নয়: শূন্য দিয়ে নিঃশব্দে ভাগ করা ভুল প্রমাণের একটি পুরোনো উৎস। আর ধাপ ৫ দেখায় কেন পদক্ষেপ b/d, শুধু b নয়: x = x0 + bt লিখলে অর্ধেক বা আরও বেশি সমাধান হারিয়ে যেত। ডিমের প্রশ্নে চলুন।
16x + 9y = 3329 = 1·6 + 3, 6 = 2·333 = 9 − 6 = 6·(−1) + 9·14×11: 6·(−11) + 9·11 = 335x = −11 + 3t, y = 11 − 2t6t=4: (1, 3); t=5: (4, 1)
| এই ধাপে | |
| পাওয়া গেল | |
| যাচাই |
- সমাধান আছে কি? Euclid: 9 = 1 · 6 + 3, 6 = 2 · 3, তাই d = 3. 3 ∣ 33, তাই উপপাদ্য ৬.১(ক) অনুযায়ী পূর্ণসংখ্যা সমাধান আছে। ৩২টি ডিমের ক্ষেত্রে 3 ∤ 32: কোনো উপায়েই সম্ভব নয়, কারণ যেকোনো সংখ্যক ৬ আর ৯-এর যোগফল ৩-এর গুণিতক।
- Bézout-এর ধাপ। শেষ অশূন্য ভাগ থেকে পেছনে: 3 = 9 − 1 · 6 = 6 · (−1) + 9 · 1. যাচাই: −6 + 9 = 3.
- c/d দিয়ে গুণ। 33/3 = 11, তাই 6 · (−11) + 9 · 11 = 33. একটি সমাধান (x0, y0) = (−11, 11). গণিতে বৈধ, কিন্তু −11টি বাক্স দেওয়া যায় না।
- সব সমাধান। b/d = 9/3 = 3, a/d = 6/3 = 2, তাই x = −11 + 3t, y = 11 − 2t. প্রতিটি t-তে 6x + 9y = 33 থাকে, কারণ x-এ +3 বাড়লে 6 · 3 = 18 বাড়ে, আর y-এ −2 হলে 9 · 2 = 18 কমে।
- অঋণাত্মক সমাধান। x ≥ 0 ⇔ t ≥ 11/3, অর্থাৎ t ≥ 4; y ≥ 0 ⇔ t ≤ 11/2, অর্থাৎ t ≤ 5. t = 4-এ (1, 3): একটি ৬-এর আর তিনটি ৯-এর বাক্স; t = 5-এ (4, 1): চারটি ৬-এর আর একটি ৯-এর। আর কোনো উপায় নেই।
সমাধান-পদ্ধতিটি তাই একটি স্থির রেসিপি: (১) Euclid দিয়ে d, (২) d ∣ c কি না, (৩) extended Euclid দিয়ে ax' + by' = d, (৪) c/d দিয়ে গুণ, (৫) সাধারণ সমাধান, (৬) দরকার হলে t-এর ওপর অসমতা। নিচের ব্লক এই রেসিপিটি recursive extended Euclid দিয়ে লেখে, তারপর তিনটি সমীকরণ আর দুটি বাক্স-ব্যবস্থা পরীক্ষা করে।
def ext(a, b): # returns (d, x, y) with a*x + b*y = d
if b == 0:
return a, 1, 0
d, x, y = ext(b, a % b)
return d, y, x - (a // b) * y
def solve(a, b, c): # x = x0 + (b/d)t, y = y0 - (a/d)t
d, x, y = ext(a, b)
if c % d != 0:
return None
return x * (c // d), y * (c // d), b // d, a // d
def nonneg(a, b, c): # solutions with x >= 0 and y >= 0
sol = solve(a, b, c)
if sol is None:
return None
x0, y0, bx, ay = sol
return [(x0 + bx * t, y0 - ay * t) for t in range(-c, c + 1)
if x0 + bx * t >= 0 and y0 - ay * t >= 0]
print("6x + 9y = 33: (x0, y0, b/d, a/d) =", solve(6, 9, 33))
print(" non-negative:", nonneg(6, 9, 33))
print("6x + 9y = 32: ", solve(6, 9, 32))
print("15x + 21y = 39:", solve(15, 21, 39), " non-negative:", nonneg(15, 21, 39))
def packable(n, a, b):
return bool(nonneg(a, b, n))
bad = [n for n in range(1, 61) if not packable(n, 4, 9)]
print("boxes 4 and 9, impossible totals:", bad)
print("largest:", max(bad), " ab-a-b =", 4 * 9 - 4 - 9, " count:", len(bad))
print("boxes 6 and 9, impossible up to 30:",
[n for n in range(1, 31) if not packable(n, 6, 9)])আসল আউটপুট (ব্রাউজারের Python):
6x + 9y = 33: (x0, y0, b/d, a/d) = (-11, 11, 3, 2)
non-negative: [(1, 3), (4, 1)]
6x + 9y = 32: None
15x + 21y = 39: (39, -26, 7, 5) non-negative: []
boxes 4 and 9, impossible totals: [1, 2, 3, 5, 6, 7, 10, 11, 14, 15, 19, 23]
largest: 23 ab-a-b = 23 count: 12
boxes 6 and 9, impossible up to 30: [1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29]
প্রথম দুই লাইন stepper-এর ফল: একই (x0, y0) = (−11, 11), পদক্ষেপ 3 আর 2, আর ঠিক দুটি অঋণাত্মক সমাধান। 32-এ None, কারণ 3 ∤ 32. চতুর্থ লাইন একটি সূক্ষ্ম বিষয় দেখায়: 15x + 21y = 39-এর পূর্ণসংখ্যা সমাধান আছে (gcd 3 ∣ 39), কিন্তু একটিও অঋণাত্মক নয়। d ∣ c শর্তটি পূর্ণসংখ্যা সমাধানের জন্য যথেষ্ট, বাক্সের (অঋণাত্মক) সমাধানের জন্য নয়। শেষ তিন লাইন পরের অংশের বিষয়।
৭ · বাক্সে প্যাকিং — কোন সংখ্যা কখনো হয় না
আগের ব্লকের শেষ লাইন বলছে, ৬ আর ৯-এর বাক্সে ৩-এর গুণিতক ছাড়া কিছুই হয় না (তা উপপাদ্য ৬.১(ক) থেকেই জানা), আর ৩-এর গুণিতকের মধ্যে শুধু ৩ নিজে অসম্ভব। কারণ 6x + 9y = 3(2x + 3y), আর 2x + 3y অঋণাত্মক x, y-তে 1 ছাড়া প্রতিটি ধনাত্মক সংখ্যা হয় (2, 3, আর তারপর প্রতিবার একটি 2 যোগ করে)। পর্ব ১১-এ ৩ আর ৫ টাকার টিকিটে আমরা দেখেছি, coprime জোড়ায় একটি “সবচেয়ে বড় অসম্ভব সংখ্যা” থাকে, যাকে Frobenius number বলে, আর অনুমান করেছিলাম তা ab − a − b. ৪ আর ৯-এর বাক্সে ব্লকটি দেখাল 23 = 36 − 4 − 9, আর অসম্ভব সংখ্যা ১২টি = (4 − 1)(9 − 1)/2. এবার Bézout-এর সাধারণ সমাধান দিয়ে প্রথম দাবিটি প্রমাণ করা যাক।
a, b ≥ 2 আর gcd(a, b) = 1 হলে (ক) প্রতিটি n > ab − a − b-কে ax + by আকারে লেখা যায় যেখানে x, y ≥ 0; (খ) ab − a − b-কে এভাবে লেখা যায় না।
প্রমাণ:
- (ক) gcd = 1 ∣ n, তাই উপপাদ্য ৬.১ অনুযায়ী সমাধান আছে, আর সব সমাধানে x = x0 + bt. t বদলে x-কে b-এর ধাপে সরানো যায়, তাই একটি সমাধান আছে যেখানে 0 ≤ x ≤ b − 1. — সাধারণ সমাধান, division algorithm
- সেই সমাধানে by = n − ax ≥ n − a(b − 1) > (ab − a − b) − ab + a = −b, তাই y > −1, অর্থাৎ y ≥ 0. — অসমতা, y পূর্ণসংখ্যা
- (খ) ধরি ax + by = ab − a − b, x, y ≥ 0. তাহলে a(x + 1) + b(y + 1) = ab. — proof by contradiction
- b ∣ ab − b(y + 1) = a(x + 1), আর gcd(a, b) = 1, তাই b ∣ x + 1; x + 1 ≥ 1 বলে x + 1 ≥ b. একইভাবে y + 1 ≥ a. — উপপাদ্য ৫.১
- তাহলে a(x + 1) + b(y + 1) ≥ ab + ab = 2ab > ab, বিরোধ। ∎
এই ফলটি সাধারণত James Joseph Sylvester-এর নামে যুক্ত (১৮৮০-এর দশকের একটি প্রশ্ন-সমাধান থেকে বলে উল্লেখিত); অসম্ভব সংখ্যার মোট সংখ্যা (a − 1)(b − 1)/2-এর প্রমাণ এখানে বাদ রাখলাম, ব্লকে শুধু একটি উদাহরণে মেলানো হলো। তিনটি বা তার বেশি বাক্সের মাপে Frobenius সংখ্যার কোনো সরল সূত্র জানা নেই, আর সাধারণ ক্ষেত্রে এটি বের করা গণনার দিক থেকে কঠিন সমস্যা বলে জানা যায়। বাজারঘরের জন্য ব্যবহারিক শিক্ষা: বাক্সের মাপ coprime রাখুন, তাহলে একটি সীমার পর যেকোনো অর্ডার না খুলে পাঠানো যায়।
৮ · Binary gcd — ভাগ ছাড়াই gcd
কম্পিউটারে বড় সংখ্যার ভাগ তুলনামূলক ব্যয়বহুল কাজ, অথচ ২ দিয়ে ভাগ শুধু bit সরানো (shift), আর বিয়োগ সস্তা। Josef Stein ১৯৬৭ সালে এমন একটি gcd পদ্ধতি প্রকাশ করেন যা শুধু এই সস্তা কাজগুলো ব্যবহার করে; একে binary gcd বা Stein-এর algorithm বলে (Knuth উল্লেখ করেছেন যে এর ধারণা প্রাচীন চীনা গণিতেও থাকতে পারে)। এটি তিনটি সহজ সত্যের ওপর দাঁড়িয়ে:
- a, b দুটিই জোড় হলে gcd(a, b) = 2 · gcd(a/2, b/2);
- a বিজোড় আর b জোড় হলে gcd(a, b) = gcd(a, b/2), কারণ 2 সাধারণ ভাজক হতে পারে না;
- a, b দুটিই বিজোড় আর a ≤ b হলে gcd(a, b) = gcd(a, b − a), আর b − a জোড় (লেমা ২.১-এর বিয়োগ-রূপ)।
বিজোড় − বিজোড় সবসময় জোড়, তাই প্রতিটি বিয়োগের পরেই অন্তত একটি ২ বাদ যায়, আর সংখ্যা দ্রুত ছোট হয়। নিচের ব্লক (252, 198)-এর ধাপগুলো ছাপে আর ১০,০০০টি এলোমেলো 64-bit জোড়ায় ফল math.gcd-এর সঙ্গে মেলায়।
from math import gcd
import random
def twos(n): # how many times 2 divides n (n > 0)
return (n & -n).bit_length() - 1
def binary_gcd(a, b, trace=False): # Stein: only shifts, comparisons, subtraction
if a == 0 or b == 0:
return a | b, 0
k = min(twos(a), twos(b)) # common factor 2^k
a, b = a >> twos(a), b >> twos(b)
steps = 0
while a != b:
if trace:
print(f" ({a}, {b})")
if a > b:
a, b = b, a
b = (b - a) >> twos(b - a) # odd - odd is even: strip its 2s
steps += 1
return a << k, steps
print("binary gcd(252, 198), common 2^1 removed first:")
print(" gcd =", binary_gcd(252, 198, trace=True)[0])
random.seed(42)
ok, total = 0, 0
for _ in range(10000):
a, b = random.getrandbits(64), random.getrandbits(64)
g, steps = binary_gcd(a, b)
ok += (g == gcd(a, b))
total += steps
print("agrees with math.gcd:", ok, "of 10000; average subtract steps:", round(total / 10000, 1))আসল আউটপুট (ব্রাউজারের Python):
binary gcd(252, 198), common 2^1 removed first:
(63, 99)
(63, 9)
(9, 27)
gcd = 18
agrees with math.gcd: 10000 of 10000; average subtract steps: 43.7
252 = 22 · 63 আর 198 = 2 · 99, তাই সাধারণ ২-এর ঘাত k = 1, আর বিজোড় অংশ (63, 99). 99 − 63 = 36 = 4 · 9, তাই (63, 9); 63 − 9 = 54 = 2 · 27, তাই (9, 27); 27 − 9 = 18 = 2 · 9, তাই (9, 9), এবং থামে। উত্তর 9 · 21 = 18. ১০,০০০টি 64-bit জোড়াতেই ফল মিলেছে। গড়ে প্রায় ৪৪টি বিয়োগ লেগেছে, যা Euclid-এর ভাগের সংখ্যার চেয়ে বেশি; কিন্তু প্রতিটি ধাপ অনেক সস্তা। কোনটি বাস্তবে দ্রুত, তা নির্ভর করে যন্ত্র আর সংখ্যার আকারের ওপর, তাই লাইব্রেরিগুলো সাবধানে মেপে বেছে নেয়। এখানে n & -n হলো n-এর সবচেয়ে নিচের 1-bit (পর্ব ০২-এর bitwise অপারেটর)।
৯ · পরীক্ষার অঙ্ক আর একটি ভুল প্রমাণ
বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর লিখিত পরীক্ষায় এই বিষয়ের যে ধাঁচের অঙ্ক আসে, তার তিনটি পূর্ণ সমাধান। প্রতিটি সংখ্যা scratch-এ Python দিয়ে মেলানো।
অঙ্ক ১: gcd(391, 299), lcm(391, 299) আর Bézout-এর x, y বের করুন
- Euclid: 391 = 1 · 299 + 92; 299 = 3 · 92 + 23; 92 = 4 · 23 + 0. তাই gcd = 23.
- lcm: উপপাদ্য ১.২ থেকে lcm = 391 · 299 / 23 = 17 · 299 = 5083. (391 = 17 · 23, 299 = 13 · 23.)
- পেছন থেকে প্রতিস্থাপন: 23 = 299 − 3 · 92 = 299 − 3(391 − 299) = 4 · 299 − 3 · 391. যাচাই: 1196 − 1173 = 23. তাই x = −3, y = 4.
অঙ্ক ২: 15x + 21y = 39-এর সব পূর্ণসংখ্যা সমাধান, আর অঋণাত্মক সমাধান কয়টি?
- 21 = 1 · 15 + 6; 15 = 2 · 6 + 3; 6 = 2 · 3. d = 3, আর 3 ∣ 39, তাই সমাধান আছে।
- 3 = 15 − 2 · 6 = 15 − 2(21 − 15) = 3 · 15 − 2 · 21. 39/3 = 13 দিয়ে গুণ: x0 = 39, y0 = −26.
- b/d = 7, a/d = 5: x = 39 + 7t, y = −26 − 5t, t ∈ ℤ.
- x ≥ 0 ⇔ t ≥ −39/7 ≈ −5.57, তাই t ≥ −5; y ≥ 0 ⇔ t ≤ −26/5 = −5.2, তাই t ≤ −6. দুটি একসঙ্গে অসম্ভব: অঋণাত্মক সমাধান ০টি। (t = −5-এ (4, −1), t = −6-এ (−3, 4): সীমার দুই পাশে।) §৬-এর ব্লকের চতুর্থ লাইনও তাই বলে।
অঙ্ক ৩: প্রমাণ করুন, প্রতিটি পূর্ণসংখ্যা n-এ gcd(2n + 1, 3n + 1) = 1
লেমা ২.১-এর প্রমাণে আসলে দেখানো হয়েছে, gcd(a, b) = gcd(b, a − qb) যেকোনো পূর্ণসংখ্যা q-তে (শুধু ভাগফলে নয়)। তাই gcd(3n + 1, 2n + 1) = gcd(2n + 1, n) = gcd(n, 1) = 1. Bézout দিয়ে সরাসরিও: 3(2n + 1) − 2(3n + 1) = 1, আর অনুসিদ্ধান্ত ৩.৩(খ) বলে gcd = 1. দ্বিতীয় পদ্ধতিটি পরীক্ষায় সবচেয়ে ছোট উত্তর: সহগগুলো খুঁজে বের করুন যাতে n কেটে যায়। n = 1 থেকে 9999 পর্যন্ত scratch-এ যাচাই করা হয়েছে, কিন্তু প্রমাণ সব n-এর জন্য।
প্রমাণের ভুল ধরুন: Euclid-এর লেমার একটি “সহজ” প্রমাণ
একজন লিখলেন: “দাবি: p মৌলিক, p ∣ ab হলে p ∣ a বা p ∣ b. প্রমাণ: a আর b-কে মৌলিক গুণনীয়কে ভাঙি। তাহলে ab-এর ভাঙন হলো দুটি ভাঙন পাশাপাশি রাখা। p ∣ ab, তাই p, ab-এর ভাঙনে আছে, কারণ ভাঙন অনন্য। তাই p হয় a-এর ভাঙনে আছে, নয় b-এর, অর্থাৎ p ∣ a বা p ∣ b. ∎” এরপর তিনি এই লেমা দিয়ে factorization-এর অনন্যতা প্রমাণ করলেন। পড়ে ভুলটি নিজে খুঁজুন।
ভুল কোথায়: প্রমাণের প্রতিটি বাক্য সত্য, কিন্তু “ভাঙন অনন্য” ধাপটি সেই উপপাদ্যই ব্যবহার করছে, যা পরে এই লেমা দিয়ে প্রমাণ করা হবে। এটি circular reasoning বা চক্রাকার যুক্তি, যাকে পর্ব ০৮-এ begging the question নামে দেখেছেন। অনন্যতা আগে থেকে জানা থাকলে প্রমাণটি ঠিক আছে; কিন্তু অনন্যতার প্রমাণে এটি ব্যবহার করা যায় না। সঠিক পথ ছবি ৫.১-এর শিকল: Bézout থেকে Euclid-এর লেমা, factorization ছাড়াই। শিক্ষা: একটি প্রমাণ পড়ার সময় প্রতিটি ব্যবহৃত ফলের জন্য জিজ্ঞেস করুন, “এটি কোথায়, কী দিয়ে প্রমাণিত?”
আরও গভীরে: Euclid-এর ভাগফলগুলো একটি ভগ্নাংশের continued fraction দেয়: 252/198 = 1 + 1/(3 + 1/(1 + 1/2)), অর্থাৎ [1; 3, 1, 2], ছবি ২.১-এর বর্গের সংখ্যাই। এই ভাঙন অমূলদ সংখ্যার সবচেয়ে ভালো ভগ্নাংশ-অনুমান দেয়; π ≈ 355/113 তার একটি বিখ্যাত উদাহরণ। আর যে সংখ্যা-ব্যবস্থায় “ভাগশেষ ছোট হয়” এমন একটি ভাগ আছে (যেমন বাস্তব সহগের polynomial, বা a + bi আকারের Gaussian integer), সেখানেও Euclid, Bézout আর অনন্য factorization খাটে; বীজগণিতে এদের Euclidean domain বলে।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- gcd(a, b) = 12, ab = 4320 হলে lcm? 4320/12 = 360, কারণ ধনাত্মক a, b-তে gcd · lcm = ab.
- Euclid-এর algorithm কেন থামে আর কেন দ্রুত? দ্বিতীয় সংখ্যা কঠোরভাবে কমে, ≥ 0 থাকে; প্রতি দুই ধাপে অর্ধেকের নিচে নামে।
- 6x + 10y = 7-এর পূর্ণসংখ্যা সমাধান আছে? না, gcd 2 ∤ 7.
- p ∣ ab ⇒ p ∣ a বা p ∣ b কখন? p মৌলিক হলে; 6 ∣ 4 · 9 কিন্তু 6 ∤ 4, 6 ∤ 9.
- gcd(a, b) = 1 প্রমাণের দ্রুততম উপায়? এমন x, y দেখানো যাতে ax + by = 1.
১০ · AI-এর যুগে — gcd-এর হিসাব আর প্রমাণ যাচাই
AI সহকারী gcd আর extended Euclid-এর উত্তর খুব আত্মবিশ্বাসের সঙ্গে দেয়। ছোট সংখ্যায় সাধারণত ঠিক থাকে, কিন্তু বড় সংখ্যায়, ঋণাত্মক চিহ্নে আর প্রমাণে কিছু ভুল নিয়মিত দেখা যায়:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| বড় সংখ্যায় ভাগশেষ বা Bézout সহগ ভুল, অথচ উত্তর দেখতে পরিপাটি | ax + by নিজে হিসাব করে দেখুন সত্যিই gcd হয় কি না; math.gcd আর pow(a, -1, m) দিয়ে মেলান |
| ax + by = c দেখে gcd(a, b) = c ধরে নেওয়া | অনুসিদ্ধান্ত ৩.৩: শুধু gcd ∣ c জানা যায়; c = 1 হলেই gcd = 1 |
| সাধারণ সমাধানে b/d-এর বদলে b, বা চিহ্ন উল্টো (y = y0 + (a/d)t) | দুই-তিনটি t বসিয়ে মূল সমীকরণে যাচাই করুন; ছোট পরিসরে brute force-এর তালিকার সঙ্গে মেলান |
| Euclid-এর লেমা যৌগিক সংখ্যায় প্রয়োগ, বা “gcd(a, b) = 1” শর্ত বাদ দিয়ে উপপাদ্য ৫.১ বলা | প্রতিটি উপপাদ্যের শর্ত জিজ্ঞেস করুন; 6 ∣ 4 · 9-এর মতো counterexample খুঁজুন |
| চক্রাকার প্রমাণ: unique factorization দিয়ে Euclid-এর লেমা, আবার উল্টোটা | প্রতিটি ব্যবহৃত ফল কী দিয়ে প্রমাণিত, তার শিকল নিজে আঁকুন (ছবি ৫.১) |
| পূর্ণসংখ্যা সমাধান আর অঋণাত্মক সমাধান গুলিয়ে ফেলা; gcd(0, 0) বা ঋণাত্মক সংখ্যার gcd নিয়ে অসাবধানতা | প্রশ্নের শর্ত (x, y ≥ 0?) আবার পড়ুন; সীমার ক্ষেত্রগুলো আলাদা করে পরীক্ষা করুন |
AI-এর কাছে gcd, Bézout বা Diophantine সমীকরণের সমাধান চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে যাচাই করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
সবচেয়ে সস্তা প্রথম পরীক্ষা: AI যে x, y দিল, সেগুলো দিয়ে ax + by হিসাব করুন। এক লাইনের এই যাচাই প্রায় সব হিসাবের ভুল ধরে ফেলে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Euclid-এর algorithm-কে প্রায়ই “আজও ব্যবহৃত সবচেয়ে পুরোনো algorithm” বলা হয়। Euclid আসলে কী লিখেছিলেন, আর তা জ্যামিতির সঙ্গে কীভাবে জড়িত?
Euclid-এর Elements সাধারণত খ্রিস্টপূর্ব ৩০০ সালের কাছাকাছি সময়ের বলে ধরা হয়। এর সপ্তম খণ্ডের শুরুর প্রস্তাবগুলোতে দুটি সংখ্যার সবচেয়ে বড় সাধারণ “মাপ” খোঁজার পদ্ধতি আছে, আর দশম খণ্ডে একই পদ্ধতি দুটি দৈর্ঘ্যের ওপর। পদ্ধতিটি ভাগ দিয়ে নয়, বারবার বিয়োগ দিয়ে লেখা: ছোটটিকে বড়টি থেকে যতবার সম্ভব বাদ দেওয়া, তারপর দুটির ভূমিকা অদলবদল। গ্রিক লেখায় একে পরস্পর বিয়োগ (anthyphairesis) বলা হতো বলে ইতিহাসবিদরা উল্লেখ করেন। ছবি ২.১-এর বর্গ কাটার ছবিটি এই চিন্তারই আধুনিক রূপ। অনেক ইতিহাসবিদ মনে করেন পদ্ধতিটি Euclid-এর আগেই জানা ছিল, আর Euclid এটিকে সুশৃঙ্খলভাবে লিখে রাখেন।
Donald Knuth তাঁর The Art of Computer Programming-এর দ্বিতীয় খণ্ডে একে আজও টিকে থাকা সবচেয়ে পুরোনো অ-তুচ্ছ algorithm বলে বর্ণনা করেছেন বলে প্রায়ই উদ্ধৃত হয়। “অ-তুচ্ছ” শব্দটি গুরুত্বপূর্ণ: এর আগের গণনা-পদ্ধতিও ছিল (যেমন প্রাচীন মিশরের গুণের পদ্ধতি), কিন্তু Euclid-এর পদ্ধতিতে একটি লুপ, একটি থামার শর্ত আর একটি সঠিকতার যুক্তি একসঙ্গে আছে।
জ্যামিতির সংযোগটি গভীর। দুটি দৈর্ঘ্যে পদ্ধতিটি চালালে দুই রকম ঘটনা ঘটতে পারে। দৈর্ঘ্য দুটির অনুপাত মূলদ হলে পদ্ধতি একসময় থামে, আর শেষ দৈর্ঘ্যটি দুটিকেই পূর্ণ সংখ্যায় মাপে। অনুপাত অমূলদ হলে পদ্ধতি কখনো থামে না। বর্গের বাহু আর কর্ণে চালালে প্রতিটি ধাপে আবার একটি ছোট বর্গ-কর্ণ জোড়া ফিরে আসে, তাই পদ্ধতি অনন্তকাল চলে। এটি √2-এর অমূলদতার একটি জ্যামিতিক প্রমাণ দেয় (পর্ব ০৮-এ আমরা একই সত্য বীজগণিতে প্রমাণ করেছি)। গ্রিক গণিতে অমূলদ দৈর্ঘ্যের আবিষ্কার এমন পরস্পর বিয়োগের মধ্য দিয়েই এসেছিল কি না, তা নিয়ে ইতিহাসবিদদের মধ্যে আলোচনা আছে; এটিকে নিশ্চিত ইতিহাস হিসেবে নয়, একটি সম্ভাব্য পুনর্গঠন হিসেবে দেখাই নিরাপদ।
মূল উপলব্ধি: Euclid-এর algorithm জন্মেছে মাপার প্রশ্ন থেকে, তাই এর একই ধাপ মূলদ অনুপাতে থামে আর অমূলদ অনুপাতে চিরকাল চলে; সংখ্যাতত্ত্ব আর জ্যামিতি এখানে একই যুক্তির দুই রূপ।
প্র ০২“Bézout-এর অভেদ” নামটি কি ঐতিহাসিকভাবে ঠিক? আর ax + by = c সমাধানের পদ্ধতি ভারতীয় গণিতে কীভাবে এসেছিল?
নামটি আংশিক ঐতিহাসিক দুর্ঘটনা। ফরাসি গণিতবিদ Étienne Bézout (১৭৩০–১৭৮৩) অষ্টাদশ শতাব্দীতে মূলত polynomial-এর জন্য এমন একটি ফল নিয়ে কাজ করেন: দুটি polynomial-এর সাধারণ উৎপাদক না থাকলে অন্য দুটি polynomial দিয়ে গুণ করে যোগ করলে 1 পাওয়া যায়। পূর্ণসংখ্যার রূপটি তাঁর আগেই জানা ছিল; ফরাসি গণিতবিদ Claude Gaspard Bachet de Méziriac ১৬২৪ সালের দিকে প্রকাশিত গাণিতিক ধাঁধার একটি বইয়ে এর সমতুল্য পদ্ধতি দেন বলে সাধারণত উল্লেখ করা হয়। তাই কিছু লেখক একে Bachet–Bézout অভেদ বলেন। গণিতে নামকরণ প্রায়ই প্রথম আবিষ্কারককে নয়, যাঁর লেখা সবচেয়ে পরিচিত হয়েছে তাঁকে মনে রাখে।
আরও অনেক আগে ভারতীয় গণিতবিদরা ax + by = c ধরনের সমীকরণের পূর্ণসংখ্যা সমাধানের একটি পদ্ধতি দেন, যার নাম kuṭṭaka (“চূর্ণ করা”)। আর্যভট তাঁর আর্যভটীয় গ্রন্থে (সাধারণত ৪৯৯ খ্রিস্টাব্দের বলে ধরা হয়) এর একটি রূপ দেন, আর পরে ব্রহ্মগুপ্ত (৬২৮ খ্রিস্টাব্দের ব্রাহ্মস্ফুটসিদ্ধান্ত) ও ভাস্কর এটিকে বিস্তৃত করেন বলে ইতিহাসে উল্লেখিত। পদ্ধতির ভেতরের কাঠামো আধুনিক extended Euclid-এর মতো: বারবার ভাগ করে সংখ্যাগুলোকে “চূর্ণ” করা, তারপর ভাগফলগুলো দিয়ে পেছন থেকে সমাধান গড়া। প্রয়োগ ছিল জ্যোতির্বিদ্যায়, যেমন গ্রহের চক্র কবে একটি নির্দিষ্ট অবস্থানে মিলবে, যা পর্ব ২৩-এর Chinese Remainder Theorem-এর প্রশ্নের আত্মীয়।
এই ইতিহাস একটি সাধারণ শিক্ষা দেয়। একই গাণিতিক ধারণা বিভিন্ন সভ্যতায়, ভিন্ন প্রয়োজনে, ভিন্ন ভাষায় এসেছে: গ্রিকদের মাপার প্রশ্ন, ভারতীয়দের জ্যোতির্বিদ্যার চক্র, ইউরোপের ধাঁধা আর polynomial-এর বীজগণিত। প্রাচীন উৎসের সঠিক তারিখ আর কে কার কাছ থেকে কী পেয়েছিলেন, তা নিয়ে ইতিহাসবিদদের মধ্যে মতভেদ আছে, তাই এখানে দেওয়া সালগুলো “সাধারণত ধরা হয়” অর্থে পড়ুন।
মূল উপলব্ধি: Bézout-এর অভেদ আর kuṭṭaka একই সত্যের দুই নাম; উপপাদ্যের নাম ইতিহাসের সঠিক রেকর্ড নয়, তাই উৎস দাবি করার আগে বিশ্বস্ত ইতিহাস-গ্রন্থ দেখা দরকার।
প্র ০৩সবচেয়ে খারাপ ক্ষেত্রে Euclid-এর ধাপ-সংখ্যা Lamé জানিয়েছেন। কিন্তু গড়ে কত ধাপ লাগে, আর হাজার হাজার অঙ্কের সংখ্যায় gcd কীভাবে বের হয়?
Lamé-এর ১৮৪৪ সালের বিশ্লেষণ সবচেয়ে খারাপ ক্ষেত্র নিয়ে: পরপর দুটি Fibonacci সংখ্যা, যেখানে প্রতিটি ভাগফল 1. বাস্তবের এলোমেলো সংখ্যায় ভাগফল প্রায়ই 1-এর বেশি, তাই ধাপ কম লাগে। গড় ক্ষেত্রের বিশ্লেষণ বিংশ শতাব্দীর দ্বিতীয়ার্ধের কাজ; Hans Heilbronn আর John Dixon-এর মতো গণিতবিদদের ১৯৬০-এর দশকের শেষ থেকে ১৯৭০-এর দশকের শুরুর কাজে দেখা যায়, n পর্যন্ত সংখ্যায় গড় ধাপ-সংখ্যা প্রায় (12 ln 2/π2) ln n, অর্থাৎ প্রায় 0.843 ln n (সঠিক বক্তব্য আর শর্তের জন্য Knuth-এর দ্বিতীয় খণ্ড দেখুন)। এখানে ln হলো স্বাভাবিক লগারিদম। এমনকি ভাগফলগুলোর বণ্টনও জানা: ভাগফল 1 আসে প্রায় ৪১.৫% ক্ষেত্রে, 2 প্রায় ১৭%, এভাবে কমে, যাকে Gauss–Kuzmin বণ্টন বলে।
ধাপ-সংখ্যা ছাড়াও প্রতিটি ধাপের খরচ আছে। হাজার অঙ্কের দুটি সংখ্যা ভাগ করা নিজেই অনেক কাজ। সরল বিশ্লেষণে n অঙ্কের সংখ্যায় Euclid-এর মোট খরচ মোটামুটি n2-এর মাপে, কারণ ভাগফল ছোট হলে ভাগের খরচও কম, আর পুরো প্রক্রিয়া জুড়ে সেটি পুষিয়ে যায়। লক্ষ লক্ষ অঙ্কের সংখ্যায় এটিও ধীর, তাই “half-gcd” নামের একটি divide-and-conquer পদ্ধতি আছে, যা ১৯৭০-এর দশকের শুরুতে Knuth আর Schönhage-এর কাজ থেকে এসেছে বলে উল্লেখিত। এর ধারণা: বড় সংখ্যার শুধু ওপরের অর্ধেক অঙ্ক দেখে প্রথম কয়েকটি ভাগফল অনুমান করা যায়, কারণ ভাগফল মূলত ওপরের অঙ্কের ওপর নির্ভর করে। GMP-এর মতো বড় সংখ্যার লাইব্রেরি খুব বড় সংখ্যায় এমন পদ্ধতি ব্যবহার করে বলে জানা যায়, আর মাঝারি আকারে সরল বা binary পদ্ধতি।
এই স্তরভেদ একটি বড় শিক্ষা: একই গাণিতিক কাজের জন্য ইনপুটের আকার অনুযায়ী আলাদা algorithm সেরা, আর লাইব্রেরি নির্মাতারা মেপে মেপে সীমা ঠিক করেন। তত্ত্বের অসিম্পটোটিক সেরা পদ্ধতি সবসময় ছোট ইনপুটে সেরা নয়।
মূল উপলব্ধি: Euclid-এর খারাপ ক্ষেত্র Fibonacci, গড় ক্ষেত্র লগারিদমের একটি সুন্দর ধ্রুবক গুণিতক, আর বিশাল সংখ্যায় দ্রুততার জন্য ভাগফল অনুমানের মতো কৌশল লাগে; “কত ধাপ” আর “প্রতি ধাপে কত খরচ” দুটিই গুনতে হয়।
প্র ০৪Cryptography-তে extended Euclid কোথায় লাগে? আর নিরাপত্তার কাজে “gcd একটু দ্রুত বা ধীর” কেন বিপদ ডেকে আনতে পারে?
Public-key cryptography-র বহু হিসাবে একটি সংখ্যার modular inverse লাগে, অর্থাৎ এমন x যাতে ax-কে m দিয়ে ভাগ করলে ভাগশেষ 1 থাকে। §৪-এর ব্লকে দেখেছেন, এটি ঠিক ax + my = 1-এর x, যা extended Euclid সরাসরি দেয়। পাঠ্যবইয়ের RSA-তে গোপন সূচক d বের করা হয় একটি সর্বজনীন সূচক e-এর inverse হিসেবে (পর্ব ২৮ “RSA-এর গণিত”), আর elliptic curve-এর বিন্দু যোগেও ভাগের জায়গায় inverse লাগে (পর্ব ৩০)। Key তৈরির সময় gcd পরীক্ষাও লাগে, যেমন e আর একটি নির্দিষ্ট সংখ্যা coprime কি না।
gcd একটি আক্রমণের হাতিয়ারও হতে পারে। দুটি RSA key-এর modulus যদি দুর্ঘটনাক্রমে একটি মৌলিক গুণনীয়ক ভাগাভাগি করে, তবে একটি gcd হিসাবেই সেই গুণনীয়ক বেরিয়ে পড়ে, আর দুটি key-ই ভেঙে যায়, অথচ factorization কঠিন হওয়ার কথা ছিল। ২০১২ সালের দিকে কয়েকটি গবেষক দল ইন্টারনেট থেকে সংগ্রহ করা বিপুল সংখ্যক public key-এ জোড়ায় জোড়ায় gcd নিয়ে দেখান যে খারাপ random number generator-এর কারণে কিছু যন্ত্রের key এভাবে দুর্বল ছিল বলে প্রকাশিত হয়েছে। শিক্ষা: গণিত ঠিক থাকলেও এলোমেলো সংখ্যা তৈরির দুর্বলতা পুরো ব্যবস্থাকে ভাঙতে পারে।
দ্বিতীয় বিপদ সময়। Euclid-এর ধাপ-সংখ্যা ইনপুটের ওপর নির্ভর করে। গোপন সংখ্যার inverse হিসাব করতে কতক্ষণ লাগল, তা কেউ খুব সূক্ষ্মভাবে মাপতে পারলে গোপন সংখ্যা সম্পর্কে তথ্য ফাঁস হতে পারে; একে timing side channel বলে। তাই বাস্তবের ভালো লাইব্রেরি গোপন তথ্যের ওপর এমনভাবে হিসাব করে, যাতে সময় ইনপুটের ওপর নির্ভর না করে (constant-time), যেমন Fermat-এর উপপাদ্য দিয়ে inverse (পর্ব ২৪) বা বিশেষভাবে নকশা করা gcd পদ্ধতি।
এই কারণেই এই কোর্সের RSA বা Diffie–Hellman উদাহরণ শুধু বোঝার জন্য: ছোট সংখ্যার “textbook” পদ্ধতি নিরাপদ নয়। বাস্তবে padding, বড় key আর যাচাই-করা লাইব্রেরি লাগে; এর ব্যবহারিক দিক Cybersecurity কোর্সের পর্ব ১০-এ।
মূল উপলব্ধি: extended Euclid cryptography-র নিত্যদিনের হাতিয়ার, কিন্তু নিরাপত্তায় শুধু উত্তর ঠিক হওয়া যথেষ্ট নয়: এলোমেলো সংখ্যার মান আর হিসাবের সময়ও গোপন তথ্য রক্ষার অংশ।
প্র ০৫পূর্ণসংখ্যায় factorization অনন্য। এমন সংখ্যা-ব্যবস্থা কি আছে যেখানে তা নয়? আর তার সঙ্গে Euclid-এর লেমার সম্পর্ক কী?
আছে, আর এটি ঊনবিংশ শতাব্দীর গণিতের একটি বিখ্যাত মোড়। a + b√−5 আকারের সংখ্যাগুলো ভাবুন, যেখানে a, b পূর্ণসংখ্যা। এখানে 6 = 2 · 3 = (1 + √−5)(1 − √−5). প্রমাণ করা যায় যে 2, 3, 1 + √−5 আর 1 − √−5 চারটিই এই ব্যবস্থায় আর ভাঙা যায় না (irreducible), আর একটি অন্যটির “একক গুণ” রূপও নয়। তাহলে 6-এর দুটি সত্যিকারের আলাদা factorization আছে। এখানে Euclid-এর লেমা ভাঙে: 2 ভাগ করে (1 + √−5)(1 − √−5) = 6-কে, কিন্তু কোনো একটি গুণককে ভাগ করে না। অর্থাৎ 2 irreducible, কিন্তু Euclid-এর লেমার অর্থে “prime” নয়। এই ব্যবস্থায় তাই ভাগশেষ ছোট করার মতো কোনো Euclid-ধাঁচের ভাগ থাকতে পারে না, আর Bézout-ও সংখ্যার ভাষায় খাটে না।
ইতিহাসে এর একটি নাটকীয় মুহূর্ত আছে বলে প্রায়ই বলা হয়। ১৮৪৭ সালে প্যারিসের বিজ্ঞান একাডেমিতে Gabriel Lamé, এই পর্বের সেই Lamé, Fermat-এর শেষ উপপাদ্যের একটি প্রমাণের রূপরেখা দেন, যা একটি বিশেষ সংখ্যা-ব্যবস্থায় অনন্য factorization ধরে নিয়েছিল। Joseph Liouville সঙ্গে সঙ্গে প্রশ্ন তোলেন এই অনুমান নিয়ে, আর জানা যায় যে Ernst Kummer আগেই দেখিয়েছিলেন, সেই ব্যবস্থাগুলোর অনেকটিতে অনন্যতা ভাঙে। Kummer এর প্রতিকার হিসেবে “ideal number” ধারণা আনেন, যা পরে Richard Dedekind-এর হাতে ideal-এর তত্ত্ব হয়ে আধুনিক বীজগণিতের ভিত্তি হয়। এই ঘটনার খুঁটিনাটি নিয়ে ইতিহাসবিদদের বর্ণনায় পার্থক্য আছে, তাই একে মূল শিক্ষার দৃষ্টান্ত হিসেবে পড়ুন।
ideal-এর ধারণা আসলে অনুসিদ্ধান্ত ৩.৩(গ)-এর সাধারণ রূপ: পূর্ণসংখ্যায় ax + by আকারের সব সংখ্যা একটি একক সংখ্যা d-এর গুণিতক। যে ব্যবস্থায় এমন প্রতিটি সেট একটি একক উপাদান দিয়ে তৈরি, সেখানে Bézout আর অনন্য factorization খাটে; যেখানে নয়, সেখানে “সংখ্যা”র বদলে “সেট”-এর factorization নিয়ে কাজ করতে হয়।
মূল উপলব্ধি: অনন্য factorization কোনো স্বতঃসিদ্ধ নয়, Bézout আর Euclid-এর লেমার ফল; যে সংখ্যা-ব্যবস্থায় এই শিকল ভাঙে, সেখানে অনন্যতাও ভাঙে, আর সেখান থেকেই আধুনিক বীজগণিতের একটি বড় শাখার জন্ম।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: gcd(a, b) = 1, a ∣ c আর b ∣ c হলে প্রমাণ করুন ab ∣ c. তারপর একটি উদাহরণ দিন যে gcd(a, b) = 1 শর্তটি বাদ দেওয়া যায় না, আর দেখান যে coprime ধনাত্মক a, b-তে lcm(a, b) = ab, factorization ব্যবহার না করে।
- Bézout: ax + by = 1. c দিয়ে গুণ: c = acx + bcy. — উপপাদ্য ৩.২
- b ∣ c, তাই c = bk, আর acx = ab(kx); ab ∣ acx. a ∣ c, তাই c = al, আর bcy = ab(ly); ab ∣ bcy. — বিভাজ্যতার সংজ্ঞা
- দুটি গুণিতকের যোগফল, তাই ab ∣ c. ∎
- শর্ত ছাড়া মিথ্যা: 4 ∣ 12 আর 6 ∣ 12, কিন্তু 24 ∤ 12 (gcd(4, 6) = 2).
- lcm: ab-কে a আর b দুটিই ভাগ করে। আর যেকোনো ধনাত্মক সাধারণ গুণিতক c-তে প্রথম অংশ বলে ab ∣ c, তাই c ≥ ab. সবচেয়ে ছোটটি তাই ab. ∎
-
হিসাব: (ক) gcd(161, 28) বের করুন আর extended Euclid দিয়ে 161x + 28y = gcd-এর একটি সমাধান দিন। (খ) 14x + 35y = 93-এর পূর্ণসংখ্যা সমাধান আছে কি? (গ) বাজারঘরের কুপন দুই মানের: ৪ টাকার আর ৭ টাকার, যতগুলো খুশি। কোন কোন মোট ছাড় কখনো দেওয়া যায় না, আর সবচেয়ে বড়টি কত?
(ক) 161 = 5 · 28 + 21; 28 = 1 · 21 + 7; 21 = 3 · 7 + 0. gcd = 7. টেবিল: (161, 1, 0), (28, 0, 1), (21, 1, −5), (7, −1, 6). তাই 161 · (−1) + 28 · 6 = −161 + 168 = 7.
(খ) gcd(14, 35) = 7, আর 93 = 13 · 7 + 2, তাই 7 ∤ 93: কোনো পূর্ণসংখ্যা সমাধান নেই (উপপাদ্য ৬.১(ক))।
(গ) gcd(4, 7) = 1, তাই উপপাদ্য ৭.১ অনুযায়ী সবচেয়ে বড় অসম্ভব মোট 4 · 7 − 4 − 7 = 17. অসম্ভব মোটগুলো: 1, 2, 3, 5, 6, 9, 10, 13, 17, মোট ৯টি = (4 − 1)(7 − 1)/2. সব সংখ্যা scratch-এ Python দিয়ে যাচাই করা।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
def g(a, b): print(a, b) return a if b == 0 else g(b, a % b) print("gcd =", g(48, 180))48 180 180 48 48 36 36 12 12 0 gcd = 12লক্ষ করুন দ্বিতীয় লাইন: a < b হলে a % b = a, তাই প্রথম ডাক শুধু দুটি সংখ্যার জায়গা বদলায়। তাই a ≥ b আগে থেকে সাজানোর দরকার নেই, একটি বাড়তি ধাপ লাগে মাত্র। তারপর 180 = 3 · 48 + 36, 48 = 1 · 36 + 12, 36 = 3 · 12 + 0. প্রতিটি ডাকের আগেই print হয়, তাই gcd লাইনটি সবার শেষে।
-
প্রমাণের ভুল ধরুন: একজন লিখলেন: “দাবি: যদি কিছু পূর্ণসংখ্যা x, y-তে ax + by = 6 হয়, তবে gcd(a, b) = 6. প্রমাণ: Bézout বলে gcd(a, b) হলো a আর b-এর একটি linear combination; ax + by = 6 একটি linear combination; তাই gcd(a, b) = 6. ∎” ভুল কোথায়, আর সঠিক দাবি কী?
- ভুল: “gcd একটি linear combination” থেকে “প্রতিটি linear combination gcd” আসে না; এটি converse ধরে নেওয়ার ভুল (পর্ব ০৬-এর affirming the consequent-এর আত্মীয়)। Counterexample: a = 4, b = 9: 4 · (−3) + 9 · 2 = 6, কিন্তু gcd(4, 9) = 1.
- সঠিক দাবি: ax + by = c হলে gcd(a, b) ∣ c (অনুসিদ্ধান্ত ৩.৩(গ))। আর gcd হলো ক্ষুদ্রতম ধনাত্মক linear combination, তাই ax + by = 1 হলে gcd = 1. সাধারণভাবে: ax + by = d, d ∣ a আর d ∣ b, d > 0, এই তিনটি একসঙ্গে হলে তবেই d = gcd(a, b).
- শিক্ষা: প্রতিটি “তাই”-এর দিক পরীক্ষা করুন; একটি ছোট counterexample খুঁজলেই এমন প্রমাণ ভেঙে পড়ে।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমax + by = c-এর সব অঋণাত্মক পূর্ণসংখ্যা সমাধান খোঁজার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- Euclid-এর algorithm দিয়ে d = gcd(a, b) বের করা
- d ∣ c কি না দেখা; না হলে সমাধান নেই
- Extended Euclid দিয়ে ax' + by' = d লেখা
- c/d দিয়ে গুণ করে একটি সমাধান (x0, y0) পাওয়া
- সাধারণ সমাধান x = x0 + (b/d)t, y = y0 − (a/d)t লেখা
- x ≥ 0 আর y ≥ 0 থেকে t-এর পরিসর বের করা
252 আর 198-এর gcd কত?
- 18
- 6
- 36
- 9
দুটি ধনাত্মক পূর্ণসংখ্যা a, b-এর gcd 12 আর গুণফল ab = 4320. lcm(a, b) কত?
- 51840
- 720
- 360
- 12
কোন সমীকরণের পূর্ণসংখ্যা সমাধান আছে?
- 6x + 10y = 7
- 12x + 18y = 30
- 9x + 15y = 4
- 14x + 21y = 10
Bézout-এর অভেদের প্রমাণে S = {ax + by : x, y ∈ ℤ, ax + by > 0}-এর একটি ক্ষুদ্রতম উপাদান আছে, এটি কোন নীতি থেকে আসে?
- Pigeonhole principle
- Fundamental theorem of arithmetic
- Division algorithm
- Well-ordering principle
6x + 9y = 33-এর একটি সমাধান (x, y) = (1, 3). সব পূর্ণসংখ্যা সমাধান কোনটি (t ∈ ℤ)?
- x = 1 + 9t, y = 3 − 6t
- x = 1 + 3t, y = 3 + 2t
- x = 1 + 3t, y = 3 − 2t
- x = 1 + 2t, y = 3 − 3t
“n ∣ ab হলে n ∣ a অথবা n ∣ b” বাক্যটি সব পূর্ণসংখ্যা a, b-এর জন্য কোন n > 1-এ সবসময় সত্য?
- যেকোনো n > 1-এ
- ঠিক তখন, যখন n মৌলিক
- যেকোনো বিজোড় n-এ
- শুধু যৌগিক n-এ
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- gcd, lcm: মৌলিক ঘাতের min আর max; gcd · lcm = ab (ধনাত্মক a, b); gcd(a, 0) = |a|, gcd(0, 0) সংজ্ঞায়িত নয়।
- Euclid: gcd(a, b) = gcd(b, a mod b); শেষ অশূন্য ভাগশেষ gcd; প্রতি দুই ধাপে সংখ্যা অর্ধেকের নিচে।
- Bézout: gcd = ax + by-এর ক্ষুদ্রতম ধনাত্মক মান (well-ordering দিয়ে প্রমাণ); extended Euclid-এর টেবিল x, y দেয়, প্রতিটি সারিতে r = as + bt.
- Euclid-এর লেমা: p মৌলিক, p ∣ ab ⇒ p ∣ a বা p ∣ b; সাধারণ রূপ: a ∣ bc, gcd(a, b) = 1 ⇒ a ∣ c. অনন্য factorization এর ওপর দাঁড়িয়ে।
- ax + by = c: সমাধান ⇔ d ∣ c; সব সমাধান x0 + (b/d)t, y0 − (a/d)t; coprime a, b-তে ab − a − b-এর পর সব সংখ্যা অঋণাত্মকভাবে হয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২২ · Modular arithmetic — ঘড়ির গণিত আর modular exponentiationপরবর্তী পর্বঘড়ির গণিত, ভাগশেষের হিসাব আর দ্রুত ঘাত।
- পর্ব ১৩ · Program-এর সঠিকতা — loop invariant আর Hoare logic-এর ধারণাপুনরালোচনাEuclid-এর লুপের invariant, termination আর Lamé-এর সীমা।
- পর্ব ১১ · Strong induction আর well-orderingভিত্তিwell-ordering, division algorithm আর ৩ ও ৫ টাকার টিকিটের Frobenius সংখ্যা।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপুরো কোর্সের মানচিত্র আর ১৪টি মডিউল।
- DSA · পর্ব ৬২ · Number theory — GCD, sieve আর modular arithmeticcontest কৌশলgcd, extended Euclid আর modular inverse-এর কোড আর contest-এর কৌশল।
- Python · পর্ব ০৭ · সংখ্যা ও হিসাব — int, float-এর ফাঁদ, Decimalহাতে-কলমেPython-এর সীমাহীন int, // আর ঋণাত্মক সংখ্যায় %.