সরাসরি পর্বে যান
পর্ব ১১ · ৮৩-এর মধ্যে · মডিউল ২

Strong induction আর well-ordering

Strong Induction and the Well-Ordering Principle — Prime Factorisation, Stamps, Games, Division Algorithm and Minimal Counterexamples

Taught in Bangla, this lesson shows when ordinary induction gets stuck and proves strong induction valid. Full proofs cover factorisation into primes, postage with 3- and 5-taka stamps (and why three base cases are needed), a winning strategy in a take-away game, the division algorithm through well-ordering, and the minimal counterexample technique. In-page Python finds first failures such as 7, 40 and 5777 and checks recurrences used in algorithm analysis.

এই পর্বে যা শিখবেন

  • Strong induction-এর নীতি, তার ছাঁচ, আর সাধারণ induction থেকে কেন এটি বৈধ
  • “প্রতিটি n ≥ 2 মৌলিক সংখ্যার গুণফল” আর টিকিটের সমস্যার সম্পূর্ণ প্রমাণ
  • কাঠির খেলায় জেতার কৌশল প্রমাণ, আর basis কম পড়লে প্রমাণ কোথায় ভাঙে
  • Well-ordering principle, induction-এর সঙ্গে তার সমতুল্যতা, আর minimal counterexample কৌশল
  • Recursive algorithm-এর হিসাব strong induction দিয়ে প্রমাণ করা

১ · সাধারণ induction কোথায় আটকে যায়

পর্ব ১০ “Mathematical induction — এক ধাপ থেকে অসীম পর্যন্ত”-এ ছাঁচটি ছিল: P(1) সত্য, আর প্রতিটি k-এর জন্য P(k) → P(k + 1); তাহলে সব n-এ P(n) সত্য। ডমিনোর সারির মতো: প্রথমটি পড়ে, আর প্রতিটি ডমিনো ঠিক পরেরটিকে ফেলে।

এবার বাজারঘরের হিসাব বিভাগের একটি প্রশ্ন। প্রতিটি অর্ডার নম্বরকে মৌলিক সংখ্যার গুণফলে ভেঙে একটি “আঙুলের ছাপ” বানানো হবে। দাবি: ২ বা তার বেশি প্রতিটি পূর্ণসংখ্যা মৌলিক সংখ্যার গুণফল। সাধারণ induction-এ চেষ্টা করি। ধরুন জানি ৫৯ মৌলিক সংখ্যার গুণফল (৫৯ নিজেই মৌলিক)। এখন ৬০ নিয়ে কী বলা যায়? ৬০ = ৬ × ১০. এখানে লাগে ৬ আর ১০-এর গুণনীয়ক, ৫৯-এর নয়। P(59) জেনে P(60) সম্পর্কে কিছুই পাওয়া যায় না।

সিঁড়ি বেয়ে ছাদে ওঠার কথা ভাবুন। সাধারণ induction বলে: প্রতিটি ধাপ থেকে ঠিক পরের ধাপে ওঠা যায়। কিন্তু কিছু সিঁড়িতে পরের ধাপে উঠতে আগের ধাপ নয়, নিচের দুই-তিনটি ধাপে একসঙ্গে পা রাখতে হয়। Strong induction বলে: নিচের সব ধাপ তো আপনি ইতিমধ্যে পেরিয়ে এসেছেন; যেটিতে দরকার, সেটিতেই পা রাখুন।

৬০-এর জন্য দরকার ছিল ৬ আর ১০, দুটোই ৬০-এর চেয়ে ছোট। যদি এমন একটি প্রমাণ-কাঠামো থাকে যেখানে P(60) প্রমাণের সময় ২ থেকে ৫৯ পর্যন্ত সব মানে দাবিটি সত্য ধরে নেওয়া যায়, তাহলে কাজ সহজ। সেটিই strong induction.

২ · Strong induction — নীতি, ছাঁচ আর কেন বৈধ

নীতি

ধরুন P(n) একটি দাবি, আর b একটি পূর্ণসংখ্যা (শুরুর মান)। যদি

  1. Basis: P(b) সত্য (দরকার হলে P(b), P(b + 1), …, P(b + j) কয়েকটি শুরুর মান), এবং
  2. Inductive step: প্রতিটি k ≥ b (বা k ≥ b + j)-এর জন্য, [P(b) ∧ P(b + 1) ∧ … ∧ P(k)] → P(k + 1),

তাহলে প্রতিটি n ≥ b-তে P(n) সত্য। ধাপ ২-এর বাঁ অংশটিকে বলে strong inductive hypothesis: “b থেকে k পর্যন্ত সব j-এ P(j) সত্য।”

একে complete induction বা second principle of induction-ও বলে। পার্থক্য শুধু inductive step-এ: সাধারণ mathematical induction-এ হাতে থাকে শুধু P(k); এখানে P(b) থেকে P(k) পর্যন্ত সবগুলো। প্রথম অংশটিকে বলে basis step.

নিচের ছবিতে পার্থক্যটি দেখুন। ওপরের সারিতে প্রতিটি সংখ্যা শুধু ঠিক আগেরটির ওপর দাঁড়ায়। নিচের সারিতে ৮-এর প্রমাণ দাঁড়িয়েছে ২ আর ৪-এর ওপর (৮ = ২ × ৪), যদিও ২ থেকে ৭ পর্যন্ত সবাই হাতের কাছে ছিল।

কে কার ওপর দাঁড়ায়

Ordinary induction: k → k + 1. Strong induction: any smaller values → k + 1

Ordinary versus strong induction dependencies সাধারণ induction: শুধু ঠিক আগেরটি Strong induction: ছোট সবাই হাতে 2345 6789 2345 6789 P(k) → P(k + 1) P(8) দাঁড়াল P(2) আর P(4)-এর ওপর: 8 = 2 × 4
ছবি ২.১ — ওপরে প্রতিটি তীর এক ঘর লম্বা। নিচে নীল তীর অনেক ঘর পেছনে যায়; ধূসর ড্যাশ রেখা মানে “এই মানগুলোও hypothesis-এ ছিল, কিন্তু লাগেনি”।

কেন বৈধ — সাধারণ induction থেকে প্রমাণ

উপপাদ্য ২.১

সাধারণ induction-এর নীতি সত্য হলে strong induction-এর নীতিও সত্য।

প্রমাণ: ধরি strong induction-এর দুই শর্ত পূর্ণ হয়েছে (এক basis b-এর ক্ষেত্রে; কয়েকটি basis হলে একই যুক্তি)। নতুন একটি দাবি বানাই: Q(n) = P(b) ∧ P(b + 1) ∧ … ∧ P(n), অর্থাৎ “b থেকে n পর্যন্ত সবগুলোতে P সত্য”।

  1. Q(b) = P(b), যা basis অনুযায়ী সত্য। তাই Q-এর basis পূর্ণ।
  2. ধরি কোনো k ≥ b-তে Q(k) সত্য, অর্থাৎ P(b), …, P(k) সব সত্য (সাধারণ induction-এর hypothesis).
  3. Strong induction-এর ধাপ ২ বলে [P(b) ∧ … ∧ P(k)] → P(k + 1); ধাপ ২-এর তথ্যের সঙ্গে modus ponens দিয়ে P(k + 1) সত্য।
  4. Q(k) আর P(k + 1) একসঙ্গে মানে Q(k + 1) (conjunction-এর সংজ্ঞা)। তাই Q(k) → Q(k + 1).
  5. সাধারণ induction দিয়ে সব n ≥ b-তে Q(n) সত্য; আর Q(n) সত্য হলে তার শেষ অংশ P(n)-ও সত্য (simplification). ∎

অর্থাৎ strong induction আসলে নতুন কোনো স্বীকার্য নয়; এটি সাধারণ induction, শুধু দাবিটিকে “এখন পর্যন্ত সবগুলো” আকারে শক্ত করে লেখা। উল্টো দিকটি আরও সহজ: সাধারণ induction-এর প্রতিটি প্রমাণ strong induction-এরও প্রমাণ, কারণ hypothesis-এর শুধু শেষ অংশ P(k) ব্যবহার করলেই চলে। “Strong” নামটি তাই একটু বিভ্রান্তিকর: শক্তিশালী হলো hypothesis, প্রমাণ-পদ্ধতির ক্ষমতা একই।

৩ · প্রতিটি n ≥ 2 মৌলিক সংখ্যার গুণফল

একটি মৌলিক সংখ্যা (prime) হলো ১-এর চেয়ে বড় পূর্ণসংখ্যা, যার ধনাত্মক ভাজক শুধু ১ আর সংখ্যাটি নিজে। ১-এর চেয়ে বড় যে সংখ্যা মৌলিক নয়, তাকে বলে যৌগিক সংখ্যা (composite): তাকে n = a · b লেখা যায়, যেখানে 1 < a, b < n. একটিমাত্র মৌলিক সংখ্যাকেও “একটি মৌলিকের গুণফল” ধরা হয়।

উপপাদ্য ৩.১

২ বা তার বেশি প্রতিটি পূর্ণসংখ্যা n এক বা একাধিক মৌলিক সংখ্যার গুণফল হিসেবে লেখা যায়।

প্রমাণ (strong induction, n-এর ওপর): P(n) = “n মৌলিক সংখ্যার গুণফল”।

  1. Basis: n = 2. ২-এর ধনাত্মক ভাজক শুধু ১ আর ২, তাই ২ মৌলিক; এটি নিজেই একটি মৌলিকের গুণফল। P(2) সত্য।
  2. Hypothesis: কোনো k ≥ 2-এর জন্য ধরি P(2), P(3), …, P(k) সব সত্য। দেখাতে হবে P(k + 1).
  3. ক্ষেত্র ১, k + 1 মৌলিক: তাহলে k + 1 নিজেই একটি মৌলিকের গুণফল। P(k + 1) সত্য।
  4. ক্ষেত্র ২, k + 1 যৌগিক: সংজ্ঞা অনুযায়ী k + 1 = a · b, যেখানে 1 < a < k + 1 আর 1 < b < k + 1. অর্থাৎ 2 ≤ a ≤ k আর 2 ≤ b ≤ k.
  5. a আর b দুটোই hypothesis-এর পরিসরে (২ থেকে k), তাই P(a) আর P(b) সত্য: a = p1⋯pr, b = q1⋯qs, সবগুলো মৌলিক।
  6. তাহলে k + 1 = p1⋯pr · q1⋯qs, মৌলিক সংখ্যার গুণফল। P(k + 1) সত্য।
  7. দুই ক্ষেত্র সব সম্ভাবনা ঢাকে (১-এর চেয়ে বড় প্রতিটি সংখ্যা মৌলিক অথবা যৌগিক)। Strong induction-এ সব n ≥ 2-তে P(n) সত্য। ∎

ধাপ ৫-ই মূল জায়গা: a আর b কত, আমরা জানি না, শুধু জানি তারা k + 1-এর চেয়ে ছোট আর অন্তত ২। সাধারণ induction-এ শুধু P(k) হাতে থাকত, যা এখানে অকেজো। এবার প্রমাণটিকে ৬০-এর ওপর চালিয়ে দেখুন; প্রমাণের প্রতিটি ধাপ আসলে একটি recursive algorithm-এর ধাপ।

