ডিভাইড অ্যান্ড কঙ্কার৫ মিনিট পড়া

ফাস্ট পাওয়ার বা দ্রুত ঘাত (Fast Power)

\(x^n\) গণনা করুন \(O(\log n)\) সময়ে — \(O(n)\) সংখ্যক গুণফল বা মাল্টিপ্লিকেশন নয়
time:\(O(\log n)\)space:\(O(\log n)\) রিকার্সিভ · \(O(1)\) ইটারেটিভ

আপনি ২৬৪ (264) কীভাবে হিসেব করবেন? সবচেয়ে সাধারণ উপায় হলো: ২-কে নিজের সাথে ৬৪ বার গুণ করা। এতে আপনাকে ৬৩ বার গুণ করতে হবে।

এটিকে করার আরও একটি স্মার্ট পদ্ধতি আছে। ২ থেকে শুরু করুন। এটিকে স্কয়ার বা বর্গ করুন → ৪। ৪-কে স্কয়ার করুন → ১৬। ১৬-কে স্কয়ার করুন → ২৫৬। এভাবে মাত্র ৬ বার স্কয়ার করলেই আপনি ২৬৪ পেয়ে যাবেন। যেখানে আপনার ৬৩ বার গুণের প্রয়োজন ছিল, সেখানে এখন লাগছে মাত্র ৬ বার গুণ। আর ঘাত বা পাওয়ার যত বাড়বে, এই পার্থক্যের পার্থক্যও তত বড় হবে: ২১,০০০,০০০ হিসেব করতে লিনিয়ার পদ্ধতিতে যেখানে ১০ লক্ষ ধাপ লাগত, সেখানে এই পদ্ধতিতে মাত্র ২০ বার স্কয়ার করলেই কাজ হয়ে যাবে।

এই ট্রিকটি — অর্থাৎ রিপিটেড স্কয়ারিং (repeated squaring) বা বারবার বর্গ করা — হলো ফাস্ট পাওয়ার (একে এক্সপোনেনশিয়েশন বাই স্কয়ারিংও বলা হয়) এর মূল ভিত্তি।

মূল ধারণা

যদি n জোড় (even) হয়: xn = (xn/2)2। একবার xn/2 হিসেব করুন, তারপর সেটিকে বর্গ করে দিন। একটি রিকার্সিভ কল এবং একটি গুণফল।

যদি n বেজোড় (odd) হয়: xn = x · xn−1। এখানে ১টি বাড়তি গুণের মাধ্যমে সমস্যাটিকে জোড় বা ইভেন কেসে পরিণত করা হয়।

প্রতিটি ধাপে n এর মান অর্ধেক হয়ে যায়, তাই মাত্র \(\log_2(n)\) ধাপের পরেই n এর মান ০-তে পৌঁছায় — যা হলো আমাদের বেস কেস (যেকোনো কিছুর পাওয়ার ০ হলে তার মান ১)। সর্বমোট: \(O(\log n)\) সংখ্যক গুণফল।

ইটারেটিভ ভার্সন বা পুনরাবৃত্তিমূলক সংস্করণ

n সংখ্যাটিকে বাইনারিতে চিন্তা করুন। প্রতিটি বিট আপনাকে বলে দিচ্ছে যে আপনার ফলাফলে x-এর একটি নির্দিষ্ট পাওয়ার বা ঘাত অন্তর্ভুক্ত করতে হবে কি না। ইটারেটিভ পদ্ধতিতে এলএসবি (LSB) থেকে এমএসবি (MSB) পর্যন্ত বিটগুলো স্ক্যান করা হয়: একটি রানিং রেজাল্ট এবং একটি কারেন্ট বেস (বর্তমান ভিত্তি) সংরক্ষণ করুন। যদি বর্তমান বিটটি ১ হয়, তবে রেজাল্টকে বর্তমান বেস দিয়ে গুণ করুন। সবসময় বেসকে বর্গ করুন এবং n-কে ১ ধাপ ডানে শিফট (shift right) করুন। এতে কোনো রিকার্সনের প্রয়োজন হয় internal — যা মাত্র \(O(1)\) স্পেস বা জায়গা নেয়।

পূর্ণসংখ্যার বাইরে: ম্যাট্রিক্স ফাস্ট পাওয়ার

