Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Возведение в степень

Автор: ramzes 14.07.2007 23:54

кто-нибудь в курсе, есть ли классический вариант возведения в спепень выражения вида:
(a+ib)^n
(комплексного числа.)
Мне надо получить, например, (a+ib)^2=a^2+2iab+(ib)^2=a^2+2iab-b^2;
максимальное n=10.
Конечно, можно записать многочлен для каждой степени (и это оправдано с точки зрения производительности), но хотелось бы универсализма. А вдруг n=100, в ручную возводить - охренеешь.

Автор: Гость 8.10.2007 19:42

Цитата(ramzes @ 14.07.2007 19:54) *

кто-нибудь в курсе, есть ли классический вариант возведения в спепень выражения вида:
(a+ib)^n
(комплексного числа.)
Мне надо получить, например, (a+ib)^2=a^2+2iab+(ib)^2=a^2+2iab-b^2;
максимальное n=10.
Конечно, можно записать многочлен для каждой степени (и это оправдано с точки зрения производительности), но хотелось бы универсализма. А вдруг n=100, в ручную возводить - охренеешь.

Перевести в показательную или тригонометрическую форму, где операция возведения заменяется умножением.

Автор: Michael_Rybak 8.10.2007 21:05

Каждый член многочлена имеет вид k * i^r * a^p * b^q, где r = 0 или 1, а p и q - из отрезка [0; 10].

Объявляем тип "многочлен":

type Poly = array[0 .. 1, 0 .. 10, 0 .. 10] of integer;


Это у нас кубическая матрица, в которой элемент [r][p][q] задает коэффициент k в члене k * i^r * a^p * b^q.

Например, многочлен a^2+2iab-b^2 будет представлен так:

var x: Poly;
begin
fillchar(x, sizeof(x), 0); // заполнили всё нулями
x[0][2][0] := 1; // a^2
x[1][1][1] := 2; // 2iab
x[0][0][2] := -1; // -b^2
...


Дальше реализуем сложение и умножение:

Function Add(a, b: Poly): Poly;
Var res: Poly;
Begin
fillchar(res, sizeof(res), 0);
.. // реализуешь сам
End;

Function Mul(a, b: Poly): Poly;
Var res: Poly;
Begin
fillchar(res, sizeof(res), 0);
.. // реализуешь сам
End;


Ну и дальше сам додумаешь/доделаешь.


Автор: Lapp 9.10.2007 8:45

Цитата(ramzes @ 14.07.2007 20:54) *

возведения в спепень выражения вида:
(a+ib)^n
...
Мне надо получить, например, (a+ib)^2=a^2+2iab+(ib)^2=a^2+2iab-b^2;

Мне так и осталось непонятным, что именно ты хочешь.

1. Если а и b - это конкретные числа, то просто реализуй комплексную арифметику.
Тип:
type
tComplexNumber = record
a,b : real
end;

И операцию умножения (другие, вроде как, не нужны):
procedure MultComplex(var z: tComplexNumber; x,y: tComplexNumber);
begin
z.a := x.a*y.a - x.b*y.b;
{вторую строчку допиши сам}
end;

И тогда перемножай числа в простом цикле for хоть 10 раз, хоть 100, хоть до умопомрачения..

2. А если тебе нужен сам вид многочлена, его коэффициенты (чего я вообще-то не понимаю, ибо, например, i^2 = -1, и т.д., так что в нем можно приводить подобные, а в результате все равно получишь тот же результат, что и в способе 1), то - метод Michael_Rybak тебе в помощь..