জেনারেটিং ফাংশন পরিচিতি
এই পাঠে যা শিখবেন
- জেনারেটিং ফাংশনের সংজ্ঞা — একটি সিকোয়েন্সকে ফরমাল পাওয়ার সিরিজ হিসেবে দেখা
- জ্যামিতিক সিকোয়েন্সের ক্লাসিক জেনারেটিং ফাংশন $\frac{1}{1-x}$
- একটি সাধারণ ধারণা — কীভাবে জেনারেটিং ফাংশন রিকারেন্স সমাধানে ব্যবহার করা যায়
- এই কৌশল কোথায় কোর্সের বাকি অংশে (M6-এর পরে) প্রাসঙ্গিক হতে পারে তার একটি ইঙ্গিত
১ · জেনারেটিং ফাংশন কী?
এতক্ষণ আমরা একটি সিকোয়েন্সকে দেখেছি সংখ্যার একটি তালিকা হিসেবে: $a_0, a_1, a_2, \dots$। একটি জেনারেটিং ফাংশনGenerating Functionএকটি সিকোয়েন্স $a_0,a_1,a_2,\dots$-কে একটি একক বীজগাণিতিক বস্তু — একটি ফরমাল পাওয়ার সিরিজ — হিসেবে এনকোড করার কৌশল, যেখানে $a_n$ হলো $x^n$-এর গুণাঙ্ক। "ফরমাল" মানে আমরা $x$-এর কোনো নির্দিষ্ট সাংখ্যিক মান বসাচ্ছি না — এটি শুধু গুণাঙ্কগুলো ধরে রাখার একটি খাতা মাত্র। একই সিকোয়েন্সকে সম্পূর্ণ ভিন্নভাবে দেখে — একটি একক বীজগাণিতিক বস্তু হিসেবে, যেখানে প্রতিটি $a_n$ একটি পাওয়ার সিরিজের $x^n$ পদের গুণাঙ্ক —
$$G(x) = \sum_{n=0}^{\infty} a_n x^n = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \dots$$
এখানে $x$ কোনো প্রকৃত সংখ্যা নয় যাতে আমরা মান বসাব — এটি শুধু একটি "স্লট" বা "প্লেসহোল্ডার", যার ঘাত (power) $n$ দেখেই আমরা বুঝি এটি $a_n$-এর তথ্য বহন করছে। এই কারণে $G(x)$-কে বলা হয় একটি ফরমাল পাওয়ার সিরিজ — আমরা এর কনভার্জেন্স (converge করে কি না) নিয়ে চিন্তা করি না, শুধু গুণাঙ্কগুলোর বীজগণিত নিয়ে কাজ করি।
২ · সবচেয়ে সহজ উদাহরণ — জ্যামিতিক সিকোয়েন্স
ধরুন সিকোয়েন্সটি হলো $a_n = 1$ প্রতিটি $n \geq 0$-এর জন্য — অর্থাৎ $1, 1, 1, 1, \dots$। তাহলে —
$$G(x) = 1 + x + x^2 + x^3 + \dots$$
এটি একটি সুপরিচিত সিরিজ — জ্যামিতিক সিরিজ (Geometric Series)। এর একটি বদ্ধ-রূপ পরিচিতি আছে —
$$G(x) = \frac{1}{1-x}$$
এই অভেদটি সহজেই যাচাই করা যায়: $(1-x)(1+x+x^2+\dots) = 1+x+x^2+\dots - x - x^2 - x^3 - \dots = 1$ (বাকি সব পদ বাতিল হয়ে যায়)। এভাবে একটি অসীম সিকোয়েন্স একটি ছোট্ট বীজগাণিতিক রাশিতে "সংকুচিত" হয়ে যায়।
৩ · জেনারেটিং ফাংশন দিয়ে রিকারেন্স সমাধান — একটি ঝলক
জেনারেটিং ফাংশনের সবচেয়ে শক্তিশালী ব্যবহার হলো রিকারেন্স রিলেশন সমাধান করা — L30-এর ক্যারেক্টারিস্টিক ইকুয়েশন পদ্ধতির একটি বিকল্প বীজগাণিতিক পথ। ধারণাটি (বিস্তারিত ডেরিভেশন ছাড়া) এরকম: রিকারেন্স $a_n = 2a_{n-1}+1$, $a_0=0$-এর জন্য, প্রতিটি পাশকে $x^n$ দিয়ে গুণ করে সব $n \geq 1$-এর উপর যোগ করলে, এবং $G(x)=\sum a_n x^n$ সংজ্ঞা ব্যবহার করে, শেষ পর্যন্ত পাওয়া যায় —
$$G(x) = \frac{x}{(1-x)(1-2x)}$$
এরপর পার্শিয়াল ফ্র্যাকশন ডিকম্পোজিশন (একটি বীজগাণিতিক কৌশল যা এই রাশিকে সহজ ভগ্নাংশের যোগফলে ভাঙে) প্রয়োগ করলে বদ্ধ-রূপ সূত্র পাওয়া যায় —
$$a_n = 2^n - 1$$
সূত্রটি সঠিক কি না তা যাচাই করার সবচেয়ে সহজ উপায় হলো সরাসরি মূল রিকারেন্সে বসানো — $a_n = 2a_{n-1}+1$ ধরে নিয়ে, $a_n = 2^n-1$ এবং $a_{n-1} = 2^{n-1}-1$ বসিয়ে —
$$2a_{n-1}+1 = 2\big(2^{n-1}-1\big)+1 = 2^n - 2 + 1 = 2^n - 1 = a_n \quad ✓$$
এবং বেস কেসও মেলে: $a_0 = 2^0-1 = 1-1 = 0$ ✓। সূত্রটি সব $n$-এর জন্য সঠিক প্রমাণিত হলো — জেনারেটিং ফাংশনের পূর্ণ বীজগণিত না বুঝেও, শুধু চূড়ান্ত ফলাফল সরাসরি রিকারেন্সে বসিয়ে আমরা এটি নিশ্চিত করতে পারি।
# a_n = 2*a_(n-1) + 1, a_0 = 0
# বদ্ধ-রূপ সূত্র: a_n = 2**n - 1 — দুইভাবে যাচাই
def recurrence(n):
a = [0]
for i in range(1, n + 1):
a.append(2 * a[i - 1] + 1)
return a[:n + 1]
def closed_form(n):
return 2**n - 1
N = 10
recursive_values = recurrence(N)
closed_values = [closed_form(n) for n in range(N + 1)]
print("রিকার্সিভ:", recursive_values)
print("বদ্ধ-রূপ :", closed_values)
for n in range(N + 1):
assert recursive_values[n] == closed_values[n], f"n={n} তে অমিল!"
print("যাচাই সম্পন্ন — n=0..10 পর্যন্ত সব মান মিলেছে।")
জেনারেটিং ফাংশন একটি সিকোয়েন্সকে একটি বীজগাণিতিক বস্তুতে রূপান্তর করে, যার উপর সাধারণ বীজগণিত (যোগ, গুণ, পার্শিয়াল ফ্র্যাকশন) প্রয়োগ করে রিকারেন্স সমাধান করা যায় — এটি L30-এর ক্যারেক্টারিস্টিক ইকুয়েশন পদ্ধতির একটি ভিন্ন, আরও সাধারণ (general) বিকল্প, যা অ-হোমোজিনিয়াস রিকারেন্স ($+1$-এর মতো অতিরিক্ত পদসহ) এবং আরও জটিল কম্বিনেটরিক্স সমস্যাতেও কাজ করে। M6 এখানেই শেষ হচ্ছে — পরবর্তী মডিউলে (M7) আমরা বুলিয়ান অ্যালজেব্রা ও অটোমাটা থিওরিতে যাব।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ "ফরমাল পাওয়ার সিরিজ" বলতে কেন জোর দেওয়া হয় যে $x$-এ কোনো সাংখ্যিক মান বসানো হচ্ছে না — এটি না বললে কী সমস্যা হতো?
যদি আমরা $x$-এ একটি প্রকৃত সংখ্যা (যেমন $x=2$) বসাতাম, তাহলে $1+x+x^2+\dots$ সিরিজটি কনভার্জ (converge) করত কি না তা নিয়ে চিন্তা করতে হতো — এবং $|x|\geq 1$ হলে এটি ডাইভার্জ (diverge, অসীমে চলে যায়) করে, তাই $\frac{1}{1-x}$ অভেদটি অর্থহীন হয়ে যেত। কিন্তু আমরা যেহেতু $G(x)$-কে শুধু গুণাঙ্কগুলো ধরে রাখার একটি "খাতা" হিসেবে ব্যবহার করছি (কোনো নির্দিষ্ট মান বসানোর উদ্দেশ্যে নয়), তাই কনভার্জেন্সের প্রশ্নটি একেবারেই প্রাসঙ্গিক নয় — এই কারণেই "ফরমাল" শব্দটি গুরুত্বপূর্ণ।
প্র ০২ জেনারেটিং ফাংশন পদ্ধতি এবং L30-এর ক্যারেক্টারিস্টিক ইকুয়েশন পদ্ধতি — এই দুটো একই ধরনের রিকারেন্সে ভিন্ন উত্তর দেবে কি?
না — যদি একই রিকারেন্স ও একই বেস কেসে দুটো পদ্ধতিই সঠিকভাবে প্রয়োগ করা হয়, উভয়ই ঠিক একই বদ্ধ-রূপ সূত্র দেবে। এগুলো একই গাণিতিক সত্যে পৌঁছানোর দুটি ভিন্ন পথ মাত্র — ক্যারেক্টারিস্টিক ইকুয়েশন পদ্ধতি সরাসরি $a_n=x^n$ অনুমান করে কাজ করে, জেনারেটিং ফাংশন পদ্ধতি পুরো সিকোয়েন্সকে একটি একক বীজগাণিতিক রাশিতে এনকোড করে কাজ করে। কোন পদ্ধতি ব্যবহার করবেন তা নির্ভর করে রিকারেন্সের ধরনের উপর — নন-হোমোজিনিয়াস বা আরও জটিল রিকারেন্সে জেনারেটিং ফাংশন প্রায়ই বেশি সাধারণ (general) ও শক্তিশালী প্রমাণিত হয়।
প্র ০৩ কোড সেলে বদ্ধ-রূপ সূত্র যাচাই করা হয়েছে রিকার্সিভ সংজ্ঞার সাথে তুলনা করে — কিন্তু "কী প্রমাণ" এর সাথে "কীভাবে প্রমাণ" এই দুটোর পার্থক্য কী?
কোড সেলে যা করা হয়েছে তা হলো যাচাই (verification) — নির্দিষ্ট কিছু $n$ মানের ($0$ থেকে $10$) জন্য সূত্রটি সত্য কি না চেক করা। এটি একটি শক্তিশালী স্যানিটি-চেক, কিন্তু এটি সব $n$-এর জন্য সত্য তা প্রমাণ করে না। উপরে ধাপ "$2a_{n-1}+1 = 2^n-1$" দেখানো প্রকৃত প্রমাণ (proof)-এর একটি অংশ — এটি বীজগণিতের মাধ্যমে দেখায় যে সূত্রটি রিকারেন্সের সংজ্ঞা সাধারণভাবে সন্তুষ্ট করে, নির্দিষ্ট কোনো $n$-এর জন্য নয়। L06-এ শেখা ইনডাকশন এই ধরনের প্রমাণকে পুরোপুরি কঠোর করে তোলে (base case + inductive step)।
অনুশীলন
-
হাতে যাচাই করুন: $a_n = 2^n - 1$ সূত্র ব্যবহার করে $a_0, a_1, a_2, a_3$ হাতে হিসাব করুন, তারপর $a_n=2a_{n-1}+1$ রিকারেন্স ব্যবহার করে একই মান আবার হিসাব করে মিলিয়ে দেখুন।
সূত্র থেকে: $a_0=2^0-1=0$, $a_1=2^1-1=1$, $a_2=2^2-1=3$, $a_3=2^3-1=7$।
রিকারেন্স থেকে: $a_0=0$ (বেস কেস)। $a_1=2(0)+1=1$ ✓। $a_2=2(1)+1=3$ ✓। $a_3=2(3)+1=7$ ✓। দুই পদ্ধতি পুরোপুরি মেলে। -
কোড পরিবর্তন করুন: উপরের কোড সেলে
N-এর মান $20$-এ পরিবর্তন করে চালান, এবং $a_{20}$-এর মান দেখে বলুন এটি $2^{20}$-এর কতটা কাছাকাছি (আনুপাতিকভাবে)।$a_{20} = 2^{20}-1 = 1{,}048{,}575$, যেখানে $2^{20} = 1{,}048{,}576$ — মাত্র $1$ কম। যত $n$ বড় হয়, $2^n-1$ আনুপাতিকভাবে $2^n$-এর আরও কাছাকাছি চলে আসে (পার্থক্যটা সবসময় ঠিক $1$, কিন্তু $2^n$ নিজেই সূচকীয় হারে বাড়তে থাকে) — এই কারণেই আমরা বলি $a_n = \Theta(2^n)$।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৪৪টি পাঠ পরবর্তী পাঠ — বুলিয়ান অ্যালজেব্রা ও লজিক গেট — নতুন মডিউল M7 শুরু হচ্ছে।
- Data Structures & Algorithms কোর্স সঙ্গী কোর্স রিকারেন্স রিলেশন ও Master Theorem বাস্তব কোডে কীভাবে প্রয়োগ হয় তা দেখতে DSA কোর্সটিও দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, HTML & CSS ও Discrete Mathematics — সব এক জায়গায়।