কম্পিউটার টিউটোরিয়াল

C++-এ O(log n)-এ কমপ্লেক্স নম্বরের ঘাতांक

x+yi রূপে একটি কমপ্লেক্স নম্বর এবং একটি ইন্টিজার n দেওয়া আছে; কাজ হল কমপ্লেক্স নম্বরটি n ঘাত করলে এর মান কত হবে তা ক্যালকুলেট ও প্রিন্ট করা।

কমপ্লেক্স নম্বর কী?

কমপ্লেক্স নম্বর হল এমন একটি নম্বর যা a + bi রূপে লেখা যায়, যেখানে a এবং b হল রিয়েল নম্বর এবং i হল সমীকরণের সমাধান বা কাল্পনিক নম্বর। সরল ভাষায় কমপ্লেক্স নম্বর হল রিয়েল নম্বর এবং কাল্পনিক নম্বরের সংমিশ্রণ।

কমপ্লেক্স নম্বরের ঘাতांक বেড়ানো

কমপ্লেক্স নম্বরের ঘাতांक বেড়ানোর জন্য নিচের সূত্রটি ব্যবহার করা হয়:

(a+bi)(c+di) = (ac - bd) + (ad + bc)i

যেমন একটি কমপ্লেক্স নম্বর আছে 2+3i এবং এর ঘাত ৫ করলে পাবো:

(2+3i)^5 = (2+3i)(2+3i)(2+3i)(2+3i)(2+3i)

উপরের সূত্র ব্যবহার করে উত্তর পাওয়া যাবে:

উদাহরণ

Input: x[0] = 10, x[1] = 11 
n = 4 
Output: -47959 + i(9240) 
Input: x[0] = 2, x[1] = 3 
n = 5 
Output: 122 + i(597)

সমাধানের পদ্ধতি:

সমস্যাটি ইটারেটিভ মেথড দিয়ে সহজে সমাধান করা যায় কিন্তু কমপ্লেক্সিটি O(n) হবে, কিন্তু আমাদের O(log n) টাইমে সমাধান করতে হবে। এর জন্য আমরা:

  • প্রথমে ইনপুট অ্যারে আকারে নিব।
  • Power ফাংশনে x^n ক্যালকুলেট করব:
    • যদি n = 1 হয়, তবে x রিটার্ন করব।
    • রিকার্সিভভাবে power কল করব x এবং n/2 দিয়ে এবং ফলাফল sq-তে রাখব।
    • যদি n কে ২ দিয়ে ভাগ করলে ভাগশেষ ০ হয়, তবে cmul(sq, sq) রিটার্ন করব।
    • যদি ভাগশেষ ০ না হয়, তবে cmul(x, cmul(sq, sq)) রিটার্ন করব।
  • cmul() ফাংশনে:
    • যদি x1 = a+bi এবং x2 = c+di হয়, তবে x1 * x2 = (a*c - b*d) + (b*c + d*a)i।
  • ফলাফল রিটার্ন ও প্রিন্ট করব।

অ্যালগরিদম

Start 
Step 1-> দুটি কমপ্লেক্স নম্বরের গুণফল বের করার ফাংশন ডিক্লেয়ার 
    long long* complex(long long* part1, long long* part2) 
    Declare long long* ans = new long long[2] 
    Set ans[0] = (part1[0] * part2[0]) - (part1[1] * part2[1]) 
    Set ans[1] = (part1[1] * part2[0]) + part1[0] * part2[1] 
    Return ans 
Step 2-> কমপ্লেক্স নম্বর n ঘাত করার ফাংশন ডিক্লেয়ার 
    long long* power(long long* x, long long n) 
    Declare long long* temp = new long long[2] 
    IF n == 0: temp[0]=0, temp[1]=0, return temp 
    IF n == 1: return x 
    Declare long long* part = power(x, n/2) 
    IF n%2 == 0: return complex(part, part) 
    Return complex(x, complex(part, part)) 
Step 3 -> main() 
    Declare int n 
    Declare long long* x = new long long[2] 
    Set x[0] = 10, x[1] = -11, n = 4 
    Call long long* a = power(x, n) 
Stop

উদাহরণ

#include <bits/stdc++.h> 
using namespace std; 
long long* complex(long long* part1, long long* part2) { 
    long long* ans = new long long[2]; 
    ans[0] = (part1[0] * part2[0]) - (part1[1] * part2[1]); 
    ans[1] = (part1[1] * part2[0]) + part1[0] * part2[1]; 
    return ans; 
} 
long long* power(long long* x, long long n) { 
    long long* temp = new long long[2]; 
    if (n == 0) { temp[0] = 0; temp[1] = 0; return temp; } 
    if (n == 1) return x; 
    long long* part = power(x, n / 2); 
    if (n % 2 == 0) return complex(part, part); 
    return complex(x, complex(part, part)); 
} 
int main() { 
    int n; 
    long long* x = new long long[2]; 
    x[0] = 10; x[1] = -11; n = 4; 
    long long* a = power(x, n); 
    cout << a[0] << " + i ( " << a[1] << " )" << endl; 
    return 0; 
}

আউটপুট

power of complex number in O(Log n) : -47959 + i ( 9240 )
  1. C++ প্রোগ্রাম: হেক্সাডেসিমেল থেকে ডেসিমেল কনভার্সন

  2. C++-এ জটিল সংখ্যার জন্য acos() ফাংশন

  3. জটিল সংখ্যা গুণফল বের করার C++ প্রোগ্রাম

  4. সংখ্যার ঘাত (Power) বের করার C++ প্রোগ্রাম (রিকার্সিভ ও নন-রিকার্সিভ)