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

Mathematical induction — এক ধাপ থেকে অসীম পর্যন্ত

Mathematical Induction — Basis, Inductive Step, Sums, Inequalities, Divisibility, Tromino Tilings and Flawed Proofs

Taught in Bangla, this lesson states the principle of induction, proves it from well-ordering, and gives full proofs for sums such as 1 + … + n and odd numbers, the inequality n! > 2ⁿ for n ≥ 4, divisibility like 3 ∣ n³ − n, and 2ⁿ subsets of a set. It turns the L-tromino tiling proof into an algorithm that in-page Python runs on an 8 × 8 board, dissects the "all horses are the same colour" fallacy, and links recursion correctness to induction.

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

  • Induction-এর নীতি, তার বৈধতার প্রমাণ, আর basis–hypothesis–step ছাঁচে প্রমাণ লেখা
  • যোগফল, অসমতা, বিভাজ্যতা আর সেট নিয়ে পূর্ণ, ধাপে ধাপে কারণসহ প্রমাণ
  • ছোট ক্ষেত্র Python-এ হিসাব করে সূত্র আবিষ্কার, তারপর পরিচ্ছন্ন প্রমাণ
  • L-tromino দিয়ে বোর্ড ঢাকার প্রমাণ, যা নিজেই একটি recursive algorithm
  • ভুল induction প্রমাণ ধরা, আর recursive কোডের সঠিকতা induction দিয়ে দেখানো

১ · ডমিনোর সারি — induction-এর নীতি আর কেন তা বৈধ

বাজারঘরের গুদামে প্রতিটি অর্ডারের একটি ক্রমিক id থাকে: 1, 2, 3, …. ধরুন দাবি করা হলো, “প্রথম n টি অর্ডারের id-এর যোগফল n(n+1)/2”. n = 1, 2, 3 বসিয়ে মিলিয়ে দেখা সহজ, কিন্তু অর্ডার তো অসীম পর্যন্ত চলতে পারে। প্রতিটি n আলাদা করে যাচাই করা কখনো শেষ হবে না। পর্ব ০১-এ দেখেছেন, n² + n + 41 প্রথম ৪০টি n-এ মৌলিক হয়েও n = 40-এ ভেঙে পড়ে। তাই অসীম সংখ্যক দাবির জন্য দরকার এমন একটি যুক্তি, যা একবারে সব n ঢাকে।

লম্বা একটি সারিতে ডমিনো দাঁড় করানো আছে। দুটি জিনিস নিশ্চিত হলে সব ডমিনো পড়বে: (১) প্রথম ডমিনোটিকে ধাক্কা দেওয়া হয়েছে; (২) ডমিনোগুলো এত কাছে যে যেকোনো একটি পড়লে ঠিক পরেরটিও পড়ে। কোনো ডমিনো আলাদা করে দেখার দরকার নেই। ঠিক এটিই mathematical induction.

ডমিনো আর induction-এর দুই ধাপ

Basis tips P(1); the step P(k) → P(k+1) passes the fall along

Dominoes: basis and inductive step P(1) P(2) P(3) P(4) P(5) P(6) … basis: প্রথমটি পড়ে step: P(k) → P(k+1) ⇒ সব n-এর জন্য P(n)
ছবি ১.১ — কমলা তীর basis, সবুজ তীরগুলো একই inductive step-এর বারবার ব্যবহার। Step একবার প্রমাণ করলেই সব সবুজ তীর একসঙ্গে প্রমাণিত।
নীতি · Principle of mathematical induction

ধরি P(n) স্বাভাবিক সংখ্যা n সম্পর্কে একটি বিবৃতি (পর্ব ০৪-এর propositional function). যদি

  1. Basis step: P(1) সত্য, এবং
  2. Inductive step: প্রতিটি k ≥ 1-এর জন্য P(k) → P(k+1) সত্য,

তবে প্রতিটি n ≥ 1-এর জন্য P(n) সত্য। অনুমানের নিয়ম হিসেবে (পর্ব ০৬): [P(1) ∧ ∀k (P(k) → P(k+1))] → ∀n P(n).

Mathematical induction-এর বাংলা নাম গাণিতিক আরোহ। নামে “induction” থাকলেও এটি বিজ্ঞানের “অনেক উদাহরণ দেখে সাধারণ সিদ্ধান্ত” নয়; এটি পুরোপুরি নিশ্চিত, deductive একটি প্রমাণ। Inductive step-এ P(k) সত্য ধরে নেওয়া হয়; এই অনুমানকে বলে inductive hypothesis. এটি “সব k-এর জন্য P(k) সত্য” ধরে নেওয়া নয়, যা হতো উপসংহারকেই ধরে নেওয়া। এটি শুধু একটি conditional P(k) → P(k+1) প্রমাণের সাধারণ কৌশল: শর্ত সত্য ধরে ফল দেখানো (পর্ব ০৮-এর direct proof).

নীতিটি কেন বৈধ — well-ordering থেকে প্রমাণ

স্বাভাবিক সংখ্যার একটি মৌলিক ধর্ম হলো well-ordering principle: ধনাত্মক পূর্ণসংখ্যার প্রতিটি অশূন্য উপসেটে একটি সবচেয়ে ছোট সদস্য থাকে। (বাস্তব সংখ্যায় এটি খাটে না: শূন্যের চেয়ে বড় বাস্তব সংখ্যার কোনো সবচেয়ে ছোটটি নেই।)

উপপাদ্য ১.১

Well-ordering principle মেনে নিলে induction-এর নীতি সত্য।

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

  1. S = {n ≥ 1 : P(n) মিথ্যা} সেটটি অশূন্য — ধরে নেওয়া অনুমান অনুযায়ী।
  2. Well-ordering অনুযায়ী S-এর একটি সবচেয়ে ছোট সদস্য m আছে।
  3. m ≠ 1, কারণ P(1) সত্য (basis). তাই m ≥ 2, অর্থাৎ m − 1 ≥ 1.
  4. m − 1 < m আর m সবচেয়ে ছোট, তাই m − 1 ∉ S; অর্থাৎ P(m − 1) সত্য।
  5. Inductive step-এ k = m − 1 বসালে P(m − 1) → P(m); ধাপ ৪-এর সঙ্গে modus ponens দিয়ে P(m) সত্য।
  6. কিন্তু m ∈ S মানে P(m) মিথ্যা। বিরোধ; তাই S ফাঁকা, আর সব n-এ P(n) সত্য। ∎

উল্টো দিকও প্রমাণ করা যায়: induction থেকে well-ordering আসে। দুটি একে অপরের সমতুল্য; সেই প্রমাণ আর well-ordering-এর সরাসরি ব্যবহার পর্ব ১১ “Strong induction আর well-ordering”-এ আসবে। শুরু 1 থেকেই হতে হবে, এমন কথা নেই: basis P(b) আর k ≥ b-এর জন্য step প্রমাণ করলে সব n ≥ b-এ P(n) সত্য।

২ · প্রমাণের ছাঁচ — basis, hypothesis আর step

প্রতিটি induction প্রমাণ একই কাঠামোয় লেখা যায়। পরীক্ষায় নম্বরও প্রায়ই এই কাঠামো ধরে দেওয়া হয়, তাই অংশগুলো স্পষ্ট নাম দিয়ে লেখার অভ্যাস করুন।

০ · দাবি

P(n) কী, আর কোন n থেকে, তা হুবহু লিখুন। যেমন “প্রতিটি n ≥ 1-এর জন্য P(n): …”.

১ · Basis

শুরুর মান (n = 1 বা b) বসিয়ে দুই পাশ আলাদা করে হিসাব করে সমান দেখান।

২ · Hypothesis

“ধরি একটি ইচ্ছামতো k ≥ 1-এর জন্য P(k) সত্য” — P(k) পুরোটা লিখে ফেলুন।

৩ · Step

P(k+1)-এর বাঁ পাশ থেকে শুরু করে P(k)-কে খুঁজে বের করুন, hypothesis বসান, ডান পাশে পৌঁছান।

প্রথম পূর্ণ উদাহরণ সেই অর্ডার-id-এর যোগফল। ∑ চিহ্নে লিখলে ∑i=1n i = n(n+1)/2. নিচের stepper-এ প্রতিটি লাইনের কারণ দেখুন; ডান পাশে k = 4 বসিয়ে একই ধাপগুলোর সংখ্যাগত রূপও আছে। “পরে” চাপুন:

1P(n): 1+…+n = n(n+1)/22basis: 1 = 1·2/23IH: 1+…+k = k(k+1)/241+…+k+(k+1)5 = k(k+1)/2 + (k+1)6 = (k+1)(k+2)/27∴ ∀n ≥ 1 P(n)  ∎
k = 4 দিয়ে মিলিয়ে দেখা
ধাপ
বাঁ পাশ
ডান পাশ
  1. দাবি লেখা। P(n): “1 + 2 + … + n = n(n+1)/2”, প্রতিটি n ≥ 1-এর জন্য। দুই পাশ কী, তা স্পষ্ট লেখা থাকলে basis আর step দুটিই যান্ত্রিক হয়ে যায়।
  2. Basis, n = 1. বাঁ পাশ শুধু একটি পদ: 1. ডান পাশ 1·2/2 = 1. সমান, তাই P(1) সত্য। দুই পাশ আলাদা করে হিসাব করাই নিরাপদ।
  3. Inductive hypothesis. ধরি একটি ইচ্ছামতো k ≥ 1-এর জন্য 1 + … + k = k(k+1)/2. উদাহরণে k = 4: 1+2+3+4 = 10 = 4·5/2. লক্ষ্য: 1 + … + (k+1) = (k+1)(k+2)/2.
  4. Step: P(k)-কে খুঁজে বের করা। P(k+1)-এর বাঁ পাশ = (1 + … + k) + (k+1). বন্ধনীর অংশটিই P(k)-এর বাঁ পাশ, তাই hypothesis বসিয়ে পাই k(k+1)/2 + (k+1). উদাহরণে 10 + 5.
  5. Step: বীজগণিত। (k+1) সাধারণ উৎপাদক: k(k+1)/2 + (k+1) = (k+1)(k/2 + 1) = (k+1)(k+2)/2. এটিই P(k+1)-এর ডান পাশ। উদাহরণে 10 + 5 = 15 = 5·6/2.
  6. উপসংহার। P(1) সত্য, আর প্রতিটি k ≥ 1-এ P(k) → P(k+1). Induction-এর নীতিতে সব n ≥ 1-এর জন্য P(n) সত্য। যেমন 1 + … + 100 = 100·101/2 = 5050. ∎