একই ট্রিক যেকোনো অ্যাসোসিয়েটিভ অপারেশনের জন্য কাজ করে — এমনকি ম্যাট্রিক্স মাল্টিপ্লিকেশনের ক্ষেত্রেও। ম্যাট্রিক্স [[১,১],[১,০]]n হিসেব করলে তা n-তম ফিবোনাচি (Fibonacci) সংখ্যা প্রদান করে। ফাস্ট পাওয়ার ব্যবহার করে এই ম্যাট্রিক্সটিকে n-তম ঘাতে উন্নীত করুন, এবং আপনি ফিবোনাচি(n) হিসেব করতে পারবেন মাত্র \(O(\log n)\) ম্যাট্রিক্স মাল্টিপ্লিকেশনের মাধ্যমে যেখানে \(O(n)\) সময় লাগত। এটি তখন খুব গুরুত্বপূর্ণ হয়ে দাঁড়ায় যখন n এর মান ১০১৮-এর মতো বিশাল হয়।

দ্রষ্টব্য: মডুলার ফাস্ট পাওয়ার (\(x^n\) mod m হিসেব করা) মূলত RSA এনক্রিপশন, ডিফি-হেলম্যান (Diffie-Hellman) কী এক্সচেঞ্জ এবং প্রাইমালিটি টেস্টের মূল ভিত্তি। এখানে ব্যবহৃত সংখ্যাগুলো শত শত ডিজিট লম্বা হয় — ফাস্ট পাওয়ার ছাড়া আধুনিক ক্রিপ্টোগ্রাফি বা তথ্য গুপ্তায়ন কম্পিউটেশনালি অসম্ভব হয়ে পড়ত।

ফাস্ট পাওয়ার — রিকার্সিভ এবং ইটারেটিভ

# Recursive
def fast_pow_recursive(x, n):
if n == 0: return 1
half = fast_pow_recursive(x, n // 2)
if n % 2 == 0:
return half * half
else:
return x * half * half
# Iterative
def fast_pow_iterative(x, n):
result = 1
base = x
while n > 0:
if n % 2 == 1:
result *= base
base *= base
n //= 2
return result
# Modular fast power (for cryptography)
def fast_pow_mod(x, n, mod):
result = 1
x %= mod
while n > 0:
if n % 2 == 1:
result = result * x % mod
x = x * x % mod
n //= 2
return result
print(fast_pow_recursive(2, 10)) # 1024
print(fast_pow_iterative(2, 10)) # 1024
print(fast_pow_mod(2, 64, 10**9+7)) # 2^64 mod 1e9+7
Output
1024
1024
340282366920938463463374607431768211456

Complexity

🐌 সাধারণ ঘাত বা পাওয়ার (Naive power)
x-কে নিজের সাথে n বার গুণ করুন — ২^৬৪ এর জন্য ৬৩ বার গুণের প্রয়োজন
রৈখিক বা লিনিয়ার গুণফল \(O(n)\)
⚡ ফাস্ট পাওয়ার (Fast power - সময়)
প্রতিটি ধাপে ঘাত বা এক্সপোনেন্ট অর্ধেক করুন — ২^৬৪ এর জন্য মাত্র ৬ বার স্কয়ারিং
লগারিদমিক \(O(\log n)\)
📚 স্পেস বা জায়গা (রিকার্সিভ)
n-এর প্রতিটি বিটের জন্য একটি ফ্রেম; গভীরতা = বিটের সংখ্যা
কল স্ট্যাক ডেপথ বা গভীরতা \(O(\log n)\)
💾 স্পেস (ইটারেটিভ)
শুধুমাত্র রেজাল্ট এবং বেস ভেরিয়েবল — কোনো রিকার্সন স্ট্যাক নেই
ধ্রুবক বা কন্সট্যান্ট \(O(1)\)
🔢 ম্যাট্রিক্স ফাস্ট পাওয়ার
প্রতি ধাপে k×k ম্যাট্রিক্স গুণন; ফিবোনাচির জন্য k=২ — মোট \(O(\log n)\)
ফিবোনাচি এবং লিনিয়ার রিকারেন্সের জন্য \(O(k^3 \log n)\)

ছোট কুইজ

২^৬৪ (2^64) হিসেব করতে ফাস্ট পাওয়ার ব্যবহার করলে কয়টি গুণফলের প্রয়োজন হবে?

পড়া চালিয়ে যান