160 = 6 × 102 6 = 2 × 3310 = 2 × 5460 = 2·3·2·5560 = 4 × 15
এই ধাপ
সংখ্যা
মৌলিক?
কোন P লাগল
ফল
  1. Hypothesis সাজানো। প্রমাণ করতে চাই P(60). Strong hypothesis-এ P(2), P(3), …, P(59) সব সত্য ধরে নেওয়া যায়। প্রথম প্রশ্ন: ৬০ কি মৌলিক?
  2. যৌগিক ক্ষেত্র। ৬০ মৌলিক নয়: 60 = 6 × 10, আর 2 ≤ 6, 10 ≤ 59. দুটিই hypothesis-এর পরিসরে, তাই P(6) আর P(10) ব্যবহার করা চলে। খেয়াল করুন, P(59) এখানে একেবারেই লাগছে না।
  3. P(6) কোথা থেকে। একই প্রমাণ ৬-এ খাটে: 6 = 2 × 3, আর ২, ৩ মৌলিক (ক্ষেত্র ১)। তাই 6 = 2 × 3. প্রমাণটি recursion-এর মতো নিচে নামছে, আর প্রতিবার সংখ্যা ছোট হচ্ছে।
  4. P(10) কোথা থেকে। 10 = 2 × 5, দুটোই মৌলিক। তাই 10 = 2 × 5.
  5. জোড়া লাগানো। 60 = (2 × 3) × (2 × 5) = 2 · 3 · 2 · 5 = 2² × 3 × 5. P(60) সত্য, ঠিক প্রমাণের ধাপ ৬-এর মতো।
  6. অন্য পথ, একই উত্তর। 60 = 4 × 15 থেকে শুরু করলে 4 = 2 × 2, 15 = 3 × 5, ফল আবার 2² × 3 × 5. সব পথে একই মৌলিক পাওয়া কি কাকতালীয়? না, কিন্তু সেটি এই উপপাদ্য বলে না। ভাঙন একটিই (unique), এই অংশটির প্রমাণ পর্ব ২০-এ।

উপপাদ্য ৩.১ হলো fundamental theorem of arithmetic-এর অস্তিত্বের (existence) অংশ। পূর্ণ উপপাদ্য বলে, ক্রম বাদ দিলে ভাঙনটি অনন্য; সেটির জন্য Euclid-এর lemma (“p মৌলিক আর p ∣ ab হলে p ∣ a অথবা p ∣ b”) লাগে, যা পর্ব ২০ “বিভাজ্যতা আর মৌলিক সংখ্যা — division algorithm আর unique factorization”-এর বিষয়। এখানে ∣ চিহ্নের অর্থ “ভাগ করে”।

সাধারণ ভুল: “k + 1 যৌগিক হলে k + 1 = a · b, আর hypothesis থেকে a আর b মৌলিকের গুণফল।” এখানে একটি শর্ত বাদ গেছে: a আর b-কে অবশ্যই ২ থেকে k-এর মধ্যে দেখাতে হবে। a = 1, b = k + 1 নিলে b পরিসরের বাইরে, আর যুক্তিটি চক্রাকার হয়ে যায় (P(k + 1) দিয়েই P(k + 1)). তাই যৌগিকের সংজ্ঞায় 1 < a, b < n শর্তটি জরুরি।

৪ · ৩ আর ৫ টাকার টিকিট — আগে Python, তারপর দুই প্রমাণ

বাজারঘর ছোট পার্সেলে ডাক-টিকিট লাগায়। গুদামে শুধু ৩ টাকা আর ৫ টাকার টিকিট আছে, যত খুশি। কোন কোন মাশুল ঠিক ঠিক মেটানো যায়? যেমন ৮ = ৩ + ৫, কিন্তু ৭? প্রমাণ লেখার আগে ছোট মানগুলো দেখে নিই। গণিতবিদরাও এভাবেই শুরু করেন: হিসাব করে প্যাটার্ন দেখা, তারপর অনুমান (conjecture), তারপর প্রমাণ।

নিচের ব্লকে ok[n] সত্য হয়, যদি n − a বা n − b আগেই সত্য হয়ে থাকে। খেয়াল করুন: n-এর উত্তর ছোট মানের উত্তর থেকে আসছে, ঠিক strong induction-এর মতো। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

from math import gcd

def representable(a, b, limit):
    # ok[n] = n টাকা কি a আর b টাকার টিকিটে ঠিক ঠিক হয়?
    ok = [False] * (limit + 1)
    ok[0] = True                      # কোনো টিকিট নয়: 0 টাকা
    for n in range(1, limit + 1):
        ok[n] = (n >= a and ok[n - a]) or (n >= b and ok[n - b])
    return ok