পরীক্ষার ধরনের একটি হিসাব: বাজারঘরের ৫১ নম্বর থেকে ১০০ নম্বর পর্যন্ত অর্ডারের id-এর যোগফল কত? সরাসরি সূত্র নেই, কিন্তু প্রমাণিত সূত্র দুবার খাটানো যায়: (1 + … + 100) − (1 + … + 50) = 5050 − 1275 = 3775. একইভাবে 1 + … + 250 = 250·251/2 = 31375. প্রমাণিত সূত্রের সুবিধা এটাই: একবার প্রমাণ হলে যেকোনো n-এ নিশ্চিন্তে বসানো যায়, আলাদা করে যাচাই লাগে না।

Step-এ সবচেয়ে সাধারণ ভুল: P(k+1)-এর সমীকরণটিকে শুরুতেই সত্য ধরে নিয়ে দুই পাশ সরল করতে করতে “0 = 0” পাওয়া, তারপর “প্রমাণিত” বলা। এটি যা প্রমাণ করার কথা, তাকেই ধরে নেওয়া (পর্ব ০৬-এর begging the question). সঠিক পথ: একটি পাশ থেকে শুরু করে সমান চিহ্নের শিকল দিয়ে অন্য পাশে পৌঁছানো, যেমন stepper-এ করা হলো।

৩ · যোগফল — আগে আবিষ্কার, তারপর প্রমাণ

Induction একটি সূত্র প্রমাণ করে, কিন্তু সূত্রটি খুঁজে দেয় না। সূত্র আসে ছোট ক্ষেত্র দেখে অনুমান থেকে। কাজের ক্রম তাই: ছোট n-এ হিসাব → প্যাটার্ন অনুমান → অনেক n-এ যন্ত্রে যাচাই → induction-এ প্রমাণ। নিচের ব্লক প্রথম তিন ধাপ করে। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

# ধাপ ১: ছোট n-এ বিজোড় সংখ্যার যোগফল দেখে প্যাটার্ন খোঁজা
for n in range(1, 7):
    odd = [2 * i - 1 for i in range(1, n + 1)]
    print(n, odd, "যোগফল =", sum(odd))

