পাঠ ৩২ · ৪৪-এর মধ্যে · মডিউল ৬
Home / Courses / Discrete Mathematics / জেনারেটিং ফাংশন

জেনারেটিং ফাংশন পরিচিতি

Introduction to generating functions
৮ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • জেনারেটিং ফাংশনের সংজ্ঞা — একটি সিকোয়েন্সকে ফরমাল পাওয়ার সিরিজ হিসেবে দেখা
  • জ্যামিতিক সিকোয়েন্সের ক্লাসিক জেনারেটিং ফাংশন $\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$-এর জন্য সঠিক প্রমাণিত হলো — জেনারেটিং ফাংশনের পূর্ণ বীজগণিত না বুঝেও, শুধু চূড়ান্ত ফলাফল সরাসরি রিকারেন্সে বসিয়ে আমরা এটি নিশ্চিত করতে পারি।

এই পাঠটি ইচ্ছাকৃতভাবে হালকা রাখা হয়েছে — জেনারেটিং ফাংশন একটি গভীর ও শক্তিশালী ক্ষেত্র (কম্বিনেটরিক্সের অনেক উন্নত ফলাফল এর উপর দাঁড়িয়ে), কিন্তু এই পরিচায়ক পাঠের লক্ষ্য শুধু ধারণাটির সাথে পরিচয় করানো — সম্পূর্ণ দক্ষতা অর্জন নয়। L30-এর ক্যারেক্টারিস্টিক ইকুয়েশন পদ্ধতিই এই কোর্সে রিকারেন্স সমাধানের মূল হাতিয়ার থাকবে।
Python
# 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 পর্যন্ত সব মান মিলেছে।")

    
মূল কথা · Key takeaway

জেনারেটিং ফাংশন একটি সিকোয়েন্সকে একটি বীজগাণিতিক বস্তুতে রূপান্তর করে, যার উপর সাধারণ বীজগণিত (যোগ, গুণ, পার্শিয়াল ফ্র্যাকশন) প্রয়োগ করে রিকারেন্স সমাধান করা যায় — এটি 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)।

অনুশীলন

  1. হাতে যাচাই করুন: $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$ ✓। দুই পদ্ধতি পুরোপুরি মেলে।

  2. কোড পরিবর্তন করুন: উপরের কোড সেলে 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-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
ডিভাইড-অ্যান্ড-কনকার রিকারেন্স ও Master Theorem