Форум «Всё о Паскале» _ Теоретические вопросы _ Возведение в степень
Автор: 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;
И операцию умножения (другие, вроде как, не нужны):
И тогда перемножай числа в простом цикле for хоть 10 раз, хоть 100, хоть до умопомрачения..
2. А если тебе нужен сам вид многочлена, его коэффициенты (чего я вообще-то не понимаю, ибо, например, i^2 = -1, и т.д., так что в нем можно приводить подобные, а в результате все равно получишь тот же результат, что и в способе 1), то - метод Michael_Rybak тебе в помощь..