এই পর্বে যা শিখবেন
- একটি recurrence linear, homogeneous আর ধ্রুবক সহগের কি না চেনা, আর তার degree বলা
- Characteristic equation লিখে ভিন্ন মূলের ক্ষেত্রে সমাধান, আর উপপাদ্যটির পূর্ণ প্রমাণ
- Fibonacci-র Binet সূত্র বের করা আর কেন floating point-এ তা বড় n-এ ব্যর্থ হয় তা বোঝা
- পুনরাবৃত্ত মূলে n·rn কেন সমাধান তার প্রমাণ, আর degree k ও complex মূলের সাধারণ নিয়ম
- সমাধান-জগৎকে vector space আর companion matrix হিসেবে দেখা, আর dominant root দিয়ে বৃদ্ধির হার বলা
১ · Linear homogeneous recurrence — কোনটি, কোনটি নয়
আগের পর্ব ৪৪ “Recurrence দিয়ে মডেল — Fibonacci, Hanoi আর bit string”-এ নানা গণনার প্রশ্নকে recurrence-এর ভাষায় লেখা হয়েছে: একটি ক্রমের প্রতিটি পদ আগের কয়েকটি পদ দিয়ে লেখা নিয়ম। তখন সমাধান মানে ছিল কয়েকটি পদ খুলে (unrolling) একটি নিয়ম অনুমান করা, তারপর induction দিয়ে প্রমাণ করা (পর্ব ১০ “Mathematical induction — এক ধাপ থেকে অসীম পর্যন্ত”). অনুমান সব সময় চোখে পড়ে না। যেমন 2, 7, 11, 25, 47, 97, … দেখে নিয়মটি অনুমান করা সহজ নয়। এই পর্বে একটি বড় শ্রেণির recurrence-এর জন্য অনুমান ছাড়াই closed form বের করার একটি যান্ত্রিক পদ্ধতি শিখবেন।
বাজারঘরের রেফারেল কুপনের খাতাটি ভাবুন। প্রতি সপ্তাহে আগের সপ্তাহের সব কুপন আবার চালু হয়, আর দুই সপ্তাহ আগের প্রতিটি কুপন থেকে ২টি নতুন রেফারেল কুপন তৈরি হয়। সপ্তাহ n-এর কুপন সংখ্যা an হলে an = an−1 + 2an−2. প্রথম দুই সপ্তাহে কুপন ছিল ২টি আর ৭টি। হিসাবরক্ষক ১০০তম সপ্তাহের সংখ্যা জানতে চান, কিন্তু ৯৮ বার যোগ না করে, একটিমাত্র সূত্রে। এই পর্বের পদ্ধতি ঠিক সেটিই দেয়: an = 3 · 2n − (−1)n.
Degree k-এর একটি linear homogeneous recurrence (ধ্রুবক সহগসহ) হলো
an = c1an−1 + c2an−2 + … + ckan−k (n ≥ k)
যেখানে c1, …, ck নির্দিষ্ট বাস্তব (বা complex) ধ্রুবক আর ck ≠ 0. a0, …, ak−1-এর দেওয়া মানগুলো হলো initial condition.
- Linear: ডান পাশ আগের পদগুলোর linear combination; কোনো an−12 বা an−1an−2 নেই।
- Homogeneous: aj-এর গুণিতক নয় এমন কোনো আলাদা পদ (যেমন + n বা + 2n) নেই।
- ধ্রুবক সহগ: ci-গুলো n-এর ওপর নির্ভর করে না।
- Degree: সবচেয়ে পেছনের পদটি কত ধাপ পেছনে, সেই k; ck ≠ 0 শর্তটি degree-কে সুনির্দিষ্ট করে।
| Recurrence | এই শ্রেণির? | কারণ |
|---|---|---|
| Fn = Fn−1 + Fn−2 | হ্যাঁ, degree 2 | Fibonacci; c1 = c2 = 1 |
| an = 2an−1 − an−3 | হ্যাঁ, degree 3 | c2 = 0 চলে, শুধু c3 ≠ 0 লাগে |
| an = 1.05 an−1 | হ্যাঁ, degree 1 | চক্রবৃদ্ধি; উত্তর 1.05na0 |
| Hn = 2Hn−1 + 1 | না | + 1 পদ, তাই non-homogeneous (পর্ব ৪৬) |
| an = an−12 | না | linear নয় |
| an = n · an−1 | না | সহগ n-এর ওপর নির্ভর করে (n! দেয়) |
| T(n) = 2T(n/2) + n | না | divide-and-conquer ধরন (পর্ব ৪৭) |
এই শ্রেণিটি সংকীর্ণ শোনালেও কম্পিউটার বিজ্ঞানে বারবার আসে। Dynamic programming-এ “শেষ ধাপে কী হলো” ধরে গোনার প্রশ্ন (টাইল বসানো, সিঁড়ি ভাঙার উপায়, নিষিদ্ধ pattern ছাড়া string) প্রায়ই এমন recurrence দেয়। Linear feedback shift register (LFSR) নামের সরল pseudorandom bit উৎপাদক আসলে mod 2-এ একটি linear recurrence, যেমন xn = xn−3 ⊕ xn−4. Digital signal processing-এর অনেক filter-ও একই গঠনের। তাই সমাধানের পদ্ধতিটি একবার শিখলে অনেক জায়গায় কাজে লাগে।
Degree k-এর একটি linear homogeneous recurrence আর k-টি initial condition a0, …, ak−1 দিলে, recurrence আর এই মানগুলো মেনে চলে এমন ক্রম ঠিক একটিই আছে।
- অস্তিত্ব: a0, …, ak−1 দেওয়া; n ≥ k-এর জন্য recurrence-এর ডান পাশ শুধু আগের পদ দিয়ে an গণনা করে। তাই প্রতিটি পদ একভাবে সংজ্ঞায়িত (পর্ব ১২ “Recursive সংজ্ঞা আর structural induction”). — recursive সংজ্ঞা
- অনন্যতা: ধরুন a আর b দুটি ক্রমই শর্তগুলো মানে। P(n): an = bn. n < k-এর জন্য P(n) সত্য, কারণ দুজনের initial condition এক। — basis
- n ≥ k আর সব j < n-এ P(j) সত্য ধরলে an = ∑ cian−i = ∑ cibn−i = bn. তাই strong induction-এ সব n-এর জন্য an = bn. ∎ — পর্ব ১১
এই লেমাটিই পুরো পর্বের ভিত্তি। কোনো সূত্র recurrence মানে আর প্রথম k-টি মান মেলায়, এটুকু দেখালেই সূত্রটি সব n-এর জন্য সঠিক; আলাদা induction আর লাগে না। আর উল্টো দিকে সতর্কতা: degree k-এর recurrence-এ k-এর কম initial condition দিলে উত্তর অনন্য নয়, বেশি দিলে পরস্পরবিরোধী হতে পারে।
২ · Characteristic equation — rn অনুমান আর superposition
Degree 1-এর ক্ষেত্রটি সহজ: an = c·an−1 খুলে লিখলে an = cna0, একটি geometric progression (পর্ব ১৭ “Sequence আর summation — closed form আর বিখ্যাত যোগফল”). তাহলে degree 2-এও হয়তো সমাধান গুণোত্তর ধরনের। an = rn (r ≠ 0) বসিয়ে দেখি an = c1an−1 + c2an−2 কখন মেটে:
rn = c1rn−1 + c2rn−2 ⇔ r2 − c1r − c2 = 0
দুই পাশকে rn−2 ≠ 0 দিয়ে ভাগ করা হয়েছে। n-এর ওপর নির্ভরতা পুরো উধাও; বাকি থাকে r-এর একটি সাধারণ দ্বিঘাত সমীকরণ।
অনুমানটি কেন যুক্তিসঙ্গত, তা degree 1 থেকেই বোঝা যায়। বাজারঘরের একটি সঞ্চয় হিসাবে প্রতি মাসে ব্যালান্স একটি নির্দিষ্ট গুণে বাড়ে, ধরুন bn = 1.01 bn−1 (হার কাল্পনিক, শুধু হিসাবের জন্য, কোনো আর্থিক পরামর্শ নয়)। এখানে প্রতিটি ধাপ আগের মানকে একই সংখ্যা দিয়ে গুণ করে, তাই উত্তর গুণোত্তর। Degree 2-এ ধাপটি দুটি আগের মান মেশায়, কিন্তু মেশানোর নিয়ম n-এর সঙ্গে বদলায় না; তাই এমন কোনো গুণোত্তর ক্রম খোঁজা স্বাভাবিক, যার ক্ষেত্রে দুই আগের মান মেশানো আর একটি নির্দিষ্ট সংখ্যায় গুণ করা একই কথা। আর ck ≠ 0 শর্তটি কেন: ck = 0 হলে recurrence আসলে ছোট degree-র, শুধু শুরুর সূচক সরানো, আর r = 0 একটি অর্থহীন “মূল” হয়ে ঢোকে।
an = c1an−1 + … + ckan−k-এর characteristic equation হলো
rk − c1rk−1 − c2rk−2 − … − ck = 0
আর এর সমাধানগুলো হলো characteristic root. ck ≠ 0 বলে r = 0 কখনো মূল নয়।
লেখার নিয়মটি মনে রাখার একটি সহজ কৌশল: an−i-কে rk−i দিয়ে বদলান, তারপর সব পদ এক পাশে আনুন। Fibonacci-র জন্য r2 − r − 1 = 0; বাজারঘরের কুপনের জন্য r2 − r − 2 = 0; আর an = 2an−1 − an−3-এর জন্য r3 − 2r2 + 1 = 0 (মাঝের r-এর পদ শূন্য)। একটি সাধারণ ভুল হলো চিহ্ন উল্টে ফেলা, যেমন r2 + r + 2 লেখা; মূল তখন সম্পূর্ণ আলাদা হয়।
- r ≠ 0 হলে an = rn recurrence-টির সমাধান, যদি আর কেবল যদি r characteristic equation-এর একটি মূল।
- sn আর tn দুটি সমাধান হলে যেকোনো ধ্রুবক α, β-এর জন্য αsn + βtn-ও একটি সমাধান।
- (১) rn = ∑ cirn−i-কে rn−k ≠ 0 দিয়ে ভাগ করলে rk = ∑ cirk−i, যা ঠিক characteristic equation; প্রতিটি ধাপ উল্টানো যায়। — বীজগণিত
- (২) αsn + βtn = α∑ cisn−i + β∑ citn−i = ∑ ci(αsn−i + βtn−i). অর্থাৎ নতুন ক্রমটিও একই recurrence মানে। ∎ — যোগ আর গুণের বণ্টন নিয়ম
দ্বিতীয় অংশটির নাম superposition principle. এটি ঠিক “linear” আর “homogeneous” শর্ত দুটির ফসল। Recurrence-এ + 1 থাকলে দুই সমাধানের যোগফলে + 2 আসত, তাই superposition ভাঙত; সেই ক্ষেত্রের জন্য পর্ব ৪৬ “Non-homogeneous recurrence আর particular solution” আলাদা কৌশল দেবে। এখন পরিকল্পনাটি পরিষ্কার: প্রতিটি মূল থেকে একটি গুণোত্তর সমাধান পাই, তারপর সেগুলোর linear combination নিয়ে initial condition মেলাই।
৩ · ভিন্ন মূলের উপপাদ্য — দুই মাত্রার সমাধান-জগৎ
an = c1an−1 + c2an−2, c2 ≠ 0, আর r2 − c1r − c2 = 0-এর দুটি ভিন্ন মূল r1 ≠ r2. তাহলে একটি ক্রম {an} এই recurrence-এর সমাধান, যদি আর কেবল যদি কিছু ধ্রুবক α1, α2-এর জন্য
an = α1r1n + α2r2n (সব n ≥ 0)
- (⇐) এই রূপ সমাধান: লেমা ২.২(১) অনুযায়ী r1n আর r2n দুটিই সমাধান, আর ২.২(২) অনুযায়ী তাদের linear combination-ও। — লেমা ২.২
- (⇒) প্রতিটি সমাধান এই রূপের: ধরুন {an} একটি সমাধান। এমন α1, α2 খুঁজি যাতে n = 0 আর n = 1-এ মেলে: α1 + α2 = a0 আর α1r1 + α2r2 = a1. — দুই চলকের linear system
- এই system-এর সহগ matrix [1 1; r1 r2]-এর determinant r2 − r1 ≠ 0, তাই এর ঠিক একটি সমাধান আছে। Cramer's rule থেকে α1 = (a0r2 − a1)/(r2 − r1) আর α2 = (a1 − a0r1)/(r2 − r1). — r1 ≠ r2
- bn = α1r1n + α2r2n ধাপ ১ অনুযায়ী recurrence মানে, আর ধাপ ৩ অনুযায়ী b0 = a0, b1 = a1. — নির্মাণ
- লেমা ১.২ (অনন্যতা) অনুযায়ী সব n-এ an = bn. ∎ — লেমা ১.২
ধাপ ৩-এই “ভিন্ন” শর্তটি কাজ করে: r1 = r2 হলে determinant শূন্য, আর system সাধারণত সমাধানহীন। তখন কী করতে হয়, তা §৫-এ। নিচের stepper বাজারঘরের কুপনের recurrence পুরোটা সমাধান করে।
1aₙ = aₙ₋₁ + 2aₙ₋₂2rⁿ বসিয়ে: r² = r + 23(r − 2)(r + 1) = 04aₙ = α₁·2ⁿ + α₂·(−1)ⁿ5α₁ + α₂ = 2, 2α₁ − α₂ = 763α₁ = 9: α₁ = 3, α₂ = −17যাচাই: a₂ = 11, a₅ = 97
| সমীকরণ | |
| মূল | |
| α₁ | |
| α₂ | |
| aₙ |
- Recurrence চেনা। ডান পাশে আগের দুটি পদের ধ্রুবক-গুণিতক, আলাদা কোনো পদ নেই: degree 2-এর linear homogeneous, c1 = 1, c2 = 2.
- Characteristic equation. an = rn বসিয়ে rn−2 দিয়ে ভাগ করলে r2 = r + 2, অর্থাৎ r2 − r − 2 = 0.
- মূল বের করা। r2 − r − 2 = (r − 2)(r + 1), তাই r1 = 2 আর r2 = −1. মূল দুটি ভিন্ন, তাই উপপাদ্য ৩.১ খাটে।
- সাধারণ সমাধান। প্রতিটি সমাধান an = α1·2n + α2·(−1)n রূপের; এখন শুধু দুটি ধ্রুবক অজানা।
- Initial condition বসানো। n = 0: α1 + α2 = 2. n = 1: 2α1 − α2 = 7.
- System সমাধান। দুটি সমীকরণ যোগ করলে 3α1 = 9, তাই α1 = 3, আর α2 = 2 − 3 = −1. ফল an = 3·2n − (−1)n.
- যাচাই। Recurrence থেকে a2 = 7 + 2·2 = 11, সূত্রে 12 − 1 = 11. a5 = 97, সূত্রে 96 + 1 = 97. লেমা ১.২ বলে মিল সব n-এ চলবে, তবু কয়েকটি পদ মেলানো ভুল ধরার সবচেয়ে সস্তা উপায়।
এবার হিসাবরক্ষকের প্রশ্নের উত্তর এক লাইনে: ১০০ জোড় সংখ্যা, তাই (−1)100 = 1, আর a100 = 3·2100 − 1 = 3802951800684688204490109616127, একটি ৩১ অঙ্কের সংখ্যা (scratch-এ recurrence চালিয়ে মেলানো)। বাস্তবে কোনো কুপন-ব্যবস্থা এভাবে চিরকাল দ্বিগুণ হয় না; মডেলটি শুধু দেখায় যে এমন নিয়ম কত দ্রুত সীমা ছাড়ায়, আর তাই রেফারেল-স্কিমে সাধারণত একটি ঊর্ধ্বসীমা রাখা হয়। গণিতের দিক থেকে মূল কথা হলো, সূত্রটি ৯৮টি যোগের বদলে একটি ঘাত আর একটি বিয়োগ চায়।
ধাপ ৬-এর উত্তর একটি জ্যামিতিক ছবিও দেয়। প্রতিটি সমাধান তার প্রথম দুটি মান (a0, a1) দিয়ে নির্ধারিত (লেমা ১.২), তাই সমাধানগুলোকে সমতলের বিন্দু হিসেবে ভাবা যায়। 2n-এর প্রথম দুটি মান (1, 2), আর (−1)n-এর (1, −1). এই দুটি vector সমতলের যেকোনো বিন্দুতে পৌঁছাতে পারে, কারণ তারা এক রেখায় নেই। কুপনের বিন্দু (2, 7) = 3·(1, 2) − 1·(1, −1).
সমাধান-জগৎ একটি সমতল: (2, 7) = 3·(1, 2) − (1, −1)
অনুভূমিক অক্ষে a0, উল্লম্ব অক্ষে a1. নীল তীর 2n, সবুজ তীর (−1)n. নীল তীর তিনগুণ লম্বা করে, তারপর সবুজ তীরের উল্টো দিকে এক ধাপ গেলে কুপনের বিন্দুতে পৌঁছানো যায়।
নিচের ব্লক উপপাদ্যটি সাধারণভাবে প্রয়োগ করে: c1, c2, initial condition আর দুটি ভিন্ন মূল দিলে Cramer's rule দিয়ে α বের করে, তারপর fractions.Fraction-এ নির্ভুল ভগ্নাংশে recurrence-এর ৪০টি পদের সঙ্গে সূত্রটি মেলায়। তৃতীয় উদাহরণে মূলগুলো ভগ্নাংশ (1/2 আর 1/3), সেখানে float ব্যবহার করলে “সমান” পরীক্ষাটি বিশ্বাসযোগ্য হতো না। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।
from fractions import Fraction as F
def solve2(c1, c2, a0, a1, r1, r2):
"""a(n) = c1*a(n-1) + c2*a(n-2) with distinct roots r1, r2."""
assert r1 != r2 and r1 + r2 == c1 and r1 * r2 == -c2
det = r2 - r1 # nonzero, because r1 != r2
al1 = F(a0 * r2 - a1) / det # Cramer's rule
al2 = F(a1 - a0 * r1) / det
return al1, al2
def iterate(c1, c2, a0, a1, N):
a = [F(a0), F(a1)]
for n in range(2, N):
a.append(c1 * a[-1] + c2 * a[-2])
return a
cases = [ # (c1, c2, a0, a1, r1, r2)
(1, 2, 2, 7, 2, -1),
(7, -10, 2, 1, 2, 5),
(F(5, 6), F(-1, 6), 1, 2, F(1, 2), F(1, 3)),
]
for c1, c2, a0, a1, r1, r2 in cases:
al1, al2 = solve2(c1, c2, a0, a1, r1, r2)
seq = iterate(c1, c2, a0, a1, 40)
ok = all(al1 * r1**n + al2 * r2**n == seq[n] for n in range(40))
print(f"roots {r1}, {r2}: a(n) = {al1}*({r1})^n + ({al2})*({r2})^n")
print(" a(0..5) =", [str(x) for x in seq[:6]], " match n<40:", ok)আসল আউটপুট (ব্রাউজারের Python):
roots 2, -1: a(n) = 3*(2)^n + (-1)*(-1)^n
a(0..5) = ['2', '7', '11', '25', '47', '97'] match n<40: True
roots 2, 5: a(n) = 3*(2)^n + (-1)*(5)^n
a(0..5) = ['2', '1', '-13', '-101', '-577', '-3029'] match n<40: True
roots 1/2, 1/3: a(n) = 10*(1/2)^n + (-9)*(1/3)^n
a(0..5) = ['1', '2', '3/2', '11/12', '37/72', '119/432'] match n<40: True
প্রথম লাইন stepper-এর ফল মেলায়: 3·2n − (−1)n. দ্বিতীয়টি §৯-এর একটি পরীক্ষার অঙ্ক, an = 7an−1 − 10an−2: মূল 2 আর 5, উত্তর 3·2n − 5n; ক্রমটি দ্রুত ঋণাত্মক হয়, কারণ বড় মূল 5-এর সহগ ঋণাত্মক। তৃতীয়টি 6an = 5an−1 − an−2, অর্থাৎ c1 = 5/6, c2 = −1/6; উত্তর 10·(1/2)n − 9·(1/3)n, আর পদগুলো 3/2, 11/12, 37/72 … নির্ভুল ভগ্নাংশে মিলেছে। assert লাইনটি একটি নিরাপত্তা-জাল: ভুল মূল দিলে (যেমন চিহ্ন উল্টে) কোড সঙ্গে সঙ্গে থামবে, কারণ মূল দুটির যোগফল c1 আর গুণফল −c2 হতেই হবে।
৪ · Binet-এর সূত্র — irrational সংখ্যা থেকে পূর্ণসংখ্যা
Fibonacci ক্রম F0 = 0, F1 = 1, Fn = Fn−1 + Fn−2 এই কোর্সে বারবার এসেছে। পর্ব ১২-এ strong induction দিয়ে দেখানো হয়েছে, n ≥ 3-এ f(n) > αn−2, যেখানে α = (1 + √5)/2. সেখানে α কোথা থেকে এল, তা রহস্য ছিল। এখন সেটি স্বাভাবিক: α হলো Fibonacci-র characteristic equation r2 − r − 1 = 0-এর বড় মূল, যার প্রচলিত নাম φ, golden ratio. উপপাদ্য ৩.১ সরাসরি একটি নির্ভুল সূত্র দেয়।
1F₀ = 0, F₁ = 1, Fₙ = Fₙ₋₁ + Fₙ₋₂2r² − r − 1 = 03φ = (1 + √5)/2, ψ = (1 − √5)/24n = 0: α + β = 05n = 1: α(φ − ψ) = 1, φ − ψ = √56Fₙ = (φⁿ − ψⁿ)/√57|ψⁿ/√5| < 1/2 ⇒ নিকটতম পূর্ণসংখ্যা
| φ | |
| ψ | |
| α | |
| β | |
| F₁₀ |
- Recurrence. Fibonacci degree 2-এর linear homogeneous recurrence, c1 = c2 = 1, initial condition F0 = 0, F1 = 1.
- Characteristic equation. Fn = rn বসালে r2 = r + 1, অর্থাৎ r2 − r − 1 = 0.
- মূল। দ্বিঘাত সূত্রে r = (1 ± √5)/2: φ ≈ 1.618034 আর ψ ≈ −0.618034. লক্ষ করুন φ + ψ = 1 আর φψ = −1, যেমন মূল-সহগের সম্পর্ক বলে।
- n = 0 বসানো। F0 = α + β = 0, তাই β = −α.
- n = 1 বসানো। F1 = αφ + βψ = α(φ − ψ) = 1. যেহেতু φ − ψ = √5, তাই α = 1/√5 আর β = −1/√5.
- সূত্র। Fn = (φn − ψn)/√5. দুটি irrational সংখ্যার ঘাতের পার্থক্যকে √5 দিয়ে ভাগ করলে প্রতিটি n-এ একটি পূর্ণসংখ্যা: লবে √5-এর জোড় ঘাতের পদ কাটাকাটি হয়ে যায়, বাকি থাকে √5-এর বিজোড় ঘাত।
- গোল করা। |ψ| < 1 বলে |ψn| ≤ 1, আর √5 > 2 বলে |ψn/√5| < 1/2. তাই Fn হলো φn/√5-এর নিকটতম পূর্ণসংখ্যা। n = 10-এ φ10/√5 ≈ 55.0036, গোল করে F10 = 55.
φ = (1 + √5)/2 আর ψ = (1 − √5)/2 হলে প্রতিটি n ≥ 0-এর জন্য
Fn = (φn − ψn) / √5, আর Fn = φn/√5-এর নিকটতম পূর্ণসংখ্যা
প্রমাণ stepper-এর ধাপ ২–৭: মূল দুটি ভিন্ন বলে উপপাদ্য ৩.১ রূপটি দেয়, initial condition ধ্রুবক দেয়, আর |ψn/√5| < 1/2 গোল করার দাবি প্রমাণ করে। ∎ একটি সুন্দর ফল সঙ্গে আসে: Fn+1/Fn → φ, কারণ ψn → 0 (এর সাধারণ রূপ §৮-এ)। আর ψ ঋণাত্মক বলে φn/√5 পালা করে Fn-এর একটু ওপরে আর একটু নিচে থাকে।
সূত্রটির একটি দ্রুত ব্যবহার হলো আকার অনুমান। log10 Fn ≈ n·log10 φ − log10 √5 ≈ 0.20899n − 0.349. তাই F100 প্রায় 3.54 × 1020 (আসল মান 354224848179261915075), আর F1000-এর অঙ্কসংখ্যা ⌊208.64⌋ + 1 = 209, যা §৭-এর ব্লক নির্ভুল পূর্ণসংখ্যায় মেলাবে। পরীক্ষায় “Fn-এ কয়টি অঙ্ক” ধরনের প্রশ্নে এই হিসাবই যথেষ্ট।
কম্পিউটারে সাবধান। সূত্রটি গণিতে নির্ভুল, কিন্তু কম্পিউটারের floating point সংখ্যা (IEEE 754 double) প্রায় ১৫–১৬টি দশমিক অঙ্ক রাখে। √5 নিজেই গোল করা, আর φn নিলে সেই ছোট আপেক্ষিক ত্রুটি মোটামুটি n-এর অনুপাতে বাড়ে। Fn যখন 1014-এর ঘরে, তখন 10−15 মাপের আপেক্ষিক ত্রুটিও পরম মানে ০.৫-এর কাছে চলে যায়, আর গোল করা ভুল পূর্ণসংখ্যায় পড়ে। নিচের ব্লক ঠিক কোথায় তা ঘটে মেপে দেখায়।
from math import sqrt
fib = [0, 1] # exact integers
for n in range(2, 80):
fib.append(fib[-1] + fib[-2])
phi = (1 + sqrt(5)) / 2
psi = (1 - sqrt(5)) / 2
print("phi =", phi, " psi =", psi)
for n in (10, 30, 50, 70, 71, 75):
approx = phi**n / sqrt(5) # Binet without the psi term
err = approx - fib[n]
ok = round(approx) == fib[n]
print(f"n={n}: F={fib[n]} float err {err:+.2e} round ok: {ok}")
first = next(n for n in range(80) if round(phi**n / sqrt(5)) != fib[n])
print("first n where float Binet fails:", first)
print("F(71) < 2**53 ?", fib[71] < 2**53)আসল আউটপুট (ব্রাউজারের Python):
phi = 1.618033988749895 psi = -0.6180339887498949
n=10: F=55 float err +3.64e-03 round ok: True
n=30: F=832040 float err +2.41e-07 round ok: True
n=50: F=12586269025 float err +1.91e-05 round ok: True
n=70: F=190392490709135 float err +4.38e-01 round ok: True
n=71: F=308061521170129 float err +6.88e-01 round ok: False
n=75: F=2111485077978050 float err +5.25e+00 round ok: False
first n where float Binet fails: 71
F(71) < 2**53 ? True
গণিতে φn/√5 − Fn = ψn/√5, যা n = 70-এ প্রায় 10−15. কিন্তু float-এ মাপা পার্থক্য n = 70-এ 0.438: এর প্রায় সবটাই গোল করার ত্রুটি, গণিতের নয়। ত্রুটি 0.5 পেরোলেই গোল করা ভুল উত্তর দেয়, আর তা প্রথম ঘটে n = 71-এ। শেষ লাইনটি জরুরি: F71 < 253, অর্থাৎ সংখ্যাটি নিজে double-এ নির্ভুলভাবে রাখা যেত; সমস্যা সংখ্যার আকারে নয়, irrational φ-এর আসন্ন মানকে ৭১ বার গুণ করায়। তাই নির্ভুল Fn-এর জন্য Python-এর অসীম-নির্ভুল int-এ সরাসরি যোগ, বা §৭-এর matrix power ব্যবহার করুন; Binet-এর সূত্র প্রমাণ আর বৃদ্ধির হারের জন্য, বড় n-এর গণনার জন্য নয়।
৫ · পুনরাবৃত্ত মূল — n·rn কোথা থেকে আসে
an = 6an−1 − 9an−2 নিন। Characteristic equation r2 − 6r + 9 = (r − 3)2 = 0: মূল একটিই, 3, দুবার। উপপাদ্য ৩.১-এর রূপ α13n + α23n আসলে (α1 + α2)3n, একটিমাত্র ধ্রুবক। কিন্তু initial condition দুটি, তাই এক ধ্রুবক দিয়ে দুটি মেলানো সাধারণত অসম্ভব। একটি দ্বিতীয়, স্বাধীন সমাধান দরকার। মূলটি m বার থাকলে বলা হয় তার multiplicity m; এখানে m = 2.
an = c1an−1 + c2an−2, c2 ≠ 0, আর r2 − c1r − c2 = (r − r0)2. তাহলে {an} সমাধান, যদি আর কেবল যদি কিছু ধ্রুবক α1, α2-এর জন্য
an = (α1 + α2n) r0n
- (r − r0)2 = r2 − 2r0r + r02-এর সঙ্গে সহগ মিলিয়ে c1 = 2r0 আর c2 = −r02. c2 ≠ 0 বলে r0 ≠ 0. — সহগ তুলনা
- n·r0n একটি সমাধান: ডান পাশ c1(n − 1)r0n−1 + c2(n − 2)r0n−2 = 2(n − 1)r0n − (n − 2)r0n = n·r0n, যা বাম পাশের সমান। — ধাপ ১ বসিয়ে
- r0n সমাধান (লেমা ২.২), তাই superposition-এ (α1 + α2n)r0n-ও সমাধান। — লেমা ২.২(২)
- প্রতিটি সমাধান এই রূপের: n = 0 আর n = 1 বসালে α1 = a0 আর (α1 + α2)r0 = a1. Determinant r0 ≠ 0, তাই একমাত্র সমাধান α2 = a1/r0 − a0. — ধাপ ১
- এই α-তে সূত্রটি recurrence মানে আর প্রথম দুটি মান মেলায়, তাই লেমা ১.২ অনুযায়ী সব n-এ an মেলে। ∎ — লেমা ১.২
কোন ক্ষেত্র কোনটি, তা আগেই চেনার একটি সহজ পরীক্ষা: r2 − c1r − c2-এর discriminant c12 + 4c2. এটি ধনাত্মক হলে দুটি ভিন্ন বাস্তব মূল (উপপাদ্য ৩.১), শূন্য হলে একটি পুনরাবৃত্ত মূল r0 = c1/2 (উপপাদ্য ৫.১), আর ঋণাত্মক হলে দুটি complex মূল (§৬). যেমন 62 + 4(−9) = 0, তাই 6an−1 − 9an−2-এ মূল 6/2 = 3, দুবার।
n·r0n কোথা থেকে আসে, তার একটি স্বজ্ঞা: ভিন্ন মূল r1 আর r0-এর জন্য (r1n − r0n)/(r1 − r0) একটি সমাধান। r1 → r0 করলে এই ভাগফল rn-এর derivative n·r0n−1-এর দিকে যায়, যা n·r0n-এর ধ্রুবক গুণিতক। দুটি মূল এক হয়ে যাওয়ার মুহূর্তে হারানো সমাধানটি এভাবে ফিরে আসে।
1aₙ = 6aₙ₋₁ − 9aₙ₋₂2r² − 6r + 9 = 03(r − 3)² = 0: মূল 3, দুবার4ভুল চেষ্টা: α·3ⁿ5aₙ = (α₁ + α₂n)·3ⁿ6α₁ = 1; 3(1 + α₂) = 67aₙ = (1 + n)·3ⁿ
| মূল | |
| রূপ | |
| α₁ | |
| α₂ | |
| a₁ মেলে? |
- Recurrence. c1 = 6, c2 = −9, degree 2; initial condition a0 = 1, a1 = 6.
- Characteristic equation. r2 = 6r − 9, অর্থাৎ r2 − 6r + 9 = 0.
- মূল। বাম পাশ পূর্ণ বর্গ (r − 3)2; discriminant 36 − 36 = 0. মূল 3, multiplicity 2.
- ভুল চেষ্টা। শুধু α·3n নিলে a0 = 1 থেকে α = 1, কিন্তু তখন a1 = 3, অথচ দেওয়া আছে 6. এক ধ্রুবকে দুটি শর্ত মেলে না।
- সঠিক রূপ। উপপাদ্য ৫.১: an = (α1 + α2n)·3n. দ্বিতীয় সমাধান n·3n হারানো স্বাধীনতাটুকু ফিরিয়ে দেয়।
- ধ্রুবক। n = 0: α1 = 1. n = 1: (α1 + α2)·3 = 6, তাই α2 = 1.
- উত্তর আর যাচাই। an = (1 + n)·3n. Recurrence-এ a2 = 36 − 9 = 27 = 3·9, a3 = 162 − 54 = 108 = 4·27 ✓.
৬ · সাধারণ degree k আর complex মূল
একই ভাবনা যেকোনো degree-তে চলে। প্রমাণের কাঠামো হুবহু এক: প্রতিটি মূল থেকে সমাধান, superposition, আর initial condition থেকে একটি k × k linear system, যার determinant অশূন্য। শেষ ধাপটির প্রমাণ (একটি সাধারণীকৃত Vandermonde determinant অশূন্য) একটু দীর্ঘ, তাই এখানে বক্তব্যটি দিচ্ছি, প্রমাণ বাদ রাখছি; পর্ব ৪৮ “Generating function — গণনাকে বীজগণিতে রূপান্তর” partial fraction দিয়ে একই ফল অন্য পথে দেখাবে।
an = c1an−1 + … + ckan−k, ck ≠ 0, আর characteristic polynomial-এর ভিন্ন মূলগুলো r1, …, rt, multiplicity যথাক্রমে m1, …, mt (m1 + … + mt = k). তাহলে প্রতিটি সমাধান ঠিক একভাবে লেখা যায়:
an = ∑i=1t (αi,0 + αi,1n + … + αi,mi−1nmi−1) rin
উদাহরণ ৬.২ (তিনটি ভিন্ন মূল)। an = 6an−1 − 11an−2 + 6an−3, a0 = 2, a1 = 5, a2 = 15. Characteristic equation r3 − 6r2 + 11r − 6 = (r − 1)(r − 2)(r − 3) = 0. তাই an = α + β·2n + γ·3n, আর §৯-এর অঙ্ক ৩-এ এর system সমাধান করে পাবেন an = 1 − 2n + 2·3n. ঘনসমীকরণের মূল খুঁজতে পরীক্ষায় সাধারণ কৌশল হলো rational root পরীক্ষা: পূর্ণসংখ্যা সহগ আর প্রধান সহগ 1 হলে প্রতিটি পূর্ণসংখ্যা মূল ধ্রুবক পদকে ভাগ করে। এখানে ধ্রুবক পদ −6, তাই ±1, ±2, ±3, ±6 বসিয়ে দেখলেই r = 1 পাওয়া যায়, আর ভাগ করে বাকি দ্বিঘাত r2 − 5r + 6.
উদাহরণ ৬.৩ (তিনগুণ মূল)। an = −3an−1 − 3an−2 − an−3, a0 = 1, a1 = −2, a2 = −1. Characteristic equation r3 + 3r2 + 3r + 1 = (r + 1)3: মূল −1, multiplicity 3. রূপ (α0 + α1n + α2n2)(−1)n; initial condition থেকে an = (1 + 3n − 2n2)(−1)n.
Complex মূল। সহগ বাস্তব হলেও মূল complex number হতে পারে, আর তখন complex মূলগুলো conjugate জোড়ায় আসে। উপপাদ্যগুলো complex সংখ্যাতেও খাটে, কারণ প্রমাণে শুধু যোগ, গুণ আর ভাগ লেগেছে। বাস্তব উত্তর পেতে জোড়াটিকে একসঙ্গে লেখা হয়: মূল ρ(cos θ ± i sin θ) হলে সমাধান ρn(A cos nθ + B sin nθ). ρ = 1 আর θ যদি 2π-এর একটি মূলদ ভগ্নাংশ হয়, তাহলে ক্রমটি পর্যায়বৃত্ত, একটি periodic sequence.
- an = −an−2: r2 + 1 = 0, মূল ±i, θ = π/2. ক্রম প্রতি ৪ ধাপে ফেরে: a0 = 1, a1 = 2 থেকে 1, 2, −1, −2, 1, 2, …, অর্থাৎ an = cos(nπ/2) + 2 sin(nπ/2).
- an = an−1 − an−2: r2 − r + 1 = 0, মূল (1 ± i√3)/2, θ = π/3, period 6. Complex সংখ্যা ছাড়াও এটি দেখা যায়: an+1 = an − an−1 আর an+2 = an+1 − an যোগ করলে an+2 = −an−1, অর্থাৎ an+3 = −an, তাই an+6 = an.
উদাহরণ ৬.৪ (complex মূল, পুরো সমাধান)। an = 2an−1 − 2an−2, a0 = 1, a1 = 1. Characteristic equation r2 − 2r + 2 = 0, discriminant 4 − 8 = −4 < 0, মূল 1 ± i. Polar রূপে 1 ± i = √2(cos π/4 ± i sin π/4), তাই ρ = √2, θ = π/4, আর an = (√2)n(A cos(nπ/4) + B sin(nπ/4)). n = 0 থেকে A = 1; n = 1 থেকে √2(√2/2 + B·√2/2) = 1 + B = 1, তাই B = 0. উত্তর an = (√2)n cos(nπ/4): ক্রম 1, 1, 0, −2, −4, −4, 0, 8, 16, … (scratch-এ ১৩টি পদ মেলানো)। এখানে ρ > 1, তাই ক্রমটি পর্যায়বৃত্ত নয়, বরং দোলায় আর দোলনের মাপ বাড়ে: প্রতি ৪ ধাপে মান −4 গুণ হয়, কারণ (1 + i)4 = −4.
Complex মূলে দুটি ভুল প্রায়ই দেখা যায়। প্রথমত, শুধু বাস্তব অংশ নিয়ে লেখা, যেমন 1 ± i-কে “মূল 1” ধরে an = α·1n লেখা; তখন ক্রমটি ধ্রুবক হওয়ার কথা, অথচ 1, 1, 0, −2, … ধ্রুবক নয়। দ্বিতীয়ত, ρ ভুলে যাওয়া: মূলের পরম মান √2 হলে প্রতিটি পদে (√2)n গুণক লাগে, শুধু cos আর sin যথেষ্ট নয়। দুটি ভুলই প্রথম কয়েকটি পদ মেলালেই ধরা পড়ে।
বাজারঘরের সাপ্তাহিক মজুদ-সমন্বয়ের মতো কোনো হিসাব যদি এমন নিয়মে চলে, তাহলে সংখ্যাগুলো বাড়েও না, কমেও না, শুধু ঘুরে ঘুরে আসে। নিচের ব্লক §৫ আর §৬-এর প্রতিটি দাবি নির্ভুল পূর্ণসংখ্যায় মেলায়।
def iterate(coeffs, init, N):
"""a(n) = coeffs[0]*a(n-1) + coeffs[1]*a(n-2) + ..."""
a = list(init)
while len(a) < N:
a.append(sum(c * a[-1 - i] for i, c in enumerate(coeffs)))
return a
# 1) double root 3: a(n) = 6a(n-1) - 9a(n-2), a0 = 1, a1 = 6
seq = iterate([6, -9], [1, 6], 30)
print("a(0..6) :", seq[:7])
print("(1 + n) 3^n :", [(1 + n) * 3**n for n in range(7)])
print("match n<30 :", all(seq[n] == (1 + n) * 3**n for n in range(30)))
print("only alpha*3^n with alpha = 1 gives a1 =", 1 * 3, "not 6")
# 2) roots 1, 2, 3: a(n) = 6a(n-1) - 11a(n-2) + 6a(n-3)
seq = iterate([6, -11, 6], [2, 5, 15], 30)
print("deg 3, roots 1,2,3:",
all(seq[n] == 1 - 2**n + 2 * 3**n for n in range(30)))
# 3) triple root -1: a(n) = -3a(n-1) - 3a(n-2) - a(n-3)
seq = iterate([-3, -3, -1], [1, -2, -1], 30)
print("triple root -1:", seq[:7],
all(seq[n] == (1 + 3*n - 2*n*n) * (-1)**n for n in range(30)))
# 4) complex roots: periodic sequences
print("a(n) = -a(n-2) :", iterate([0, -1], [1, 2], 12))
print("a(n) = a(n-1) - a(n-2):", iterate([1, -1], [0, 1], 13))আসল আউটপুট (ব্রাউজারের Python):
a(0..6) : [1, 6, 27, 108, 405, 1458, 5103]
(1 + n) 3^n : [1, 6, 27, 108, 405, 1458, 5103]
match n<30 : True
only alpha*3^n with alpha = 1 gives a1 = 3 not 6
deg 3, roots 1,2,3: True
triple root -1: [1, -2, -1, 8, -19, 34, -53] True
a(n) = -a(n-2) : [1, 2, -1, -2, 1, 2, -1, -2, 1, 2, -1, -2]
a(n) = a(n-1) - a(n-2): [0, 1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0]
প্রথম তিন লাইন stepper-এর (1 + n)·3n সূত্রকে ৩০টি পদে মেলায়, আর চতুর্থ লাইন দেখায় কেন শুধু α·3n চলে না। তারপর উদাহরণ ৬.২ আর ৬.৩-এর সূত্র দুটি ৩০টি পদে সত্য। তিনগুণ মূলের ক্রম 1, −2, −1, 8, −19, 34, … চিহ্ন বদলায় (−1)n-এর জন্য, আর মান বাড়ে 2n2-এর মতো: মূলের মাপ 1 হলেও n2 গুণক বৃদ্ধি আনে। শেষ দুই লাইনে period 4 আর period 6 সরাসরি দেখা যাচ্ছে। সব হিসাব পূর্ণসংখ্যায়, তাই “== ” পরীক্ষাটি নির্ভুল।
৭ · Vector space আর companion matrix — linear algebra-র চোখে
§৩-এর ছবিটি আসলে একটি সাধারণ সত্য। একটি নির্দিষ্ট recurrence-এর সব সমাধানের সেট S নিন। লেমা ২.২(২) বলে, S-এর দুটি ক্রমের যোগফল আর ধ্রুবক-গুণ আবার S-এ থাকে; শূন্য ক্রমও S-এ আছে। তাই S সব অসীম ক্রমের জগতের একটি vector space (subspace). Linear algebra-র এই ভাষা Machine Learning কোর্সের পর্ব ৬-এ বিস্তারিত আছে; এখানে শুধু span, basis আর dimension শব্দ তিনটি লাগবে।
Degree k-এর linear homogeneous recurrence-এর সমাধানগুলো একটি k-মাত্রার vector space. বিশেষত, k-টি ভিন্ন মূল থাকলে r1n, …, rkn এর একটি basis.
- T: S → ℝk, T(a) = (a0, …, ak−1) নিন। দুটি ক্রম যোগ করলে প্রথম k-টি মানও যোগ হয়, তাই T linear. — সংজ্ঞা
- লেমা ১.২-এর অস্তিত্ব অংশ: প্রতিটি (a0, …, ak−1) থেকে একটি সমাধান হয়, তাই T onto. অনন্যতা অংশ: একই প্রথম k মান মানে একই ক্রম, তাই T one-to-one. — লেমা ১.২
- একটি bijective linear map dimension রক্ষা করে, তাই dim S = dim ℝk = k. — isomorphism
- k = 2-এ উপপাদ্য ৩.১-এর প্রমাণ দেখিয়েছে r1n, r2n সব S-কে span করে; k-মাত্রার জগতে k-টি span-কারী vector-ই একটি basis. ∎ — উপপাদ্য ৩.১
উপপাদ্যটির একটি ব্যবহারিক অর্থ আছে। আপনি যদি কোনোভাবে k-টি এমন সমাধান পান যাদের প্রথম k-টি মানের vector-গুলো linearly independent, তাহলে সেগুলোই basis, আর প্রতিটি সমাধান তাদের linear combination. §৩-এর ছবিতে k = 2: (1, 2) আর (1, −1) এক রেখায় নেই, তাই 2n আর (−1)n যথেষ্ট।
এই দৃষ্টিতে characteristic equation-এর পদ্ধতিটি একটি basis খোঁজা: গুণোত্তর ক্রমগুলো সবচেয়ে সুবিধার basis, কারণ তাদের ঘাত সহজে লেখা যায়। পুনরাবৃত্ত মূলে গুণোত্তর ক্রম যথেষ্ট নয়, তাই n·rn যোগ করে basis পূর্ণ করতে হয়।
Companion matrix. Degree 2-এর recurrence-কে একটি 2 × 2 matrix দিয়ে এক ধাপের গুণ হিসেবে লেখা যায় (matrix গুণ পর্ব ১৯ “Discrete math-এ matrix — 0-1 matrix আর Boolean product”-এ):
[an; an−1] = C · [an−1; an−2], C = [c1 c2; 1 0]
তাই [an; an−1] = Cn−1[a1; a0]. C-কে বলে recurrence-এর companion matrix. এর characteristic polynomial det(rI − C) = (r − c1)·r − c2 = r2 − c1r − c2: হুবহু আমাদের characteristic equation. অর্থাৎ characteristic root আসলে C-এর eigenvalue, আর প্রতিটি মূল r-এর জন্য (r, 1) একটি eigenvector (eigenvalue-র ভাবনা Machine Learning কোর্সের পর্ব ৮-এ)। মূল দুটি ভিন্ন হলে C-কে diagonal করা যায়, C = VDV−1, তাই Cn = VDnV−1, আর Dn-এর ঘরে r1n, r2n: উপপাদ্য ৩.১ আবার পাওয়া গেল। পুনরাবৃত্ত মূলে C-কে diagonal করা যায় না, আর তার Jordan রূপের ঘাতে n·rn−1 পদ আসে; n·rn সমাধানের এটিই linear algebra-র ব্যাখ্যা।
Degree k-তেও একই গঠন: k × k companion matrix-এর প্রথম সারিতে c1, …, ck, আর তার নিচে একটি সরানো identity, যা প্রতিটি পুরোনো মানকে এক ঘর নিচে নামায়। যেমন উদাহরণ ৬.২-এর জন্য C = [6 −11 6; 1 0 0; 0 1 0], আর det(rI − C) = r3 − 6r2 + 11r − 6. এই কারণে matrix-এর eigenvalue-র তত্ত্বের প্রতিটি ফল, যেমন ভিন্ন eigenvalue-র eigenvector-গুলো linearly independent, সরাসরি recurrence-এর ফলে অনুবাদ হয়।
Q = [1 1; 1 0] হলে প্রতিটি n ≥ 1-এর জন্য Qn = [Fn+1 Fn; Fn Fn−1].
- ভিত্তি n = 1: Q = [F2 F1; F1 F0] = [1 1; 1 0]. — সরাসরি
- ধাপ: Qn+1 = QnQ = [Fn+1 + Fn Fn+1; Fn + Fn−1 Fn] = [Fn+2 Fn+1; Fn+1 Fn]. ∎ — induction আর Fibonacci-র নিয়ম
উপপাদ্যটি থেকে Fibonacci-র অনেক অভেদ বিনা পরিশ্রমে আসে, কারণ matrix-এর ঘাতের নিয়ম Qm+n = QmQn সবসময় সত্য। দুই পাশের ওপরের-ডান ঘর মেলালে Fm+n = Fm+1Fn + FmFn−1 (m, n ≥ 1). m = n বসালে F2n = Fn(Fn+1 + Fn−1); যেমন F10 = 5 × (8 + 3) = 55. এই “দ্বিগুণ করার” সূত্র দিয়ে Fn থেকে সরাসরি F2n-এ লাফ দেওয়া যায়, যা fast doubling নামের দ্রুত পদ্ধতির ভিত্তি।
দুই পাশের determinant নিলে (−1)n = Fn+1Fn−1 − Fn2: পর্ব ১২-এর Cassini-র সূত্র এক লাইনে। আর ব্যবহারিক লাভ: Qn binary exponentiation-এ প্রায় 2 log2 n-টি matrix গুণে পাওয়া যায়, প্রতিটি পূর্ণসংখ্যায় নির্ভুল। DSA কোর্সের পর্ব ৫২-এ memoization আর tabulation-এর আলোচনা এর সঙ্গে মিলিয়ে দেখতে পারেন।
def matmul(X, Y):
return [[sum(X[i][k] * Y[k][j] for k in range(2)) for j in range(2)]
for i in range(2)]
def matpow(M, n): # fast exponentiation: O(log n) products
R, count = [[1, 0], [0, 1]], 0
while n:
if n & 1:
R, count = matmul(R, M), count + 1
M, count, n = matmul(M, M), count + 1, n >> 1
return R, count
Q = [[1, 1], [1, 0]] # companion matrix of a(n) = a(n-1) + a(n-2)
P, used = matpow(Q, 10)
print("Q^10 =", P, "-> [[F11, F10], [F10, F9]]")
a, b = 0, 1
for _ in range(1000):
a, b = b, a + b # a = F(1000) by plain iteration
P, used = matpow(Q, 1000)
print("F(1000): matrix == loop:", P[0][1] == a, " digits:", len(str(a)),
" matrix products:", used)
# dominant root: a(n)/a(n-1) for a(n) = a(n-1) + 2a(n-2), a0=2, a1=7
s = [2, 7]
for n in range(2, 41):
s.append(s[-1] + 2 * s[-2])
for n in (1, 5, 10, 20, 40):
print(f"n={n}: a(n)/a(n-1) = {s[n] / s[n-1]:.10f}")আসল আউটপুট (ব্রাউজারের Python):
Q^10 = [[89, 55], [55, 34]] -> [[F11, F10], [F10, F9]]
F(1000): matrix == loop: True digits: 209 matrix products: 16
n=1: a(n)/a(n-1) = 3.5000000000
n=5: a(n)/a(n-1) = 2.0638297872
n=10: a(n)/a(n-1) = 1.9980481457
n=20: a(n)/a(n-1) = 1.9999980927
n=40: a(n)/a(n-1) = 2.0000000000
Q10-এর ঘরগুলো F11 = 89, F10 = 55, F9 = 34, উপপাদ্য ৭.২ যেমন বলে। F1000 একটি ২০৯ অঙ্কের সংখ্যা; সাধারণ loop-এ ১০০০টি যোগ লেগেছে, matrix পথে মাত্র ১৬টি 2 × 2 গুণ (1000-এর binary রূপে ১০টি bit, তার ৬টি 1). দুটি পথের উত্তর হুবহু এক, কারণ Python-এর int যত বড়ই হোক নির্ভুল। শেষ পাঁচ লাইন কুপনের ক্রমে পরপর দুই পদের অনুপাত দেখায়: 3.5 থেকে শুরু করে দ্রুত 2-এর দিকে যায়, আর ২০তম পদে ছয় দশমিক পর্যন্ত মিলে যায়। কেন 2, তা পরের অংশে।
৮ · বৃদ্ধির হার — dominant root
পরীক্ষায় আর অ্যালগরিদম বিশ্লেষণে প্রায়ই পুরো closed form লাগে না, শুধু জানতে চাওয়া হয় ক্রমটি কত দ্রুত বাড়ে। তখন characteristic equation-এর মূলগুলো বের করে সবচেয়ে বড় মাপের মূলটি দেখলেই বেশিরভাগ কাজ শেষ, ধ্রুবক হিসাব করার দরকার পড়ে শুধু একটি জায়গায়: তার সহগ শূন্য কি না।
an = 3·2n − (−1)n-এ n বড় হলে (−1)n পদটি নগণ্য, আর an প্রায় 3·2n. সাধারণভাবে, সবচেয়ে বড় পরম মানের মূলটিই দীর্ঘমেয়াদে সব ঠিক করে। একে বলে dominant root.
an = α1r1n + α2r2n, |r1| > |r2| আর α1 ≠ 0 হলে an/r1n → α1, আর an/an−1 → r1. ফলে |an| = Θ(|r1|n).
- q = r2/r1 ধরুন; |q| < 1, তাই qn → 0. — গুণোত্তর ধারা (পর্ব ১৭)
- an/r1n = α1 + α2qn → α1. — ধাপ ১
- an/an−1 = r1·(α1 + α2qn)/(α1 + α2qn−1) → r1·α1/α1 = r1; এখানে α1 ≠ 0 শর্তটি হরকে শূন্য থেকে দূরে রাখে। — সীমার নিয়ম
- ধাপ ২ থেকে বড় n-এ |an| থাকে |α1|·|r1|n/2 আর 2|α1|·|r1|n-এর মধ্যে, যা Θ-এর সংজ্ঞা। ∎ — সংজ্ঞা
দুটি শর্তই সত্যিই লাগে। α1 = 0 হলে: কুপনের একই recurrence, কিন্তু a0 = 1, a1 = −1 দিলে α1 + α2 = 1, 2α1 − α2 = −1 থেকে α1 = 0, আর ক্রমটি (−1)n: কোনো বৃদ্ধিই নেই। মাপ সমান হলে: an = −an−2-এ মূল ±i, দুটিরই পরম মান 1, আর অনুপাত an/an−1 কোনো সীমায় যায় না, ঘুরতে থাকে। Fibonacci-তে φ ≈ 1.618 dominant, তাই Fn = Θ(φn): naive recursive Fibonacci function-এর call সংখ্যাও এই হারে বাড়ে, যার হিসাব DSA কোর্সের পর্ব ৮-এ।
| Recurrence | মূল | বৃদ্ধি |
|---|---|---|
| an = an−1 + 2an−2 (কুপন) | 2, −1 | Θ(2n) |
| Fn = Fn−1 + Fn−2 | φ, ψ | Θ(φn) ≈ Θ(1.618n) |
| an = 6an−1 − 9an−2 | 3, 3 | Θ(n·3n) |
| an = 2an−1 − 2an−2 | 1 ± i | দোলায়, মাপ ≤ (√2)n |
| an = an−1 − an−2 | (1 ± i√3)/2 | বৃদ্ধি নেই, period 6 |
ভিন্ন মূলের সাধারণ degree k-তেও একই কথা; পুনরাবৃত্ত dominant মূলে nm−1 গুণক যোগ হয়, যেমন (1 + n)3n = Θ(n·3n). অ্যালগরিদমের সময়ের recurrence-এ এই ধরনের Θ উত্তরই সাধারণত আসল চাওয়া, যা পর্ব ৪৭ “Divide-and-conquer recurrence আর master theorem-এর গণিত”-এ অন্য ধরনের recurrence-এ আবার দেখবেন।
৯ · পরীক্ষার অঙ্ক আর একটি ভুল সমাধান
অঙ্ক ১: ভিন্ন মূল
an = 7an−1 − 10an−2, a0 = 2, a1 = 1 সমাধান করুন।
- r2 − 7r + 10 = (r − 2)(r − 5) = 0, মূল 2 আর 5.
- an = α12n + α25n; α1 + α2 = 2, 2α1 + 5α2 = 1.
- প্রথমটির দ্বিগুণ বাদ দিলে 3α2 = −3, তাই α2 = −1, α1 = 3.
- উত্তর an = 3·2n − 5n; যাচাই a2 = 7 − 20 = −13 = 12 − 25.
অঙ্ক ২: পুনরাবৃত্ত মূল
an = 4an−1 − 4an−2, a0 = 3, a1 = 10. a5 কত?
- r2 − 4r + 4 = (r − 2)2, মূল 2 দুবার; an = (α1 + α2n)2n.
- n = 0: α1 = 3. n = 1: 2(3 + α2) = 10, তাই α2 = 2.
- an = (3 + 2n)2n, আর a5 = 13 · 32 = 416. ক্রম 3, 10, 28, 72, 176, 416 recurrence থেকেও একই।
অঙ্ক ৩: degree 3
উদাহরণ ৬.২-এর an = α + β·2n + γ·3n-এ a0 = 2, a1 = 5, a2 = 15 বসান।
- α + β + γ = 2, α + 2β + 3γ = 5, α + 4β + 9γ = 15.
- পরপর বিয়োগ: β + 2γ = 3 আর 2β + 6γ = 10, অর্থাৎ β + 3γ = 5.
- আবার বিয়োগ: γ = 2, তাই β = −1 আর α = 1. উত্তর an = 1 − 2n + 2·3n; a3 = 1 − 8 + 54 = 47, recurrence-এ 90 − 55 + 12 = 47.
অঙ্ক ৪: বৃদ্ধির হার আর ঋণাত্মক মূল
an = an−1 + 6an−2, a0 = 1, a1 = 0. Closed form আর বৃদ্ধির হার বলুন।
- r2 − r − 6 = (r − 3)(r + 2) = 0, মূল 3 আর −2.
- α1 + α2 = 1, 3α1 − 2α2 = 0; প্রথমটির দ্বিগুণ যোগ করলে 5α1 = 2, তাই α1 = 2/5, α2 = 3/5.
- an = (2·3n + 3·(−2)n)/5; ক্রম 1, 0, 6, 6, 42, 78, 330, … (দুটি পদ সমান হতে পারে, যেমন a2 = a3 = 6).
- |3| > |−2| আর α1 = 2/5 ≠ 0, তাই উপপাদ্য ৮.১ অনুযায়ী an = Θ(3n), আর an/an−1 → 3.
অঙ্ক ৫: সূত্র থেকে recurrence
an = (2 − n)5n কোন degree 2-এর linear homogeneous recurrence মানে? মূল 5 দুবার, তাই characteristic equation (r − 5)2 = r2 − 10r + 25, আর recurrence an = 10an−1 − 25an−2, a0 = 2, a1 = 5.
সমাধানের ভুল ধরুন: “দুটি মূলই 3”
একজন an = 6an−1 − 9an−2, a0 = 1, a1 = 6 সমাধানে লিখলেন: “মূল r1 = 3, r2 = 3, তাই an = α13n + α23n. n = 0: α1 + α2 = 1. n = 1: 3α1 + 3α2 = 6, অর্থাৎ α1 + α2 = 2. সমীকরণ দুটি পরস্পরবিরোধী, তাই recurrence-টির কোনো সমাধান নেই।”
ভুল কোথায়: উপসংহারটি লেমা ১.২-এর বিরুদ্ধে যায়: প্রতিটি initial condition-এ সমাধান ঠিক একটি আছে (1, 6, 27, 108, …). ভুলটি রূপে: উপপাদ্য ৩.১ ভিন্ন মূল চায়, আর r1 = r2 হলে α13n + α23n আসলে এক ধ্রুবকের রূপ; system-এর determinant r2 − r1 = 0. সঠিক রূপ (α1 + α2n)3n, যা (1 + n)3n দেয় (উপপাদ্য ৫.১). শিক্ষা: “system-এর সমাধান নেই” মানে প্রায় সবসময় ভুল রূপ নেওয়া হয়েছে, recurrence-এর দোষ নয়।
আরও গভীরে: একটি পূর্ণসংখ্যার linear recurrence কখনো 0 মান নেয় কি না, এই সরল-শোনানো প্রশ্নটির নাম Skolem problem. Skolem–Mahler–Lech উপপাদ্য (১৯৩৪–১৯৫৩ সালের কাজ বলে জানা যায়) বলে শূন্যের সূচকগুলো একটি সসীম সেট আর কয়েকটি সমান্তর ধারার মিলন, কিন্তু প্রমাণটি গঠনমূলক নয়। Degree 4 পর্যন্ত প্রশ্নটি algorithm দিয়ে মীমাংসাযোগ্য বলে ১৯৮০-র দশকে দেখানো হয়েছে বলে জানা যায়, আর সাধারণ degree-তে এটি আজও খোলা সমস্যা। Program verification-এ একটি linear loop থামবে কি না, এই ধরনের প্রশ্ন সরাসরি এর সঙ্গে জড়িত।
পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:
- an = 5an−1 − 6an−2-এর সাধারণ সমাধান? α12n + α23n, কারণ r2 − 5r + 6 = (r − 2)(r − 3).
- মূল 4 দুবার হলে রূপ? (α1 + α2n)4n.
- Fibonacci-র closed form? Fn = (φn − ψn)/√5, আর Fn = round(φn/√5).
- Fn O(log n) গুণে কীভাবে? [1 1; 1 0]n-কে fast exponentiation-এ।
- Degree 3-এর recurrence-এ কয়টি initial condition লাগে? ৩টি; সমাধান-জগতের dimension 3.
১০ · AI-এর যুগে — recurrence-এর সমাধান যাচাই
Recurrence সমাধান AI সহকারীর কাছে একটি প্রিয় কাজ, আর উত্তরগুলো দেখতে নিখুঁত। কিন্তু এই বিষয়ে ভুল যাচাই করাও সবচেয়ে সহজ: সূত্রে কয়েকটি n বসিয়ে recurrence-এর পদের সঙ্গে মেলালেই হয়। নিয়মিত যে ভুলগুলো দেখা যায়:
| AI-এর ভুল | কীভাবে ধরবেন |
|---|---|
| Characteristic equation-এ চিহ্ন উল্টে ফেলা (r2 + r + 2) | মূল দুটির যোগফল c1 আর গুণফল −c2 কি না দেখুন |
| পুনরাবৃত্ত মূলে n·rn বাদ দেওয়া | Discriminant শূন্য কি না দেখুন; a0, a1 দুটিই মেলে কি না বসান |
| Initial condition-এর সূচক ভুল (a1-কে n = 0 ধরা) | দেওয়া সূচকে সূত্রটি বসিয়ে মান মেলান |
| Non-homogeneous recurrence-এ (যেমন + 1) শুধু characteristic equation প্রয়োগ | আলাদা পদ আছে কি না দেখুন; থাকলে পর্ব ৪৬-এর পদ্ধতি লাগে |
| Float-এ Binet দিয়ে “নির্ভুল” F100 দেওয়া | পূর্ণসংখ্যায় loop চালিয়ে মেলান |
| Binet বা de Moivre-এর সাল আর কৃতিত্ব বানিয়ে বলা | বিশ্বস্ত পাঠ্যবই বা ইতিহাসের উৎসে মেলান |
AI-এর কাছে recurrence-এর সমাধান চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে যাচাই করা যায়:
AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট
Recurrence-এর ক্ষেত্রে একটি বড় সুবিধা আছে: লেমা ১.২ বলে, একটি সূত্র recurrence মানে আর প্রথম k-টি মান মেলায়, এটুকু দেখালেই সূত্রটি প্রমাণিত। তাই AI-এর দেওয়া যেকোনো সূত্র আপনি দুটি নির্দিষ্ট পরীক্ষায় নিজেই চূড়ান্তভাবে যাচাই করতে পারেন: সূত্রটি recurrence-এ বসিয়ে বীজগণিতে মেলানো, আর প্রথম k-টি মান মেলানো। কয়েকশো পদের সংখ্যাগত মিল এর সহায়ক প্রমাণ, বিকল্প নয়।
আরেকটি ভালো অভ্যাস হলো AI-কে উল্টো দিক থেকে প্রশ্ন করা। সমাধান চাওয়ার বদলে নিজের বের করা সূত্রটি দিয়ে জিজ্ঞেস করুন, “এটি কোন initial condition-এ ভুল হবে?” বা “একটি পুনরাবৃত্ত মূলের উদাহরণ দাও যেখানে এই পদ্ধতি ব্যর্থ হয়।” ভুল যুক্তি সাধারণত নির্দিষ্ট উদাহরণের সামনে টেকে না, আর উদাহরণটি আপনি নিজেই Python-এ চালিয়ে যাচাই করতে পারেন। মনে রাখবেন, AI-এর উত্তর শেখার সহায়ক, প্রমাণের উৎস নয়: চূড়ান্ত দায়িত্ব থাকে লেমা ১.২-এর মতো যাচাইযোগ্য যুক্তির ওপর।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Fibonacci ক্রমের নাম একজন ইতালীয় গণিতবিদের নামে, অথচ ভারতীয় ছন্দশাস্ত্রে এই সংখ্যাগুলো আরও আগে এসেছে বলে জানা যায়। একটি গাণিতিক ধারণার “আবিষ্কারক” ঠিক করা এত কঠিন কেন?
Pisa-র Leonardo, পরে যাঁকে Fibonacci নামে ডাকা হয়, ১২০২ সালে তাঁর Liber Abaci বইয়ে খরগোশের একটি ধাঁধা দেন: প্রতিটি জোড়া দ্বিতীয় মাস থেকে প্রতি মাসে একটি নতুন জোড়া জন্ম দেয়, তাহলে এক বছরে কত জোড়া হবে? উত্তরের ক্রমটিই আজকের Fibonacci. বইটির মূল উদ্দেশ্য ছিল ইউরোপে হিন্দু-আরবি সংখ্যাপদ্ধতি আর হিসাবের কৌশল ছড়ানো; খরগোশের ধাঁধাটি ছিল অনেক অনুশীলনের একটি মাত্র।
অন্যদিকে প্রাচীন ভারতের সংস্কৃত ও প্রাকৃত ছন্দশাস্ত্রে প্রশ্ন ছিল: হ্রস্ব (১ মাত্রা) আর দীর্ঘ (২ মাত্রা) অক্ষর দিয়ে মোট n মাত্রার কয়টি ছন্দ-বিন্যাস হয়? উত্তর ঠিক এই ক্রম, আর এটি এই কোর্সের পর্ব ৩৭-এর 1 আর 2-এর composition গোনার সমান। Pingala-র ছন্দশাস্ত্রে এর ইঙ্গিত আছে বলে ধরা হয়, আর Virahāṅka, Gopāla আর Hemachandra (দ্বাদশ শতক) স্পষ্ট নিয়মটি দেন বলে ইতিহাসবিদরা লেখেন; সঠিক সাল আর কার লেখায় প্রথম, তা নিয়ে মতভেদ আছে। “Fibonacci ক্রম” নামটি এসেছে আরও অনেক পরে, উনিশ শতকে Édouard Lucas-এর লেখা থেকে বলে জানা যায়।
আবিষ্কারক ঠিক করা কঠিন কয়েকটি কারণে। প্রথমত, একই গাণিতিক কাঠামো ভিন্ন প্রশ্ন থেকে স্বাধীনভাবে বারবার উঠে আসে: ছন্দ, খরগোশ, টাইল বসানো, Euclid-এর algorithm-এর ধাপ। দ্বিতীয়ত, পুরোনো লেখা প্রায়ই হারিয়ে গেছে বা অনুবাদ হয়নি, আর ইউরোপকেন্দ্রিক ইতিহাস-লেখায় অন্য অঞ্চলের কাজ দীর্ঘদিন উপেক্ষিত ছিল। তৃতীয়ত, “জানা” আর “সাধারণ নিয়ম হিসেবে প্রকাশ করা” আলাদা ধাপ।
মূল উপলব্ধি: গাণিতিক সত্য কারও সম্পত্তি নয়; নামগুলো ইতিহাসের দুর্ঘটনা, তাই সাল আর কৃতিত্ব বলার সময় সতর্ক আর বিনয়ী ভাষা ব্যবহার করাই সঠিক।
প্র ০২Binet-এর সূত্রের নাম Jacques Binet-এর নামে, কিন্তু সূত্রটি তাঁর আগেও জানা ছিল বলে শোনা যায়। দুটি irrational সংখ্যার সূত্র থেকে সবসময় পূর্ণসংখ্যা আসা কি কাকতালীয়?
ফরাসি গণিতবিদ Jacques Binet ১৮৪৩ সালে সূত্রটি প্রকাশ করেন বলে প্রচলিত। কিন্তু ইতিহাসবিদরা উল্লেখ করেন যে Abraham de Moivre অষ্টাদশ শতকের প্রথম দিকে “recurring series” (আজকের ভাষায় linear recurrence) নিয়ে কাজ করতে গিয়ে এই ধরনের সূত্র পেয়েছিলেন, আর Daniel Bernoulli ও Euler-ও একই সূত্র জানতেন বলে উল্লেখ পাওয়া যায়। ধারণার নাম প্রায়ই প্রথম আবিষ্কারকের নয়, বরং যিনি তা জনপ্রিয় করেছেন তাঁর নামে হয়; এই প্রবণতাকে মজা করে Stigler-এর নামের সূত্র বলা হয়।
পূর্ণসংখ্যা আসা মোটেই কাকতালীয় নয়। দুইভাবে বোঝা যায়। প্রথমত, recurrence নিজেই পূর্ণসংখ্যা থেকে শুরু করে শুধু যোগ করে, তাই প্রতিটি Fn পূর্ণসংখ্যা; Binet-এর সূত্র সেই একই সংখ্যার অন্য একটি লিখন মাত্র, আর লেমা ১.২-এর অনন্যতা নিশ্চিত করে যে দুটি এক। দ্বিতীয়ত, বীজগণিতে: (1 + √5)n − (1 − √5)n-কে binomial উপপাদ্যে বিস্তৃত করলে √5-এর জোড় ঘাতের পদগুলো কাটাকাটি হয়ে যায়, আর বাকি সব পদে √5-এর বিজোড় ঘাত, যা √5 দিয়ে ভাগ করলে মূলদ সংখ্যা হয়ে যায় (Binet-এ বাকি থাকে শুধু 2n দিয়ে ভাগ, আর প্রথম যুক্তি বলে ফলটি আসলে পূর্ণসংখ্যা)। φ আর ψ পরস্পরের “conjugate”: √5-কে −√5 দিয়ে বদলালে একটি অন্যটি হয়, আর conjugate-এর প্রতিসম রাশিগুলো সবসময় মূলদ হয়।
এখান থেকে একটি গভীর শিক্ষা আসে। Irrational সংখ্যার “সুন্দর” সূত্র গণিতে নির্ভুল, কিন্তু কম্পিউটারে আসন্ন। এই পর্বের ব্লক দেখিয়েছে float-এ Binet n = 71-এ ভুল করে, যদিও উত্তরটি double-এ পুরোপুরি রাখা যায়। একই ব্যাপার ঘটে যখন কেউ float-এ বড় factorial বা binomial coefficient বের করেন। তাই প্রমাণে closed form, গণনায় পূর্ণসংখ্যা: এই ভাগাভাগি মনে রাখা দরকার।
মূল উপলব্ধি: সূত্রের পূর্ণসংখ্যা হওয়া অনন্যতা আর conjugate-এর প্রতিসাম্যের ফল, আর নির্ভুল গণনার জন্য গাণিতিক সত্য আর যন্ত্রের সংখ্যা-পদ্ধতির পার্থক্য সবসময় মাথায় রাখতে হয়।
প্র ০৩Linear recurrence আর linear differential equation (যেমন y″ − 3y′ + 2y = 0) সমাধানের পদ্ধতি প্রায় হুবহু এক। এই মিল কেন, আর এটি linear algebra সম্পর্কে কী বলে?
Differential equation y″ − 3y′ + 2y = 0-এ y = erx অনুমান করলে r2 − 3r + 2 = 0 আসে, মূল 1 আর 2, আর সাধারণ সমাধান αex + βe2x. পুনরাবৃত্ত মূল হলে xerx যোগ হয়। এটি এই পর্বের পদ্ধতির হুবহু ছায়া: rn-এর জায়গায় erx, আর n·rn-এর জায়গায় x·erx. সতেরো-আঠারো শতকে Euler-সহ গণিতবিদরা দুটি তত্ত্বকে পাশাপাশি বিকশিত করেন বলে জানা যায়।
মিলের কারণ কাঠামোগত। Recurrence-এ “এক ধাপ সামনে সরানো” অপারেটর E (Ean = an+1) আর differential equation-এ “derivative” অপারেটর D, দুটিই linear. Recurrence an+2 − 3an+1 + 2an = 0-কে লেখা যায় (E2 − 3E + 2)a = 0, আর differential equation-কে (D2 − 3D + 2)y = 0. দুই ক্ষেত্রেই একটি polynomial-এ linear অপারেটর বসানো হয়েছে, আর তার kernel খোঁজা হচ্ছে। Polynomial-টি গুণনীয়কে ভাঙলে kernel-ও টুকরো হয়ে যায়, আর প্রতিটি গুণনীয়ক (E − r) বা (D − r)-এর kernel হলো যথাক্রমে rn বা erx. Eigenvector হলো এমন বস্তু যাকে অপারেটর শুধু গুণ করে: E(rn) = r·rn, D(erx) = r·erx.
পুনরাবৃত্ত মূলে (E − r)2-এর kernel-এ নতুন সমাধান আসে, যা eigenvector নয় কিন্তু “generalized eigenvector”; matrix-এর ভাষায় এটিই Jordan block, যা §৭-এ companion matrix-এর ক্ষেত্রে দেখেছেন। এই কারণে অনেক বইয়ে recurrence-এর তত্ত্বকে “difference equation” বলা হয়, আর সংখ্যাগত গণনায় differential equation-কে ছোট ধাপে ভাঙলে ঠিক এমন recurrence-ই পাওয়া যায়।
মূল উপলব্ধি: দুটি পদ্ধতি একই linear algebra-র দুটি রূপ: একটি linear অপারেটরের polynomial-এর kernel খোঁজা, আর তার basis তৈরি হয় eigenvector দিয়ে।
প্র ০৪an = (10/3)an−1 − an−2, a0 = 1, a1 = 1/3-এর নির্ভুল উত্তর (1/3)n, যা শূন্যের দিকে যায়। কিন্তু float-এ সামনের দিকে হিসাব করলে n = 40-এ মান প্রায় 104.7 আসে। কেন?
Characteristic equation r2 − (10/3)r + 1 = 0-এর মূল 3 আর 1/3. সাধারণ সমাধান α·3n + β·(1/3)n, আর দেওয়া initial condition-এ ঠিক α = 0, β = 1. অর্থাৎ নির্ভুল উত্তরটি dominant root-এর সহগ শূন্য হওয়ার বিশেষ ক্ষেত্র, §৮-এ যাকে উপপাদ্য ৮.১-এর বাইরের ক্ষেত্র বলা হয়েছে।
Float-এ 1/3 নির্ভুলভাবে রাখা যায় না, আর 10/3-ও না। তাই প্রথম ধাপেই প্রায় 10−17 মাপের একটি ছোট ত্রুটি ঢোকে। লেমা ২.২ অনুযায়ী এই ত্রুটিটিও recurrence মেনে চলে, তাই তা নিজেও α′·3n + β′·(1/3)n রূপের, আর α′ সামান্য হলেও শূন্য নয়। 3n n = 40-এ প্রায় 1.2 × 1019, তাই 10−17 মাপের α′ গুণ হয়ে কয়েকশোর ঘরে পৌঁছায়। এই পর্বের scratch হিসাবে n = 20-এ float মান নির্ভুল মানের প্রায় ১০০ গুণ, আর n = 40-এ প্রায় 104.68, যখন নির্ভুল মান প্রায় 8.2 × 10−20. একই হিসাব Fraction-এ চালালে n = 40-এ ঠিক 1/340 আসে।
সংখ্যাগত বিশ্লেষণে এর নাম numerical instability: যে সমাধান চাওয়া হচ্ছে তা যদি dominant না হয়, সামনের দিকে recurrence চালালে dominant অংশটি ত্রুটি থেকে জন্মে সব দখল করে নেয়। প্রতিকার হিসেবে উল্টো দিকে (n বড় থেকে ছোট) চালানো হয়, যেখানে 1/3 মূলটি dominant; বিশেষ function-এর মান হিসাবের কিছু পদ্ধতি এই ভাবনায় চলে বলে জানা যায়। এখানে dominant root-এর তত্ত্বটি শুধু বৃদ্ধির হার বলে না, গণনার নিরাপত্তাও বলে।
মূল উপলব্ধি: ত্রুটিও recurrence-এর সমাধান, তাই dominant root-এর দিকে তা বাড়ে; non-dominant সমাধান float-এ সামনের দিকে নির্ভরযোগ্যভাবে হিসাব করা যায় না।
প্র ০৫Golden ratio নিয়ে Parthenon, মোনালিসা আর মানবদেহের নানা দাবি প্রচলিত। এর কতটা গণিত আর কতটা মিথ? আর গণিতে φ-এর সত্যিকারের বিশেষত্ব কী?
জনপ্রিয় বই আর ভিডিওতে প্রায়ই বলা হয় Parthenon-এর মাপ, Leonardo-র ছবি বা “নিখুঁত” মুখের অনুপাত φ-এর ওপর গড়া। গণিতের ইতিহাসবিদ আর পরিসংখ্যানবিদরা দেখিয়েছেন যে এর বেশিরভাগ দাবি দুর্বল: কোন দুটি বিন্দুর মাপ নেওয়া হবে তা বেছে নেওয়ার স্বাধীনতা থাকলে প্রায় যেকোনো ভবনে 1.6-এর কাছাকাছি একটি অনুপাত খুঁজে পাওয়া যায়, আর মাপের ত্রুটি কয়েক শতাংশ হলে 1.5 আর 1.7-ও “golden” দেখায়। Mario Livio-র মতো লেখকেরা এই মিথগুলোর বিশ্লেষণ করেছেন বলে জানা যায়। গাছের পাতা আর সূর্যমুখীর বীজের সর্পিল বিন্যাসে Fibonacci সংখ্যা আসার কিছু দাবি অবশ্য জীববিজ্ঞানে মডেল দিয়ে ব্যাখ্যা করা হয়েছে, তবে সেখানেও ব্যতিক্রম অনেক।
গণিতে φ-এর বিশেষত্ব অনেক বেশি নিশ্চিত। φ = 1 + 1/φ, তাই এর continued fraction 1 + 1/(1 + 1/(1 + …)), সব আংশিক ভাগফল 1. এই কারণে φ হলো মূলদ সংখ্যা দিয়ে আসন্ন করতে সবচেয়ে কঠিন irrational সংখ্যাগুলোর একটি, আর তার সেরা আসন্ন মান ঠিক Fn+1/Fn. Lamé ১৮৪৪ সালে Euclid-এর gcd algorithm-এর ধাপ গুনতে Fibonacci সংখ্যা ব্যবহার করেন: পরপর দুটি Fibonacci সংখ্যাই সবচেয়ে বেশি ধাপ নেয় (পর্ব ১৩-এ এই ধরনের loop বিশ্লেষণ)। Fibonacci heap আর Fibonacci search-এর মতো data structure-এও φ বৃদ্ধির হার হিসেবে আসে, কারণ এগুলোর গঠন Fn = Fn−1 + Fn−2 ধরনের recurrence মানে।
তাই প্রশ্নটি একটি ভালো অভ্যাসের পরীক্ষা: একটি সুন্দর সংখ্যা বারবার “দেখা গেলে” আগে জিজ্ঞেস করুন, কোন মাপ বাছা হলো, ত্রুটি কত, আর বিকল্প ব্যাখ্যা কী। গণিতে φ আসে যখন একটি recurrence-এর characteristic equation r2 = r + 1, আর সেই কারণটি প্রমাণসহ বলা যায়।
মূল উপলব্ধি: φ-এর গাণিতিক গুরুত্ব প্রমাণিত, কিন্তু শিল্প আর স্থাপত্যে তার উপস্থিতির বেশিরভাগ দাবি বাছাই-করা মাপের ফল; দাবি যাচাইয়ে সংশয়ী মনই বিজ্ঞানের হাতিয়ার।
অনুশীলন
আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।
-
প্রমাণ: Lucas সংখ্যা L0 = 2, L1 = 1, Ln = Ln−1 + Ln−2. প্রমাণ করুন Ln = φn + ψn, আর n ≥ 2 হলে Ln হলো φn-এর নিকটতম পূর্ণসংখ্যা।
- Recurrence Fibonacci-র মতোই, তাই মূল φ আর ψ, আর উপপাদ্য ৩.১-এ Ln = αφn + βψn. — উপপাদ্য ৩.১
- n = 0: α + β = 2. n = 1: αφ + βψ = 1. α = β = 1 নিলে দ্বিতীয়টি φ + ψ = 1, যা সত্য; system-এর determinant ψ − φ ≠ 0 বলে এটিই একমাত্র সমাধান। — initial condition
- তাই Ln = φn + ψn, অর্থাৎ Ln − φn = ψn. — ধাপ ২
- n ≥ 2 হলে |ψn| ≤ ψ2 ≈ 0.382 < 1/2, তাই Ln হলো φn-এর নিকটতম পূর্ণসংখ্যা। ∎ — |ψ| < 1
n = 0 আর 1-এ দাবিটি ভাঙে: φ0 = 1 অথচ L0 = 2, আর φ ≈ 1.618 গোল করে 2, অথচ L1 = 1. তাই “n ≥ 2” শর্তটি জরুরি; scratch-এ n = 2 থেকে 19 পর্যন্ত মেলানো হয়েছে।
-
হিসাব: বাজারঘরের গুদামে 1 × n মাপের একটি তাক 1 × 1 বাক্স (এক রকম) আর 1 × 2 বাক্স (লাল বা নীল, দুই রকম) দিয়ে ফাঁক ছাড়া ভরতে হবে। tn = কতভাবে ভরা যায় (t0 = 1). (ক) recurrence লিখুন, (খ) closed form বের করুন, (গ) t10 কত?
(ক) প্রথম বাক্সটি 1 × 1 হলে বাকি n − 1, আর 1 × 2 হলে (দুই রঙে) বাকি n − 2: tn = tn−1 + 2tn−2, t0 = 1, t1 = 1.
(খ) কুপনের একই recurrence, মূল 2 আর −1: α1 + α2 = 1, 2α1 − α2 = 1, তাই α1 = 2/3, α2 = 1/3, আর tn = (2n+1 + (−1)n)/3.
(গ) t10 = (2048 + 1)/3 = 683. ক্রম 1, 1, 3, 5, 11, 21, 43, 85, 171, 341, 683; scratch-এ সরাসরি গোনার সঙ্গে n ≤ 11 পর্যন্ত মেলানো।
-
আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
a = [3, 5] for n in range(2, 8): a.append(4 * a[-1] - 4 * a[-2]) print(a) print(max(a), a.index(0))[3, 5, 8, 12, 16, 16, 0, -64] 16 6মূল 2 দুবার, তাই an = (α1 + α2n)2n; a0 = 3 থেকে α1 = 3, আর 2(3 + α2) = 5 থেকে α2 = −1/2. তাই an = (6 − n)·2n−1: n = 6-এ ঠিক 0, তারপর ঋণাত্মক (a7 = −64). ধনাত্মক শুরু দেখে ক্রমটি চিরকাল বাড়বে ভাবা ভুল; ঋণাত্মক α2-এর n-গুণক শেষে জেতে। আউটপুট CPython-এ চালিয়ে মেলানো।
-
সমাধানের ভুল ধরুন: প্রশ্ন: an = 5an−1 − 6an−2 (n ≥ 3), a1 = 1, a2 = 5. একজন লিখলেন: “মূল 2, 3; an = α12n + α23n. প্রথম শর্তে α1 + α2 = 1, দ্বিতীয়তে 2α1 + 3α2 = 5. তাই α2 = 3, α1 = −2, আর an = 3n+1 − 2n+1.” ভুলটি কোথায়, আর সঠিক উত্তর কী?
- ভুল ধাপ: ক্রম শুরু n = 1 থেকে, কিন্তু সমীকরণ দুটি লেখা হয়েছে n = 0 আর n = 1 বসিয়ে। ফলে সূত্রটি a1 = 9 − 4 = 5 দেয়, দেওয়া মান 1 নয়।
- সঠিক system: n = 1: 2α1 + 3α2 = 1; n = 2: 4α1 + 9α2 = 5. প্রথমটির দ্বিগুণ বাদ দিলে 3α2 = 3, তাই α2 = 1, α1 = −1.
- উত্তর: an = 3n − 2n. যাচাই: a1 = 1, a2 = 5, a3 = 25 − 6 = 19 = 27 − 8 ✓. শিক্ষা: initial condition যে সূচকে দেওয়া, ঠিক সেই n বসান।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমধ্রুবক সহগের একটি linear homogeneous recurrence সমাধানের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- Recurrence linear, homogeneous আর ধ্রুবক সহগের কি না, আর তার degree k দেখা
- an-কে rn দিয়ে বদলে characteristic equation লেখা
- মূলগুলো multiplicity-সহ বের করা
- মূল অনুযায়ী সাধারণ সমাধান লেখা (পুনরাবৃত্ত মূলে n·rn-সহ)
- k-টি initial condition বসিয়ে linear system সমাধান করা
- প্রথম কয়েকটি পদ recurrence আর সূত্র দুইভাবে মেলানো
নিচের কোনটি ধ্রুবক সহগের linear homogeneous recurrence?
- an = an−12 + 1
- an = 3an−1 + n
- an = n·an−1
- an = 2an−1 − an−3
an = 5an−1 − 6an−2-এর characteristic root কোনগুলো?
- −2 আর −3
- 2 আর 3
- 1 আর 6
- −1 আর 6
একটি degree 2-এর recurrence-এর characteristic equation (r − 4)2 = 0. সাধারণ সমাধান কোনটি?
- α14n + α24n
- α14n + α2(−4)n
- (α1 + α2n)4n
- (α1 + α2n2)4n
φ = (1 + √5)/2, ψ = (1 − √5)/2. প্রতিটি n ≥ 0-এ Fibonacci সংখ্যা Fn (F0 = 0, F1 = 1) কেন φn/√5-এর নিকটতম পূর্ণসংখ্যা?
- কারণ |ψn/√5| < 1/2 সব n-এ
- কারণ φn/√5 নিজেই পূর্ণসংখ্যা
- কারণ φn খুব দ্রুত বাড়ে
- কারণ কম্পিউটার double-এ ১৫ অঙ্ক রাখে
an = 2an−1 + an−2 − 2an−3-এর সব সমাধানের সেট একটি vector space. এর dimension কত?
- 1
- 2
- 3
- অসীম
a0 = 0, a1 = 1 আর an = an−1 − an−2 (n ≥ 2) হলে a2026 কত?
- 0
- −1
- 1
- একটি বিশাল সংখ্যা
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- শ্রেণি: an = c1an−1 + … + ckan−k, ck ≠ 0; k-টি initial condition একটিমাত্র সমাধান ঠিক করে (strong induction).
- পদ্ধতি: rk − c1rk−1 − … − ck = 0; ভিন্ন মূলে an = ∑ αirin, ধ্রুবক আসে অশূন্য determinant-এর linear system থেকে।
- পুনরাবৃত্ত মূল: multiplicity m হলে rn, n·rn, …, nm−1rn; complex মূলে ρn(A cos nθ + B sin nθ), |ρ| = 1 হলে প্রায়ই periodic.
- Fibonacci: Fn = (φn − ψn)/√5 = round(φn/√5); float-এ n = 71 থেকে ভুল, নির্ভুল মানের জন্য int বা Qn.
- Linear algebra: সমাধান-জগতের dimension k; characteristic root = companion matrix-এর eigenvalue; dominant root (α ≠ 0 হলে) বৃদ্ধির হার Θ(|r1|n) দেয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৪৬ · Non-homogeneous recurrence আর particular solutionপরবর্তী পর্ববাড়তি পদসহ recurrence-এর সমাধান।
- পর্ব ১১ · Strong induction আর well-orderingপুনরালোচনাসমাধানের অনন্যতার প্রমাণের ভিত।
- পর্ব ১২ · Recursive সংজ্ঞা আর structural inductionপুনরালোচনাFibonacci-র বৃদ্ধি আর Cassini-র সূত্র।
- ডিসক্রিট ম্যাথমেটিক্স · কোর্স হোম৮৩টি পর্বপুরো কোর্সের মানচিত্র আর ১৪টি মডিউল।
- DSA · পর্ব ৮ · Recurrence সমাধান — substitution আর recursion treeকোডে প্রয়োগঅ্যালগরিদমের সময়ের recurrence লেখা আর সমাধান।
- Machine Learning · পর্ব ৮ · Eigenvalue আর eigenvectorগভীরেCompanion matrix-এর পেছনের linear algebra.