Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình lũy thừa của một số phức trong O (log n) trong C ++

Cho số phức có dạng x + yi và số nguyên n; nhiệm vụ là tính toán và in ra giá trị của số phức nếu chúng ta lũy thừa số phức với n.

Số phức là gì?

Một số phức là một số có thể được viết dưới dạng a + bi, trong đó a và b là các số thực và i là nghiệm của phương trình hoặc chúng ta có thể nói là một số ảo. Vì vậy, nói một cách đơn giản, chúng ta có thể nói rằng số phức là sự kết hợp của Số thực và số ảo.

Nâng cao sức mạnh của một số phức

Để nâng lũy ​​thừa của một số phức, chúng ta sử dụng công thức dưới đây -

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

Giống như chúng ta có một số phức

2 + 3i và tăng sức mạnh của nó lên 5 thì chúng ta sẽ nhận được -

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

Sử dụng công thức trên, chúng ta sẽ nhận được câu trả lời -

Ví dụ

Input: x[0] = 10, x[1] = 11 /*Where x[0] is the first real number and 11 is the
second real number*/
n = 4
Output: -47959 + i(9240)
Input: x[0] = 2, x[1] =3
n = 5
Output: 122 + i(597)

Phương pháp tiếp cận mà chúng tôi đang sử dụng để giải quyết vấn đề trên -

Vì vậy, bài toán có thể được giải quyết bằng phương pháp lặp lại một cách dễ dàng nhưng độ phức tạp sẽ là O (n), nhưng chúng ta phải giải bài toán trong thời gian O (log n). Vì điều đó, chúng tôi có thể -

  • Đầu tiên, hãy lấy dữ liệu đầu vào dưới dạng một mảng.
  • Trong hàm Power the x ^ n
    • Kiểm tra xem n có là 1 không, sau đó trả về x
    • Gọi đệ quy lũy thừa x và n / 2 và lưu trữ kết quả của nó trong một sq biến.
    • Kiểm tra xem chia n cho 2 có dư 0 hay không; nếu đúng thì trả về kết quả thu được từ cmul (sq, sq)
    • Kiểm tra xem chia n cho 2 có dư 0 không; nếu đúng thì trả về kết quả thu được từ cmul (x, cmul (sq, sq)).
  • Trong hàm cmul ().
    • Kiểm tra nếu x1 =a + bi và x2 =x + di, thì x1 * x2 =(a * c – b * d) + (b * c + d * a) i.
  • Trả lại và in kết quả thu được.

Thuật toán

Start
Step 1-> declare function to calculate the product of two complex numbers
   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])
   Se ans[1] = (part1[1] * part2[0]) + part1[0] * part2[1]
   return ans
Step 2-> declare function to return the complex number raised to the power n
   long long* power(long long* x, long long n)
   Declare long long* temp = new long long[2]
   IF n = 0
      Set temp[0] = 0
      Set temp[1] = 0
      return temp
   End
   IF n = 1
      return x
   End
   Declare long long* part = power(x, n / 2)
   IF n % 2 = 0
      return complex(part, part)
   End
   return complex(x, complex(part, part))
Step 3 -> In main()
   Declare int n
   Declare and set long long* x = new long long[2]
   Set x[0] = 10
   Set x[1] = -11
   Set n = 4
   Call long long* a = power(x, n)
Stop

Ví dụ

#include <bits/stdc++.h>
using namespace std;
//calculate product of two complex numbers
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;
}
// Function to return the complex number raised to the power n
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;
}

Đầu ra

power of complex number in O(Log n) : -47959 + i ( 9240 )