ok = representable(3, 5, 30)
print("3 and 5, not possible in 1..30:", [n for n in range(1, 31) if not ok[n]])
for n in range(8, 17):
    j = next(j for j in range(n // 5 + 1) if (n - 5 * j) % 3 == 0)
    print(f"  {n:2} = 3 x {(n - 5 * j) // 3} + 5 x {j}")

print("a  b  largest-bad  ab-a-b  #bad  (a-1)(b-1)/2")
for a, b in [(3, 5), (4, 5), (5, 7), (4, 9), (6, 9)]:
    ok = representable(a, b, 200)
    bad = [n for n in range(1, 201) if not ok[n]]
    if gcd(a, b) > 1:
        print(f"{a}  {b}  gcd = {gcd(a, b)}: only multiples of {gcd(a, b)}, no largest")
        continue
    print(f"{a}  {b}  {max(bad):6}  {a*b-a-b:10}  {len(bad):4}  {(a-1)*(b-1)//2:6}")

আসল আউটপুট (ব্রাউজারের Python):

3 and 5, not possible in 1..30: [1, 2, 4, 7]
   8 = 3 x 1 + 5 x 1
   9 = 3 x 3 + 5 x 0
  10 = 3 x 0 + 5 x 2
  11 = 3 x 2 + 5 x 1
  12 = 3 x 4 + 5 x 0
  13 = 3 x 1 + 5 x 2
  14 = 3 x 3 + 5 x 1
  15 = 3 x 5 + 5 x 0
  16 = 3 x 2 + 5 x 2
a  b  largest-bad  ab-a-b  #bad  (a-1)(b-1)/2
3  5       7           7     4       4
4  5      11          11     6       6
5  7      23          23    12      12
4  9      23          23    12      12
6  9  gcd = 3: only multiples of 3, no largest

৩০ পর্যন্ত মাত্র চারটি অঙ্ক অসম্ভব: ১, ২, ৪, ৭. ৭-এর পর আর কোনো ফাঁক নেই। তাই অনুমান: ৮ বা তার বেশি প্রতিটি অঙ্ক ৩ আর ৫ টাকার টিকিটে হয়। সবচেয়ে বড় অসম্ভব অঙ্কটিকে বলে Frobenius number; এখানে ৭. টেবিলে আরও একটি প্যাটার্ন: gcd(a, b) = 1 হলে সবচেয়ে বড় অসম্ভব অঙ্ক ab − a − b, আর অসম্ভব অঙ্কের সংখ্যা (a − 1)(b − 1)/2. কিন্তু ৬ আর ৯-এর gcd ৩: তখন শুধু ৩-এর গুণিতক হয়, ফাঁক অসীম।

প্রায় ২০০ পর্যন্ত যাচাই প্রমাণ নয়; ২০১ টাকায় কী হবে? এবার দুইভাবে প্রমাণ করি।

উপপাদ্য ৪.১

প্রতিটি পূর্ণসংখ্যা n ≥ 8-এর জন্য অঋণাত্মক পূর্ণসংখ্যা x, y আছে যাতে n = 3x + 5y.

প্রমাণ ১ (সাধারণ induction):

  1. Basis: 8 = 3 · 1 + 5 · 1.
  2. Hypothesis: কোনো k ≥ 8-এর জন্য k = 3x + 5y, x, y ≥ 0.
  3. ক্ষেত্র y ≥ 1 (অন্তত একটি ৫ টাকার টিকিট আছে): একটি ৫ সরিয়ে দুটি ৩ বসাই: k + 1 = 3(x + 2) + 5(y − 1); কারণ −5 + 6 = +1, আর y − 1 ≥ 0.
  4. ক্ষেত্র y = 0 (সব ৩ টাকার): তখন k = 3x ≥ 8, তাই x ≥ 3 (কারণ 3 · 2 = 6 < 8). তিনটি ৩ সরিয়ে দুটি ৫ বসাই: k + 1 = 3(x − 3) + 5 · 2; কারণ −9 + 10 = +1.
  5. দুই ক্ষেত্রেই k + 1 = 3x′ + 5y′, x′, y′ ≥ 0. সাধারণ induction-এ সব n ≥ 8-এ দাবি সত্য। ∎

প্রমাণ ১ সুন্দর, কিন্তু চালাকি লাগে (“কোন টিকিট বদলাব?”)। প্রমাণ ২ অনেক সরাসরি: প্রতিটি অঙ্ক তিন টাকা কম অঙ্কের সঙ্গে একটি ৩ টাকার টিকিট।

প্রমাণ ২ (strong induction):

  1. Basis (তিনটি): 8 = 3 + 5, 9 = 3 + 3 + 3, 10 = 5 + 5.
  2. Hypothesis: কোনো k ≥ 10-এর জন্য ৮ থেকে k পর্যন্ত প্রতিটি অঙ্ক বানানো যায়।
  3. ধাপ: k + 1 ≥ 11, তাই (k + 1) − 3 = k − 2 ≥ 8; আবার k − 2 ≤ k. অর্থাৎ k − 2 hypothesis-এর পরিসরে, তাকে বানানো যায়।
  4. সেই টিকিটগুলোর সঙ্গে একটি ৩ টাকার টিকিট যোগ করলে k + 1. ∎
1P(n): n = 3x + 5y2basis: 8 = 3 + 53basis: 9 = 3 + 3 + 34basis: 10 = 5 + 55step: n = (n − 3) + 3
এই ধাপ
n
উৎস
টিকিট
  1. দাবি আর পরিকল্পনা। P(n) = “n টাকা ৩ আর ৫ টাকার টিকিটে হয়”, n ≥ 8. ধাপের ধারণা: n টাকা = (n − 3) টাকা + একটি ৩ টাকার টিকিট। ধাপটি তিন ঘর পেছনে যায়, তাই শুরুতে তিনটি পরপর মান যাচাই করতে হবে।
  2. Basis ১: n = 8. 8 = 3 + 5 (x = 1, y = 1). এটি সবচেয়ে ছোট দাবিকৃত মান।
  3. Basis ২: n = 9. 9 = 3 + 3 + 3 (x = 3, y = 0). কেন আলাদা করে? কারণ 9 − 3 = 6, যা দাবির পরিসরের (n ≥ 8) বাইরে; ধাপটি এখানে খাটে না।
  4. Basis ৩: n = 10. 10 = 5 + 5. একই কারণ: 10 − 3 = 7 পরিসরের বাইরে, আর ৭ আসলেই বানানো যায় না। তিনটি basis ছাড়া প্রমাণ অসম্পূর্ণ।
  5. প্রথম ধাপ: n = 11. 11 − 3 = 8, যা ৮ থেকে ১০-এর মধ্যে, hypothesis-এ আছে। 8-এর টিকিট (3 + 5)-এর সঙ্গে একটি ৩: 11 = 3 + 5 + 3. সাধারণ induction-এ শুধু P(10) থাকত; এখানে লাগল P(8).
  6. n = 12 আর 13. 12 − 3 = 9 থেকে 12 = 3 + 3 + 3 + 3; 13 − 3 = 10 থেকে 13 = 5 + 5 + 3. এভাবে তিনটি basis থেকে তিনটি “সুতা” চলে: ৮, ১১, ১৪, …; ৯, ১২, ১৫, …; ১০, ১৩, ১৬, …
  7. সাধারণ ধাপ। যেকোনো k ≥ 10-এ k + 1 ≥ 11, তাই 8 ≤ k − 2 ≤ k; hypothesis থেকে k − 2 বানানো যায়, সঙ্গে একটি ৩ যোগ করলে k + 1. Strong induction-এ সব n ≥ 8-এ দাবি সত্য। ∎

প্রমাণ ২-কে সাধারণ induction-এ রূপান্তর করা যায়, উপপাদ্য ২.১-এর মতো: Q(n) = “n, n − 1, n − 2 তিনটিই বানানো যায়”। কিন্তু strong induction-এ চিন্তাটি অনেক পরিষ্কার।

দুই রকম মুদ্রা বা টিকিটের প্রশ্নটি পুরোনো। প্রচলিত বিবরণ অনুযায়ী ইংরেজ গণিতবিদ J. J. Sylvester ১৮৮০-এর দশকে (প্রায়ই ১৮৮৪ উল্লেখ করা হয়) দেখান যে gcd(a, b) = 1 হলে ঠিক (a − 1)(b − 1)/2টি অঙ্ক অসম্ভব, আর সবচেয়ে বড়টি ab − a − b. বেশি রকম মুদ্রার সাধারণ প্রশ্নটি জার্মান গণিতবিদ Ferdinand Georg Frobenius-এর নামে পরিচিত, কারণ বলা হয় তিনি বক্তৃতায় প্রশ্নটি প্রায়ই তুলতেন।

৫ · কত basis লাগবে — আর একটি ভুল প্রমাণ

Strong induction-এর সবচেয়ে সাধারণ ভুল basis কম রাখা। নিয়মটি সহজ: ধাপে P(k + 1) প্রমাণের সময় যে ছোট মানগুলো ব্যবহার করছেন, প্রতিটি k-এর জন্য সেগুলো যেন দাবির পরিসরে (≥ b) থাকে। যেসব k + 1-এ ধাপটি পরিসরের বাইরে চলে যায়, সেগুলো আলাদা basis case.

ধাপে যা ব্যবহার করেনউদাহরণলাগবে এমন basis
P(k)সাধারণ induction১টি: P(b)
P(k) আর P(k − 1)Fibonacci-জাতীয় recurrence২টি: P(b), P(b + 1)
P(k − 2), অর্থাৎ (k + 1) − 3৩ টাকার টিকিট যোগ৩টি: P(8), P(9), P(10)
P(a), P(b), যেখানে 2 ≤ a, b ≤ kমৌলিক গুণফল১টি: P(2); a, b সবসময় পরিসরে
P(⌊(k + 1)/2⌋)binary search১টি: P(1), যদি k + 1 ≥ 2

এবার একটি বিখ্যাত ভুল “প্রমাণ”। খুঁজে দেখুন কোথায় ভাঙছে, তারপর নিচে পড়ুন।

দাবি: a একটি অশূন্য বাস্তব সংখ্যা হলে প্রতিটি n ≥ 0-এ an = 1.

“প্রমাণ”: Basis: a0 = 1. Strong hypothesis: 0 ≤ j ≤ k সব j-এ aj = 1. তাহলে ak+1 = ak · ak / ak−1 = 1 · 1 / 1 = 1. ∎

ভুলটি: ধাপে ak−1 ব্যবহার হয়েছে, অর্থাৎ P(k − 1). k = 0 হলে (k + 1 = 1 প্রমাণের সময়) k − 1 = −1, যা দাবির পরিসর n ≥ 0-এর বাইরে; hypothesis সেখানে কিছুই বলে না। আসলে a−1 = 1/a, যা সাধারণত ১ নয়। ধাপ শুধু k ≥ 1-এ বৈধ, তাই দুটি basis লাগত: a0 = 1 আর a1 = 1. দ্বিতীয়টি মিথ্যা (a = 2 হলে a1 = 2), তাই পুরো দাবিই ভেঙে পড়ে। এক লাইনের এই ফাঁক পর্ব ১০-এর “সব ঘোড়া একই রঙের” ভুল প্রমাণের আত্মীয়: সেখানেও ধাপটি ঠিক একটি ছোট মানে (n = 1 থেকে 2) খাটে না।

পরীক্ষার কৌশল: নিজের প্রমাণ লেখার পর সবচেয়ে ছোট দুই-তিনটি k নিয়ে ধাপটি হাতে চালান: k + 1-এর জন্য কোন কোন P(j) লাগছে, আর প্রতিটি j কি ≥ b? এই দুই মিনিটের কাজ অধিকাংশ ভুল ধরে।

৬ · কাঠির খেলা — জেতার কৌশলের প্রমাণ

বাজারঘরের অফিসে চা-বিরতিতে একটি খেলা চলে। টেবিলে n-টি দেশলাই কাঠি। দুজন পালা করে ১, ২ বা ৩টি কাঠি তোলেন। যিনি শেষ কাঠিটি তোলেন, তিনি জেতেন। প্রশ্ন: কোন n-এ প্রথম খেলোয়াড় নিশ্চিত জিততে পারেন, প্রতিপক্ষ যত ভালোই খেলুক? এমন নিশ্চিত পরিকল্পনাকে বলে winning strategy. খেলাটি Nim পরিবারের একটি সরল সদস্য।

আবার আগে হিসাব। একটি অবস্থান (n কাঠি বাকি) “জেতা” (W), যদি অন্তত একটি চাল প্রতিপক্ষকে “হারা” (L) অবস্থানে পাঠায়; আর “হারা”, যদি প্রতিটি চাল প্রতিপক্ষকে জেতা অবস্থানে পাঠায়। ০ কাঠি L: যাঁর পালা, তাঁর আগেরজন শেষ কাঠি তুলে জিতে গেছেন। এই সংজ্ঞাটিই একটি ছোট game tree-এর হিসাব, আর n-এর উত্তর আসে ছোট সব n-এর উত্তর থেকে।

from functools import lru_cache

MOVES = (1, 2, 3)

@lru_cache(maxsize=None)
def wins(n):
    # n কাঠি বাকি; যাঁর পালা, তিনি কি নিশ্চিত জিততে পারেন?
    # এমন একটি চাল খুঁজি, যার পর প্রতিপক্ষ হারা অবস্থানে পড়েন
    return any(not wins(n - m) for m in MOVES if m <= n)

def good_moves(n):
    return [m for m in MOVES if m <= n and not wins(n - m)]

print("n  :", " ".join(f"{n:2}" for n in range(17)))
print("W/L:", " ".join(" W" if wins(n) else " L" for n in range(17)))
print("losing n up to 60:", [n for n in range(61) if not wins(n)])
print("wins(n) == (n % 4 != 0) for all n <= 500:",
      all(wins(n) == (n % 4 != 0) for n in range(501)))
for n in (15, 22, 4):
    print(f"n = {n}: winning first moves {good_moves(n)}")

আসল আউটপুট (ব্রাউজারের Python):

n  :  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
W/L:  L  W  W  W  L  W  W  W  L  W  W  W  L  W  W  W  L
losing n up to 60: [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60]
wins(n) == (n % 4 != 0) for all n <= 500: True
n = 15: winning first moves [3]
n = 22: winning first moves [2]
n = 4: winning first moves []

প্যাটার্ন পরিষ্কার: হারা অবস্থান ঠিক ৪-এর গুণিতকগুলো। ১৫ কাঠিতে ৩টি তুলুন (বাকি ১২), ২২-এ ২টি (বাকি ২০); ৪ কাঠিতে কোনো জেতার চাল নেই। ৫০০ পর্যন্ত মিলেছে, কিন্তু এটি এখনো অনুমান। lru_cache প্রতিটি n-এর উত্তর একবার হিসাব করে মনে রাখে; ছোট থেকে বড় ক্রমে ডাকা হচ্ছে বলে recursion গভীরে যায় না।

উপপাদ্য ৬.১

প্রতিটি n ≥ 0-এ: 4 ∣ n হলে, যাঁর পালা তিনি হারবেন (প্রতিপক্ষ ঠিক খেললে); 4 ∤ n হলে, যাঁর পালা তিনি নিশ্চিত জিততে পারেন। জেতার চাল: n mod 4-টি কাঠি তোলা।

প্রমাণ (strong induction, n-এর ওপর): P(n) = উপপাদ্যের দাবি, n কাঠির জন্য।

  1. Basis, n = 0: 4 ∣ 0. যাঁর পালা তিনি কোনো চাল দিতে পারেন না; শেষ কাঠি আগেরজন তুলেছেন, তাই তিনি হেরেছেন। P(0) সত্য।
  2. Hypothesis: কোনো n ≥ 1-এর জন্য ধরি 0 ≤ j < n সব j-এ P(j) সত্য।
  3. ক্ষেত্র 4 ∤ n: r = n mod 4 ∈ {1, 2, 3}, আর r ≤ n, তাই r-টি কাঠি তোলা বৈধ চাল। বাকি থাকে n − r, যা ৪-এর গুণিতক আর n-এর চেয়ে ছোট। Hypothesis P(n − r) অনুযায়ী এখন যাঁর পালা (প্রতিপক্ষ), তিনি হারবেন। তাই n-এ যাঁর পালা, তিনি জেতেন।
  4. ক্ষেত্র 4 ∣ n (তাই n ≥ 4): যেকোনো চালে m ∈ {1, 2, 3} কাঠি তুললে বাকি n − m, যা ৪-এর গুণিতক নয় (৪ দিয়ে ভাগশেষ 4 − m), আর 0 ≤ n − m < n. Hypothesis P(n − m) অনুযায়ী প্রতিপক্ষ সেখান থেকে নিশ্চিত জিততে পারেন। তাই n-এ যাঁর পালা, তিনি হারবেন।
  5. দুই ক্ষেত্রেই P(n) সত্য; strong induction-এ সব n ≥ 0-এ P(n) সত্য। ∎

ধাপ ৩ আর ৪-এ লাগল P(n − 1), P(n − 2) বা P(n − 3), কোনটি তা চালের ওপর নির্ভর করে; তাই strong hypothesis স্বাভাবিক। Basis একটিই যথেষ্ট, কারণ n ≥ 1-এ প্রতিটি বৈধ চাল 0 বা তার বেশি কাঠি রাখে, পরিসরের বাইরে যায় না। খেলার এই ধরনের বিশ্লেষণ, আর বড় খেলায় minimax, AI-এর ভিত্তি আর Python for AI কোর্সের পর্ব ৪২-এ আছে।

৭ · Well-ordering principle আর induction-এর সমতুল্যতা

এবার একই শক্তিকে অন্য দিক থেকে দেখি। ক্লাসের রোল নম্বরের তালিকায় যত জনই থাকুক, সবচেয়ে ছোট রোল নম্বর একটি আছেই। স্বাভাবিক সংখ্যার এই সাধারণ ধর্মটির নাম:

Well-ordering principle

ℕ = {0, 1, 2, …}-এর প্রতিটি অশূন্য উপসেট S-এ একটি ক্ষুদ্রতম উপাদান আছে: এমন m ∈ S, যাতে প্রতিটি s ∈ S-এর জন্য m ≤ s.

Well-ordering principle সব সংখ্যা-সেটে খাটে না। পূর্ণসংখ্যা ℤ-এ {…, −3, −2, −1}-এর কোনো ক্ষুদ্রতম নেই। ধনাত্মক মূলদ সংখ্যার সেটে 1, 1/2, 1/3, … ক্রমশ ছোট হয়, কিন্তু ক্ষুদ্রতম কেউ নেই (যেকোনো q > 0-এর চেয়ে q/2 ছোট)। তবে {n ∈ ℤ : n ≥ −5}-এর মতো নিচে আটকানো পূর্ণসংখ্যার সেটে খাটে, কারণ সবাইকে ৫ যোগ করে ℕ-এ সরানো যায়।

উপপাদ্য ৭.১

(ক) Well-ordering principle থেকে সাধারণ induction-এর নীতি আসে। (খ) Strong induction-এর নীতি থেকে well-ordering principle আসে।

(ক)-এর প্রমাণ (contradiction): ধরি P(0) সত্য আর প্রতিটি k-এ P(k) → P(k + 1), কিন্তু তবুও কোনো n-এ P(n) মিথ্যা।

  1. S = {n ∈ ℕ : P(n) মিথ্যা}. ধারণা অনুযায়ী S অশূন্য।
  2. Well-ordering অনুযায়ী S-এর ক্ষুদ্রতম উপাদান m আছে।
  3. P(0) সত্য, তাই 0 ∉ S, অর্থাৎ m ≠ 0; তাই m ≥ 1 আর m − 1 ∈ ℕ.
  4. m − 1 < m, আর m ক্ষুদ্রতম, তাই m − 1 ∉ S: P(m − 1) সত্য।
  5. P(m − 1) → P(m) থেকে (modus ponens) P(m) সত্য, অথচ m ∈ S মানে P(m) মিথ্যা। বিরোধ। তাই S শূন্য, সব n-এ P(n) সত্য। ∎

(খ)-এর প্রমাণ: ধরি S ⊆ ℕ-এর কোনো ক্ষুদ্রতম উপাদান নেই; দেখাব S শূন্য। P(n) = “n ∉ S”.

  1. Strong hypothesis: 0 ≤ j < n সব j-এ j ∉ S (n = 0-এ এই শর্ত ফাঁকা)।
  2. যদি n ∈ S হতো, তাহলে n-এর চেয়ে ছোট কেউ S-এ নেই (ধাপ ১), অর্থাৎ n হতো S-এর ক্ষুদ্রতম। কিন্তু S-এর ক্ষুদ্রতম নেই। তাই n ∉ S: P(n) সত্য।
  3. ধাপ ১-২ সব n-এ খাটে (n = 0-ও, তাই আলাদা basis লাগে না)। Strong induction-এ সব n-এ n ∉ S, অর্থাৎ S = ∅. Contrapositive: S অশূন্য হলে তার ক্ষুদ্রতম উপাদান আছে। ∎

উপপাদ্য ২.১ (সাধারণ ⟹ strong) মিলিয়ে একটি চক্র পূর্ণ হলো: well-ordering ⟹ সাধারণ induction ⟹ strong induction ⟹ well-ordering. তিনটি আসলে একই সত্যের তিন রূপ। এটি একটি প্রমাণের রূপরেখা: পুরো কঠোরতায় ℕ-এর বাকি মৌলিক ধর্ম (যেমন প্রতিটি ধনাত্মক সংখ্যার আগে একটি সংখ্যা আছে) মেনে নিতে হয়, যা Peano-র স্বীকার্যে লেখা থাকে।

৮ · Well-ordering সরাসরি — division algorithm আর minimal counterexample

কখনো কখনো induction-এর বদলে সরাসরি “সবচেয়ে ছোটটি নিন” বলা অনেক স্বাভাবিক। প্রথম উদাহরণ ভাগশেষ। বাজারঘরে ৪৫টি ডিম ৭টি করে ট্রেতে সাজালে ৬টি ট্রে ভরে, ৩টি ডিম বাকি থাকে: 45 = 7 · 6 + 3. এমন ভাগফল আর ভাগশেষ সবসময় আছে কেন?

উপপাদ্য ৮.১ (division algorithm, অস্তিত্ব)

n যেকোনো পূর্ণসংখ্যা আর d ধনাত্মক পূর্ণসংখ্যা হলে এমন পূর্ণসংখ্যা q আর r আছে যাতে n = dq + r আর 0 ≤ r < d.

প্রমাণ (well-ordering):

  1. S = {n − dq : q ∈ ℤ, আর n − dq ≥ 0}. এটি ℕ-এর উপসেট।
  2. S অশূন্য: q = −|n| নিলে n − dq = n + d|n| ≥ n + |n| ≥ 0, কারণ d ≥ 1.
  3. Well-ordering অনুযায়ী S-এর ক্ষুদ্রতম উপাদান r আছে; কোনো q-এর জন্য r = n − dq, তাই n = dq + r, আর r ≥ 0.
  4. ধরি r ≥ d. তাহলে r − d = n − d(q + 1) ≥ 0, তাই r − d ∈ S, অথচ r − d < r (কারণ d > 0). এটি r-এর ক্ষুদ্রতমতার বিরোধী।
  5. তাই r < d. অর্থাৎ 0 ≤ r < d. ∎

৪৫ আর ৭-এ: S = {45, 38, 31, 24, 17, 10, 3} (q = 0, 1, …, 6), ক্ষুদ্রতম ৩, q = 6. ঋণাত্মক n-এও খাটে: −17 = 5 · (−4) + 3. Python-এর divmod(-17, 5) ঠিক এই (-4, 3) দেয়, কারণ ধনাত্মক d-এ Python-এর ভাগশেষ কখনো ঋণাত্মক হয় না। এমন q আর r যে একটিই, সেই প্রমাণ পর্ব ২০-এ। এর division algorithm নাম ঐতিহ্যগত; এটি আসলে একটি উপপাদ্য।

Minimal counterexample কৌশল

সাধারণ ছাঁচ: “সব n ≥ b-তে P(n)” প্রমাণ করতে ধরে নিন এটি মিথ্যা। তাহলে ব্যতিক্রমের সেট অশূন্য, তাই well-ordering অনুযায়ী একটি ক্ষুদ্রতম ব্যতিক্রম m আছে। এবার m থেকে আরও ছোট একটি ব্যতিক্রম বানান, বা m-এর চেয়ে ছোট সবাই ঠিক বলে m-ও ঠিক দেখান। দুটোই বিরোধ। এর নাম minimal counterexample. নিচের stepper-এ একই যুক্তি একটি সত্য আর একটি মিথ্যা দাবিতে চালানো হলো।

1S = ব্যতিক্রম, m = min S2ছোট মান হাতে যাচাই3m − 3 ∉ S ⟹ m ∉ S
এই ধাপ
দাবি
m সম্পর্কে
m − 3
রায়
  1. দাবি ক: সব n ≥ 8. ধরি দাবিটি মিথ্যা। S = {n ≥ 8 : n টাকা ৩ আর ৫-এ হয় না} অশূন্য। Well-ordering অনুযায়ী S-এর ক্ষুদ্রতম উপাদান m আছে: সবচেয়ে ছোট “খারাপ” অঙ্ক।
  2. ছোট মানগুলো বাদ। 8 = 3 + 5, 9 = 3 + 3 + 3, 10 = 5 + 5, তাই m এদের কোনোটি নয়। অতএব m ≥ 11.
  3. বিরোধ। m ≥ 11 হলে m − 3 ≥ 8, আর m − 3 < m. m ক্ষুদ্রতম খারাপ অঙ্ক, তাই m − 3 খারাপ নয়: বানানো যায়। তার সঙ্গে একটি ৩ যোগ করলে m-ও বানানো যায়, অর্থাৎ m ∉ S. বিরোধ, তাই S শূন্য। ∎ এটি strong induction-এর প্রমাণই, শুধু উল্টো দিক থেকে বলা।
  4. দাবি খ: সব n ≥ 5. একই যুক্তি চালাই। S = {n ≥ 5 : n টাকা হয় না}, m = min S. হাতে যাচাই: 5 = 5, 6 = 3 + 3, তাই m ∉ {5, 6}.
  5. যুক্তি কোথায় আটকায়। পরের প্রার্থী m = 7. যুক্তি বলত “m − 3 খারাপ নয়”, কিন্তু 7 − 3 = 4, যা দাবির পরিসর n ≥ 5-এর বাইরে; ক্ষুদ্রতমতা ৪ সম্পর্কে কিছুই বলে না। বিরোধ তৈরি হলো না।
  6. আসল ব্যতিক্রম। 7 = 3x + 5y? y = 0 হলে 7/3 পূর্ণসংখ্যা নয়; y = 1 হলে 2 = 3x অসম্ভব। তাই 7 ∈ S, আর m = 7 সত্যিই ক্ষুদ্রতম ব্যতিক্রম। যুক্তি যেখানে আটকায়, ব্যতিক্রম প্রায়ই ঠিক সেখানেই থাকে।

আরেকটি minimal counterexample: √2-এর অমূলদতা

পর্ব ০৮ “প্রমাণের পদ্ধতি — direct, contrapositive আর contradiction”-এ √2-এর অমূলদতার একটি প্রমাণ আছে, জোড়-বিজোড় যুক্তি দিয়ে। Well-ordering দিয়ে আরেকটি, একেবারে ভিন্ন প্রমাণ:

  1. ধরি √2 মূলদ। তাহলে S = {b ∈ ℤ, b ≥ 1 : b√2 একটি পূর্ণসংখ্যা} অশূন্য। এর ক্ষুদ্রতম উপাদান b নিই, আর a = b√2 (পূর্ণসংখ্যা)।
  2. c = a − b = b(√2 − 1) নিই। এটি পূর্ণসংখ্যা। 1 < √2 < 2, তাই 0 < √2 − 1 < 1, অর্থাৎ 0 < c < b; c ধনাত্মক পূর্ণসংখ্যা, তাই c ≥ 1.
  3. c√2 = b√2 · √2 − b√2 = 2b − a, যা পূর্ণসংখ্যা। তাই c ∈ S.
  4. c ∈ S আর c < b, অথচ b ছিল S-এর ক্ষুদ্রতম। বিরোধ। তাই √2 অমূলদ। ∎

খেয়াল করুন, ক্ষুদ্রতম ব্যতিক্রম থেকে আরও ছোট একটি ব্যতিক্রম বানানো হলো। এই ধাঁচের প্রমাণকে ঐতিহাসিকভাবে infinite descent বলে: একটি ব্যতিক্রম থাকলে অসীম সংখ্যক ক্রমশ ছোট স্বাভাবিক সংখ্যা থাকত, যা অসম্ভব।

প্রমাণ খোঁজার আগে প্রথম ব্যতিক্রম খুঁজে দেখা সবসময় বুদ্ধিমানের কাজ। নিচের ব্লক কয়েকটি দাবির ক্ষুদ্রতম ব্যতিক্রম খোঁজে, ছোট থেকে বড় ক্রমে: well-ordering-এর হাতে-কলমে রূপ।

def is_prime(n):
    return n > 1 and all(n % d for d in range(2, int(n ** 0.5) + 1))

def smallest_counterexample(claim, start, limit):
    # ছোট থেকে বড়: প্রথম যেখানে দাবি ভাঙে, সেটিই ক্ষুদ্রতম ব্যতিক্রম
    for n in range(start, limit + 1):
        if not claim(n):
            return n
    return None

def stamps(n):          # n টাকা কি 3 আর 5 টাকার টিকিটে হয়?
    return any((n - 5 * j) % 3 == 0 for j in range(n // 5 + 1))

def odd_composite(n):   # বিজোড় যৌগিক n = মৌলিক + 2k² ?
    if n % 2 == 0 or is_prime(n):
        return True     # দাবিটি শুধু বিজোড় যৌগিক সংখ্যা নিয়ে
    return any(is_prime(n - 2 * k * k) for k in range(1, int((n / 2) ** 0.5) + 1))

claims = [
    ("stamps 3, 5 for n >= 8", stamps, 8, 2000),
    ("stamps 3, 5 for n >= 5", stamps, 5, 2000),
    ("n*n + n + 41 is prime", lambda n: is_prime(n * n + n + 41), 0, 2000),
    ("odd composite = p + 2k^2", odd_composite, 3, 10000),
]
for name, claim, start, limit in claims:
    m = smallest_counterexample(claim, start, limit)
    print(f"{name:26}", f"none up to {limit}" if m is None else f"smallest counterexample {m}")
print("5777 =", " = ".join(f"{a}*{b}" for a in range(2, 76) for b in [5777 // a] if a * b == 5777))
print("5777 - 2k^2 composite for every k = 1..53:",
      all(not is_prime(5777 - 2 * k * k) for k in range(1, 54)))

আসল আউটপুট (ব্রাউজারের Python):

stamps 3, 5 for n >= 8     none up to 2000
stamps 3, 5 for n >= 5     smallest counterexample 7
n*n + n + 41 is prime      smallest counterexample 40
odd composite = p + 2k^2   smallest counterexample 5777
5777 = 53*109
5777 - 2k^2 composite for every k = 1..53: True

প্রথম দাবি ২০০০ পর্যন্ত টিকেছে, আর আমাদের প্রমাণ বলে এটি সব n-এ টিকবে। দ্বিতীয়টির প্রথম ব্যতিক্রম ৭, ঠিক stepper-এর মতো। তৃতীয়টি পর্ব ০১-এর পরিচিত n² + n + 41: n = 40-এ 40² + 40 + 41 = 1681 = 41², যৌগিক। চতুর্থটি সবচেয়ে শিক্ষণীয়। Christian Goldbach ১৭৫২ সালে Euler-কে চিঠিতে অনুমান করেন বলে জানা যায় যে প্রতিটি বিজোড় যৌগিক সংখ্যা একটি মৌলিক আর একটি পূর্ণবর্গের দ্বিগুণের যোগফল (যেমন 9 = 7 + 2 · 1², 15 = 7 + 2 · 2²)। হাজার হাজার সংখ্যায় এটি টেকে; প্রথম ব্যতিক্রম ৫৭৭৭ = ৫৩ × ১০৯, যেখানে 2k² < 5777 এমন সব k-এ 5777 − 2k² যৌগিক। প্রচলিত বিবরণ অনুযায়ী Moritz Stern আর তাঁর ছাত্ররা ১৮৫৬ সালে এটি (আর ৫৯৯৩) খুঁজে পান। হাজারটি উদাহরণ প্রমাণ নয়; একটি ব্যতিক্রমই খণ্ডন।

৯ · Algorithm বিশ্লেষণে strong induction

Recursive algorithm প্রায় সবসময় নিজেকে ছোট কিন্তু “ঠিক এক কম নয়” এমন ইনপুটে ডাকে: binary search অর্ধেকে, merge sort দুই অর্ধেকে, Euclid-এর gcd ভাগশেষে। তাই এদের চলার সময়ের recurrence প্রমাণে strong induction স্বাভাবিক। Recurrence সমাধানের algorithm-কেন্দ্রিক পদ্ধতি (unrolling, recursion tree, substitution) DSA কোর্সের পর্ব ০৮-এ আছে; এখানে শুধু প্রমাণের যুক্তিটি দেখি।

Sorted তালিকায় n-টি আইটেম থাকলে binary search মাঝের আইটেম দেখে, তারপর বাকি দুই ভাগের একটিতে খোঁজে। বড় ভাগে ⌊n/2⌋টি আইটেম থাকে (⌊x⌋ মানে x-এর চেয়ে বড় নয় এমন বৃহত্তম পূর্ণসংখ্যা)। তাই সবচেয়ে খারাপ ক্ষেত্রে দেখার সংখ্যা T(1) = 1, আর n ≥ 2-এ T(n) = T(⌊n/2⌋) + 1.

উপপাদ্য ৯.১

প্রতিটি n ≥ 1-এ T(n) = ⌊log2 n⌋ + 1.

প্রমাণ (strong induction):

  1. Basis: T(1) = 1 = ⌊log2 1⌋ + 1 = 0 + 1.
  2. Hypothesis: কোনো n ≥ 2-এর জন্য 1 ≤ j < n সব j-এ T(j) = ⌊log2 j⌋ + 1.
  3. e = ⌊log2 n⌋ ধরি; সংজ্ঞা অনুযায়ী 2e ≤ n < 2e+1, আর n ≥ 2 বলে e ≥ 1.
  4. ২ দিয়ে ভাগ করে 2e−1 ≤ n/2 < 2e. 2e−1 পূর্ণসংখ্যা, তাই floor নিলেও 2e−1 ≤ ⌊n/2⌋ < 2e; অর্থাৎ ⌊log2 ⌊n/2⌋⌋ = e − 1.
  5. 1 ≤ ⌊n/2⌋ < n, তাই hypothesis খাটে: T(⌊n/2⌋) = (e − 1) + 1 = e.
  6. T(n) = T(⌊n/2⌋) + 1 = e + 1 = ⌊log2 n⌋ + 1. ∎

ধাপ ৫-এ ⌊n/2⌋ সাধারণত n − 1 থেকে অনেক দূরে, তাই P(n − 1) এখানে অকেজো। একই কাঠামোয় merge sort-এর সবচেয়ে খারাপ ক্ষেত্রের তুলনা-সংখ্যা M(1) = 0, M(n) = M(⌈n/2⌉) + M(⌊n/2⌋) + n − 1-এর জন্য বন্ধ সূত্র M(n) = n⌈log2 n⌉ − 2⌈log2 n⌉ + 1 প্রমাণ করা যায়। প্রমাণের আগে Python-এ যাচাই:

N = 4096
T = [0] * (N + 1)
M = [0] * (N + 1)
T[1], M[1] = 1, 0
for n in range(2, N + 1):
    T[n] = T[n // 2] + 1                        # binary search: এক তুলনা + বড় অর্ধেক
    M[n] = M[(n + 1) // 2] + M[n // 2] + n - 1  # merge sort-এর সবচেয়ে খারাপ ক্ষেত্র

def clog(n):            # ceil(log2 n), float ছাড়াই
    return (n - 1).bit_length()

print("T(n) == floor(log2 n) + 1 for 1..4096:",
      all(T[n] == n.bit_length() for n in range(1, N + 1)))
print("M(n) == n*clog(n) - 2**clog(n) + 1 for 1..4096:",
      all(M[n] == n * clog(n) - 2 ** clog(n) + 1 for n in range(1, N + 1)))
print(" n    T(n)  M(n)  n*clog(n)")
for n in (1, 2, 3, 7, 8, 100, 1000, 4096):
    print(f"{n:4}  {T[n]:4}  {M[n]:5}  {n * clog(n):6}")

আসল আউটপুট (ব্রাউজারের Python):

T(n) == floor(log2 n) + 1 for 1..4096: True
M(n) == n*clog(n) - 2**clog(n) + 1 for 1..4096: True
 n    T(n)  M(n)  n*clog(n)
   1     1      0       0
   2     2      1       2
   3     2      3       6
   7     3     14      21
   8     4     17      24
 100     7    573     700
1000    10   8977   10000
4096    13  45057   49152

দুটি সূত্রই ৪০৯৬ পর্যন্ত প্রতিটি n-এ মিলেছে। n.bit_length() হলো n-এর binary রূপে অঙ্কের সংখ্যা, যা n ≥ 1-এ ঠিক ⌊log2 n⌋ + 1; তাই float-এর গোলমাল ছাড়াই তুলনা হলো। ১০০০টি আইটেমে binary search সবচেয়ে খারাপ ক্ষেত্রে ১০বার দেখে, আর merge sort বড়জোর ৮৯৭৭টি তুলনা করে, সহজ সীমা n⌈log2 n⌉ = 10000-এর নিচে। উপপাদ্য ৯.১ প্রমাণ, এই ব্লক শুধু প্রমাণের আগের আত্মবিশ্বাস আর প্রমাণের পরের জোড়া-যাচাই।

আরেকটি পরিচিত উদাহরণ: প্রতিটি n ≥ 1-এর একটি binary রূপ আছে (২-এর ভিন্ন ভিন্ন ঘাতের যোগফল)। Strong induction-এ: n = 1 = 20. n ≥ 2 হলে n = 2⌊n/2⌋ + (n mod 2); hypothesis থেকে ⌊n/2⌋-এর binary রূপ আছে, সব ঘাত এক করে বাড়ালে 2⌊n/2⌋-এর রূপ, আর n বিজোড় হলে সঙ্গে 20 (যা তখন তালিকায় নেই, কারণ বাকি ঘাত সব ≥ 1). Python-এর bin(n) ঠিক এই recursion-ই করে, উল্টো দিক থেকে। Recursive function কীভাবে নিজেকে ডাকে, Python প্রোগ্রামিং কোর্সের পর্ব ১৩-এ আছে; algorithm-এর সঠিকতার প্রমাণ DSA কোর্সের পর্ব ০৩-এ।

আরও গভীরে: Well-ordering-এর ধারণা ℕ ছাড়িয়েও যায়। যে ক্রমে অসীমভাবে ক্রমশ ছোট হওয়া কোনো শিকল নেই (well-founded order), সেখানেই induction চলে; যেমন (a, b) জোড়ার lexicographic ক্রম, যা পর্ব ১২-এ আসবে, আর program-এর থামা (termination) প্রমাণের “variant”, যা পর্ব ১৩-এ। আরও গভীরে আছে ordinal আর transfinite induction. একটি বিখ্যাত ফল: Goodstein-এর উপপাদ্য (১৯৪৪) সত্য, কিন্তু Kirby আর Paris ১৯৮২ সালে দেখান যে শুধু Peano-র পাটিগণিতের স্বীকার্যে এটি প্রমাণ করা যায় না; প্রমাণে ℕ-এর চেয়ে “লম্বা” একটি well-ordering লাগে।

পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:

  • ৪ আর ৫ টাকার কুপনে কোন অঙ্ক থেকে সব অঙ্ক হয়? ১২ থেকে; সবচেয়ে বড় অসম্ভব 4 · 5 − 4 − 5 = 11; strong induction-এ চারটি basis (১২–১৫), ধাপ n − 4.
  • Strong আর সাধারণ induction-এর পার্থক্য? Hypothesis-এ শুধু P(k) বনাম P(b) … P(k); ক্ষমতায় সমতুল্য।
  • Well-ordering principle কী, কোথায় খাটে না? ℕ-এর প্রতিটি অশূন্য উপসেটে ক্ষুদ্রতম আছে; ℤ বা ধনাত্মক মূলদে খাটে না।
  • ২১টি কাঠি, ১–৩টি তোলা যায়, শেষ কাঠি যে তোলে সে জেতে: প্রথম চাল? ১টি তুলে ২০ রাখুন (৪-এর গুণিতক)।
  • প্রতিটি n ≥ 2 মৌলিকের গুণফল: সাধারণ induction কেন যথেষ্ট সুবিধাজনক নয়? n = ab-এর a, b লাগে, P(n − 1) নয়।

১০ · AI-এর যুগে — AI-এর লেখা induction প্রমাণ যাচাই

AI সহকারী induction প্রমাণ খুব আত্মবিশ্বাসের সঙ্গে লেখে, আর strong induction-এর ভুলগুলো চোখে পড়ে কম, কারণ প্রমাণ দেখতে ছোট আর পরিষ্কার। যে ভুলগুলো বেশি দেখা যায়:

AI-এর ভুলকীভাবে ধরবেন
একটি basis রেখে ধাপে n − 3 বা n − 2 ব্যবহারসবচেয়ে ছোট দুই-তিনটি k-এ ধাপ হাতে চালান: ব্যবহৃত মান কি ≥ b?
Hypothesis-এ P(k + 1) নিজেই ঢুকে যাওয়া (চক্রাকার)ধাপে ব্যবহৃত প্রতিটি P(j)-এর j < k + 1 কি না দেখুন
ab − a − b সূত্র gcd যাচাই ছাড়া, বা তিন মুদ্রায় খাটানোgcd(a, b) = 1 কি না দেখুন; তিন মুদ্রায় Python দিয়ে গুনুন
“Strong induction বেশি জিনিস প্রমাণ করতে পারে” দাবিউপপাদ্য ২.১ মনে রাখুন: তিন নীতি সমতুল্য
ℤ বা ℚ-এ well-ordering খাটানোসেটটি নিচে আটকানো পূর্ণসংখ্যার সেট কি না দেখুন
অস্তিত্ব প্রমাণ করে অনন্যতাও প্রমাণিত বলাদুটি আলাদা দাবি; অনন্যতার জন্য আলাদা যুক্তি চান
বড় সংখ্যার গুণনীয়ক বা ভাগশেষ ভুল বলা, ভুয়া উৎসPython-এ হিসাব করুন; বই আর লেখকের নাম নিজে মিলিয়ে নিন

AI-কে strong induction প্রমাণ লিখতে দিলে কাঠামো আর যাচাই একসঙ্গে চেয়ে নিন:

নিচের দাবিটি strong induction দিয়ে প্রমাণ করো: দাবি: [এখানে দাবি, n-এর শুরুর মানসহ] ১. P(n) স্পষ্ট লেখো, আর শুরুর মান b বলো। ২. ধাপে P(k + 1) প্রমাণে কোন কোন P(j) ব্যবহার করবে, আগে তা বলো; প্রতিটি j যে b ≤ j ≤ k, তা দেখাও। ৩. সেই অনুযায়ী কয়টি basis case লাগবে, কেন, তা ব্যাখ্যা করে প্রতিটি যাচাই করো। ৪. প্রতিটি ধাপ নম্বর দিয়ে কারণসহ লেখো, শেষে ∎ দাও। ৫. দাবিটি মিথ্যা মনে হলে প্রমাণের চেষ্টা না করে সবচেয়ে ছোট counterexample দাও। ৬. শেষে একটি ছোট Python কোড দাও, যা n = b থেকে 1000 পর্যন্ত দাবিটি যাচাই করে।

AI-এর প্রমাণ হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Strong induction যদি সাধারণ induction-এর সমান শক্তির হয়, তাহলে আলাদা নাম আর আলাদা নিয়ম রাখার মানে কী?

উপপাদ্য ২.১ দেখিয়েছে, strong induction-এর প্রতিটি প্রমাণকে Q(n) = P(b) ∧ … ∧ P(n) বসিয়ে সাধারণ induction-এ রূপান্তর করা যায়। তাহলে আলাদা নাম কেন? কারণ গণিতে “কী প্রমাণ করা যায়” আর “কীভাবে সহজে চিন্তা করা যায়” দুটি আলাদা প্রশ্ন। একটি প্রোগ্রামিং ভাষায় for লুপ দিয়ে যা লেখা যায়, while দিয়েও তা লেখা যায়; তবুও দুটিই রাখা হয়, কারণ কোনো কাজে একটি অনেক পরিষ্কার।

ইতিহাসে: induction-এর যুক্তি নাম পাওয়ার অনেক আগে থেকেই ব্যবহার হতো। প্রচলিত বিবরণ অনুযায়ী Francesco Maurolico ১৫৭৫ সালের একটি বইয়ে বিজোড় সংখ্যার যোগফল নিয়ে এ ধরনের যুক্তি দেন, আর Blaise Pascal ১৬৫০-এর দশকে তাঁর ত্রিভুজ-সংক্রান্ত লেখায় স্পষ্টভাবে দুই ধাপের কাঠামো ব্যবহার করেন। “Mathematical induction” নামটি সাধারণত Augustus De Morgan-এর ১৮৩৮ সালের একটি বিশ্বকোষ-নিবন্ধের সঙ্গে যুক্ত করা হয়। “Strong” বা “complete” induction নামগুলো পরে পাঠ্যবইয়ে আসে, মূলত শিক্ষার সুবিধার জন্য; গবেষণা-সাহিত্যে একে প্রায়ই course-of-values induction বলা হয়।

কখন কোনটি: যখন P(k + 1) স্বাভাবিকভাবে P(k) থেকে আসে (যোগফলের সূত্র, ২n > n), সাধারণ induction পরিষ্কার। যখন বড় মানটি অজানা কোনো ছোট মানে ভাঙে (গুণনীয়ক, অর্ধেক, ভাগশেষ, খেলার চাল), strong induction পরিষ্কার। একটি ব্যবহারিক পরামর্শ: প্রমাণ লেখার সময় strong hypothesis ধরে নিন, পরে যদি দেখেন শুধু P(k) লেগেছে, তাহলে লিখুন সাধারণ induction-এ।

সূক্ষ্ম একটি জায়গা: strong induction-এর ধাপে কখনো basis লুকিয়ে থাকে। উপপাদ্য ৭.১(খ)-এর প্রমাণে n = 0-এ hypothesis ফাঁকা, তবুও ধাপটি খাটে; তাই আলাদা basis লাগেনি। কিন্তু সাধারণত ছোট মানে ধাপটি খাটে কি না আলাদা করে দেখতে হয়।

মূল উপলব্ধি: নামের “strong” শব্দটি hypothesis-এর, প্রমাণ-ক্ষমতার নয়। তিনটি নীতি (সাধারণ, strong, well-ordering) সমতুল্য; বেছে নিন যেটিতে প্রমাণ সবচেয়ে পরিষ্কার।

প্র ০২Fermat-এর “infinite descent” কী, আর minimal counterexample-এর সঙ্গে এর সম্পর্ক কী?

সতেরো শতকের ফরাসি গণিতবিদ Pierre de Fermat একটি প্রমাণ-কৌশলকে নিজের প্রিয় পদ্ধতি বলে উল্লেখ করেছেন বলে জানা যায়; ফরাসিতে এর নাম descente infinie, অসীম অবতরণ। যুক্তিটি: যদি কোনো ধনাত্মক পূর্ণসংখ্যায় একটি সমাধান থাকে, তাহলে তার চেয়ে ছোট আরেকটি সমাধান বানানো যায়; তার থেকে আরও ছোট; এভাবে অসীম পর্যন্ত। কিন্তু ধনাত্মক পূর্ণসংখ্যার অসীমভাবে ক্রমশ ছোট হওয়া কোনো শিকল নেই। তাই কোনো সমাধানই নেই।

বিখ্যাত প্রয়োগ: Fermat-এর একটি টীকায় পাওয়া যুক্তি থেকে আধুনিক গণিতবিদরা দেখান, পূর্ণসংখ্যা বাহুর কোনো সমকোণী ত্রিভুজের ক্ষেত্রফল একটি পূর্ণবর্গ হতে পারে না; এর একটি ফল হলো x4 + y4 = z4-এর ধনাত্মক পূর্ণসংখ্যায় সমাধান নেই। এটি Fermat-এর শেষ উপপাদ্যের n = 4 ক্ষেত্র, যার পূর্ণ প্রমাণ (সব n > 2) Andrew Wiles ১৯৯৪-৯৫ সালে দেন, একেবারে ভিন্ন ও অনেক গভীর গণিতে।

সম্পর্ক: “অসীম শিকল নেই” আর “প্রতিটি অশূন্য সেটে ক্ষুদ্রতম আছে” একই কথা। আধুনিক লেখায় descent সাধারণত minimal counterexample আকারে লেখা হয়: ক্ষুদ্রতম সমাধান নিন, তার চেয়ে ছোট একটি বানান, বিরোধ। এই পর্বের √2-এর প্রমাণ ঠিক তাই: ক্ষুদ্রতম b থেকে c = b(√2 − 1) < b. দুটি লেখার মধ্যে পার্থক্য রুচির; minimal counterexample-এ “অসীম” শব্দটিই লাগে না, তাই অনেকে এটিকে বেশি পরিষ্কার মনে করেন।

কম্পিউটার বিজ্ঞানে: একই যুক্তি program থামার প্রমাণে আসে। লুপের প্রতিটি পুনরাবৃত্তিতে একটি অঋণাত্মক পূর্ণসংখ্যা (variant) কঠোরভাবে কমলে লুপ অসীমকাল চলতে পারে না; Euclid-এর algorithm-এ ভাগশেষ ঠিক এই ভূমিকা নেয়। এই ধারণা পর্ব ১৩ “Program-এর সঠিকতা — loop invariant আর Hoare logic-এর ধারণা”-তে বিস্তারিত আসবে।

মূল উপলব্ধি: descent, minimal counterexample আর well-ordering একই হাতিয়ারের তিন নাম: স্বাভাবিক সংখ্যা চিরকাল কমতে পারে না, তাই “ছোট থেকে আরও ছোট” বানাতে পারলেই বিরোধ।

প্র ০৩দুই রকম টিকিটে ab − a − b সূত্র আছে। তিন বা বেশি রকম টিকিটে কেন এমন সহজ সূত্র নেই?

দুই রকম মুদ্রা a, b (gcd = 1)-এর ক্ষেত্রে উত্তর সম্পূর্ণ জানা: সবচেয়ে বড় অসম্ভব অঙ্ক ab − a − b, আর অসম্ভব অঙ্ক মোট (a − 1)(b − 1)/2টি। এই পর্বের Python টেবিলে (৩, ৫), (৪, ৫), (৫, ৭), (৪, ৯) চারটিতেই দুটি সূত্র মিলেছে। প্রচলিত বিবরণ অনুযায়ী দ্বিতীয় সূত্রটি J. J. Sylvester-এর ১৮৮০-এর দশকের কাজ থেকে আসে।

তিন বা বেশি মুদ্রায়: gcd(a1, …, ak) = 1 হলে Frobenius number অবশ্যই আছে (একটি যথেষ্ট বড় অঙ্কের পর সব অঙ্ক বানানো যায়), কিন্তু তিন মুদ্রার জন্য দুই-মুদ্রার মতো একটি সরল বহুপদী সূত্র নেই বলে জানা যায়; বিশেষ ক্ষেত্রের জন্য বিভিন্ন সূত্র আর দ্রুত algorithm আছে। মুদ্রার সংখ্যা ইনপুটের অংশ হলে Frobenius number বের করা computationally কঠিন, NP-hard বলে প্রমাণিত (Jorge Ramírez Alfonsín-এর ১৯৯০-এর দশকের কাজ হিসেবে সাধারণত উল্লেখ করা হয়)। অর্থাৎ সাধারণ ক্ষেত্রে দ্রুত সমাধান আশা করা যায় না।

কেন বাস্তব প্রশ্ন: বাজারঘরের প্যাকেজিংয়ে ৬, ৯ আর ২০টির বাক্স থাকলে কোন সংখ্যার অর্ডার ঠিক ঠিক প্যাক করা যায়? এই জাতীয় প্রশ্ন সত্যিই বিনোদনমূলক গণিতে জনপ্রিয়; ৬, ৯, ২০-এর উত্তর ৪৩ (scratch-এ যাচাই করার মতো একটি ছোট অনুশীলন)। সংখ্যাতত্ত্বে এটি numerical semigroup-এর তত্ত্বের অংশ, আর algorithm-এ এটি coin change বা knapsack জাতীয় dynamic programming-এর আত্মীয়: এই পর্বের প্রথম Python ব্লকের ok[n] আসলে সেই dynamic programming.

Strong induction-এর সঙ্গে সম্পর্ক: কোনো ক্ষুদ্রতম মুদ্রা a থাকলে, পরপর a-টি বানানো যায় এমন অঙ্ক পেলেই তার পরের সব অঙ্ক বানানো যায়: ধাপ n = (n − a) + a, আর basis সেই a-টি পরপর অঙ্ক। ৩ আর ৫-এ ছিল ৮, ৯, ১০. এভাবে প্রমাণের কাঠামো সব মুদ্রাতেই এক; কঠিন অংশ শুধু সেই পরপর অঙ্কগুলো কোথায় শুরু হয়, তা খুঁজে বের করা।

মূল উপলব্ধি: দুই মুদ্রায় বন্ধ সূত্র আছে, বেশি মুদ্রায় সমস্যাটি সাধারণভাবে কঠিন। তবে “পরপর a-টি অঙ্ক পেলে সব পাওয়া যায়” যুক্তিটি সবসময় strong induction.

প্র ০৪কাঠির খেলার বিশ্লেষণ আসল Nim খেলায় কীভাবে বড় হয়? এখানে strong induction-এর ভূমিকা কী?

এই পর্বের খেলায় একটিই স্তূপ, আর তোলার সীমা ৩. ক্লাসিক Nim-এ কয়েকটি স্তূপ, আর নিজের পালায় যেকোনো একটি স্তূপ থেকে যত খুশি (অন্তত একটি) কাঠি তোলা যায়। আমেরিকান গণিতবিদ Charles L. Bouton ১৯০১ সালে Nim-এর সম্পূর্ণ সমাধান প্রকাশ করেন বলে সাধারণত উল্লেখ করা হয়: স্তূপের আকারগুলোকে binary-তে লিখে bit ধরে XOR (nim-sum) নিন; nim-sum ০ হলে যাঁর পালা তিনি হারবেন, নইলে জিততে পারেন।

প্রমাণের কাঠামো একই: P(অবস্থান) = “nim-sum ০ হলে হারা, নইলে জেতা”। মোট কাঠির সংখ্যার ওপর strong induction চলে, কারণ প্রতিটি চাল মোট কাঠি কমায়, তবে কতটা, তা চালের ওপর নির্ভর করে। দুটি lemma লাগে: (১) nim-sum ০ অবস্থান থেকে যেকোনো চাল nim-sum অশূন্য করে; (২) nim-sum অশূন্য অবস্থান থেকে অন্তত একটি চাল nim-sum ০ করে। তারপর ঠিক উপপাদ্য ৬.১-এর মতো যুক্তি।

আরও বড় তত্ত্ব: ১৯৩০-এর দশকে Roland Sprague আর Patrick Grundy স্বাধীনভাবে দেখান, এই ধরনের প্রতিটি “impartial” খেলা (যেখানে দুই খেলোয়াড়ের চাল একই রকম) কোনো এক আকারের Nim স্তূপের সমতুল্য; প্রতিটি অবস্থানের একটি Grundy সংখ্যা আছে। এই পর্বের খেলায় n কাঠির Grundy সংখ্যা n mod 4. Grundy সংখ্যার সংজ্ঞাটিই recursive: একটি অবস্থানের মান তার পরের অবস্থানগুলোর মান থেকে, অর্থাৎ ছোট অবস্থান থেকে। তাই এর প্রতিটি ধর্ম প্রমাণ হয় strong induction-এ।

Programming contest-এ: খেলার প্রশ্ন প্রায়ই আসে: আগে ছোট অবস্থানে win/lose টেবিল বানান (এই পর্বের দ্বিতীয় ব্লকের মতো), প্যাটার্ন দেখুন, তারপর প্রমাণ বা অন্তত যুক্তি দিয়ে নিশ্চিত হন। বড় খেলায় (দাবা) পুরো game tree বানানো অসম্ভব, সেখানে minimax আর সীমিত গভীরতার খোঁজ লাগে, যা AI-এর ভিত্তি কোর্সের পর্ব ৪২-এ আছে।

মূল উপলব্ধি: খেলার অবস্থানের মান ছোট অবস্থান থেকে recursive ভাবে আসে, তাই খেলার প্রতিটি “জেতার কৌশল” প্রমাণ মূলত strong induction (বা well-founded induction).

প্র ০৫প্রতিটি ধনাত্মক পূর্ণসংখ্যা Fibonacci সংখ্যার যোগফল — Zeckendorf-এর উপপাদ্যে strong induction কীভাবে কাজ করে?

Fibonacci সংখ্যা F = 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … (প্রতিটি আগের দুটির যোগফল; এই গণনায় ১ একবারই)। দাবি: প্রতিটি ধনাত্মক পূর্ণসংখ্যাকে পরপর নয় এমন ভিন্ন ভিন্ন Fibonacci সংখ্যার যোগফল হিসেবে লেখা যায়, আর এমন লেখা একটিই। যেমন 100 = 89 + 8 + 3, 60 = 55 + 5 (scratch-এ Python-এ যাচাই করা)। প্রকাশের ইতিহাস নিয়ে সাধারণত বলা হয়, Belgian গণিতবিদ Édouard Zeckendorf ১৯৭২ সালে প্রকাশ করেন, যদিও C. G. Lekkerkerker ১৯৫২ সালেই ফলটি প্রকাশ করেছিলেন।

অস্তিত্বের প্রমাণ (strong induction, লোভী পদ্ধতি): n = 1, 2, 3 নিজেরাই Fibonacci. ধরি n-এর চেয়ে ছোট সব ধনাত্মক সংখ্যার এমন লেখা আছে। n Fibonacci হলে কাজ শেষ। নইলে Fj < n < Fj+1 এমন সবচেয়ে বড় Fj নিন। তাহলে m = n − Fj ধনাত্মক আর n-এর চেয়ে ছোট, তাই hypothesis অনুযায়ী m-এর লেখা আছে। আরও, m < Fj+1 − Fj = Fj−1, তাই m-এর লেখায় Fj−1 বা Fj আসতে পারে না; Fj যোগ করলেও “পরপর নয়” শর্ত টেকে। ∎

এখানে m = n − Fj n − 1 থেকে বহু দূরে হতে পারে (১০০ − ৮৯ = ১১), তাই strong hypothesis অপরিহার্য। অনন্যতার প্রমাণও strong induction-এ হয়, একটি অতিরিক্ত lemma দিয়ে: পরপর নয় এমন Fibonacci সংখ্যার যেকোনো যোগফল, যার বৃহত্তম পদ Fj, Fj+1-এর চেয়ে ছোট।

কম্পিউটারে: Zeckendorf-এর লেখা থেকে Fibonacci coding নামে একটি variable-length কোড আসে, যেখানে প্রতিটি কোডশব্দ “11” দিয়ে শেষ হয় (কারণ লেখায় পরপর দুটি ১ আসতে পারে না); এটি ডেটা সংকোচনের সাহিত্যে আলোচিত। আর লোভী algorithm-টি (সবচেয়ে বড়টি আগে নেওয়া) কেন ঠিক কাজ করে, তার প্রমাণই উপরের strong induction; সব মুদ্রা-ব্যবস্থায় লোভী পদ্ধতি সবচেয়ে কম মুদ্রা দেয় না, তাই এমন প্রমাণ জরুরি।

মূল উপলব্ধি: লোভী বা recursive একটি পদ্ধতি “বড় একটা অংশ নিয়ে বাকিটা আবার একই নিয়মে” কাজ করলে তার সঠিকতা প্রমাণের স্বাভাবিক ভাষা strong induction.

অনুশীলন

আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।

  1. প্রমাণ: বাজারঘরের উপহার-কুপন শুধু ৪ টাকা আর ৫ টাকার। Strong induction দিয়ে প্রমাণ করুন যে ১২ বা তার বেশি প্রতিটি অঙ্ক এই কুপনে ঠিক ঠিক দেওয়া যায়। কয়টি basis লাগবে, কেন? আর দেখান যে ১১ দেওয়া যায় না।

    P(n) = “n = 4x + 5y, x, y ≥ 0”. ধাপে n − 4 ব্যবহার করব, তাই চারটি পরপর basis লাগবে।

    1. Basis: 12 = 4 + 4 + 4, 13 = 4 + 4 + 5, 14 = 4 + 5 + 5, 15 = 5 + 5 + 5.
    2. Hypothesis: কোনো k ≥ 15-এর জন্য ১২ থেকে k পর্যন্ত সব অঙ্ক দেওয়া যায়।
    3. ধাপ: k + 1 ≥ 16, তাই (k + 1) − 4 = k − 3 ≥ 12, আর k − 3 ≤ k; hypothesis থেকে k − 3 দেওয়া যায়।
    4. সঙ্গে একটি ৪ টাকার কুপন যোগ করলে k + 1. Strong induction-এ সব n ≥ 12. ∎

    চারটি কেন: n = 13, 14, 15-এ n − 4 = 9, 10, 11, যা পরিসরের (≥ 12) বাইরে। ১১ অসম্ভব: y = 0 হলে 11/4 পূর্ণসংখ্যা নয়; y = 1 হলে 6 = 4x অসম্ভব; y = 2 হলে 1 = 4x অসম্ভব। এটি 4 · 5 − 4 − 5 = 11 সূত্রের সঙ্গে মেলে (scratch-এ Python-এ যাচাই করা)।

  2. হিসাব: (ক) ৫ আর ৭ টাকার টিকিটে সবচেয়ে বড় অসম্ভব অঙ্ক কত, আর মোট কয়টি অঙ্ক অসম্ভব? তালিকাটি লিখুন। (খ) কাঠির খেলায় এবার একবারে ১ থেকে ৪টি তোলা যায়, শেষ কাঠি যে তোলে সে জেতে। ২৩টি কাঠি থাকলে প্রথম চালে কয়টি তুলবেন? (গ) Division algorithm অনুযায়ী n = −17, d = 5-এর q আর r কত (0 ≤ r < 5)?

    (ক) সবচেয়ে বড় অসম্ভব 5 · 7 − 5 − 7 = 23; মোট (5 − 1)(7 − 1)/2 = 12টি: ১, ২, ৩, ৪, ৬, ৮, ৯, ১১, ১৩, ১৬, ১৮, ২৩ (Python-এর টেবিলের সঙ্গে মেলে)।

    (খ) ১–৪ তোলা গেলে হারা অবস্থান ৫-এর গুণিতক (উপপাদ্য ৬.১-এর একই প্রমাণ, ৪-এর জায়গায় ৫)। 23 mod 5 = 3, তাই ৩টি তুলে ২০ রাখুন। এরপর প্রতিপক্ষ m তুললে আপনি 5 − m তুলবেন; প্রতিটি জোড়া চালে ৫টি কমে, আর শেষ কাঠি আপনার।

    (গ) S-এর ক্ষুদ্রতম উপাদান: −17 − 5q ≥ 0 এমন q-এর মধ্যে q = −4 দেয় −17 + 20 = 3, আর q = −3 দেয় −2 < 0. তাই q = −4, r = 3: −17 = 5 · (−4) + 3. Python-এর divmod(-17, 5)-ও (-4, 3).

  3. আউটপুট অনুমান: একটি খেলায় একবারে ১, ৩ বা ৪টি কাঠি তোলা যায়, শেষ কাঠি যে তোলে সে জেতে। কোড না চালিয়ে বলুন কী ছাপা হবে, তারপর যেকোনো Python-এ চালিয়ে মেলান।
    from functools import lru_cache
    
    @lru_cache(maxsize=None)
    def wins(n):
        return any(not wins(n - m) for m in (1, 3, 4) if m <= n)
    
    print([n for n in range(15) if not wins(n)])
    print([m for m in (1, 3, 4) if not wins(10 - m)])
    [0, 2, 7, 9, 14]
    [1, 3]

    হাতে হিসাব (ছোট থেকে বড়): ০ L. ১ W (১ তুলে ০). ২ L (একমাত্র চাল ১, যায় ১-এ, যা W). ৩ W (৩ তুলে ০). ৪ W (৪ তুলে ০). ৫ W (৩ তুলে ২, যা L). ৬ W (৪ তুলে ২). ৭ L (যায় ৬, ৪, ৩, সব W). ৮ W (১ তুলে ৭). ৯ L (যায় ৮, ৬, ৫, সব W). ১০ থেকে ১৩ W, ১৪ L. প্যাটার্ন: n mod 7 ∈ {0, 2} হলে হারা। দ্বিতীয় লাইন: ১০ থেকে ১ তুললে ৯ (L), ৩ তুললে ৭ (L), ৪ তুললে ৬ (W); তাই জেতার চাল [1, 3]. প্রতিটি মান ছোট মানের ওপর দাঁড়িয়ে: এটিই strong induction-এর হিসাব।

  4. প্রমাণের ভুল ধরুন: Fibonacci সংখ্যা f(0) = 0, f(1) = 1, আর n ≥ 2-এ f(n) = f(n − 1) + f(n − 2). একজন লিখলেন: “দাবি: প্রতিটি n ≥ 0-এ f(n) জোড়। প্রমাণ: basis f(0) = 0, জোড়। Strong hypothesis: 0 ≤ j ≤ k সব j-এ f(j) জোড়। তাহলে f(k + 1) = f(k) + f(k − 1), দুটি জোড় সংখ্যার যোগফল, তাই জোড়। ∎” ভুল কোথায়?
    • ধাপটি k = 0-এ খাটে না: k + 1 = 1-এর জন্য f(1) = f(0) + f(−1) লেখা হয়েছে, কিন্তু recurrence শুধু n ≥ 2-এ সংজ্ঞায়িত, আর f(−1) সংজ্ঞায়িতই নয় (hypothesis-এর পরিসরের বাইরেও)। তাই f(1)-এর জন্য আলাদা basis লাগত।
    • সেই basis মিথ্যা: f(1) = 1, বিজোড়। তাই দাবিটিই মিথ্যা; ক্ষুদ্রতম counterexample n = 1. আসলে f(n) জোড় ঠিক তখন, যখন 3 ∣ n (০, ১, ১, ২, ৩, ৫, ৮, … তে জোড় পদ ০, ২, ৮, …)।

    শিক্ষা: ধাপে P(k) আর P(k − 1) দুটোই লাগলে দুটি basis লাগে (P(0), P(1)). অংশ ৫-এর টেবিলের দ্বিতীয় সারি।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি strong induction প্রমাণ লেখার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. দাবি P(n) আর শুরুর মান b স্পষ্ট করে লেখা
  2. ধাপে কত পেছনে যেতে হবে দেখে প্রয়োজনীয় সব basis case যাচাই করা
  3. Strong hypothesis: b ≤ j ≤ k সব j-এ P(j) সত্য ধরা
  4. P(k + 1)-কে ছোট মানের P(j) দিয়ে প্রকাশ করা, আর প্রতিটি j পরিসরে আছে কি না দেখা
  5. Strong induction-এর নীতিতে সব n ≥ b-তে P(n) সত্য বলে সিদ্ধান্ত

৩ আর ৫ টাকার টিকিটে n ≥ 8-এর প্রতিটি অঙ্ক বানানো যায়। Strong induction-এ ধাপটি “n টাকা = (n − 3) টাকা + একটি ৩ টাকার টিকিট” হলে ন্যূনতম কয়টি basis case লাগবে?

  • ১টি: n = 8
  • ২টি: n = 8, 9
  • ৩টি: n = 8, 9, 10
  • ৫টি: n = 8 থেকে 12

৪ টাকা আর ৯ টাকার টিকিট (যত খুশি) দিয়ে ঠিক ঠিক বানানো যায় না, এমন সবচেয়ে বড় অঙ্ক কত?

  • 23
  • 36
  • 13
  • 27

সাধারণ ≤ ক্রমে নিচের কোন সেটের প্রতিটি অশূন্য উপসেটে একটি ক্ষুদ্রতম উপাদান থাকে?

  • সব ধনাত্মক মূলদ সংখ্যা
  • {n ∈ ℤ : n ≥ −5}
  • সব পূর্ণসংখ্যা ℤ
  • 0 থেকে 1-এর সব বাস্তব সংখ্যা

২০টি কাঠি, পালা করে ১, ২ বা ৩টি তোলা যায়, শেষ কাঠি যে তোলে সে জেতে। প্রথম খেলোয়াড় প্রথম চালে কয়টি তুললে নিশ্চিত জিতবেন?

  • ১টি
  • ২টি
  • ৩টি
  • কোনোটিই নয়; প্রতিপক্ষ ঠিক খেললে প্রথমজন হারবেন

“২ বা তার বেশি প্রতিটি পূর্ণসংখ্যা মৌলিক সংখ্যার গুণফল” প্রমাণে শুধু P(n − 1) ধরে নেওয়া সাধারণ induction কেন অসুবিধাজনক?

  • n যৌগিক হলে n = a · b-এর a, b লাগে, যারা সাধারণত n − 1 নয়
  • কারণ এই দাবির কোনো basis নেই
  • কারণ দাবিটি কিছু n-এ মিথ্যা
  • কারণ মৌলিক সংখ্যা অসীম সংখ্যক

দাবি: a ≠ 0 হলে সব n ≥ 0-এ an = 1. “প্রমাণ”: basis a0 = 1; 0 থেকে k পর্যন্ত সত্য ধরে ak+1 = ak · ak / ak−1 = 1. ভুলটি কোথায়?

  • Basis a0 = 1 ভুল
  • ak−1 দিয়ে ভাগ করা নিষিদ্ধ
  • k = 0-এ ধাপটি a−1 ব্যবহার করে, যা hypothesis-এর পরিসরের বাইরে
  • Strong induction-এ ভাগ ব্যবহার করা যায় না

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Strong induction: basis, তারপর [P(b) ∧ … ∧ P(k)] → P(k + 1). সাধারণ induction-এর সমান শক্তি, শুধু hypothesis বড়।
  2. Basis-এর সংখ্যা: ধাপ যত ঘর পেছনে যায়, ততগুলো পরপর basis; সবচেয়ে ছোট k-এ ধাপ হাতে চালিয়ে দেখুন।
  3. ক্লাসিক প্রয়োগ: মৌলিক গুণফলে ভাঙন (অস্তিত্ব), ৩ আর ৫ টাকার টিকিট (n ≥ 8, Frobenius number ৭), কাঠির খেলা (৪ ∣ n হলে হার)।
  4. Well-ordering: ℕ-এর প্রতিটি অশূন্য উপসেটে ক্ষুদ্রতম আছে; induction-এর সমতুল্য। Division algorithm আর minimal counterexample এর সরাসরি প্রয়োগ।
  5. Python-এর জায়গা: ছোট মানে প্যাটার্ন আর প্রথম ব্যতিক্রম খোঁজা; প্রমাণ সবসময় আলাদা করে লিখতে হয়।

পরের পর্বে: Recursive সংজ্ঞা আর structural induction — Fibonacci আর gcd-এর মতো recursive function, balanced parentheses আর full binary tree-এর মতো recursive সেট, আর সেগুলোর ধর্ম প্রমাণের induction.

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান