double A = sqrt (a*a + b*b);
double fi = a == 0 ? pi/2 : atan(b/a);
double ApowN = pow (A, n);
double a1 = ApowN * cos (fi * n);
double b1 = ApowN * sin (fi * n);
возведение в степень
(a+ib)^n
(комплексного числа.)
Мне надо получить, например, (a+ib)^2=a^2+2iab+(ib)^2=a^2+2iab-b^2;
максимальное n=10.
Конечно, можно записать многочлен для каждой степени (и это оправдано с точки зрения производительности), но хотелось бы универсализма. А вдруг n=100, в ручную возводить - охренеешь.
а циклы тебе на что?
Через Cos и Sin быстрее
Поищи... ну не знаю, хоть у Кнута.
Цитата: Pavia
Через Cos и Sin быстрее
Ага. Если точнее, через экспоненту. Читайте элементарный матан :)
Комплексное число a + i*b можно представить в виде A*(cos fi + i * sin fi) = A * e ^ (i * fi), где A - модуль комплексного числа, fi - аргумент. Связь с a и b в формуле a + i*b такова:
A = sqrt(a^2 + b^2), где sqrt - корень квадратный;
fi = arctg (b/a),
а также
a = A * cos fi,
b = A * sin fi.
Теперь перейдем к возведению в степень.
(a + i*b) ^ n = (A * e ^ (i*fi)) ^ n = A^n * e^(i*fi*n) = A^n * (cos (fi*n) + i * sin (fi*n))... Далее, думаю, понятно - вместо A и fi подставим вышеуказанные значения. И никаких биномов - снято ограничение на целостность числа n.
Вот такой примерно код:
Код:
Вообще-то, если речь идет о C++, все это реализовано:
Код:
#include <complex>
#include <stdio>
using namespace std;
void main ()
{
double a, b, n;
cout >> "Введите реальную часть числа, мнимую часть числа, показатель степени:";
cin >> a >> b >> n;
complex<double> x (a, b);
complex<double> result = pow (x, n);
std::cout << "Результат: " << result.real() << " + i * " << result.imag();
}
#include <stdio>
using namespace std;
void main ()
{
double a, b, n;
cout >> "Введите реальную часть числа, мнимую часть числа, показатель степени:";
cin >> a >> b >> n;
complex<double> x (a, b);
complex<double> result = pow (x, n);
std::cout << "Результат: " << result.real() << " + i * " << result.imag();
}