এই পর্বে যা শিখবেন
- Sequence-এর সংজ্ঞা, সমান্তর আর গুণোত্তর ধারার n-তম পদ আর যোগফল, প্রমাণসহ
- Difference table দিয়ে নিয়ম অনুমান, আর কেন সসীম ডেটা থেকে নিয়ম নিশ্চিত হয় না
- Σ আর ∏ চিহ্নের নিয়ম: index shift, সীমা বদল, ভাঙা, double sum আর ক্রম বদল
- ∑k, ∑k², ∑k³, ∑k·2k-এর closed form তিন রকম কৌশলে বের করা আর প্রমাণ
- Harmonic number-এর সীমা, আর লুপের কাজ গুনে algorithm-এর সময় হিসাব
১ · Sequence — নিয়মে বাঁধা তালিকা
বাজারঘরের একটি নতুন শাখা খুলেছে রাজশাহীতে। প্রথম দিন ১২০টি অর্ডার, দ্বিতীয় দিন ১৩৫টি, তৃতীয় দিন ১৫০টি। হিসাবরক্ষক প্রতিদিনের সংখ্যা একটি খাতায় পরপর লিখে রাখেন: 120, 135, 150, 165, … এই তালিকায় ক্রম জরুরি: “তৃতীয় দিনের অর্ডার” একটি নির্দিষ্ট সংখ্যা, আর একই সংখ্যা দুই দিনে আসতেও পারে। গণিতে এমন ক্রমবদ্ধ তালিকাকে বলে sequence (ক্রম)।
একটি sequence হলো ℤ-এর একটি উপসেট (সাধারণত {0, 1, 2, …} বা {1, 2, 3, …}) থেকে একটি সেট S-এ একটি function. n-এর জন্য function-এর মানকে লেখা হয় an, আর একে বলে sequence-এর n-তম পদ (term). পুরো sequence লেখা হয় {an} বা a1, a2, a3, …
অর্থাৎ sequence নতুন কোনো জিনিস নয়, একটি বিশেষ function: ইনপুট হলো অবস্থান (দিন নম্বর), আউটপুট হলো সেই অবস্থানের মান। Function-এর সাধারণ ভাষা (domain, codomain, one-to-one) পর্ব ১৬ “ফাংশন — one-to-one, onto, inverse আর composition”-এ। সসীম sequence a1, …, an-কে প্রোগ্রামিংয়ে বলি list বা array; অক্ষরের সসীম sequence-ই string, যা পর্ব ১২-এ Σ* হিসেবে দেখেছেন।
পরীক্ষার হলে রোল নম্বর অনুযায়ী খাতা সাজানো থাকে। “রোল ১৭-এর নম্বর কত?” প্রশ্নের একটিই উত্তর, কিন্তু দুজন ছাত্রের নম্বর একই হতেই পারে। রোল নম্বর হলো index n, প্রাপ্ত নম্বর হলো an. খাতাগুলো এলোমেলো করে দিলে সেটটি একই থাকে, কিন্তু sequence আর একই থাকে না।
দুইভাবে নিয়ম দেওয়া — explicit আর recursive
একটি sequence-এর নিয়ম দুইভাবে দেওয়া যায়। Explicit formula-এ n থেকে সরাসরি an: যেমন an = 120 + 15(n − 1). Recursive সংজ্ঞায় (recurrence) আগের পদ থেকে পরের পদ: a1 = 120, আর n ≥ 2-এর জন্য an = an−1 + 15. দ্বিতীয় রূপটি পর্ব ১২-এর recursive definition-এর একটি উদাহরণ; সেখানে দেখেছেন, basis আর নিয়ম মিলে ঠিক একটি sequence দেয়।
দুই রূপের নিজস্ব সুবিধা। Recursive রূপ প্রায়ই সমস্যা থেকে সরাসরি আসে (“প্রতিদিন আগের দিনের চেয়ে ১৫টি বেশি”), কিন্তু a1000 জানতে ৯৯৯ ধাপ লাগে। Explicit রূপে এক ধাপে উত্তর: a1000 = 120 + 15 · 999 = 15105. তাই সাধারণ কাজ হলো recursive রূপ থেকে explicit রূপ খুঁজে বের করা, যাকে recurrence-এর সমাধান বলে। সাধারণ পদ্ধতি পর্ব ৪৪–৪৬-এ আসবে; এই পর্বে সরল ক্ষেত্রগুলো।
বাড়ে না কমে — একঘেয়ে sequence
অনেক প্রমাণে sequence-এর একটি সরল ধর্ম লাগে। {an}-কে increasing (বর্ধমান) বলি যদি প্রতিটি n-এর জন্য an ≤ an+1, আর strictly increasing যদি an < an+1; decreasing একইভাবে উল্টো দিকে। বাজারঘরের অর্ডার-আইডি 1001, 1002, 1003, … strictly increasing, তাই দুটি আইডি তুলনা করেই বলা যায় কোন অর্ডার আগে এসেছিল। আর “প্রতিদিন পর্যন্ত মোট বিক্রি” সবসময় increasing, কারণ প্রতিদিন একটি অঋণাত্মক সংখ্যা যোগ হয়: Sn+1 − Sn = an+1 ≥ 0. এই ছোট পর্যবেক্ষণটি অংশ ৯-এ harmonic number-এর প্রমাণে কাজে লাগবে। একটি sequence bounded (সীমাবদ্ধ) যদি এমন একটি সংখ্যা M থাকে যাতে সব n-এর জন্য |an| ≤ M; 1/n সীমাবদ্ধ, 2n নয়।
কয়েকটি পরিচিত sequence, যাদের নাম পুরো কোর্সে বারবার আসবে:
| নাম | নিয়ম | প্রথম কয়েকটি পদ |
|---|---|---|
| বর্গ সংখ্যা | an = n² | 1, 4, 9, 16, 25, … |
| ত্রিভুজ সংখ্যা | Tn = 1 + 2 + … + n | 1, 3, 6, 10, 15, … |
| দুইয়ের ঘাত | an = 2n | 1, 2, 4, 8, 16, … |
| Fibonacci | fn = fn−1 + fn−2 | 0, 1, 1, 2, 3, 5, 8, … |
| Factorial | n! = n · (n − 1)!, 0! = 1 | 1, 1, 2, 6, 24, 120, … |
| Harmonic number | Hn = 1 + 1/2 + … + 1/n | 1, 3/2, 11/6, 25/12, … |
২ · সমান্তর আর গুণোত্তর ধারা
রাজশাহী শাখার অর্ডার প্রতিদিন একই পরিমাণ (১৫টি) বাড়ছে। এমন sequence-কে বলে arithmetic progression (সমান্তর ধারা, সংক্ষেপে AP). আর বাজারঘরের রেফারেল অফারে প্রতিদিন নতুন গ্রাহক আগের দিনের দ্বিগুণ হলে সংখ্যাগুলো 1, 2, 4, 8, …; প্রতিবার একই গুণক। এটি geometric progression (গুণোত্তর ধারা, GP).
AP: a, a + d, a + 2d, a + 3d, …; প্রথম পদ a, আর পরপর দুই পদের পার্থক্য d (common difference). Recursive রূপে a1 = a, an = an−1 + d.
GP: a, ar, ar², ar³, …; প্রথম পদ a, আর পরপর দুই পদের অনুপাত r (common ratio). Recursive রূপে a0 = a, an = r · an−1.
(ক) AP-তে প্রতিটি n ≥ 1-এর জন্য an = a + (n − 1)d, আর প্রথম n পদের যোগফল Sn = n(2a + (n − 1)d)/2 = n(প্রথম পদ + শেষ পদ)/2.
(খ) GP-তে an = arn (n ≥ 0), আর r ≠ 1 হলে a + ar + … + arn = a(rn+1 − 1)/(r − 1).
প্রমাণ (ক-এর n-তম পদ, induction): P(n): an = a + (n − 1)d.
- Basis n = 1: সংজ্ঞায় a1 = a = a + 0 · d.
- ধরি কোনো k ≥ 1-এর জন্য ak = a + (k − 1)d (inductive hypothesis).
- Recursive নিয়মে ak+1 = ak + d = a + (k − 1)d + d = a + kd. এটিই P(k + 1). ∎
যোগফলের সূত্রটি পরের দুই অংশে Gauss-এর জোড়ার কৌশলে প্রমাণ হবে, আর GP-র যোগফলের induction-প্রমাণ পর্ব ১০-এ আছে; অংশ ৬-এ একই সূত্র একটি নতুন কৌশলে (perturbation) বের করব।
পরীক্ষার ধাঁচের হিসাব ১: রাজশাহী শাখার প্রথম ৩০ দিনের মোট অর্ডার কত? a = 120, d = 15, n = 30. শেষ পদ a30 = 120 + 29 · 15 = 555. মোট S30 = 30(120 + 555)/2 = 15 · 675 = 10125টি অর্ডার।
পরীক্ষার ধাঁচের হিসাব ২: একটি AP-র ৫ম পদ 23 আর ১২তম পদ 51. প্রথম ২০ পদের যোগফল কত? a + 4d = 23 আর a + 11d = 51; বিয়োগ করে 7d = 28, তাই d = 4 আর a = 7. S20 = 20(2 · 7 + 19 · 4)/2 = 10 · 90 = 900.
GP-র সূত্রে r = 1 বসানো যায় না: হর r − 1 = 0. তখন প্রতিটি পদ a, আর যোগফল সরাসরি (n + 1)a. আরেকটি সাধারণ ভুল পদসংখ্যায়: a + ar + … + arn-এ পদ n + 1টি, n টি নয়, কারণ ঘাত 0 থেকে n. পরীক্ষায় “প্রথম n পদ” বললে শেষ পদ arn−1, আর যোগফল a(rn − 1)/(r − 1). কোনটি চাওয়া হয়েছে, আগে পদ গুনে নিন।
পরীক্ষার ধাঁচের হিসাব ৩ (GP): বাজারঘরের রেফারেল অফারের শুরুর দিনে (দিন 0) ৫ জন নতুন গ্রাহক এলেন, আর প্রতিদিন নতুন গ্রাহক আগের দিনের তিন গুণ। (ক) দিন 0 থেকে দিন 7, এই আট দিনে মোট কতজন? (খ) কততম দিনের শেষে মোট সংখ্যা প্রথম এক লাখ ছাড়াবে? (ক) a = 5, r = 3, ঘাত 0 থেকে 7: 5(38 − 1)/(3 − 1) = 5 · 6560/2 = 16400 জন। (খ) প্রথম n দিনে (দিন 0 থেকে n − 1) মোট 5(3n − 1)/2. এটি 100000-এর বেশি হতে হলে 3n > 40001. 39 = 19683 যথেষ্ট নয়, 310 = 59049 যথেষ্ট; তাই n = 10, অর্থাৎ দিন 9-এর শেষে মোট 147620 জন (দিন 8-এর শেষে মোট ছিল 49205 জন)। বাস্তবে এমন বৃদ্ধি বেশিদিন চলে না, কারণ গ্রাহকের সংখ্যা সসীম; গুণোত্তর ধারা শুধু শুরুর দিকের ভালো মডেল।
৩ · কয়েকটি পদ দেখে নিয়ম অনুমান — আর তার সীমা
চাকরির aptitude পরীক্ষায় প্রায়ই প্রশ্ন আসে: “ধারার পরের সংখ্যাটি কত?” গণিতের দৃষ্টিতে এমন প্রশ্নের কঠোর উত্তর হলো: যেকোনো সংখ্যা হতে পারে। সসীম কয়েকটি পদ অসীম sequence-কে নির্দিষ্ট করে না। তবু অনুমান করার ভালো কৌশল আছে, আর সেগুলো প্রমাণের পথ দেখায়।
Difference table
একটি sequence-এর পাশাপাশি পদের পার্থক্য নিলে নতুন একটি sequence পাই: Δan = an+1 − an. একে বলে forward difference. পার্থক্যের পার্থক্য নিতে থাকলে একটি difference table তৈরি হয়। একটি গুরুত্বপূর্ণ তথ্য: an যদি n-এর d-মাত্রার polynomial হয়, তাহলে d-তম পার্থক্যের সারি ধ্রুবক, আর তার পরের সারি শূন্য। যেমন an = n² হলে Δan = (n + 1)² − n² = 2n + 1, যা মাত্রা 1-এর; তার পার্থক্য 2, ধ্রুবক। বাজারঘরের নতুন শাখার প্রথম পাঁচ দিনের মোট অর্ডার (হাজারে) 3, 8, 15, 24, 35 হলে নিচের ব্লক টেবিল বানিয়ে পরের মান অনুমান করে, তারপর একটি সতর্কতার উদাহরণ দেখায়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।
from math import comb
def diff_table(seq): # rows of successive differences
rows = [list(seq)]
while len(rows[-1]) > 1:
r = rows[-1]
rows.append([r[i + 1] - r[i] for i in range(len(r) - 1)])
return rows
def next_term(seq): # assume the last row stays constant
return sum(row[-1] for row in diff_table(seq))
orders = [3, 8, 15, 24, 35] # total orders after day 1..5
for row in diff_table(orders):
print(row)
print("guess for day 6:", next_term(orders))
data = [1, 2, 4, 8, 16]
print()
for row in diff_table(data):
print(row)
print("difference-table guess:", next_term(data))
doubling = [2 ** (n - 1) for n in range(1, 8)]
circle = [comb(n, 4) + comb(n, 2) + 1 for n in range(1, 8)]
print("rule 2^(n-1): ", doubling)
print("rule C(n,4)+C(n,2)+1:", circle)আসল আউটপুট (ব্রাউজারের Python):
[3, 8, 15, 24, 35]
[5, 7, 9, 11]
[2, 2, 2]
[0, 0]
[0]
guess for day 6: 48
[1, 2, 4, 8, 16]
[1, 2, 4, 8]
[1, 2, 4]
[1, 2]
[1]
difference-table guess: 31
rule 2^(n-1): [1, 2, 4, 8, 16, 32, 64]
rule C(n,4)+C(n,2)+1: [1, 2, 4, 8, 16, 31, 57]
প্রথম টেবিলে দ্বিতীয় পার্থক্য ধ্রুবক 2, তাই মাত্রা 2-এর polynomial অনুমান করা স্বাভাবিক; সেটি an = n² + 2n, আর ষষ্ঠ দিনে 36 + 12 = 48. দ্বিতীয় টেবিলটি চমক: 1, 2, 4, 8, 16-এর পার্থক্যগুলোও আবার 1, 2, 4, 8, তাই কোনো সারি ধ্রুবক হয় না। শেষ সারিকে ধ্রুবক ধরে নিলে (অর্থাৎ পাঁচটি বিন্দু দিয়ে যাওয়া মাত্রা 4-এর polynomial ধরে নিলে) পরের পদ 31, 32 নয়। শেষ দুই লাইনে দুটি সম্পূর্ণ বৈধ নিয়ম: প্রথম পাঁচ পদ হুবহু এক, ষষ্ঠ পদে আলাদা।
দ্বিতীয় নিয়মটি বানানো উদাহরণ নয়। একটি বৃত্তের ওপর n টি বিন্দু নিয়ে প্রতি জোড়া বিন্দু সরলরেখায় যুক্ত করুন, এমনভাবে যাতে তিনটি রেখা ভেতরের একই বিন্দুতে না মেলে। বৃত্তের ভেতরটা কয়টি অংশে ভাগ হয়? n = 1 থেকে 5-এ উত্তর 1, 2, 4, 8, 16, কিন্তু n = 6-এ 31. সূত্রটি C(n, 4) + C(n, 2) + 1; এটি কেন, তা গণনার মডিউলে (পর্ব ৩৪ “Binomial coefficient, Pascal-এর ত্রিভুজ আর combinatorial identity”-এর ভাষায়) বোঝা যায়। শিক্ষা একটাই: কয়েকটি মিল প্রমাণ নয়।
যেকোনো বাস্তব সংখ্যা b1, …, bm আর যেকোনো বাস্তব c-এর জন্য এমন একটি polynomial p আছে যার মাত্রা ≤ m, আর p(1) = b1, …, p(m) = bm, কিন্তু p(m + 1) = c.
প্রমাণ:
- ধরি q হলো মাত্রা ≤ m − 1-এর একটি polynomial যা প্রথম m মান মেলায় (এমন q সবসময় আছে: Lagrange-এর interpolation সূত্র, যা প্রতিটি বিন্দুর জন্য একটি পদ দিয়ে তৈরি; এখানে আমরা এর অস্তিত্ব মেনে নিচ্ছি)।
- w(x) = (x − 1)(x − 2)…(x − m) নিন। x = 1, …, m-এ w(x) = 0, আর w(m + 1) = m! ≠ 0.
- p(x) = q(x) + t · w(x) নিন, যেখানে t = (c − q(m + 1))/m!.
- x = 1, …, m-এ p(x) = q(x) + 0 = bx, আর p(m + 1) = q(m + 1) + (c − q(m + 1)) = c. মাত্রা ≤ m. ∎
তাই “1, 2, 4, 8, 16-এর পরে কী?” প্রশ্নে 32-ও ঠিক, 31-ও ঠিক, এমনকি 2026-ও ঠিক, যদি নিয়মটি বলে দেওয়া হয়। পরীক্ষায় এই প্রশ্নের আসল অর্থ: “সবচেয়ে সরল স্বাভাবিক নিয়ম কোনটি?” গণিতে কাজের ধারা অন্য: অনুমান করুন, অনেক পদে যন্ত্রে মিলিয়ে নিন, তারপর প্রমাণ করুন।
অচেনা integer sequence-এর উৎস খুঁজতে গণিতবিদরা প্রায়ই OEIS (On-Line Encyclopedia of Integer Sequences, oeis.org) দেখেন: প্রথম কয়েকটি পদ লিখে খুঁজলে পরিচিত sequence, তাদের সূত্র আর তথ্যসূত্র পাওয়া যায়। এতে কয়েক লাখ sequence আছে বলে জানা যায়। মনে রাখবেন, একই শুরুর পদে কয়েকটি ভিন্ন sequence প্রায়ই মেলে; 1, 2, 4, 8, 16 খুঁজলে অনেকগুলো ফল আসে।
৪ · Σ চিহ্ন — যোগফলের সংক্ষিপ্ত লিখন আর তার নিয়ম
“1 + 2 + … + n” লেখায় “…” অংশটি পাঠকের অনুমানের ওপর ছেড়ে দেয়। নিখুঁত লিখনের জন্য গ্রিক অক্ষর সিগমা দিয়ে summation লেখা হয়:
∑k=mn ak = am + am+1 + … + an
এখানে k হলো index of summation (যোগের সূচক), m নিচের সীমা আর n ওপরের সীমা। পদসংখ্যা n − m + 1. সূচকের নাম নিজে গুরুত্বহীন: ∑k=15 k² আর ∑j=15 j² একই সংখ্যা, 55. প্রোগ্রামারের চোখে ∑ একটি লুপ, আর k লুপের variable:
total = 0
for k in range(m, n + 1): # k = m, m+1, ..., n
total += a(k)
সংজ্ঞাটিও recursive: n < m হলে ∑k=mn ak = 0 (empty sum, কোনো পদ নেই, যেমন লুপ একবারও না চললে total = 0); আর n ≥ m হলে ∑k=mn ak = (∑k=mn−1 ak) + an. এই সংজ্ঞার কারণেই ∑-এর প্রতিটি নিয়ম n-এর ওপর induction দিয়ে প্রমাণ করা যায়।
সব পূর্ণসংখ্যা m ≤ p ≤ n, s আর বাস্তব ধ্রুবক c-এর জন্য:
(১) Linearity: ∑k=mn (c·ak + bk) = c·∑k=mn ak + ∑k=mn bk.
(২) ভাঙা: ∑k=mn ak = ∑k=mp ak + ∑k=p+1n ak.
(৩) ধ্রুবকের যোগ: ∑k=mn c = (n − m + 1)c.
(৪) Index shift: ∑k=mn ak = ∑j=m+sn+s aj−s.
প্রমাণ (১, n-এর ওপর induction, m স্থির):
- Basis n = m − 1: দুই পাশেই empty sum, 0 = c · 0 + 0.
- ধরি কোনো n ≥ m − 1-এর জন্য (১) সত্য।
- সংজ্ঞায় ∑k=mn+1 (c·ak + bk) = ∑k=mn (c·ak + bk) + c·an+1 + bn+1.
- Hypothesis বসিয়ে আর পদ সাজিয়ে: = c(∑k=mn ak + an+1) + (∑k=mn bk + bn+1) = c·∑k=mn+1 ak + ∑k=mn+1 bk. ∎
(৪)-এর যুক্তি সরাসরি: j = k + s বসালে k = m হলে j = m + s, k = n হলে j = n + s, আর ak = aj−s. দুই পাশে হুবহু একই পদ, একই ক্রমে। (২) আর (৩)-ও একইভাবে induction-এ আসে; সেগুলো নিজে লিখে দেখুন।
উদাহরণ: ∑k=120 (3k + 2) = 3∑k=120 k + ∑k=120 2 = 3 · 210 + 20 · 2 = 670. আর index shift দিয়ে ∑k=0n−1 (k + 1)² = ∑j=1n j²: j = k + 1 বসালে সীমা 0..n−1 থেকে 1..n হয়।
মাঝখান থেকে শুরু হওয়া যোগফল: ∑k=1020 k² কত? ভাঙার নিয়মে ∑k=120 k² = ∑k=19 k² + ∑k=1020 k², তাই চাওয়া যোগফল = 2870 − 285 = 2585 (দুটি মান অংশ ৬-এর ∑k²-এর সূত্র থেকে)। পরীক্ষায় এই কৌশল খুব কাজের: প্রায় সব closed form 1 থেকে শুরু হয়, তাই অন্য নিচের সীমা থাকলে “পুরোটা বিয়োগ শুরুর অংশ” লিখুন। সতর্ক থাকুন, বাদ দিতে হবে 1 থেকে 9, 10 পর্যন্ত নয়; নইলে 10²-ও বাদ পড়ে যায়।
তিনটি চেনা ভুল। (ক) গুণের linearity নেই: ∑akbk সাধারণত (∑ak)(∑bk)-এর সমান নয়। n = 2, a = b = (1, 1) নিলে বাঁ পাশ 1 + 1 = 2, ডান পাশ 2 · 2 = 4. (খ) ∑k=1n 5 = 5n, 5 নয়; লুপ n বার চলে। (গ) Index shift-এ পদ বদলান অথচ সীমা বদলান না: ∑k=1n 2k-কে ∑k=0n 2k ভেবে 2n+1 − 1 লেখা। সঠিক মান 2n+1 − 2, কারণ k = 0-এর পদ 1 বাদ।
অসীম যোগফল ∑k=0∞ ak মানে আংশিক যোগফল (partial sum) Sn = ∑k=0n ak-এর সীমা, যদি সীমা থাকে। যেমন |r| < 1 হলে rn+1 → 0, তাই ∑k=0∞ rk = 1/(1 − r); 1 + 1/2 + 1/4 + … = 2. সীমা থাকার প্রশ্নটি calculus-এর বিষয়; এই কোর্সে বেশির ভাগ যোগফল সসীম, আর অসীম যোগফল এলে আমরা তা স্পষ্ট বলব।
৫ · Gauss-এর জোড়া — ১ থেকে n পর্যন্ত যোগফল
একটি জনপ্রিয় গল্প: জার্মান গণিতবিদ Carl Friedrich Gauss (১৭৭৭–১৮৫৫) প্রাথমিক বিদ্যালয়ে পড়ার সময় শিক্ষক ক্লাসকে ব্যস্ত রাখতে ১ থেকে ১০০ পর্যন্ত যোগ করতে দেন, আর ছোট্ট Gauss কয়েক মুহূর্তে 5050 লিখে দেন। গল্পটির প্রাচীনতম রূপ Gauss-এর মৃত্যুর পরে তাঁর বন্ধু Sartorius von Waltershausen-এর লেখা স্মৃতিকথায় বলে উল্লেখ করা হয়; আসল সংখ্যাগুলো কী ছিল, আর কৌশলটি ঠিক কী, তা নিয়ে পরের লেখকদের বর্ণনা ভিন্ন। কৌশলটি অবশ্য Gauss-এর বহু আগে থেকেই জানা ছিল।
কৌশলটি হলো যোগফলটিকে দুইবার লেখা, একবার সামনে থেকে, একবার পেছন থেকে, তারপর কলাম ধরে যোগ করা। n = 6 দিয়ে দেখুন; “পরে” চাপুন:
1 S = 1 + 2 + 3 + 4 + 5 + 62 S = 6 + 5 + 4 + 3 + 2 + 132S = 7 + 7 + 7 + 7 + 7 + 742S = 6 · 7 = 4252S = n(n + 1)
| কাজ | |
| একটি কলাম | |
| ফল |
- সামনে থেকে। S = 1 + 2 + 3 + 4 + 5 + 6. মান এখনো অজানা; ছয়টি পদ একটি একটি করে যোগ না করে একটি চালাকি খুঁজছি।
- পেছন থেকে। একই ছয়টি সংখ্যা উল্টো ক্রমে লিখলেও যোগফল S. এখন প্রথম কলামে 1 আর 6, দ্বিতীয় কলামে 2 আর 5, এভাবে।
- কলাম ধরে যোগ। ওপরের সারির k-তম পদ k, নিচের সারির k-তম পদ 7 − k; যোগফল সবসময় 7. দুই সারি মিলে 2S.
- কলাম গোনা। ছয়টি কলাম, প্রতিটিতে 7, তাই 2S = 6 · 7 = 42, আর S = 21. হাতে যোগ করে মিলিয়ে নিন: 1 + 2 + 3 + 4 + 5 + 6 = 21.
- সাধারণ n. নিচের সারির k-তম পদ n + 1 − k, তাই প্রতিটি কলামের যোগফল n + 1. কলাম n টি, তাই 2S = n(n + 1), S = n(n + 1)/2.
- যাচাই। n = 100-এ S = 100 · 101/2 = 5050, গল্পের সংখ্যা। 2S সবসময় পূর্ণসংখ্যা n(n + 1), আর n(n + 1) জোড় (পরপর দুই পূর্ণসংখ্যার একটি জোড়), তাই ভাগফল পূর্ণসংখ্যা।
প্রতিটি n ≥ 0-এর জন্য ∑k=1n k = n(n + 1)/2.
প্রমাণ (∑-এর নিয়ম দিয়ে Gauss-এর যুক্তি):
- S = ∑k=1n k লিখি।
- j = n + 1 − k বসাই। k যখন 1 থেকে n, j তখন n থেকে 1, প্রতিটি মান একবার করে; তাই S = ∑j=1n (n + 1 − j). (এটি index-এর উল্টো ক্রম; যোগের বিনিময় ধর্মে মান বদলায় না।)
- দুই রূপ যোগ করে, linearity দিয়ে: 2S = ∑k=1n (k + (n + 1 − k)) = ∑k=1n (n + 1).
- ধ্রুবকের যোগের নিয়মে 2S = n(n + 1), তাই S = n(n + 1)/2. ∎
এই যোগফলগুলোকে বলে ত্রিভুজ সংখ্যা Tn, কারণ বিন্দু দিয়ে সাজালে ত্রিভুজ হয়। নিচের ছবিতে Gauss-এর যুক্তিটি জ্যামিতিতে: দুটি একই রকম সিঁড়ি মিলে একটি আয়তক্ষেত্র।
দুটি সিঁড়ি মিলে একটি আয়তক্ষেত্র
Two staircases of 1 + 2 + 3 + 4 fill a 4 × 5 rectangle
AP-র যোগফলের প্রমাণ (উপপাদ্য ২.১ক): প্রথম n পদ a + kd, k = 0, …, n − 1. Linearity আর ধ্রুবকের নিয়মে Sn = ∑k=0n−1 (a + kd) = na + d∑k=0n−1 k = na + d(n − 1)n/2 = n(2a + (n − 1)d)/2. শেষ ধাপে উপপাদ্য ৫.১ ব্যবহার হয়েছে n − 1 দিয়ে (k = 0-এর পদ শূন্য)। ∎ একই জোড়ার যুক্তি যেকোনো AP-তে খাটে, কারণ প্রথম আর শেষ পদের যোগফল, দ্বিতীয় আর শেষের আগের পদের যোগফল, এভাবে সব জোড়ার যোগফল সমান।
৬ · Telescoping — পাশাপাশি পদ কাটাকাটি
পুরোনো দূরবীন (telescope) ভাঁজ করলে সব খণ্ড একটির ভেতরে আরেকটি ঢুকে যায়, বাইরে থাকে শুধু প্রথম আর শেষ খণ্ড। কিছু যোগফলও এভাবে গুটিয়ে যায়।
যেকোনো sequence {ak} আর n ≥ 0-এর জন্য ∑k=0n−1 (ak+1 − ak) = an − a0.
প্রমাণ (n-এর ওপর induction):
- Basis n = 0: বাঁ পাশ empty sum 0, ডান পাশ a0 − a0 = 0.
- ধরি কোনো n ≥ 0-এর জন্য সমতা সত্য।
- ∑k=0n (ak+1 − ak) = (an − a0) + (an+1 − an) = an+1 − a0, ∑-এর সংজ্ঞা আর hypothesis থেকে। ∎
বিখ্যাত উদাহরণ: 1/(k(k + 1)) = 1/k − 1/(k + 1), যা হর মিলিয়ে সহজে মেলে। তাই
∑k=1n 1/(k(k + 1)) = (1 − 1/2) + (1/2 − 1/3) + … + (1/n − 1/(n + 1)) = 1 − 1/(n + 1) = n/(n + 1).
খেয়াল করুন, এটি “−” চিহ্নসহ উপপাদ্য ৬.১: ak = 1/k নিলে প্রতিটি পদ −(ak+1 − ak). n বাড়লে যোগফল 1-এর দিকে যায়, কিন্তু কখনো 1 ছোঁয় না।
বাজারঘরের গুদামে প্রতিদিন সন্ধ্যায় লেখা হয় “আজ মজুত কত বাড়ল বা কমল”। মাসের সব দিনের পরিবর্তন যোগ করলে কী পাবেন? প্রতিটি দিনের শেষ মজুত পরের দিনের শুরুর মজুত হয়ে কাটাকাটি যায়; থাকে শুধু “মাস শেষের মজুত − মাস শুরুর মজুত”। Telescoping ঠিক এটিই। DSA কোর্সের পর্ব ১৭-এর prefix sum এই নীতিতে চলে: ai + … + aj = Pj+1 − Pi.
Telescoping দিয়ে ∑k² আবিষ্কার
∑k²-এর সূত্র অনুমান না করে বের করা যায়। কৌশল: এমন একটি পার্থক্য নিন যার ভেতরে k² আসে। (k + 1)³ − k³ = 3k² + 3k + 1. এবার k = 1 থেকে n পর্যন্ত যোগ করুন।
- বাঁ পাশ telescoping: ∑k=1n ((k + 1)³ − k³) = (n + 1)³ − 1.
- ডান পাশ linearity দিয়ে: 3∑k² + 3∑k + n = 3Q + 3n(n + 1)/2 + n, যেখানে Q = ∑k=1n k².
- সমান করে: 3Q = (n + 1)³ − 1 − n − 3n(n + 1)/2 = (n + 1)³ − (n + 1) − 3n(n + 1)/2.
- (n + 1) সাধারণ উৎপাদক: 3Q = (n + 1)[(n + 1)² − 1 − 3n/2] = (n + 1)(n² + 2n − 3n/2) = (n + 1) · n(2n + 1)/2.
- তাই Q = n(n + 1)(2n + 1)/6. ∎
যাচাই: n = 3-এ 1 + 4 + 9 = 14, আর সূত্রে 3 · 4 · 7/6 = 14. একই কৌশলে (k + 1)4 − k4 থেকে ∑k³, আর সাধারণভাবে ∑kp-এর সূত্র ধাপে ধাপে পাওয়া যায়; প্রতিটি ধাপে আগের সব সূত্র লাগে, ঠিক strong induction-এর মতো।
প্রতিটি n ≥ 1-এর জন্য ∑k=1n k³ = (n(n + 1)/2)² = (∑k=1n k)².
প্রমাণ (induction):
- Basis n = 1: 1³ = 1 = (1 · 2/2)².
- ধরি কোনো k ≥ 1-এর জন্য ∑i=1k i³ = k²(k + 1)²/4.
- তাহলে ∑i=1k+1 i³ = k²(k + 1)²/4 + (k + 1)³ = (k + 1)²[k² + 4(k + 1)]/4.
- k² + 4k + 4 = (k + 2)², তাই যোগফল (k + 1)²(k + 2)²/4 = ((k + 1)(k + 2)/2)². এটিই n = k + 1-এর দাবি। ∎
ফলটি চমকপ্রদ: প্রথম n টি ঘনের যোগফল প্রথম n টি সংখ্যার যোগফলের বর্গ। 1 + 8 + 27 + 64 = 100 = 10². ইতিহাসে এটি প্রায়ই খ্রিস্টীয় প্রথম-দ্বিতীয় শতকের Nicomachus-এর নামে বলা হয়; ভারতে Aryabhata (৪৯৯ খ্রিস্টাব্দের Aryabhatiya) বর্গ আর ঘনের যোগফলের নিয়ম দিয়েছিলেন বলে ইতিহাসবিদরা উল্লেখ করেন।
| যোগফল | Closed form | কৌশল | n = 10 |
|---|---|---|---|
| ∑k=1n k | n(n + 1)/2 | Gauss-এর জোড়া | 55 |
| ∑k=1n k² | n(n + 1)(2n + 1)/6 | Telescoping | 385 |
| ∑k=1n k³ | (n(n + 1)/2)² | Induction | 3025 |
| ∑k=0n rk, r ≠ 1 | (rn+1 − 1)/(r − 1) | Perturbation | r = 2: 2047 |
| ∑k=1n 1/(k(k + 1)) | n/(n + 1) | Telescoping | 10/11 |
| ∑k=0n k·2k | (n − 1)2n+1 + 2 | Perturbation | 18434 |
৭ · Perturbation — যোগফলকে একটু নাড়িয়ে সমীকরণ
Gauss-এর জোড়া AP-তে কাজ করে, কিন্তু GP-তে করে না। GP-র জন্য অন্য কৌশল, যার নাম perturbation method: একই যোগফলকে দুই ভাবে লিখে একটি সমীকরণ পাওয়া, যার সমাধানই closed form. প্রথমে geometric series Gn = ∑k=0n rk.
- শেষ পদ আলাদা করে: Gn+1 = Gn + rn+1.
- প্রথম পদ আলাদা করে, তারপর index shift: Gn+1 = 1 + ∑k=1n+1 rk = 1 + r∑k=0n rk = 1 + rGn.
- দুটি সমান: Gn + rn+1 = 1 + rGn, তাই (r − 1)Gn = rn+1 − 1.
- r ≠ 1 হলে ভাগ করা যায়: Gn = (rn+1 − 1)/(r − 1). ∎
ধাপ ৪-এ “r ≠ 1” শর্তটি অলংকার নয়: শূন্য দিয়ে ভাগ বৈধ নয়। এই একই ধারণা জটিল যোগফলেও খাটে, যেখানে অনুমান করা কঠিন। যেমন ∑k·2k: height h-এর একটি perfect binary tree-এ গভীরতা k-তে 2kটি node, তাই সব node-এর গভীরতার মোট ∑k=0h k·2k. এই ধরনের যোগফল (আর তার আত্মীয় ∑k/2k) tree-ভিত্তিক algorithm-এর বিশ্লেষণে আসে। n = 3 পাশে রেখে ধাপগুলো দেখুন:
1S = Σ k·2^k, k=0..n2S′ = S + (n+1)·2^(n+1)3S′ = Σ (k+1)·2^(k+1)4S′ = 2S + 2^(n+2) − 25S = (n−1)·2^(n+1) + 2
| কৌশল | |
| n = 3-এ |
- সংজ্ঞা। S(n) = 0·1 + 1·2 + 2·4 + … + n·2n. n = 3-এ 0 + 2 + 8 + 24 = 34. সূত্র জানা নেই; S(n + 1)-কে দুইভাবে লিখব। কোডের মতো লাইনগুলোতে সংক্ষেপে S মানে S(n) আর S′ মানে S(n + 1).
- শেষ পদ আলাদা। S(n + 1) = S(n) + (n + 1)2n+1. n = 3-এ 34 + 4 · 16 = 98.
- প্রথম পদ আলাদা আর index shift. k = 0-এর পদ 0 · 20 = 0, তাই S(n + 1) = ∑k=1n+1 k2k. k-কে k + 1 দিয়ে বদলালে সীমা 0..n: ∑k=0n (k + 1)2k+1. n = 3-এ 2 + 8 + 24 + 64 = 98.
- ভাঙা। (k + 1)2k+1 = 2 · k2k + 2 · 2k. Linearity দিয়ে 2S(n) + 2∑2k, আর GP থেকে ∑k=0n 2k = 2n+1 − 1. মূল যোগফল S(n) আবার ফিরে এসেছে, এটিই কৌশলের প্রাণ। n = 3-এ 68 + 30 = 98.
- দুই রূপ সমান। S(n) + (n + 1)2n+1 = 2S(n) + 2n+2 − 2. তাই S(n) = (n + 1)2n+1 − 2 · 2n+1 + 2 = (n − 1)2n+1 + 2. n = 3-এ 2 · 16 + 2 = 34.
- যাচাই। n = 0 থেকে 5-এ সূত্র দেয় 0, 2, 10, 34, 98, 258; সরাসরি যোগফলও তাই (scratch হিসাবে মিলিয়েছি)। পরের Python ব্লক n = 100 পর্যন্ত যাচাই করে। চাইলে induction দিয়ে প্রমাণটি আলাদা করেও লেখা যায়।
এবার এ পর্যন্ত পাওয়া সব closed form একসঙ্গে যন্ত্রে মিলিয়ে নিই, আর একটি ভুয়া সূত্রও রাখি। সেটি ∑k²-এর প্রথম তিনটি মান (1, 5, 14) হুবহু মেলায়। শেষ অংশে Python-এর Fraction দিয়ে (নির্ভুল ভগ্নাংশ, float-এর গোলমাল নেই) telescoping যোগফল দেখা হয়েছে:
from fractions import Fraction
claims = { # term a(k), claimed closed form S(n)
"k": (lambda k: k, lambda n: n * (n + 1) // 2),
"k^2": (lambda k: k * k, lambda n: n * (n + 1) * (2 * n + 1) // 6),
"k^3": (lambda k: k ** 3, lambda n: (n * (n + 1) // 2) ** 2),
"3^k": (lambda k: 3 ** k, lambda n: (3 ** (n + 1) - 3) // 2),
"k*2^k": (lambda k: k * 2**k, lambda n: (n - 1) * 2 ** (n + 1) + 2),
"k^2 (fake)": (lambda k: k * k, lambda n: (5 * n * n - 7 * n + 4) // 2),
}
for name, (term, S) in claims.items():
total, bad = 0, None
for n in range(1, 101):
total += term(n) # running sum a(1) + ... + a(n)
if total != S(n) and bad is None:
bad = n
verdict = "holds for n = 1..100" if bad is None else f"fails first at n = {bad}"
print(f"sum of {name:11} {verdict}")
print()
s = Fraction(0)
for k in range(1, 7): # 1/(k(k+1)) = 1/k - 1/(k+1)
s += Fraction(1, k * (k + 1))
print(k, s, " 1 - 1/(n+1) =", 1 - Fraction(1, k + 1))আসল আউটপুট (ব্রাউজারের Python):
sum of k holds for n = 1..100
sum of k^2 holds for n = 1..100
sum of k^3 holds for n = 1..100
sum of 3^k holds for n = 1..100
sum of k*2^k holds for n = 1..100
sum of k^2 (fake) fails first at n = 4
1 1/2 1 - 1/(n+1) = 1/2
2 2/3 1 - 1/(n+1) = 2/3
3 3/4 1 - 1/(n+1) = 3/4
4 4/5 1 - 1/(n+1) = 4/5
5 5/6 1 - 1/(n+1) = 5/6
6 6/7 1 - 1/(n+1) = 6/7
পাঁচটি আসল সূত্র ১০০টি n-এ টিকে গেছে; এখানে k = 1 থেকে যোগ, তাই ∑3k-এর সূত্রে (3n+1 − 3)/2, k = 0-এর পদ 1 বাদ। ভুয়া সূত্র (5n² − 7n + 4)/2 n = 1, 2, 3-এ 1, 5, 14 দেয়, কিন্তু n = 4-এ 28, যেখানে আসল যোগফল 30. অংশ ৩-এর শিক্ষা আবার: তিনটি মিল প্রমাণ নয়, আর ১০০টি মিলও প্রমাণ নয়; প্রমাণ দিয়েছে telescoping আর induction. Telescoping-এর সারিতে প্রতিটি আংশিক যোগফল ঠিক n/(n + 1). // এখানে নিরাপদ, কারণ প্রতিটি লব নিখুঁতভাবে বিভাজ্য (যেমন n(n + 1) সবসময় জোড়)।
৮ · Double sum, ∏ চিহ্ন আর লুপের কাজ গোনা
বাজারঘরের ৩টি গুদাম আর ৪টি জেলা। গুদাম i থেকে জেলা j-তে দৈনিক চালান aij হলে মোট চালান একটি double sum: ∑i=13 ∑j=14 aij. ভেতরের যোগফল আগে (একটি গুদামের সব জেলা), তারপর বাইরের। প্রোগ্রামে এটি দুই স্তরের লুপ। আয়তাকার পরিসরে যোগের ক্রম বদলালে মান বদলায় না (সসীম যোগফলে পদগুলো যেকোনো ক্রমে যোগ করা যায়), আর পদটি i-এর অংশ আর j-এর অংশের গুণফল হলে যোগফল আলাদা হয়ে যায়: ∑i=13 ∑j=14 ij = (∑i)(∑j) = 6 · 10 = 60.
আসল মজা ত্রিভুজাকার পরিসরে, যেখানে ভেতরের সীমা বাইরের সূচকের ওপর নির্ভর করে। ∑i=1n ∑j=1i aij মানে 1 ≤ j ≤ i ≤ n শর্ত মানা সব জোড়ার ওপর যোগ।
∑i=1n ∑j=1i aij = ∑j=1n ∑i=jn aij.
প্রমাণ:
- বাঁ পাশে প্রতিটি পদ aij আসে ঠিক তখন, যখন 1 ≤ i ≤ n আর 1 ≤ j ≤ i, অর্থাৎ যখন 1 ≤ j ≤ i ≤ n; প্রতিটি এমন জোড়া একবারই আসে।
- ডান পাশে aij আসে ঠিক তখন, যখন 1 ≤ j ≤ n আর j ≤ i ≤ n, অর্থাৎ আবার 1 ≤ j ≤ i ≤ n, প্রতিটি জোড়া একবার।
- দুই পাশে একই সসীম পদ-সংগ্রহ, শুধু ক্রম আলাদা; যোগের বিনিময় আর সংযোগ ধর্মে মান সমান। ∎
কৌশলটি মনে রাখার সহজ উপায়: সূচকের শর্তগুলো একটি অসমতা-শিকলে লিখুন (এখানে 1 ≤ j ≤ i ≤ n), তারপর যে সূচক বাইরে রাখতে চান তার সীমা শিকল থেকে পড়ে নিন। পরের অংশে এই কৌশলে harmonic number-এর একটি যোগফল বের হবে।
∏ চিহ্ন আর factorial
যোগের জন্য যেমন ∑, গুণের জন্য তেমন ∏ (বড় হাতের গ্রিক পাই): ∏k=mn ak = am · am+1 · … · an. এই product notation-এর সংজ্ঞাও recursive, কিন্তু কোনো পদ না থাকলে মান 1 (empty product), কারণ গুণে 1 কিছু বদলায় না, যেমন যোগে 0. তাই n! = ∏k=1n k, আর 0! = 1 কোনো বিশেষ ছাড় নয়, empty product-এর স্বাভাবিক মান। দুই চিহ্নের সম্পর্ক logarithm দিয়ে: সব ak > 0 হলে log ∏ak = ∑ log ak. Machine learning-এ অনেক ছোট সম্ভাবনার গুণফলের বদলে log-এর যোগফল নেওয়া হয় ঠিক এই কারণে।
Product-ও telescoping হয়: ∏k=1n (1 + 1/k) = ∏k=1n (k + 1)/k = (2/1)(3/2)…((n + 1)/n) = n + 1. প্রতিটি লব পরের হরের সঙ্গে কাটে।
লুপ গোনা মানে যোগফল
একটি algorithm কতক্ষণ চলে, তার প্রথম ধাপ হলো মূল কাজটি কতবার হয় তা গোনা। নিয়ম সরল: একটি লুপের মোট কাজ = প্রতিটি পুনরাবৃত্তির কাজের যোগফল। বাজারঘরের n জন গ্রাহকের তালিকায় ডুপ্লিকেট খুঁজতে প্রতিটি জোড়া একবার তুলনা করা হয়। n = 5 নিয়ে ভেতরের লুপ কতবার চলে, দেখুন:
1c = 02for i in range(5):3 for j in range(i+1, 5):4 c += 1 # pair i, j5print(c)
| i | |
| j-এর মান | |
| ভেতরে কতবার | |
| c |
- শুরু। c = 0. বাইরের লুপ i = 0, 1, 2, 3, 4; ভেতরের লুপ j = i + 1 থেকে 4 পর্যন্ত, তাই প্রতিটি জোড়া i < j একবারই আসে।
- i = 0. j = 1, 2, 3, 4: ভেতরের লুপ ৪ বার, c = 4.
- i = 1. j = 2, 3, 4: ৩ বার, c = 7. প্রতিবার i বাড়লে ভেতরের কাজ ১ কমে।
- i = 2. j = 3, 4: ২ বার, c = 9.
- i = 3. j = 4: ১ বার, c = 10.
- i = 4. range(5, 5) ফাঁকা: ভেতরের লুপ একবারও চলে না (empty sum), c থাকে 10.
- Double sum হিসেবে। c = ∑i=04 ∑j=i+14 1 = ∑i=04 (4 − i) = 4 + 3 + 2 + 1 + 0 = 10. সাধারণ n-এ ∑i=0n−1 (n − 1 − i) = 0 + 1 + … + (n − 1) = n(n − 1)/2, Gauss-এর সূত্রে।
এই n(n − 1)/2-ই n টি জিনিস থেকে ২টি বাছার উপায়ের সংখ্যা C(n, 2); কেন, তা পর্ব ৩৩ “Permutation আর combination”-এ। Bubble sort-এর তুলনার সংখ্যাও এই যোগফল (DSA কোর্সের পর্ব ২০)। যোগফল থেকে বৃদ্ধির হার: n(n − 1)/2 = Θ(n²); Big-O, Ω আর Θ-র সংজ্ঞা DSA কোর্সের পর্ব ৪-এ, আর এ ধরনের যোগফলের তালিকা পর্ব ৬-এ। ভেতরের কাজ নিজেই i-এর ওপর নির্ভর করলে একই ধারা: যেমন বাইরের লুপের i-তম ধাপে ভেতরে i² কাজ হলে মোট ∑i=1n i² = n(n + 1)(2n + 1)/6 = Θ(n³); n = 100-এ 338350. সাধারণ নিয়ম হলো, প্রতিটি স্তরের লুপ একটি ∑, আর সবচেয়ে ভেতরের কাজ যোগফলের পদ। নিচের ব্লক তিন রকম লুপ গুনে সূত্রের সঙ্গে মেলায়; তৃতীয়টিতে ভেতরের লুপ i ধাপে লাফায়, যা sieve ধরনের algorithm-এ দেখা যায়।
from math import comb, log
def pairs(n): # compare every pair of customer ids
c = 0
for i in range(n):
for j in range(i + 1, n):
c += 1
return c
def triples(n): # every set of 3 customers
c = 0
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
c += 1
return c
def multiples(n): # inner loop jumps by i
c = 0
for i in range(1, n + 1):
for j in range(i, n + 1, i):
c += 1
return c
for n in (10, 100, 1000):
H = sum(1 / k for k in range(1, n + 1))
print(f"n={n}: pairs {pairs(n)} = n(n-1)/2 = {n * (n - 1) // 2}")
if n <= 100:
print(f" triples {triples(n)} = C(n,3) = {comb(n, 3)}")
print(f" multiples {multiples(n)}, n*H_n = {n * H:.1f},"
f" n ln n = {n * log(n):.1f}")আসল আউটপুট (ব্রাউজারের Python):
n=10: pairs 45 = n(n-1)/2 = 45
triples 120 = C(n,3) = 120
multiples 27, n*H_n = 29.3, n ln n = 23.0
n=100: pairs 4950 = n(n-1)/2 = 4950
triples 161700 = C(n,3) = 161700
multiples 482, n*H_n = 518.7, n ln n = 460.5
n=1000: pairs 499500 = n(n-1)/2 = 499500
multiples 7069, n*H_n = 7485.5, n ln n = 6907.8
জোড়ার সংখ্যা প্রতিবার n(n − 1)/2-এর সঙ্গে হুবহু মেলে। তিন স্তরের লুপ ∑∑∑ 1 = C(n, 3) = n(n − 1)(n − 2)/6, Θ(n³); n = 1000-এ এটি প্রায় ১৭ কোটি পুনরাবৃত্তি, ব্রাউজারে অনেক সময় নেবে, তাই সেখানে ব্লক থেমেছে। সূত্র এক লাইনে উত্তর দেয়: C(1000, 3) = 166167000. তৃতীয় লুপে i-এর জন্য ভেতরের লুপ ⌊n/i⌋ বার চলে, তাই মোট ∑i=1n ⌊n/i⌋. এটি সবসময় n·Hn − n আর n·Hn-এর মাঝে (কারণ n/i − 1 < ⌊n/i⌋ ≤ n/i), আর Hn প্রায় ln n; তাই বৃদ্ধি Θ(n log n). Hn ঠিক কী, পরের অংশে।
৯ · Harmonic number — অসীমে যায়, কিন্তু খুব ধীরে
Harmonic number Hn = ∑k=1n 1/k = 1 + 1/2 + 1/3 + … + 1/n. যেমন H5 = 137/60 ≈ 2.283. পদগুলো ক্রমে শূন্যের দিকে যায়, তাই মনে হতে পারে যোগফল কোনো সীমায় থামবে। থামে না: অসীম harmonic series ∑1/k যেকোনো সংখ্যাকে ছাড়িয়ে যায়। নিচের প্রমাণে কোনো calculus লাগে না।
প্রতিটি m ≥ 0-এর জন্য H2m ≥ 1 + m/2. ফলে Hn সীমাহীনভাবে বাড়ে।
প্রমাণ (m-এর ওপর induction):
- Basis m = 0: H1 = 1 ≥ 1 + 0.
- ধরি কোনো m ≥ 0-এর জন্য H2m ≥ 1 + m/2.
- ∑-এর ভাঙার নিয়মে H2m+1 = H2m + ∑k=2m+12m+1 1/k.
- দ্বিতীয় যোগফলে পদ 2m+1 − 2m = 2mটি, আর প্রতিটি পদ ≥ সবচেয়ে ছোট পদ 1/2m+1. তাই সেটি ≥ 2m/2m+1 = 1/2.
- Hypothesis মিলিয়ে H2m+1 ≥ 1 + m/2 + 1/2 = 1 + (m + 1)/2. ∎
- যেকোনো সংখ্যা M-এর জন্য m > 2M নিলে H2m > M; আর Hn n-এর সঙ্গে বাড়ে, তাই এর কোনো ঊর্ধ্বসীমা নেই।
যুক্তিটি চতুর্দশ শতকের ফরাসি পণ্ডিত Nicole Oresme-এর বলে প্রচলিত (আনুমানিক ১৩৫০ সালের দিকে)। কিন্তু বৃদ্ধি অত্যন্ত ধীর। কতটা ধীর, তা সামান্য calculus দিয়ে নিখুঁত করা যায়: y = 1/x বক্ররেখার নিচের ক্ষেত্রফলের সঙ্গে আয়তক্ষেত্রের তুলনা।
আয়তক্ষেত্রের যোগফল বনাম বক্ররেখার নিচের ক্ষেত্রফল
Bars of height 1/k on [k, k+1] lie above the curve y = 1/x
প্রতিটি n ≥ 1-এর জন্য ln(n + 1) < Hn ≤ 1 + ln n.
প্রমাণের রূপরেখা: 1/x ক্রমহ্রাসমান, তাই k ≤ x ≤ k + 1-এ 1/(k + 1) ≤ 1/x ≤ 1/k, আর সমতা শুধু প্রান্তে। (১) ∫kk+1 dx/x < 1/k; k = 1..n যোগ করে ln(n + 1) < Hn (ছবি ৯.১)। (২) ∫k−1k dx/x > 1/k (k ≥ 2): আয়তক্ষেত্রগুলো এক ঘর বাঁয়ে সরালে বক্ররেখার নিচে চলে যায়; k = 2..n যোগ করে Hn − 1 ≤ ln n, n = 1-এ সমতা। এখানে ∫dx/x = ln x, calculus-এর তথ্য, আমরা মেনে নিচ্ছি। ∎
দুই সীমার পার্থক্য 1-এর কম, তাই Hn = ln n + O(1), অর্থাৎ Θ(log n). আরও সূক্ষ্মভাবে Hn − ln n একটি ধ্রুবকের দিকে যায়, যাকে বলে Euler–Mascheroni constant γ ≈ 0.5772. এর প্রমাণ (পার্থক্যটি ক্রমহ্রাসমান আর নিচে সীমাবদ্ধ) আমরা বাদ রাখছি। নিচের ব্লক সংখ্যাগুলো দেখায়:
from fractions import Fraction
from math import log
print("H_5 exactly:", sum(Fraction(1, k) for k in range(1, 6)))
print(f"{'n':>8} {'H_n':>8} {'ln n':>8} {'H_n - ln n':>11} ln(n+1) < H_n <= 1+ln n")
show = {1, 2, 5, 10, 100, 1000, 10**4, 10**5, 10**6}
H, first_over_10 = 0.0, None
for n in range(1, 10**6 + 1):
H += 1 / n
if H > 10 and first_over_10 is None:
first_over_10 = n
if n in show:
ok = log(n + 1) < H <= 1 + log(n)
print(f"{n:>8} {H:8.4f} {log(n):8.4f} {H - log(n):11.6f} {ok}")
print("Euler's constant gamma ~ 0.577216")
print("first n with H_n > 10:", first_over_10)আসল আউটপুট (ব্রাউজারের Python):
H_5 exactly: 137/60
n H_n ln n H_n - ln n ln(n+1) < H_n <= 1+ln n
1 1.0000 0.0000 1.000000 True
2 1.5000 0.6931 0.806853 True
5 2.2833 1.6094 0.673895 True
10 2.9290 2.3026 0.626383 True
100 5.1874 4.6052 0.582207 True
1000 7.4855 6.9078 0.577716 True
10000 9.7876 9.2103 0.577266 True
100000 12.0901 11.5129 0.577221 True
1000000 14.3927 13.8155 0.577216 True
Euler's constant gamma ~ 0.577216
first n with H_n > 10: 12367
দশ লাখ পদ যোগ করেও Hn মাত্র প্রায় 14.39; 10 ছাড়াতে লাগে 12367টি পদ। Hn − ln n কমতে কমতে 0.577216-এ স্থির হচ্ছে, γ-এর মান। প্রতিটি সারিতে উপপাদ্য ৯.২-এর দুই সীমা খেটেছে (True). H5-এর নির্ভুল মান 137/60 এসেছে Fraction থেকে; float-এর যোগফলে সামান্য গোলমাল জমে, তবে এখানে চার দশমিক ঘরে তা চোখে পড়ে না।
পরীক্ষার ধাঁচের হিসাব: ∑i=1n Hi-এর closed form বের করুন। Hi = ∑j=1i 1/j, তাই এটি ত্রিভুজাকার double sum. উপপাদ্য ৮.১ দিয়ে ক্রম বদলে: ∑j=1n ∑i=jn 1/j = ∑j=1n (n − j + 1)/j = (n + 1)∑j=1n 1/j − ∑j=1n 1 = (n + 1)Hn − n. যাচাই n = 3: H1 + H2 + H3 = 1 + 3/2 + 11/6 = 13/3, আর 4 · 11/6 − 3 = 22/3 − 3 = 13/3. ✓
Harmonic number কম্পিউটার বিজ্ঞানে বারবার আসে: quicksort-এর গড় তুলনা-সংখ্যার হিসাবে, ওপরের sieve-ধরনের লুপে, আর “কুপন সংগ্রহ” সমস্যায়। বাজারঘর প্রতিটি অর্ডারের সঙ্গে n রকম স্টিকারের একটি এলোমেলোভাবে দিলে সব রকম পেতে গড়ে n·Hnটি অর্ডার লাগে; এর প্রমাণ পর্ব ৪০ “Random variable আর প্রত্যাশা”-য়।
আরও গভীরে: ∑kp-এর সাধারণ সূত্র p + 1 মাত্রার একটি polynomial, যার সহগে Bernoulli সংখ্যা আসে (Jacob Bernoulli-র মৃত্যুর পরে ১৭১৩ সালে প্রকাশিত Ars Conjectandi-তে; এর আগে সপ্তদশ শতকে Johann Faulhaber অনেক সূত্র দিয়েছিলেন বলে উল্লেখ আছে)। Euler–Maclaurin সূত্র যোগফল আর integral-এর পার্থক্যকে নিখুঁত ধারায় লেখে; তা থেকে Hn ≈ ln n + γ + 1/(2n) − 1/(12n²) পাওয়া যায়। γ মূলদ না অমূলদ, তা আজও অজানা।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- ∑k=150 (2k − 1) কত? 50² = 2500 (প্রথম n বিজোড় সংখ্যার যোগফল n²).
- 1 + 2 + 4 + … + 29 কত? 210 − 1 = 1023.
- ∑k=1n 1/(k(k + 1))? Telescoping: n/(n + 1).
for i in range(n): for j in range(i+1, n)কতবার চলে? n(n − 1)/2, তাই Θ(n²).- 1 + 1/2 + … + 1/n কত দ্রুত বাড়ে? Θ(log n); ln(n + 1) < Hn ≤ 1 + ln n.
১০ · AI-এর যুগে — AI-এর দেওয়া closed form আর লুপ-হিসাব যাচাই
“∑k²-এর সূত্র কী?” এমন প্রশ্নে AI সহকারী সাধারণত ঠিক উত্তর দেয়, কারণ সূত্রটি অসংখ্য বইয়ে আছে। বিপদ শুরু হয় অচেনা যোগফলে, সীমা একটু বদলালে, বা লুপের হিসাবে। এই বিষয়ে AI-এর ভুলগুলো চেনা ছাঁচের:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| Off-by-one: k = 0 না k = 1 থেকে, n না n − 1 পর্যন্ত, গুলিয়ে ফেলা | n = 0, 1, 2-এ সরাসরি যোগ করে সূত্রের সঙ্গে মেলান |
| কয়েকটি মান মেলে এমন ভুল সূত্রকে “প্রমাণিত” বলা | n = 1..100-এ যন্ত্রে মেলান; তারপরও প্রমাণ চান |
| GP-র সূত্রে r ≠ 1 শর্ত, বা অসীম যোগফলে |r| < 1 শর্ত বাদ | প্রতিটি ভাগের হর আর প্রতিটি সীমার শর্ত জিজ্ঞেস করুন |
| Induction-এর ধাপ ঠিক, কিন্তু basis যাচাই নেই | Basis নিজে হিসাব করুন; অনুশীলন ৪-এর ফাঁদটি দেখুন |
| ত্রিভুজাকার লুপকে n² বা n²/2 বলে ধরে নেওয়া, বা ধাপে লাফানো লুপকে n² | ছোট n-এ counter বসিয়ে আসল সংখ্যা গুনুন |
| ঐতিহাসিক তথ্য বা “বিখ্যাত বইয়ের” উদ্ধৃতি বানিয়ে বলা | বিশ্বস্ত পাঠ্যবই বা OEIS-এর মতো উৎসে নিজে খুঁজুন |
AI-কে যোগফল বা লুপের হিসাব করতে দিলে কাঠামো বেঁধে দিন, যাতে প্রতিটি দাবি যাচাই করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১বর্গ আর ঘনের যোগফলের সূত্র কে প্রথম জানতেন? আর ছবির “প্রমাণ” কি আসল প্রমাণ?
এই সূত্রগুলোর ইতিহাস অনেক পুরোনো আর বহু সভ্যতায় ছড়ানো। প্রাচীন গ্রিসে পিথাগোরীয়রা বিন্দু সাজিয়ে “ত্রিভুজ সংখ্যা” আর “বর্গ সংখ্যা” নিয়ে কাজ করতেন; 1 + 3 + 5 + … + (2n − 1) = n² তাঁরা ছবিতে দেখতেন: প্রতিটি বিজোড় সংখ্যা একটি বর্গের চারপাশে একটি L-আকৃতির স্তর যোগ করে। ঘনের যোগফল যে ত্রিভুজ সংখ্যার বর্গ, এই তথ্য প্রায়ই খ্রিস্টীয় প্রথম-দ্বিতীয় শতকের Nicomachus-এর নামে বলা হয়। ভারতে Aryabhata ৪৯৯ খ্রিস্টাব্দের Aryabhatiya-তে বর্গ আর ঘনের যোগফলের নিয়ম লিখেছিলেন বলে ইতিহাসবিদরা উল্লেখ করেন; পরে আরব গণিতবিদরা, যেমন একাদশ শতকের Ibn al-Haytham, চতুর্থ ঘাতের যোগফল নিয়ে কাজ করেছেন বলে জানা যায়। সঠিক কৃতিত্ব নিয়ে সূত্রভেদ আছে, তাই “প্রথম কে” প্রশ্নের নিশ্চিত উত্তর দেওয়া কঠিন।
এই পর্বের ছবি ৫.১-এর মতো চিত্রকে প্রায়ই “শব্দহীন প্রমাণ” (proof without words) বলা হয়। প্রশ্ন হলো, এটি কি পূর্ণ প্রমাণ? ছবিটি একটি নির্দিষ্ট n (এখানে 4) দেখায়। পাঠক মনে মনে সাধারণ n-এর জন্য একই গঠন কল্পনা করেন, আর সেই কল্পনাটিই আসল যুক্তি: “n সারি, প্রতিটিতে n + 1 ঘর, আর নীল সিঁড়ি ঠিক অর্ধেক।” এই কথাটি ভাষায় লিখলেই উপপাদ্য ৫.১-এর প্রমাণ হয়। তাই ছবি একটি প্রমাণের ধারণা দেয়; গণিতের মান অনুযায়ী প্রমাণ হতে হলে সাধারণ n-এর জন্য প্রতিটি ধাপ যাচাইযোগ্য হতে হয়।
ছবির বিপদও আছে। কিছু বিখ্যাত “ধাঁধার ছবি”-তে টুকরোগুলো সাজালে ক্ষেত্রফল এক ঘর বেড়ে যায় বলে মনে হয়, কারণ রেখাগুলো আসলে সামান্য বাঁকা বা ফাঁকা থাকে, যা চোখে ধরা পড়ে না। তাই ছবি দিয়ে অনুমান, ভাষা আর বীজগণিত দিয়ে প্রমাণ, আর Python দিয়ে বড় n-এ যাচাই, তিনটি একসঙ্গে সবচেয়ে নিরাপদ।
মূল উপলব্ধি: সূত্রগুলো বহু সভ্যতার যৌথ অর্জন; ছবি প্রমাণের পথ দেখায়, কিন্তু প্রমাণ হলো সাধারণ n-এর জন্য লেখা যুক্তি।
প্র ০২Harmonic series অসীমে যায়, অথচ এত ধীরে কেন? বাস্তবে এর কোথায় দেখা মেলে?
পদগুলো 1/k শূন্যের দিকে যায়, তবু যোগফল সীমাহীন: এটি প্রথম দেখায় অবাক করে। উপপাদ্য ৯.১-এর যুক্তি, পদগুলোকে 2, 4, 8, … দৈর্ঘ্যের দলে ভাগ করে প্রতিটি দলে অন্তত ½ পাওয়া, চতুর্দশ শতকের ফরাসি পণ্ডিত Nicole Oresme-এর বলে প্রচলিত। পরে সপ্তদশ শতকে Pietro Mengoli আর Bernoulli ভাইয়েরাও ভিন্ন প্রমাণ দেন বলে উল্লেখ আছে। শিক্ষাটি গভীর: পদ শূন্যের দিকে যাওয়া যোগফল সসীম হওয়ার জন্য প্রয়োজনীয়, কিন্তু যথেষ্ট নয়।
ধীরতার মাপ উপপাদ্য ৯.২ দেয়: Hn প্রায় ln n. Hn 100 ছাড়াতে n লাগবে প্রায় e99.4, যা প্রায় 1043; কোনো কম্পিউটার এতগুলো পদ যোগ করতে পারবে না। তাই “অসীমে যায়” কথাটি প্রমাণের বিষয়, পরীক্ষার নয়: কম্পিউটারে যত দূর দেখবেন, মনে হবে যোগফল থেমে আছে।
বাস্তবে Hn বহু জায়গায় আসে। বই সাজানোর একটি পুরোনো ধাঁধা: টেবিলের কিনারায় n টি একই রকম বই একটির ওপর আরেকটি (প্রতি স্তরে একটি করে) রেখে সবচেয়ে ওপরের বইটি কতদূর বাইরে ঝোলানো যায়? সর্বোত্তম সাজানোয় ঝুলন্ত দূরত্ব বইয়ের দৈর্ঘ্যের Hn/2 গুণ, যা ধীরে হলেও সীমাহীন; যথেষ্ট বই থাকলে ওপরের বই পুরোপুরি টেবিলের বাইরে চলে যায় (n = 4-এই H4/2 ≈ 1.04). কম্পিউটার বিজ্ঞানে quicksort-এর গড় তুলনা-সংখ্যা প্রায় 2n ln n, যার হিসাবে harmonic number আসে; কুপন সংগ্রহ সমস্যায় গড় n·Hn; আর hash table-এর কিছু বিশ্লেষণেও এটি আসে।
আরেকটি বাস্তব দিক: “লগারিদমিক” বৃদ্ধি মানে কাজ বাড়ে, কিন্তু প্রায় চোখে পড়ে না। ইনপুট দশ লাখ গুণ বাড়লে ln n বাড়ে মাত্র প্রায় 13.8. তাই Θ(n log n) algorithm বাস্তবে প্রায় রৈখিকের মতো আচরণ করে।
মূল উপলব্ধি: সীমাহীন আর দ্রুত এক কথা নয়; Hn সীমাহীন অথচ log-এর গতিতে চলে, আর এই ধীরতাই অনেক algorithm-কে দ্রুত রাখে।
প্র ০৩“প্রথম কয়েকটি ক্ষেত্রে সত্য” দেখে কেন বিশ্বাস করা বিপজ্জনক? “ছোট সংখ্যার শক্তিশালী নিয়ম” কী?
গণিতবিদ Richard K. Guy ১৯৮৮ সালে The Strong Law of Small Numbers নামে একটি প্রবন্ধ লেখেন। তাঁর মূল কথা, কৌতুক করে বলা: “এত দাবি পূরণ করার মতো যথেষ্ট ছোট সংখ্যা নেই।” অর্থাৎ ছোট সংখ্যা এত কম যে নানা ভিন্ন নিয়ম শুরুতে একই মান দেয়, আর আমরা ভুল করে একটি নিয়ম “আবিষ্কার” করে ফেলি। তিনি অনেক উদাহরণ দেন, যার একটি এই পর্বের বৃত্ত ভাগের সমস্যা: 1, 2, 4, 8, 16, তারপর 32 নয়, 31.
আরও নাটকীয় উদাহরণ আছে। George Pólya ১৯১৯ সালে একটি অনুমান করেন: প্রতিটি n > 1-এর জন্য, 1 থেকে n পর্যন্ত সংখ্যার অন্তত অর্ধেকের মৌলিক উৎপাদক (পুনরাবৃত্তিসহ গুনে) বিজোড় সংখ্যক। ছোট n-এ এটি সত্য দেখায়। ১৯৫৮ সালে C. B. Haselgrove প্রমাণ করেন যে এটি কোথাও ভাঙে, আর পরে ১৯৮০ সালে Minoru Tanaka সবচেয়ে ছোট counterexample 906150257 খুঁজে পান বলে প্রকাশিত। অর্থাৎ প্রায় ৯০ কোটি পর্যন্ত সব ক্ষেত্র মিলে গেলেও দাবিটি মিথ্যা। এই কারণেই এই কোর্সে Python দিয়ে যাচাইকে কখনো প্রমাণের বিকল্প বলা হয় না।
উপপাদ্য ৩.১ এর গাণিতিক কারণ দেয়: m টি মান দেওয়া থাকলে পরের মান যা খুশি করে একটি polynomial বানানো যায়। তাহলে চাকরির পরীক্ষার “পরের সংখ্যা কত” প্রশ্নের অর্থ কী? প্রশ্নকর্তা আসলে সবচেয়ে সরল, স্বাভাবিক নিয়মটি চান: ধ্রুবক পার্থক্য, ধ্রুবক অনুপাত, বর্গ, Fibonacci-র মতো যোগ, বা দুটি ধারা পালাক্রমে। সেখানে difference table আর অনুপাত দেখা ভালো কৌশল। কিন্তু গবেষণায় বা কোডে একটি প্যাটার্ন পেলে তার পেছনের কারণ খুঁজতে হয়।
অচেনা ধারার উৎস খুঁজতে OEIS খুব কাজের। Neil Sloane ১৯৬০-এর দশকে ছাত্রাবস্থায় integer sequence সংগ্রহ শুরু করেন, ১৯৭৩ সালে A Handbook of Integer Sequences বই আকারে প্রকাশ করেন, আর ১৯৯০-এর দশকের মাঝামাঝি সংগ্রহটি অনলাইনে আসে বলে জানা যায়। একটি ধারা মিললে সেখানে সূত্র, প্রমাণের তথ্যসূত্র আর সম্পর্কিত ধারা পাবেন, কিন্তু মিল নিজে প্রমাণ নয়।
মূল উপলব্ধি: প্যাটার্ন অনুমানের উৎস, প্রমাণের নয়; যত বেশি ক্ষেত্রেই মিলুক, একটি counterexample দাবিকে ভেঙে দেয়।
প্র ০৪অসীম যোগফলে সসীম যোগের নিয়ম কি চলে? Basel সমস্যা আর “1 + 2 + 3 + … = −1/12” দাবির গল্প কী?
সসীম যোগফলে আমরা নিশ্চিন্তে পদ সাজাই, ভাঙি, ক্রম বদলাই (উপপাদ্য ৪.১, ৮.১)। অসীম যোগফলে এই স্বাধীনতা শর্তসাপেক্ষ। একটি সহজ উদাহরণ: 1 − 1 + 1 − 1 + …. জোড়ায় জোড়ায় বন্ধনী দিলে (1 − 1) + (1 − 1) + … = 0; প্রথম পদ আলাদা রাখলে 1 + (−1 + 1) + … = 1. আসলে আংশিক যোগফল 1, 0, 1, 0, … কোনো সীমায় পৌঁছায় না, তাই যোগফলটির সাধারণ অর্থে কোনো মান নেই। আরও চমকপ্রদ Riemann-এর rearrangement theorem: শর্তসাপেক্ষে convergent একটি ধারা (যেমন 1 − 1/2 + 1/3 − 1/4 + …) পদ নতুন ক্রমে সাজিয়ে যেকোনো বাস্তব সংখ্যার সমান করা যায়।
সঠিকভাবে করলে অসীম যোগফল অসাধারণ ফল দেয়। ∑1/k² কত, এই প্রশ্ন সপ্তদশ শতকের মাঝামাঝি Pietro Mengoli তোলেন বলে উল্লেখ আছে, আর Bernoulli ভাইয়েরাও চেষ্টা করে পারেননি। Leonhard Euler ১৭৩০-এর দশকে উত্তর দেন: π²/6 ≈ 1.6449. এটি “Basel সমস্যা” নামে পরিচিত, Bernoulli-দের শহরের নামে। Euler-এর প্রথম যুক্তিতে কিছু অংশ তখনকার মানে কঠোর ছিল না; পরে তিনি ও অন্যরা কঠোর প্রমাণ দেন। মজার একটি পরিণতি: “দুটি এলোমেলো পূর্ণসংখ্যা সহমৌলিক হওয়ার সম্ভাবনা” (সঠিক সীমার অর্থে) 6/π² ≈ 0.608.
এবার বিখ্যাত দাবি “1 + 2 + 3 + … = −1/12”. Srinivasa Ramanujan ১৯১৩ সালে G. H. Hardy-কে লেখা চিঠিতে এমন একটি সম্পর্ক লিখেছিলেন বলে প্রচলিত। কিন্তু এটি সাধারণ অর্থে যোগফল নয়: আংশিক যোগফল n(n + 1)/2 সীমাহীনভাবে বাড়ে। −1/12 আসে Riemann zeta function-এর analytic continuation থেকে, ζ(−1) = −1/12, যা একটি ভিন্ন সংজ্ঞায় ধারাটিকে একটি মান “নির্ধারণ” করে। পদার্থবিজ্ঞানের কিছু হিসাবে এই ধরনের regularization কাজে লাগে, কিন্তু “সাধারণ যোগ করলে −1/12 হয়” বললে তা ভুল।
মূল উপলব্ধি: অসীম যোগফল সংজ্ঞায় সীমার ধারণা; সেই সীমা আছে কি না, আর কোন শর্তে পদ সাজানো চলে, তা না দেখে সসীম নিয়ম চালালে উদ্ভট ফল আসে।
প্র ০৫কম্পিউটারে যোগফল কি সবসময় নির্ভুল? Float-এর যোগে ক্রম কেন গুরুত্বপূর্ণ?
গণিতে যোগ সংযোগী: (a + b) + c = a + (b + c). Python-এর int-এ এটি হুবহু খাটে, কারণ int যত বড় দরকার তত বড় হয় আর কোনো গোলমাল নেই। এই পর্বের ব্লকগুলো তাই closed form যাচাইয়ে int আর Fraction ব্যবহার করেছে। কিন্তু float (দশমিক সংখ্যার যন্ত্র-রূপ) সীমিত সংখ্যক binary অঙ্কে মান রাখে, তাই প্রতিটি যোগের পর ফল গোল করা হয়। Python-এ 0.1 + 0.1 + 0.1 লিখলে আসে 0.30000000000000004, কারণ 0.1 binary-তে নিখুঁতভাবে লেখা যায় না।
গোলমাল জমে, আর জমার পরিমাণ যোগের ক্রমের ওপর নির্ভর করে। বড় একটি সংখ্যার সঙ্গে অনেক ছোট সংখ্যা একটি একটি করে যোগ করলে ছোটগুলো হারিয়ে যেতে পারে; ছোটগুলো আগে নিজেদের মধ্যে যোগ করলে ফল ভালো হয়। এর জন্য কিছু কৌশল আছে: pairwise summation (যোগফলকে দুই ভাগ করে আলাদা যোগ, তারপর জোড়া, NumPy-র মতো লাইব্রেরি এমন কৌশল ব্যবহার করে বলে জানা যায়), আর William Kahan-এর নামে পরিচিত compensated summation (১৯৬০-এর দশকে প্রকাশিত), যা প্রতিটি ধাপে হারানো অংশ আলাদা একটি variable-এ ধরে রাখে। Python-এর math.fsum নির্ভুলভাবে গোল করা যোগফল দেয়; আর release notes অনুযায়ী Python 3.12 থেকে সাধারণ sum()-ও float-এর জন্য compensated summation ব্যবহার করে।
বাজারঘরের হিসাবেও এটি বাস্তব প্রশ্ন। লাখ লাখ অর্ডারের টাকা float-এ যোগ করলে শেষ পয়সায় অমিল হতে পারে। তাই অর্থের হিসাব সাধারণত পূর্ণসংখ্যায় (পয়সায়) বা দশমিক টাইপে রাখা হয়; Python প্রোগ্রামিং কোর্সের পর্ব ৭-এ float-এর ফাঁদ আর Decimal দেখানো আছে। আর বিচ্ছিন্ন গণিতের ফল (যেমন জোড়ার সংখ্যা n(n − 1)/2) সবসময় int-এ হিসাব করা উচিত; / নয়, //, আর তার আগে নিশ্চিত হওয়া যে ভাগ নিখুঁত।
মূল উপলব্ধি: ∑-এর নিয়মগুলো বাস্তব সংখ্যার গণিতে নিখুঁত, কিন্তু যন্ত্রের float-এ আনুমানিক; নির্ভুলতা দরকার হলে int, Fraction বা বিশেষ যোগের কৌশল ব্যবহার করুন।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: প্রতিটি n ≥ 1-এর জন্য দেখান যে ∑k=1n 1/(k(k + 1)(k + 2)) = 1/4 − 1/(2(n + 1)(n + 2)). (ইঙ্গিত: পদটিকে দুটি পাশাপাশি ভগ্নাংশের পার্থক্য হিসেবে লিখুন।)
bk = 1/(k(k + 1)) নিন। তাহলে bk − bk+1 = ((k + 2) − k)/(k(k + 1)(k + 2)) = 2/(k(k + 1)(k + 2)).
- তাই পদটি ½(bk − bk+1).
- Linearity আর telescoping (উপপাদ্য ৬.১, “−” চিহ্নসহ): যোগফল = ½(b1 − bn+1).
- b1 = 1/2, bn+1 = 1/((n + 1)(n + 2)). তাই যোগফল 1/4 − 1/(2(n + 1)(n + 2)). ∎
যাচাই n = 1: বাঁ পাশ 1/6, ডান পাশ 1/4 − 1/12 = 1/6. n = 3-এ দুই পাশই 9/40; scratch-এ Fraction দিয়ে n = 1..7 মিলিয়েছি। n বাড়লে যোগফল 1/4-এর দিকে যায়।
-
হিসাব: (ক) 3, 6, 12, 24, … গুণোত্তর ধারার প্রথম ১০ পদের যোগফল। (খ) ∑k=120 k². (গ) ∑i=13 ∑j=14 (i + 2j). (ঘ) ∏k=210 (1 − 1/k).
(ক) a = 3, r = 2, ১০টি পদ মানে শেষ ঘাত 9: 3(210 − 1)/(2 − 1) = 3 · 1023 = 3069.
(খ) 20 · 21 · 41/6 = 17220/6 = 2870.
(গ) Linearity: ∑∑i = 4 · (1 + 2 + 3) = 24 (প্রতিটি i চারবার), ∑∑2j = 3 · 2 · (1 + 2 + 3 + 4) = 60. মোট 84.
(ঘ) 1 − 1/k = (k − 1)/k, তাই গুণফল (1/2)(2/3)…(9/10) = 1/10, telescoping product. সব মান scratch script-এ মিলিয়েছি।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
n = 6 c = 0 for i in range(1, n + 1): for j in range(i, n + 1, i): c += 1 print(c, sum(n // i for i in range(1, n + 1)))14 14i-এর জন্য j চলে i, 2i, 3i, … যতক্ষণ ≤ 6, অর্থাৎ ⌊6/i⌋ বার: i = 1..6-এ 6, 3, 2, 1, 1, 1. মোট 14. দ্বিতীয় সংখ্যাটি একই যোগফল ∑⌊n/i⌋ সরাসরি। অন্যভাবে দেখলে c হলো 1 থেকে 6 পর্যন্ত প্রতিটি সংখ্যার ভাজক-সংখ্যার যোগফল: 1 + 2 + 2 + 3 + 2 + 4 = 14, কারণ প্রতিটি জোড়া (i, j) মানে “i ভাগ করে j”. একই গণনা দুই দিক থেকে, উপপাদ্য ৮.১-এর মতো ক্রম বদল।
-
প্রমাণের ভুল ধরুন: “দাবি: প্রতিটি n ≥ 1-এর জন্য 1 + 2 + … + n = (n + ½)²/2. প্রমাণ: ধরি n = k-তে সত্য। তাহলে 1 + … + k + (k + 1) = (k + ½)²/2 + (k + 1) = (k² + k + ¼ + 2k + 2)/2 = (k² + 3k + 9/4)/2 = (k + 3/2)²/2, যা n = k + 1-এর দাবি। ∎” ভুল কোথায়?
Inductive step-এর বীজগণিত নির্ভুল; সমস্যা হলো basis একেবারে নেই। n = 1-এ বাঁ পাশ 1, ডান পাশ (3/2)²/2 = 9/8. দাবিটি কোনো n-এ সত্য নয়: আসল যোগফল n(n + 1)/2 = (n² + n)/2, আর দাবির মান (n² + n + ¼)/2, সবসময় 1/8 বেশি। Step শুধু বলে “k-তে সত্য হলে k + 1-এ সত্য”; কোথাও শুরু না হলে ডমিনো পড়েই না। Scratch-এ n = 1, 2, 3-এ দাবির মান 9/8, 25/8, 49/8 আর আসল যোগফল 1, 3, 6.
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমPerturbation পদ্ধতিতে একটি যোগফল S(n)-এর closed form বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- S(n)-কে ∑ চিহ্নে নির্ভুলভাবে লেখা, সীমাসহ
- S(n + 1)-কে শেষ পদ আলাদা করে লেখা
- S(n + 1)-কে প্রথম পদ আলাদা করে index shift করে লেখা
- দ্বিতীয় রূপের ভেতরে S(n)-কে আবার খুঁজে বের করা
- দুই রূপ সমান করে S(n)-এর সমীকরণ সমাধান করা
- ছোট n-এ সূত্রটি সরাসরি যোগফলের সঙ্গে মিলিয়ে দেখা
∑k=37 (2k − 1)-এর মান কত?
- 45
- 49
- 35
- 63
∑k=1n ak−1-কে নতুন সূচক j = k − 1 দিয়ে লিখলে কোনটি পাওয়া যায়?
- ∑j=1n aj
- ∑j=0n−1 aj
- ∑j=0n aj
- ∑j=2n+1 aj
1³ + 2³ + 3³ + … + 10³-এর মান কত?
- 385
- 55
- 3025
- 1000
Hn = 1 + 1/2 + 1/3 + … + 1/n হলে n বাড়ার সঙ্গে Hn-এর বৃদ্ধি কেমন?
- Θ(1), কোনো সংখ্যায় গিয়ে থামে
- Θ(n)
- Θ(√n)
- Θ(log n)
Python-এ c = 0, তারপর for i in range(10): আর তার ভেতরে for j in range(i + 1, 10): c += 1 চালালে শেষে c কত?
- 45
- 100
- 55
- 90
∏k=15 (1 + 1/k)-এর মান কত?
- 5
- 6
- 137/60
- 32
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Sequence: ℕ বা ℤ+ থেকে একটি function; নিয়ম explicit বা recursive. AP-তে an = a + (n − 1)d, GP-তে an = arn.
- অনুমান বনাম প্রমাণ: difference table ভালো অনুমান দেয়, কিন্তু সসীম পদ নিয়ম ঠিক করে না (1, 2, 4, 8, 16, 31).
- ∑-এর নিয়ম: linearity, ভাঙা, ধ্রুবকের যোগ, index shift; empty sum = 0, empty product = 1; ত্রিভুজাকার double sum-এ ক্রম বদলাতে অসমতা-শিকল লিখুন।
- তিন কৌশল: Gauss-এর জোড়া (∑k = n(n + 1)/2), telescoping (∑k², ∑1/(k(k + 1))), perturbation (GP, ∑k·2k); আর ∑k³ = (∑k)².
- লুপ আর Hn: i < j জোড়ার লুপ n(n − 1)/2 বার; ln(n + 1) < Hn ≤ 1 + ln n, তাই ধাপে লাফানো লুপ Θ(n log n).
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ১৮ · Cardinality — countable, uncountable আর Cantor-এর diagonalপরবর্তী পর্বঅসীম সেটের আকার, Cantor-এর diagonal আর গণনার সীমা।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপরের পর্ব ১৮ “Cardinality — countable, uncountable আর Cantor-এর diagonal” আর পুরো কোর্সের মানচিত্র।
- পর্ব ১০ · Mathematical induction — এক ধাপ থেকে অসীম পর্যন্তপুনরালোচনাযোগফলের সূত্র induction দিয়ে প্রমাণের ছাঁচ।
- পর্ব ১২ · Recursive সংজ্ঞা আর structural inductionপুনরালোচনাRecursive sequence আর Fibonacci-র বৃদ্ধি।
- DSA · পর্ব ৬ · DSA-র গণিত — log, যোগফল আর ধারাalgorithm-এ যোগফলবিশ্লেষণে যে যোগফল আর log সবচেয়ে বেশি লাগে।
- DSA · পর্ব ৪ · বৃদ্ধির হার আর Big-O, Ω, Θবৃদ্ধির হারলুপের যোগফল থেকে Θ(n²), Θ(n log n).
- DSA · পর্ব ১৭ · Prefix sum আর difference arraytelescoping কোডেযেকোনো খণ্ডের যোগফল এক বিয়োগে।
- Python প্রোগ্রামিং · পর্ব ১২ · লুপ — for, range, enumerate, zip, whilePythonrange-এর সীমা আর লুপের গঠন।