# ধাপ ২: অনুমান করা সূত্রগুলো n = 1..50 পর্যন্ত মিলিয়ে দেখা
claims = [
    ("1+2+...+n = n(n+1)/2",
     lambda n: sum(range(1, n + 1)), lambda n: n * (n + 1) // 2),
    ("1+3+...+(2n-1) = n^2",
     lambda n: sum(2 * i - 1 for i in range(1, n + 1)), lambda n: n * n),
    ("1+3+...+(2n-1) = 3n-2",
     lambda n: sum(2 * i - 1 for i in range(1, n + 1)), lambda n: 3 * n - 2),
    ("1+2+4+...+2^n = 2^(n+1)-1",
     lambda n: sum(2 ** i for i in range(n + 1)), lambda n: 2 ** (n + 1) - 1),
    ("1+3+9+...+3^n = (3^(n+1)-1)/2",
     lambda n: sum(3 ** i for i in range(n + 1)), lambda n: (3 ** (n + 1) - 1) // 2),
]
print()
for name, lhs, rhs in claims:
    bad = [n for n in range(1, 51) if lhs(n) != rhs(n)]
    if bad:
        print(f"{name:31} ভুল; প্রথম ব্যতিক্রম n = {bad[0]}")
    else:
        print(f"{name:31} n = 1..50-এ ঠিক")

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

1 [1] যোগফল = 1
2 [1, 3] যোগফল = 4
3 [1, 3, 5] যোগফল = 9
4 [1, 3, 5, 7] যোগফল = 16
5 [1, 3, 5, 7, 9] যোগফল = 25
6 [1, 3, 5, 7, 9, 11] যোগফল = 36

1+2+...+n = n(n+1)/2            n = 1..50-এ ঠিক
1+3+...+(2n-1) = n^2            n = 1..50-এ ঠিক
1+3+...+(2n-1) = 3n-2           ভুল; প্রথম ব্যতিক্রম n = 3
1+2+4+...+2^n = 2^(n+1)-1       n = 1..50-এ ঠিক
1+3+9+...+3^n = (3^(n+1)-1)/2   n = 1..50-এ ঠিক

যোগফলগুলো 1, 4, 9, 16, 25, 36: পূর্ণবর্গ। তাই অনুমান n². আরেকটি অনুমান 3n − 2 প্রথম দুটি মান (1 আর 4) মেলায়, কিন্তু n = 3-এ 7 দেয়, যেখানে আসল যোগফল 9: দুটি মিল দেখে সূত্র মেনে নেওয়া চলে না। বাকি চারটি সূত্র ৫০টি n-এ টিকে গেছে। এটি আত্মবিশ্বাস দেয়, প্রমাণ দেয় না; n = 51 বা n = 109 নিয়ে কিছুই বলে না। প্রমাণ নিচে।

উপপাদ্য ৩.১

প্রতিটি n ≥ 1-এর জন্য 1 + 3 + 5 + … + (2n − 1) = n².

প্রমাণ (induction): P(n) দিয়ে উপরের সমতাটি বোঝাই।

  1. Basis: n = 1-এ বাঁ পাশ 1, ডান পাশ 1² = 1. P(1) সত্য।
  2. Hypothesis: ধরি কোনো ইচ্ছামতো k ≥ 1-এর জন্য 1 + 3 + … + (2k − 1) = k².
  3. Step: P(k+1)-এর শেষ পদ 2(k+1) − 1 = 2k + 1. তাই বাঁ পাশ = [1 + … + (2k − 1)] + (2k + 1) — শুধু পদগুলো আলাদা করে লেখা।
  4. বন্ধনীর অংশে hypothesis বসিয়ে = k² + 2k + 1.
  5. k² + 2k + 1 = (k + 1)² — বর্গের সূত্র। এটিই P(k+1)-এর ডান পাশ।
  6. Basis আর step প্রমাণিত, তাই induction-এর নীতিতে সব n ≥ 1-এ P(n) সত্য। ∎

এই উপপাদ্যটিই ইতিহাসে বিখ্যাত: সিসিলির গণিতবিদ Francesco Maurolico ১৫৭৫ সালের Arithmeticorum libri duo বইয়ে বিজোড় সংখ্যার যোগফল n² দেখাতে induction-ধরনের যুক্তি ব্যবহার করেন বলে ইতিহাসবিদরা উল্লেখ করেন। একসময় তাঁকেই প্রথম ব্যবহারকারী ভাবা হতো; পরের গবেষণায় আরও আগের উদাহরণ পাওয়া গেছে (প্র ০২ দেখুন)।

এবার geometric series (গুণোত্তর ধারা), যেখানে প্রতিটি পদ আগেরটির r গুণ। বাজারঘরের একটি রেফারেল স্কিমে প্রথম দিন ১ জন গ্রাহক, প্রতিদিন নতুন গ্রাহক আগের দিনের দ্বিগুণ হলে n + 1 দিনে মোট 1 + 2 + … + 2ⁿ জন: ঠিক এই ধারা।

উপপাদ্য ৩.২

বাস্তব সংখ্যা r ≠ 1 আর প্রতিটি n ≥ 0-এর জন্য 1 + r + r² + … + rⁿ = (rⁿ⁺¹ − 1)/(r − 1).

প্রমাণ (induction, n = 0 থেকে):

  1. Basis n = 0: বাঁ পাশ শুধু r⁰ = 1; ডান পাশ (r − 1)/(r − 1) = 1, কারণ r ≠ 1 বলে হর শূন্য নয়।
  2. Hypothesis: ধরি কোনো k ≥ 0-এর জন্য 1 + r + … + rᵏ = (rᵏ⁺¹ − 1)/(r − 1).
  3. Step: 1 + … + rᵏ + rᵏ⁺¹ = (rᵏ⁺¹ − 1)/(r − 1) + rᵏ⁺¹ — hypothesis বসিয়ে।
  4. একই হরে এনে: = [rᵏ⁺¹ − 1 + rᵏ⁺² − rᵏ⁺¹]/(r − 1) = (rᵏ⁺² − 1)/(r − 1). এটিই P(k+1). ∎

r = 2 বসালে 1 + 2 + … + 2ⁿ = 2ⁿ⁺¹ − 1: n বিটের সব 1 দিয়ে তৈরি binary সংখ্যার মান। r = 1 কেন বাদ, ভাবুন: তখন হর শূন্য, আর যোগফল সরাসরি n + 1.

৪ · অসমতা — basis কোথা থেকে শুরু, সেটিই আসল প্রশ্ন

অসমতার প্রমাণে step-এ সমান চিহ্নের বদলে “>” বা “≥”-এর শিকল চলে, আর একটি নতুন প্রশ্ন আসে: দাবিটি কোন n থেকে সত্য? ভুল শুরুর মান বেছে নিলে প্রমাণ ভেঙে যায়।

উপপাদ্য ৪.১

প্রতিটি n ≥ 1-এর জন্য 2ⁿ > n.

  1. Basis: 2¹ = 2 > 1.
  2. Hypothesis: ধরি কোনো k ≥ 1-এ 2ᵏ > k.
  3. Step: 2ᵏ⁺¹ = 2 · 2ᵏ > 2k — hypothesis-কে ধনাত্মক 2 দিয়ে গুণ করলে অসমতা টেকে।
  4. 2k = k + k ≥ k + 1, কারণ k ≥ 1. তাই 2ᵏ⁺¹ > k + 1. ∎
উপপাদ্য ৪.২

প্রতিটি n ≥ 4-এর জন্য n! > 2ⁿ. (n! = 1·2·…·n)

প্রথমে খসড়া: n = 1, 2, 3-এ n! = 1, 2, 6 আর 2ⁿ = 2, 4, 8; দাবি মিথ্যা। n = 4-এ 24 > 16. তাই basis n = 4, আর step-এ k ≥ 4 ধরা যাবে।

  1. Basis n = 4: 4! = 24 > 16 = 2⁴.
  2. Hypothesis: ধরি কোনো k ≥ 4-এ k! > 2ᵏ.
  3. Step: (k+1)! = (k+1) · k! — factorial-এর সংজ্ঞা।
  4. (k+1) · k! > (k+1) · 2ᵏ — hypothesis-কে ধনাত্মক k + 1 দিয়ে গুণ।
  5. (k+1) · 2ᵏ ≥ 2 · 2ᵏ = 2ᵏ⁺¹, কারণ k + 1 ≥ 2. মিলিয়ে (k+1)! > 2ᵏ⁺¹. ∎

মজার ব্যাপার: step-টি আসলে k ≥ 1 থেকেই খাটে (ধাপ ৫-এ শুধু k + 1 ≥ 2 লেগেছে)। দাবিটি n = 1, 2, 3-এ মিথ্যা হয়েও প্রমাণ সম্ভব হলো, কারণ ডমিনোর সারি শুরু হলো চতুর্থটি থেকে। শিক্ষা: step খাটলেই হবে না, basis-ও সঠিক জায়গায় চাই। Step সত্য অথচ basis মিথ্যা হলে কী ঘটে, অনুশীলন ৩-এ দেখবেন।

উপপাদ্য ৪.৩ (Bernoulli-র অসমতা)

বাস্তব সংখ্যা x > −1 আর প্রতিটি n ≥ 0-এর জন্য (1 + x)ⁿ ≥ 1 + nx.

বাজারঘরের ভাষায়: প্রতি মাসে বিক্রি x অংশ বাড়লে (যেমন x = 0.1 মানে ১০%), n মাস পরে চক্রবৃদ্ধি হারে বৃদ্ধি অন্তত সরল হারের বৃদ্ধির সমান। এখানে induction চলে n-এর ওপর, আর x একটি নির্দিষ্ট কিন্তু ইচ্ছামতো বাস্তব সংখ্যা।

  1. Basis n = 0: বাঁ পাশ (1 + x)⁰ = 1, ডান পাশ 1 + 0 = 1; 1 ≥ 1 সত্য।
  2. Hypothesis: ধরি কোনো k ≥ 0-এ (1 + x)ᵏ ≥ 1 + kx.
  3. Step: (1 + x)ᵏ⁺¹ = (1 + x)ᵏ · (1 + x) — ঘাতের নিয়ম।
  4. x > −1 বলে 1 + x > 0; ধনাত্মক সংখ্যা দিয়ে গুণ করলে ≥ টেকে, তাই (1 + x)ᵏ⁺¹ ≥ (1 + kx)(1 + x). শর্ত x > −1 ঠিক এখানেই লাগল।
  5. (1 + kx)(1 + x) = 1 + (k + 1)x + kx² ≥ 1 + (k + 1)x, কারণ kx² ≥ 0. ∎

শর্তটি কেন দরকার, একটি counterexample দেখায়: x = −3, n = 3 নিলে (1 − 3)³ = −8, অথচ 1 + 3·(−3) = −8; সমান, ভাঙেনি। কিন্তু n = 5-এ (−2)⁵ = −32 আর 1 − 15 = −14, তাই −32 ≥ −14 মিথ্যা। Hypothesis-এর প্রতিটি শর্ত step-এর কোন লাইনে লাগে, তা চিহ্নিত করার অভ্যাস এই কারণেই জরুরি।

৫ · বিভাজ্যতা — P(k+1)-এর ভেতরে P(k)-কে খুঁজে বের করা

a ∣ b (পড়া হয় “a ভাগ করে b”) মানে এমন পূর্ণসংখ্যা c আছে যাতে b = a·c; এটিই divisibility. বিভাজ্যতার induction-এ কৌশল একটাই: P(k+1)-এর রাশিকে “P(k)-এর রাশি + এমন কিছু যা স্পষ্টতই বিভাজ্য” আকারে ভাঙা।

উপপাদ্য ৫.১

প্রতিটি পূর্ণসংখ্যা n ≥ 0-এর জন্য 3 ∣ (n³ − n).

  1. Basis n = 0: 0³ − 0 = 0 = 3 · 0, তাই 3 ∣ 0.
  2. Hypothesis: ধরি কোনো k ≥ 0-এ k³ − k = 3m, কোনো পূর্ণসংখ্যা m-এর জন্য।
  3. Step: (k+1)³ − (k+1) = k³ + 3k² + 3k + 1 − k − 1 — ঘনের বিস্তার।
  4. = (k³ − k) + 3(k² + k) — পদ সাজিয়ে P(k)-এর রাশি আলাদা করা।
  5. = 3m + 3(k² + k) = 3(m + k² + k) — hypothesis বসিয়ে। m + k² + k পূর্ণসংখ্যা, তাই 3 ∣ (k+1)³ − (k+1). ∎

এই প্রমাণ induction ছাড়াও হয়: n³ − n = (n − 1)n(n + 1), পরপর তিনটি পূর্ণসংখ্যার গুণফল, যাদের একটি 3-এর গুণিতক। একই উপপাদ্যের দুই প্রমাণ জানা ভালো; পর্ব ০৯-এ এমন case-ভিত্তিক যুক্তি দেখেছেন।

উপপাদ্য ৫.২

প্রতিটি n ≥ 0-এর জন্য 5 ∣ (7ⁿ − 2ⁿ).

  1. Basis n = 0: 7⁰ − 2⁰ = 1 − 1 = 0, যা 5 দিয়ে বিভাজ্য।
  2. Hypothesis: ধরি কোনো k ≥ 0-এ 7ᵏ − 2ᵏ = 5m.
  3. Step: 7ᵏ⁺¹ − 2ᵏ⁺¹ = 7 · 7ᵏ − 2 · 2ᵏ = 7 · 7ᵏ − 7 · 2ᵏ + 7 · 2ᵏ − 2 · 2ᵏ — একই রাশি যোগ-বিয়োগ (মূল কৌশল)।
  4. = 7(7ᵏ − 2ᵏ) + 5 · 2ᵏ — উৎপাদক বের করে।
  5. = 7 · 5m + 5 · 2ᵏ = 5(7m + 2ᵏ) — hypothesis বসিয়ে। তাই 5 ∣ 7ᵏ⁺¹ − 2ᵏ⁺¹. ∎

ধাপ ৩-এর “7 · 2ᵏ যোগ-বিয়োগ” কোথা থেকে এলো? খসড়ায় প্রশ্ন করুন: 7ᵏ⁺¹ − 2ᵏ⁺¹-এর ভেতরে 7ᵏ − 2ᵏ কীভাবে আনা যায়? 7 দিয়ে গুণ করলে 7ᵏ⁺¹ − 7 · 2ᵏ পাওয়া যায়; বাকি ফারাক 7 · 2ᵏ − 2 · 2ᵏ = 5 · 2ᵏ, যা 5-এর গুণিতক। প্রমাণ এভাবেই আবিষ্কার হয়, পরে গুছিয়ে লেখা হয়। পর্ব ২২ “Modular arithmetic”-এ দেখবেন, 7 ≡ 2 (mod 5) বলে 7ⁿ ≡ 2ⁿ (mod 5): একই ফল এক লাইনে।

৬ · সেটের ওপর induction — power set-এ 2ⁿ টি subset

বাজারঘরের “কম্বো অফার” বানাতে একটি তালিকার পণ্য থেকে যেকোনো সংগ্রহ বেছে নেওয়া যায়, কিছু না নেওয়াও একটি সংগ্রহ। n টি পণ্য থেকে কতগুলো সংগ্রহ? একটি সেট S-এর সব subset-এর সেটকে বলে power set P(S). (P অক্ষরটি এখানে power set; induction-এর P(n)-এর সঙ্গে গুলিয়ে ফেলবেন না।) সেটের বিস্তারিত পর্ব ১৪ “সেট — সংজ্ঞা, subset, power set আর Cartesian product”-এ আসবে।

উপপাদ্য ৬.১

n টি উপাদানের যেকোনো সসীম সেট S-এর জন্য |P(S)| = 2ⁿ (n ≥ 0).

প্রমাণ (উপাদানের সংখ্যা n-এর ওপর induction):

  1. Basis n = 0: S = ∅, যার একমাত্র subset ∅ নিজে। |P(∅)| = 1 = 2⁰.
  2. Hypothesis: ধরি k টি উপাদানের প্রতিটি সেটের ঠিক 2ᵏ টি subset আছে।
  3. Step: ধরি |S| = k + 1. S থেকে একটি উপাদান a বেছে নিই, আর T = S − {a}; তখন |T| = k.
  4. S-এর প্রতিটি subset হয় a ধারণ করে না, নয়তো করে; দুই দল পরস্পর আলাদা।
  5. যে subset-এ a নেই, তারা ঠিক T-এর subset; hypothesis অনুযায়ী এরা 2ᵏ টি।
  6. যে subset-এ a আছে, তার থেকে a সরালে T-এর একটি subset পাওয়া যায়, আর T-এর প্রতিটি subset-এ a যোগ করলে এমন একটি subset ফেরত আসে। এই এক-এক মিল থেকে এরাও 2ᵏ টি।
  7. মোট 2ᵏ + 2ᵏ = 2ᵏ⁺¹. ∎

খেয়াল করুন, hypothesis-এ “k টি উপাদানের প্রতিটি সেট” বলা জরুরি, কারণ step-এ T একটি নির্দিষ্ট সেট নয়, S থেকে তৈরি যেকোনো সেট। এই প্রমাণটি একটি algorithm-ও বলে দেয়: T-এর সব subset বানান, তারপর প্রতিটির একটি a-সহ কপি জুড়ে দিন। নিচের ব্লকের subsets ফাংশন ঠিক তাই করে, সঙ্গে আগের অংশের অসমতা আর বিভাজ্যতাও যাচাই করে:

from math import factorial

# অসমতা: n! > 2^n কোন n থেকে শুরু হয়?
print(" n   n!  2^n  n! > 2^n")
for n in range(1, 7):
    print(f"{n:2} {factorial(n):4} {2**n:4}  {factorial(n) > 2**n}")
print("n = 4..50:", all(factorial(n) > 2**n for n in range(4, 51)))

# বিভাজ্যতা: n = 0..50
print("3 | n^3 - n  :", all((n**3 - n) % 3 == 0 for n in range(51)))
print("5 | 7^n - 2^n:", all((7**n - 2**n) % 5 == 0 for n in range(51)))

# Power set: recursive সংজ্ঞা, প্রমাণের ধাপের হুবহু প্রতিচ্ছবি
def subsets(items):
    if not items:                 # basis: ফাঁকা সেটের subset শুধু {}
        return [[]]
    first, rest = items[0], items[1:]
    without = subsets(rest)       # অনুমান: rest-এর সব subset
    with_first = [[first] + s for s in without]
    return without + with_first   # দ্বিগুণ হলো

print(subsets(["চাল", "ডাল", "তেল"]))
for n in range(7):
    print(n, len(subsets(list(range(n)))), 2**n)

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

 n   n!  2^n  n! > 2^n
 1    1    2  False
 2    2    4  False
 3    6    8  False
 4   24   16  True
 5  120   32  True
 6  720   64  True
n = 4..50: True
3 | n^3 - n  : True
5 | 7^n - 2^n: True
[[], ['তেল'], ['ডাল'], ['ডাল', 'তেল'], ['চাল'], ['চাল', 'তেল'], ['চাল', 'ডাল'], ['চাল', 'ডাল', 'তেল']]
0 1 1
1 2 2
2 4 4
3 8 8
4 16 16
5 32 32
6 64 64

টেবিল দেখাচ্ছে n! > 2ⁿ প্রথম সত্য হয় n = 4-এ, তাই উপপাদ্য ৪.২-এর basis n = 4. দুটি বিভাজ্যতা ৫১টি মানে টিকেছে। চাল-ডাল-তেলের ৮টি subset-এর প্রথম চারটিতে “চাল” নেই (এরা ডাল-তেলের ৪টি subset), পরের চারটিতে আছে: প্রমাণের ধাপ ৫ আর ৬ হুবহু। শেষ টেবিলে গোনা আর 2ⁿ সব সারিতে সমান।

৭ · L-tromino দিয়ে বোর্ড ঢাকা — প্রমাণ যখন নিজেই algorithm

বাজারঘরের গুদামের মেঝে 8 × 8 বর্গাকার টাইলের ঘরে ভাগ করা। একটি ঘরে একটি পিলার দাঁড়িয়ে, বাকি ৬৩টি ঘর L আকৃতির তাক দিয়ে ঢাকতে হবে, কোনো ফাঁক বা ওভারল্যাপ ছাড়া। প্রতিটি তাক একটি L-tromino: তিনটি বর্গ জুড়ে L আকৃতি, অর্থাৎ ২×২ বর্গ থেকে একটি ঘর বাদ। পিলার যেখানেই থাকুক, এটি কি সবসময় সম্ভব?

উপপাদ্য ৭.১ (Golomb, ১৯৫৪)

প্রতিটি n ≥ 1-এর জন্য, 2ⁿ × 2ⁿ বোর্ড থেকে যেকোনো একটি ঘর সরালে বাকি অংশ (একটি deficient board) L-tromino দিয়ে পুরো ঢাকা যায়।

আগে একটি সহজ যাচাই: ঘরের সংখ্যা 4ⁿ − 1, আর প্রতিটি tromino ৩টি ঘর নেয়, তাই 3 ∣ 4ⁿ − 1 হতেই হবে। এটিও induction-এ প্রমাণ করা যায় (উপপাদ্য ৫.২-এর কৌশলে), আর 8 × 8-এ (64 − 1)/3 = 21টি tromino লাগবে।

প্রমাণ:

  1. Basis n = 1: 2 × 2 বোর্ড থেকে একটি ঘর সরালে বাকি তিন ঘর নিজেই একটি L-tromino.
  2. Hypothesis: ধরি কোনো k ≥ 1-এর জন্য 2ᵏ × 2ᵏ মাপের প্রতিটি deficient board, সরানো ঘর যেখানেই থাকুক, ঢাকা যায়।
  3. Step: একটি 2ᵏ⁺¹ × 2ᵏ⁺¹ বোর্ড নিই, একটি ঘর সরানো। মাঝখান দিয়ে দুটি রেখা টেনে বোর্ডটিকে চারটি 2ᵏ × 2ᵏ ভাগে কাটি। সরানো ঘরটি ঠিক একটি ভাগে পড়ে।
  4. বাকি তিন ভাগের প্রতিটির যে কোণটি বোর্ডের কেন্দ্র ছোঁয়, সেই তিনটি ঘর মিলে একটি L-tromino; সেটি বসাই।
  5. এখন চারটি ভাগের প্রতিটি 2ᵏ × 2ᵏ মাপের, আর প্রতিটিতে ঠিক একটি ঘর আগে থেকেই ঢাকা বা সরানো। তাই প্রতিটি একটি deficient board, আর hypothesis অনুযায়ী প্রতিটি ঢাকা যায়।
  6. চার ভাগের ঢাকনা আর মাঝের tromino মিলে পুরো বোর্ড ঢাকা। ∎

Inductive step-এর এক ছবি

One centre L makes all four quarters deficient boards

Inductive step of the tromino tiling 2ᵏ × 2ᵏ 2ᵏ × 2ᵏ 2ᵏ × 2ᵏ 2ᵏ × 2ᵏ অনুমান খাটে ■ সরানো ঘর অনুমান খাটে অনুমান খাটে মাঝের কমলা L = নতুন tromino
ছবি ৭.১ — সরানো ঘরটি যে ভাগে পড়েছে, সেটি বাদে বাকি তিন ভাগের কেন্দ্র-কোণ মিলে একটি L. তারপর চারটি ভাগই ছোট মাপের deficient board, তাই hypothesis চারবার খাটে।

প্রমাণটি সরাসরি একটি recursive algorithm: “ভাগ করুন, মাঝে L বসান, প্রতিটি ভাগে একই কাজ”। 4 × 4 বোর্ডে, যেখানে সারি ২, কলাম ৩-এর ঘর (X) সরানো, পুরো কাজটি ধাপে ধাপে দেখুন:

1def tile(board, hole):2  if size == 1: return3  split into 4 quarters4  put one L at the centre5  for q in quarters: tile(q)
বোর্ড (X = সরানো ঘর)
বোর্ড
tromino
  1. শুরু। 4 × 4 = 2² × 2² বোর্ড, সারি ২ কলাম ৩-এর ঘর সরানো (X). ঢাকতে হবে ১৫টি ঘর, অর্থাৎ ৫টি tromino.
  2. চার ভাগে কাটা। প্রতিটি ভাগ 2 × 2. X পড়েছে ওপরের ডান ভাগে; বাকি তিন ভাগে এখনো কোনো ফাঁকা ঘর নেই।
  3. কেন্দ্রে L বসানো (A). ওপর-বাম ভাগের নিচ-ডান কোণ, নিচ-বাম ভাগের ওপর-ডান কোণ আর নিচ-ডান ভাগের ওপর-বাম কোণ: এই তিন ঘর মিলে একটি L. এখন চারটি ভাগের প্রতিটিতে ঠিক একটি ঘর ভরা।
  4. ওপর-বাম ভাগে recursion (B). এটি একটি 2 × 2 deficient board (A একটি ঘর নিয়েছে)। Basis: বাকি তিন ঘর নিজেই একটি L.
  5. ওপর-ডান ভাগ (C). এখানে ফাঁকা ঘর আসল X. বাকি তিন ঘর আরেকটি L.
  6. নিচ-বাম ভাগ (D). A একটি ঘর নিয়েছে, বাকি তিন ঘর D.
  7. নিচ-ডান ভাগ (E), শেষ। ৫টি tromino, প্রতিটি ৩ ঘর: ১৫টি ঘর ঢাকা, ফাঁক নেই। বড় বোর্ডে একই কাজ আরও এক স্তর গভীরে চলে; 2ⁿ × 2ⁿ বোর্ডে recursion-এর গভীরতা n.

এবার আসল 8 × 8 গুদাম, পিলার সারি ৬, কলাম ৩-এ (০ থেকে গুনলে (5, 2)). নিচের প্রোগ্রাম প্রমাণের ধাপগুলোই চালায় আর বোর্ড ছাপে; প্রতিটি অক্ষর একটি tromino, “.” পিলার:

from string import ascii_uppercase

def tile(board, top, left, size, hr, hc, names):
    # (top, left) কোণের size×size অংশ; (hr, hc) ঘরটি আগেই ভরা বা ফাঁকা
    if size == 1:
        return                      # basis: ১×১, কিছু বসানোর নেই
    h = size // 2
    piece = next(names)
    quads = [(top, left), (top, left + h), (top + h, left), (top + h, left + h)]
    middle = [(top + h - 1, left + h - 1), (top + h - 1, left + h),
              (top + h, left + h - 1), (top + h, left + h)]
    for (qr, qc), (mr, mc) in zip(quads, middle):
        if qr <= hr < qr + h and qc <= hc < qc + h:
            tile(board, qr, qc, h, hr, hc, names)   # ফাঁকা ঘর এই ভাগে
        else:
            board[mr][mc] = piece                   # মাঝের L-এর একটি ঘর
            tile(board, qr, qc, h, mr, mc, names)

N, hole = 8, (5, 2)
board = [["." for _ in range(N)] for _ in range(N)]
names = iter(ascii_uppercase)
tile(board, 0, 0, N, *hole, names)
for row in board:
    print(" ".join(row))

cells = [x for row in board for x in row if x != "."]
used = sorted(set(cells))
print("tromino:", len(used), "| প্রতিটির ঘর:", {cells.count(c) for c in used})
L = all(len({r for r, c in p}) == 2 and len({c for r, c in p}) == 2
        for p in ([(i, j) for i in range(N) for j in range(N) if board[i][j] == x] for x in used))
print("সব L-আকৃতির?", L)
print("ফাঁকা ঘর:", sum(row.count(".") for row in board), "| (64-1)/3 =", (N * N - 1) // 3)

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

C C D D H H I I
C B B D H G G I
E B F F J J G K
E E F A A J K K
M M N N A R S S
M L . N R R Q S
O L L P T Q Q U
O O P P T T U U
tromino: 21 | প্রতিটির ঘর: {3}
সব L-আকৃতির? True
ফাঁকা ঘর: 1 | (64-1)/3 = 21

কেন্দ্রের চারটি ঘর দেখুন: A তিনটি ঘর নিয়েছে (সারি ৪-এর কলাম ৪-৫ আর সারি ৫-এর কলাম ৫), আর চতুর্থ কেন্দ্র-ঘরটি নিচ-বাম ভাগের, যেখানে পিলার আছে; ঠিক প্রমাণের ধাপ ৪। তারপর প্রতিটি 4 × 4 ভাগ নিজের কেন্দ্রে একটি L নিয়েছে (B, G, L, Q). ২১টি tromino, প্রতিটি ঠিক ৩ ঘরের আর L-আকৃতির (৩টি ঘর, যাদের সারি আর কলাম দুটিই ঠিক দুই রকম), একটিমাত্র ফাঁকা ঘর: পিলার। hole বদলে অন্য ঘরে পিলার বসিয়ে চালান; প্রতিবার ঢাকনা হবে, কারণ উপপাদ্য তা-ই বলে। এখানে <= হলো ≤.

৮ · ভুল induction — “সব ঘোড়ার রং এক” আর অন্য ফাঁদ

Induction-এর কাঠামো এত পরিষ্কার যে ভুল প্রমাণও সহজে বিশ্বাসযোগ্য দেখায়। সবচেয়ে বিখ্যাত উদাহরণ:

“দাবি”: যেকোনো n ≥ 1 টি ঘোড়ার দলে সব ঘোড়ার রং এক। “প্রমাণ”: n = 1-এ স্পষ্ট। ধরি যেকোনো k টি ঘোড়ার দলে সবার রং এক। এখন k + 1 টি ঘোড়া h1, …, hk+1 নিই। শেষটি বাদ দিলে A = {h1, …, hk}, k টি ঘোড়া, তাই এক রং। প্রথমটি বাদ দিলে B = {h2, …, hk+1}, এরাও এক রং। দুই দলের মাঝের ঘোড়াগুলো দুই দলেই আছে, তাই A আর B-এর রং এক, অর্থাৎ সব k + 1 টি এক রং। ∎?

সিদ্ধান্তটি নিশ্চিতভাবে মিথ্যা: একটি কালো আর একটি সাদা ঘোড়াই counterexample. তাহলে ভুলটা কোথায়? Basis ঠিক, hypothesis ঠিকভাবে লেখা। সমস্যা step-এর “প্রতিটি k ≥ 1” অংশে। Stepper-এ খুঁজুন:

1P(n): যেকোনো n ঘোড়া এক রং2basis: n = 1 ✓3IH: যেকোনো k ঘোড়া এক রং4A = h1..hk, B = h2..hk+15A এক রং, B এক রং (IH)6মিল ঘোড়া দিয়ে A = B রং
এই ধাপে
k + 1
A
B
A ∩ B
  1. দাবি। P(n): “যেকোনো n টি ঘোড়ার দলে সবার রং এক”। প্রমাণ ঠিক হতে হলে basis আর প্রতিটি k ≥ 1-এর step দুটিই ঠিক হতে হবে।
  2. Basis. একটি ঘোড়ার দলে “সবার রং এক” স্পষ্টতই সত্য। এখানে ভুল নেই।
  3. k = 3, অর্থাৎ ৪টি ঘোড়া। A = {1, 2, 3}, B = {2, 3, 4}. দুই দলে মিল ঘোড়া 2 আর 3; A-এর রং = 2-এর রং = B-এর রং। এখানে লাইন ৬-এর যুক্তি ঠিকই খাটে।
  4. k = 1, অর্থাৎ ২টি ঘোড়া। A = শেষটি বাদ = {1}, B = প্রথমটি বাদ = {2}. প্রতিটি একা, তাই “এক রং” — hypothesis ঠিকই খাটে।
  5. লাইন ৬ ভেঙে পড়ল। A ∩ B = ∅: দুই দলের মাঝে কোনো মিল ঘোড়া নেই। “মাঝের ঘোড়া দিয়ে রং জোড়া লাগানো” অসম্ভব। ঘোড়া 1 কালো আর ঘোড়া 2 সাদা হতে পারে।
  6. রায়। P(1) → P(2) প্রমাণ হয়নি (আসলে মিথ্যা)। Step শুধু k ≥ 2-এ খাটে, কিন্তু ডমিনো ১ থেকে ২-এ পড়ে না, তাই পরের কোনো ডমিনোও পড়ে না। “Step-টি সব k-এ খাটে” — এই দাবিটিই লুকানো ভুল।

একই পরীক্ষা যন্ত্রে: প্রতিটি k + 1-এর জন্য দুই দল আর তাদের মিল ছাপি।

# "সব ঘোড়ার রং এক" প্রমাণের inductive step যন্ত্রে খোলা
def step(m):                       # m = k + 1টি ঘোড়া
    horses = list(range(1, m + 1))
    a = horses[:-1]                # শেষটি বাদ: k টি
    b = horses[1:]                 # প্রথমটি বাদ: k টি
    common = sorted(set(a) & set(b))
    return a, b, common

for m in range(2, 6):
    a, b, common = step(m)
    verdict = "রং জোড়া লাগে" if common else "কোনো সেতু নেই!"
    print(f"k+1 = {m}: A = {a}, B = {b}, মিল = {common} -> {verdict}")

# দাবিটি নিজেই মিথ্যা: দুটি ঘোড়ার একটি counterexample
colours = {1: "কালো", 2: "সাদা"}
print("২টি ঘোড়া:", colours, "| সব এক রং?", len(set(colours.values())) == 1)

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

k+1 = 2: A = [1], B = [2], মিল = [] -> কোনো সেতু নেই!
k+1 = 3: A = [1, 2], B = [2, 3], মিল = [2] -> রং জোড়া লাগে
k+1 = 4: A = [1, 2, 3], B = [2, 3, 4], মিল = [2, 3] -> রং জোড়া লাগে
k+1 = 5: A = [1, 2, 3, 4], B = [2, 3, 4, 5], মিল = [2, 3, 4] -> রং জোড়া লাগে
২টি ঘোড়া: {1: 'কালো', 2: 'সাদা'} | সব এক রং? False

ভুলটি ঠিক একটি জায়গায়: k + 1 = 2. তার পর থেকে সব ধাপ খাটে, কিন্তু শিকলের প্রথম আংটা ভাঙা। শিক্ষা: step-এর প্রতিটি যুক্তি (এখানে “মিল ঘোড়া আছে”) সবচেয়ে ছোট k-তে আলাদা করে পরীক্ষা করুন। Python-এ ছোট ক্ষেত্রগুলো এক এক করে খুলে দেখা এ কাজে খুব কার্যকর।

আরও তিনটি সাধারণ ভুল

  • Basis বাদ দেওয়া: “2 ∣ (n² + n + 1)” দাবির step নিখুঁতভাবে খাটে, অথচ দাবিটি কোনো n-এই সত্য নয় (অনুশীলন ৩)। Step শুধু বলে “একটি পড়লে পরেরটি পড়ে”; প্রথমটিকে কেউ না ফেললে কিছুই পড়ে না।
  • P(k+1) দিয়ে শুরু করা: P(k+1)-কে সত্য ধরে সরল করতে করতে একটি সত্য বাক্যে পৌঁছানো (২ নম্বর অংশের সতর্কবার্তা)। প্রতিটি ধাপ উল্টানো যায় এমন হলে সেটিকে উল্টো ক্রমে লিখে প্রমাণ বানানো যায়; নইলে সেটি প্রমাণই নয়। একটি সতর্ক উদাহরণ: “x = 1” থেকে দুই পাশ বর্গ করলে x² = 1, যা সত্য; কিন্তু x² = 1 থেকে x = 1 ফেরত আসে না (x = −1-ও হয়)। অর্থাৎ সত্য উপসংহারে পৌঁছানো শুরুর বাক্যকে সত্য করে না।
  • Hypothesis-কে সব k-এ ধরে নেওয়া: “ধরি সব n-এ P(n) সত্য” লিখলে উপসংহারটিই ধরে নেওয়া হলো। লিখতে হবে “একটি ইচ্ছামতো k-এর জন্য P(k)”.

৯ · প্রোগ্রামিংয়ে induction — recursion আর তার সঠিকতা

Recursion মানে একটি ফাংশন নিজেকেই ছোট ইনপুট দিয়ে ডাকে, আর সবচেয়ে ছোট ইনপুটে, অর্থাৎ base case-এ, সরাসরি উত্তর দেয়। Induction আর recursion একই ধারণার দুই রূপ:

Induction প্রমাণRecursive ফাংশন
Basis: P(0) সরাসরি সত্যBase case: if not items: return [[]]
Hypothesis: P(k) সত্য ধরে নেওয়াছোট ইনপুটে নিজের ডাক ঠিক উত্তর দেয় বলে ধরে নেওয়া
Step: P(k) থেকে P(k+1)ছোট উত্তর থেকে বড় উত্তর বানানো
Basis না থাকলে প্রমাণ ভাঙেBase case না থাকলে অসীম recursion

ফলে recursive কোড ঠিক কি না, তার স্বাভাবিক প্রমাণ induction. ৬ নম্বর অংশের subsets ফাংশনের দাবি: “n টি উপাদানের তালিকা দিলে এটি প্রতিটি subset ঠিক একবার করে ফেরত দেয়”। প্রমাণ উপপাদ্য ৬.১-এর হুবহু: n = 0-এ [[]], আর ধরে নিলে যে subsets(rest) ঠিক, তখন without হলো first-বিহীন সব subset আর with_first হলো first-সহ সব subset, দুই দলে কোনো মিল নেই। বাজারঘরের অ্যাপে ক্যাটাগরির ভেতরে ক্যাটাগরি (ইলেকট্রনিক্স → মোবাইল → চার্জার) দেখানোর recursive মেনুও একইভাবে প্রমাণ করা যায়, তবে সেখানে induction সংখ্যার ওপর নয়, গাছের গঠনের ওপর চলে; একে বলে structural induction, যা পর্ব ১২ “Recursive সংজ্ঞা আর structural induction”-এ আসবে।

Python-এ recursion কীভাবে লেখা হয় আর call stack-এ কী ঘটে, তা Python প্রোগ্রামিং কোর্সের পর্ব ১৩-এ আছে; algorithm হিসেবে recursion DSA কোর্সের পর্ব ০৭-এ। Recursive algorithm আর loop-এর সঠিকতা induction ও loop invariant দিয়ে প্রমাণের algorithm-দিক DSA কোর্সের পর্ব ০৩-এ; তার পেছনের যুক্তিবিদ্যা (Hoare logic) পর্ব ১৩ “Program-এর সঠিকতা”-তে আসবে। কিছু recursion-এ k + 1-এর উত্তরের জন্য শুধু k নয়, আগের অনেক মান লাগে (যেমন Fibonacci); তখন দরকার strong induction, পর্ব ১১-এর বিষয়।

আরও গভীরে: আধুনিক গণিতে induction প্রমাণ করা হয় না, স্বাভাবিক সংখ্যার সংজ্ঞার অংশ হিসেবে মেনে নেওয়া হয়: এটি Peano axioms-এর একটি (Dedekind ১৮৮৮, Peano ১৮৮৯)। Lean বা Coq-এর মতো proof assistant-এ স্বাভাবিক সংখ্যা একটি recursive ডেটা-টাইপ (শূন্য, আর “পরের সংখ্যা”), আর induction-এর নিয়ম সেই সংজ্ঞা থেকেই স্বয়ংক্রিয়ভাবে তৈরি হয়। Induction দিয়ে প্রমাণ করা দাবিকে আরও শক্তিশালী করলে কখনো প্রমাণ সহজ হয় (একে বলে strengthening the hypothesis): যেমন 1 + 1/4 + … + 1/n² ≤ 2 সরাসরি induction-এ আটকে যায় (ডান পাশ ধ্রুবক, step-এ বাড়তি পদ রাখার জায়গা নেই), কিন্তু শক্তিশালী দাবি “≤ 2 − 1/n” induction-এ সহজে প্রমাণ হয়, কারণ 1/(k+1)² ≤ 1/k − 1/(k+1).

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

  • 1² + 2² + … + n² = n(n+1)(2n+1)/6 প্রমাণ করুন। Step-এ k(k+1)(2k+1)/6 + (k+1)² = (k+1)(k+2)(2k+3)/6 (অনুশীলন ১)।
  • 6 ∣ n³ − n? হ্যাঁ: (n − 1)n(n + 1)-এ একটি জোড় আর একটি 3-এর গুণিতক থাকে।
  • n! > 2ⁿ-এর basis কত? n = 4; n = 1, 2, 3-এ দাবি মিথ্যা।
  • “সব ঘোড়া এক রং” প্রমাণের ভুল? k = 1-এ দুই দলের মিল ফাঁকা, তাই P(1) → P(2) খাটে না।
  • 16 × 16 deficient board-এ কয়টি L-tromino? (256 − 1)/3 = 85.

১০ · AI-এর যুগে — AI-এর induction প্রমাণ কীভাবে যাচাই করবেন

AI সহকারী induction প্রমাণ খুব গুছিয়ে লেখে, কারণ ছাঁচটি সবার জানা। ঠিক এই কারণেই ভুলগুলো চোখ এড়িয়ে যায়: শিরোনাম ঠিক, বীজগণিত ভুল। যে ভুলগুলো বেশি দেখা যায়:

AI-এর ভুলকীভাবে ধরবেন
Basis বাদ, বা ভুল শুরুর মান (যেমন n! > 2ⁿ-এ n = 1)শুরুর মানে দুই পাশ নিজে হিসাব করুন
P(k+1) ধরে নিয়ে “0 = 0”-তে পৌঁছানো (circular)দেখুন শিকলটি এক পাশ থেকে অন্য পাশে যায় কি না
Step-এ বীজগণিতের ভুল, শেষে “অতএব প্রমাণিত”প্রতিটি সমতায় k = 3 বা 4 বসিয়ে মিলিয়ে দেখুন
Step সব k-এ খাটে বলে দাবি, অথচ ছোট k-তে ভাঙেসবচেয়ে ছোট k-তে step-এর প্রতিটি যুক্তি আলাদা পরীক্ষা করুন
ভুল সূত্রকেই “induction দিয়ে প্রমাণ”আগে Python-এ n = 1..50 মিলিয়ে counterexample খুঁজুন
বানানো উদ্ধৃতি বা ইতিহাসলেখক, বছর আর বইয়ের নাম বিশ্বস্ত পাঠ্যবইয়ে মেলান

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

নিচের দাবিটির mathematical induction দিয়ে প্রমাণ লেখো: দাবি: [এখানে দাবি, যেমন "প্রতিটি n ≥ 1-এর জন্য 1·2 + 2·3 + … + n(n+1) = n(n+1)(n+2)/3"] ১. প্রথমে P(n) আর শুরুর মান স্পষ্ট লেখো; শুরুর মান কেন এটি, তা বলো। ২. Basis-এ দুই পাশ আলাদা করে হিসাব করো। ৩. Inductive hypothesis "একটি ইচ্ছামতো k"-এর জন্য লেখো, সব k-এর জন্য নয়। ৪. Step-এ P(k+1)-এর এক পাশ থেকে শুরু করো; প্রতিটি সমতার পাশে কারণ লেখো, আর কোথায় hypothesis লাগল তা চিহ্নিত করো। ৫. দাবিটি মিথ্যা মনে হলে প্রমাণ বানানোর চেষ্টা না করে সবচেয়ে ছোট counterexample দেখাও। ৬. শেষে একটি ছোট Python কোড দাও, যা n = 1 থেকে 50 পর্যন্ত দুই পাশ মিলিয়ে দেখে।

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

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

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

প্র ০১Induction কি প্রমাণ করা যায়, নাকি মেনে নিতে হয়? Well-ordering দিয়ে প্রমাণটি কি চক্রাকার?

উপপাদ্য ১.১-এ induction প্রমাণ করা হলো well-ordering থেকে। কিন্তু well-ordering কোথা থেকে এলো? পর্ব ১১-এ দেখবেন, well-ordering-ও induction থেকে প্রমাণ করা যায়। অর্থাৎ দুটি সমতুল্য: একটি মেনে নিলে অন্যটি আসে। কিন্তু অন্তত একটি মেনে নিতেই হয়; শূন্য থেকে দুটির কোনোটিই প্রমাণ করা যায় না।

ঐতিহাসিক সমাধান: উনিশ শতকের শেষে গণিতবিদরা স্বাভাবিক সংখ্যার নিখুঁত ভিত্তি খুঁজছিলেন। Richard Dedekind ১৮৮৮ সালে Was sind und was sollen die Zahlen? (“সংখ্যা কী আর কী হওয়া উচিত?”) বইয়ে, আর Giuseppe Peano ১৮৮৯ সালে স্বীকার্যের একটি ছোট তালিকা দেন, যা আজ Peano axioms নামে পরিচিত। মূল ভাবনা: 0 (বা 1) একটি স্বাভাবিক সংখ্যা; প্রতিটি সংখ্যার একটি “পরের সংখ্যা” আছে; আলাদা সংখ্যার পরের সংখ্যাও আলাদা; 0 কারও পরের সংখ্যা নয়; আর শেষ স্বীকার্যটি induction নিজেই: 0 ধারণ করে আর প্রতিটি সদস্যের পরের সংখ্যাও ধারণ করে এমন যেকোনো সেটে সব স্বাভাবিক সংখ্যা আছে।

শেষ স্বীকার্যটি কেন দরকার: এটি বলে, স্বাভাবিক সংখ্যা ঠিক সেগুলোই যা 0 থেকে বারবার “পরের” নিয়ে পৌঁছানো যায়, আর কিছু নয়। এটি না থাকলে “অতিরিক্ত” সংখ্যাওয়ালা অদ্ভুত কাঠামোও বাকি স্বীকার্যগুলো মানতে পারত। তাই induction আসলে স্বাভাবিক সংখ্যার সংজ্ঞার অংশ।

চক্রাকার কি না: উপপাদ্য ১.১-এর প্রমাণ চক্রাকার নয়, কারণ সেখানে well-ordering-কে স্বীকার্য ধরা হয়েছে, induction-কে ব্যবহার করা হয়নি। গণিতের যেকোনো প্রমাণ কোনো না কোনো স্বীকার্যে গিয়ে থামে; পর্ব ০৮-এ “প্রমাণ কী” আলোচনায় এই কথাই এসেছে। প্রোগ্রামিংয়ের ভাষায় তুলনা: একটি ভাষার সব ফাংশন অন্য ফাংশন দিয়ে লেখা যায়, কিন্তু কয়েকটি মৌলিক নির্দেশ হার্ডওয়্যারকেই সরাসরি দিতে হয়।

মূল উপলব্ধি: Induction আর well-ordering সমতুল্য; স্বাভাবিক সংখ্যার ধারণার ভেতরেই তারা বসানো। Induction-এ সন্দেহ করা মানে স্বাভাবিক সংখ্যার ধারণাতেই সন্দেহ করা।

প্র ০২Induction-এর ধারণা কে, কখন প্রথম ব্যবহার করেন? “আরোহ” নামটি কি বিভ্রান্তিকর?

Induction-এর ইতিহাস ধাপে ধাপে গড়ে উঠেছে, আর “প্রথম” কে, তা নির্ভর করে কতটা স্পষ্ট রূপকে induction বলবেন তার ওপর। ইতিহাসবিদরা প্রায় ১০০০ সালের দিকে বাগদাদের গণিতবিদ al-Karaji-র al-Fakhri-তে binomial সহগ আর ঘনের যোগফল নিয়ে একটি অন্তর্নিহিত induction-ধরনের যুক্তি দেখান: ছোট n থেকে পরের n-এ যাওয়ার নিয়ম, যদিও সাধারণ n-এর জন্য বিবৃতি ছিল না। চতুর্দশ শতকে Levi ben Gershon (Gersonides) আরও সুনির্দিষ্ট রূপে এমন যুক্তি ব্যবহার করেন বলে কেউ কেউ মনে করেন।

ইউরোপে: Francesco Maurolico ১৫৭৫ সালের বইয়ে বিজোড় সংখ্যার যোগফল n² দেখান (উপপাদ্য ৩.১)। Blaise Pascal তাঁর ত্রিভুজ নিয়ে লেখা Traité du triangle arithmétique-এ (লেখা আনুমানিক ১৬৫৪, প্রকাশ ১৬৬৫) basis আর step-কে বেশ স্পষ্ট করে আলাদা করেন; অনেকে একেই প্রথম পরিষ্কার বিবৃতি মনে করেন। “Mathematical induction” নামটি উনিশ শতকে Augustus De Morgan চালু করেন বলে সাধারণত বলা হয়; সঠিক বছর নিয়ে সূত্রভেদে ভিন্নতা আছে, ১৮৩০-এর দশক প্রায়ই উল্লেখ করা হয়।

নামের বিভ্রান্তি: দর্শনে induction মানে অনেক পর্যবেক্ষণ থেকে সাধারণ নিয়মে পৌঁছানো: “এ পর্যন্ত দেখা সব কাক কালো, তাই সব কাক কালো”। এটি নিশ্চিত নয়; একটি সাদা কাক দেখলেই ভাঙে। Mathematical induction মোটেও তা নয়। এটি deduction: স্বীকার্য থেকে নিশ্চিত সিদ্ধান্ত। প্রথম Python ব্লকের “n = 1..50-এ ঠিক” হলো দার্শনিক induction; উপপাদ্য ৩.১-এর প্রমাণ হলো গাণিতিক induction. প্রথমটি অনুমান তৈরি করে, দ্বিতীয়টি অনুমানকে উপপাদ্যে পরিণত করে।

বাংলা নাম “আরোহ” এসেছে “ওপরে ওঠা” অর্থ থেকে: সিঁড়ির এক ধাপ থেকে পরের ধাপে। ছবিটি ভালো, শুধু মনে রাখুন এই আরোহণ অনুমাননির্ভর নয়।

মূল উপলব্ধি: Induction-এর ধারণা কয়েক শতাব্দী ধরে অনেক সংস্কৃতির গণিতবিদের হাতে পরিণত হয়েছে। নামে “induction” থাকলেও এটি পুরোপুরি নিশ্চিত, deductive প্রমাণ।

প্র ০৩কম্পিউটারে লাখো n যাচাই করলেও কেন প্রমাণ হয় না? এমন কোনো প্যাটার্ন আছে যা অনেক দূরে গিয়ে ভাঙে?

এই পর্বে Python দিয়ে সূত্র ৫০টি n-এ মেলানো হয়েছে। চাইলে ১০ লাখ n-এ মেলানো যায়। তবুও এটি প্রমাণ নয়, কারণ স্বাভাবিক সংখ্যা অসীম, আর কিছু প্যাটার্ন সত্যিই বহু দূরে গিয়ে ভাঙে।

কাছের উদাহরণ: পর্ব ০১-এর n² + n + 41 সংখ্যাটি n = 0 থেকে 39 পর্যন্ত মৌলিক, কিন্তু n = 40-এ 40² + 40 + 41 = 1681 = 41². ৪০টি সফল পরীক্ষা কিছুই নিশ্চিত করেনি।

অনেক দূরের উদাহরণ: George Pólya ১৯১৯ সালে একটি অনুমান করেন, যা Pólya conjecture নামে পরিচিত: যেকোনো n ≥ 2 পর্যন্ত সংখ্যাগুলোর মধ্যে বিজোড় সংখ্যক মৌলিক উৎপাদক (পুনরাবৃত্তি গুনে) আছে এমন সংখ্যা অন্তত অর্ধেক। বহু দূর পর্যন্ত হাতে আর যন্ত্রে এটি সত্য দেখা গিয়েছিল। ১৯৫৮ সালে C. B. Haselgrove প্রমাণ করেন যে এটি কোথাও মিথ্যা, আর পরে সবচেয়ে ছোট counterexample পাওয়া যায় প্রায় ৯০ কোটির ঘরে (906,150,257, Minoru Tanaka-র ১৯৮০ সালের হিসাব অনুযায়ী বলে উল্লেখ করা হয়)। অর্থাৎ ৯০ কোটি পর্যন্ত সব n যাচাই করলেও অনুমানটি “প্রমাণিত” মনে হতো।

তাহলে Python-এর ভূমিকা কী: তিনটি কাজ। (১) প্যাটার্ন খোঁজা ও সূত্র অনুমান করা, যেমন বিজোড়ের যোগফল থেকে n². (২) ভুল অনুমান দ্রুত বাদ দেওয়া, যেমন 3n − 2 সূত্রটি n = 3-এ বাদ পড়ল। (৩) প্রমাণের ভুল ধরা: step-এর প্রতিটি সমতা সংখ্যায় মেলানো, ছোট k-এ যুক্তি খুলে দেখা। যন্ত্র সন্দেহ দূর করতে পারে না, শুধু বাড়াতে বা কমাতে পারে; নিশ্চয়তা আসে প্রমাণ থেকে। একটি ব্যতিক্রম আছে: domain সসীম হলে সব মান যাচাই করাই একটি পূর্ণ প্রমাণ (exhaustive proof), যা পর্ব ০৯-এ এসেছে।

মূল উপলব্ধি: উদাহরণ যত বেশিই হোক, অসীম দাবির প্রমাণ হয় না; একটি counterexample-ই দাবি খণ্ডন করে। Python অনুমান আর খণ্ডনের সঙ্গী, প্রমাণের বিকল্প নয়।

প্র ০৪Golomb-এর tromino প্রমাণ কেন induction-এর আদর্শ উদাহরণ? এর সঙ্গে divide and conquer আর Tetris-এর কী সম্পর্ক?

Solomon W. Golomb ১৯৫৪ সালে American Mathematical Monthly-তে “Checker boards and polyominoes” প্রবন্ধে উপপাদ্য ৭.১ আর তার induction প্রমাণ প্রকাশ করেন। একই প্রবন্ধে “polyomino” (কয়েকটি একক বর্গ পাশাপাশি জুড়ে তৈরি আকৃতি) আর “tromino” শব্দগুলো ছাপার অক্ষরে প্রথম আসে বলে উল্লেখ করা হয়। পরে তিনি Polyominoes নামে বইও লেখেন।

কেন আদর্শ: প্রথমত, দাবিটি সংখ্যা নিয়ে নয়, জ্যামিতি নিয়ে; induction যে শুধু সূত্রের জন্য নয়, তা দেখায়। দ্বিতীয়ত, hypothesis-এর রূপ গুরুত্বপূর্ণ: আসল সরানো ঘরটি তার ভাগের যেকোনো জায়গায় পড়তে পারে, তাই hypothesis-কে “যেকোনো একটি ঘর সরানো” বোর্ডের জন্য লিখতে হয়; শুধু একটি নির্দিষ্ট জায়গার ঘরের জন্য লিখলে সেই ভাগে hypothesis খাটত না। তৃতীয়ত, প্রমাণটি constructive: শুধু “ঢাকা যায়” বলে না, কীভাবে ঢাকতে হবে তাও বলে।

Divide and conquer: 8 × 8 বোর্ডের Python ব্লকের tile ফাংশন প্রমাণেরই অনুবাদ: সমস্যাকে চার ভাগে ভাগ, এক টুকরো বসানো, প্রতিটি ভাগে recursion. 2ⁿ × 2ⁿ বোর্ডে tromino-র সংখ্যা T(n) = 4T(n − 1) + 1, T(1) = 1; এর সমাধান (4ⁿ − 1)/3, যা নিজেও induction দিয়ে প্রমাণযোগ্য। এ ধরনের recurrence সমাধান DSA কোর্সের পর্ব ০৮-এ আছে। প্রতিটি ঘর একবার করে ভরা হয়, তাই কাজের পরিমাণ বোর্ডের ঘরের সংখ্যার সমানুপাতিক।

Tetris: Alexey Pajitnov ১৯৮৪ সালে যে খেলা বানান, তার টুকরোগুলো tetromino: চার বর্গের polyomino, যার মোট সাতটি আকৃতি। Polyomino দিয়ে ঢাকার সাধারণ প্রশ্ন অনেক কঠিন; কিছু রূপ NP-complete বলে প্রমাণিত, যা পর্ব ০৩-এ দেখা SAT-এর মতো কঠিন সমস্যার শ্রেণি। L-tromino আর 2ⁿ × 2ⁿ বোর্ডের এই বিশেষ ক্ষেত্রটি induction-এর জোরে সহজ।

মূল উপলব্ধি: একটি ভালো induction প্রমাণ প্রায়ই একটি recursive algorithm. প্রমাণ লেখা আর প্রোগ্রাম লেখা একই চিন্তার দুই রূপ।

প্র ০৫টেস্ট পাস করা recursive কোড আর induction-এ প্রমাণিত কোডের মধ্যে আসল পার্থক্য কী?

ধরুন বাজারঘরের একটি recursive ফাংশন ক্যাটাগরি-গাছের সব পণ্য গুনে দেয়। টিম ২০টি টেস্ট লিখল, সব পাস। এতে জানা গেল ২০টি নির্দিষ্ট ইনপুটে ফাংশনটি ঠিক। ২১তম গাছে, বা খুব গভীর গাছে, কী হবে, তা টেস্ট বলে না। Edsger Dijkstra-র বহুল উদ্ধৃত মন্তব্যের সারকথা এটাই: টেস্ট বাগের উপস্থিতি দেখাতে পারে, অনুপস্থিতি নয়।

Induction কী দেয়: ইনপুটের আকারের ওপর induction সব ইনপুট একসঙ্গে ঢাকে। Base case ঠিক উত্তর দেয় (basis); ছোট ইনপুটে নিজের ডাক ঠিক ধরে নিলে বড় ইনপুটেও ঠিক (step). এই দুটি প্রমাণ হলে কোনো আকারের ইনপুটেই ফাংশন ভুল উত্তর দিতে পারে না, অবশ্য যদি recursion থামে। থামার প্রমাণ আলাদা: প্রতিটি ডাকে ইনপুট কোনো মাপে কঠোরভাবে ছোট হয় আর base case-এ পৌঁছায়। এটিও well-ordering-এর প্রয়োগ, যা পর্ব ১৩-এ আসবে।

বাস্তবের সীমা: গাণিতিক প্রমাণ ধরে নেয় যন্ত্র অসীম। আসল Python-এ recursion-এর গভীরতার একটি সীমা আছে (ডিফল্টে মোটামুটি ১০০০), আর আসল সংখ্যায় মেমরি সীমিত। তাই “প্রমাণিত সঠিক” কোডও খুব গভীর ইনপুটে RecursionError দিতে পারে; প্রমাণটি বলে উত্তর যদি আসে তবে ঠিক। প্রকৌশলে তাই দুটিই লাগে: প্রমাণ যুক্তির জন্য, টেস্ট বাস্তব পরিবেশের জন্য। Software engineering কোর্সের testing-এর মৌলিক পর্বে টেস্টের দিকটি আছে।

যন্ত্রে প্রমাণ: Lean, Coq, Isabelle-এর মতো proof assistant-এ ফাংশন আর তার সঠিকতার induction প্রমাণ একসঙ্গে লেখা যায়, আর যন্ত্র প্রতিটি ধাপ যাচাই করে। CompCert C compiler এভাবে Coq-এ যাচাই করা একটি বড় উদাহরণ বলে প্রায়ই উল্লেখ করা হয়। AI-এর লেখা কোডের যুগে এই চিন্তা আরও জরুরি: কোড লেখা সস্তা হয়েছে, তার সঠিকতার যুক্তি নয়।

মূল উপলব্ধি: টেস্ট কিছু ইনপুট দেখে, induction সব ইনপুট। প্রমাণের সঙ্গে থামার যুক্তি আর বাস্তব সীমার টেস্ট মিলিয়েই আস্থা আসে।

অনুশীলন

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

  1. প্রমাণ: প্রতিটি n ≥ 1-এর জন্য 1² + 2² + … + n² = n(n+1)(2n+1)/6, induction দিয়ে প্রমাণ করুন। প্রতিটি ধাপের কারণ লিখুন।
    1. Basis n = 1: বাঁ পাশ 1² = 1; ডান পাশ 1·2·3/6 = 1.
    2. Hypothesis: ধরি কোনো k ≥ 1-এ 1² + … + k² = k(k+1)(2k+1)/6.
    3. Step: 1² + … + k² + (k+1)² = k(k+1)(2k+1)/6 + (k+1)² — hypothesis বসিয়ে।
    4. (k+1)/6 সাধারণ উৎপাদক: = (k+1)[k(2k+1) + 6(k+1)]/6 = (k+1)(2k² + 7k + 6)/6.
    5. 2k² + 7k + 6 = (k+2)(2k+3), তাই = (k+1)(k+2)(2k+3)/6 = (k+1)((k+1)+1)(2(k+1)+1)/6. এটিই P(k+1). ∎

    যাচাই: k = 3-এ 14 + 16 = 30 = 4·5·9/6. আর scratch-এ Python দিয়ে n = 1..99 পর্যন্ত সূত্রটি মেলানো হয়েছে।

  2. হিসাব: (ক) কোন সবচেয়ে ছোট n0-এর জন্য “সব n ≥ n0-এ 2ⁿ > n²” সত্য? (খ) 32 × 32 deficient board ঢাকতে কয়টি L-tromino লাগে? (গ) 1 + 3 + 5 + … + 99 কত? (ঘ) 1 + 2 + 4 + … + 2¹⁰ কত?

    (ক) n0 = 5. হিসাব: n = 1-এ 2 > 1 সত্য, কিন্তু n = 2 (4 আর 4), n = 3 (8 আর 9), n = 4 (16 আর 16)-এ মিথ্যা; n = 5-এ 32 > 25, আর তারপর থেকে সবসময় (step: 2ᵏ⁺¹ = 2·2ᵏ > 2k² ≥ (k+1)², কারণ k ≥ 5-এ k² ≥ 2k + 1). তাই n = 1 থেকে শুরু করা যায় না, যদিও n = 1-এ দাবি সত্য।

    (খ) (1024 − 1)/3 = 341.

    (গ) এখানে শেষ পদ 2n − 1 = 99, তাই n = 50; যোগফল 50² = 2500.

    (ঘ) উপপাদ্য ৩.২-এ r = 2, n = 10: 2¹¹ − 1 = 2047. (সব সংখ্যা scratch-এ Python দিয়ে যাচাই করা।)

  3. প্রমাণের ভুল ধরুন: একজন লিখলেন: “দাবি: প্রতিটি n ≥ 1-এ n² + n + 1 জোড়। প্রমাণ: ধরি k² + k + 1 জোড়। তাহলে (k+1)² + (k+1) + 1 = (k² + k + 1) + 2(k + 1), যা জোড় + জোড় = জোড়। তাই induction-এ দাবি সত্য। ∎” Step-টি কি ঠিক? প্রমাণে ভুল কোথায়, আর দাবিটি কি সত্য?

    Step-এর বীজগণিত নিখুঁত: (k+1)² + (k+1) + 1 = k² + 3k + 3 = (k² + k + 1) + 2(k+1). ভুল হলো basis নেই। n = 1-এ 1 + 1 + 1 = 3, যা বিজোড়। আসলে n² + n = n(n+1) সবসময় জোড় (পরপর দুটি সংখ্যার একটি জোড়), তাই n² + n + 1 সবসময় বিজোড়: দাবিটি প্রতিটি n-এ মিথ্যা। Step একটি সত্য conditional দেয় (“জোড় হলে পরেরটিও জোড়”), কিন্তু শর্তটি কখনো পূরণ হয় না। ডমিনোর সারি নিখুঁত, শুধু কেউ প্রথমটি ফেলেনি।

  4. আউটপুট অনুমান ও প্রমাণ: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর f(n)-এর একটি closed form অনুমান করে induction দিয়ে প্রমাণ করুন।
    def f(n):
        return 1 if n == 0 else 2 * f(n - 1) + 1
    
    print([f(n) for n in range(6)])
    [1, 3, 7, 15, 31, 63]

    প্রতিটি মান একটি 2-এর ঘাতের চেয়ে এক কম: অনুমান f(n) = 2ⁿ⁺¹ − 1. Basis: f(0) = 1 = 2¹ − 1. Hypothesis: ধরি কোনো k ≥ 0-এ f(k) = 2ᵏ⁺¹ − 1. Step: f(k+1) = 2f(k) + 1 — কোডের সংজ্ঞা (k + 1 ≥ 1, তাই else শাখা); = 2(2ᵏ⁺¹ − 1) + 1 — hypothesis; = 2ᵏ⁺² − 1. ∎ এখানে ফাংশনের base case আর induction-এর basis একই লাইন, আর recursive ডাক f(n − 1) হলো hypothesis-এর ব্যবহার।

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

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

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

  1. P(n) আর শুরুর মান b স্পষ্ট করে লেখা
  2. Basis: n = b-তে দুই পাশ হিসাব করে P(b) দেখানো
  3. Hypothesis: একটি ইচ্ছামতো k ≥ b-এর জন্য P(k) ধরে নেওয়া
  4. Step: P(k) ব্যবহার করে P(k+1) বের করা
  5. উপসংহার: induction-এর নীতিতে সব n ≥ b-এ P(n)

প্রতিটি n ≥ 1-এর জন্য P(n) প্রমাণে inductive step-এ ঠিক কী প্রমাণ করতে হয়?

  • প্রতিটি n ≥ 1-এর জন্য P(n)
  • কোনো একটি নির্দিষ্ট k-এর জন্য P(k) → P(k+1)
  • প্রতিটি k ≥ 1-এর জন্য P(k) → P(k+1)
  • প্রতিটি k ≥ 1-এর জন্য P(k+1) → P(k)

“n! > 2ⁿ” induction দিয়ে প্রমাণ করতে সবচেয়ে উপযুক্ত basis কোনটি?

  • n = 1
  • n = 4
  • n = 3
  • n = 5

একটি 16 × 16 বোর্ড থেকে একটি ঘর সরানো হলো। বাকি অংশ ঢাকতে কয়টি L-tromino লাগবে?

  • 64
  • 21
  • 255
  • 85

“যেকোনো n টি ঘোড়ার রং এক” — basis n = 1 আর step “A = শেষটি বাদ, B = প্রথমটি বাদ, মিল ঘোড়া দিয়ে রং জোড়া” — এই প্রমাণের ভুল কোথায়?

  • ২টি ঘোড়ার ক্ষেত্রে step খাটে না, কারণ দুই দলে মিল ঘোড়া থাকে না
  • Basis n = 1 মিথ্যা
  • Hypothesis-এ সব k ধরে নেওয়া হয়েছে
  • বড় দলে, যেমন ১০০টি ঘোড়ায়, step খাটে না

3 ∣ (n³ − n)-এর induction প্রমাণের step-এ (k+1)³ − (k+1)-কে কীভাবে লেখা হয়?

  • 3(k³ − k)
  • (k³ − k) + 3k + 1
  • (k³ − k) + 3(k² + k)
  • (k³ − k) + 3k²

Mathematical induction কেন বৈধ, তা স্বাভাবিক সংখ্যার কোন ধর্ম দিয়ে প্রমাণ করা যায়?

  • স্বাভাবিক সংখ্যার কোনো সবচেয়ে বড় সদস্য নেই
  • প্রতিটি অশূন্য উপসেটে একটি সবচেয়ে ছোট সদস্য আছে
  • দুটি স্বাভাবিক সংখ্যার যোগফলও স্বাভাবিক সংখ্যা
  • a·b = b·a

শব্দকোষ

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

মনে রাখুন

  1. নীতি: P(b) আর প্রতিটি k ≥ b-এ P(k) → P(k+1) হলে সব n ≥ b-এ P(n); বৈধতা আসে well-ordering থেকে।
  2. ছাঁচ: দাবি → basis (দুই পাশ আলাদা হিসাব) → ইচ্ছামতো k-এর hypothesis → step (এক পাশ থেকে অন্য পাশে, hypothesis কোথায় লাগল চিহ্নিত)।
  3. কৌশল: P(k+1)-এর ভেতরে P(k) খুঁজুন: শেষ পদ আলাদা করা (যোগফল), গুণ করে অসমতা টানা, একই রাশি যোগ-বিয়োগ (বিভাজ্যতা), একটি উপাদান সরানো (সেট), চার ভাগে কাটা (tromino).
  4. ফাঁদ: basis বাদ বা ভুল শুরু, ছোট k-তে step না খাটা (ঘোড়া), P(k+1) ধরে নিয়ে শুরু, সব k-এ hypothesis.
  5. Python আর recursion: Python অনুমান খোঁজে আর খণ্ডন করে, প্রমাণ করে না; recursive কোডের সঠিকতার প্রমাণ নিজেই একটি induction.

পরের পর্বে: Strong induction আর well-ordering — ৩ আর ৫ টাকার স্ট্যাম্পে ৮ টাকা বা তার বেশি যেকোনো অঙ্ক, প্রতিটি সংখ্যার মৌলিক উৎপাদকে ভাঙন, আর সবচেয়ে ছোট counterexample-এর কৌশল।

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

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