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 )