1.
§ 1. }kelemŠ`pm`“ `kceap`
В главе представлены алгоритмы элементарной алгеб-
ры, которые обычно не включаются в библиотеки ма-
тематического обеспечения ЭВМ, хотя довольно часто
оказываются необходимыми при решении соответствую-
щих задач.
1.1. КОМПЛЕКСНАЯ АРИФМЕТИКА.
ИЗВЛЕЧЕНИЕ КОРНЕЙ
n -й СТЕПЕНИ ИЗ
КОМПЛЕКСНОГО ЧИСЛА
При извлечении корней n-й степени из комплексного чис-
ла z = x + iy = re
i
ϕ
(i
2
= - 1), где x = Re z - действительная
часть; y = Im z - мнимая часть; y = |z| =
=+xy
22
- мо-
дуль; ϕ
=
arg z - главное значение аргумента комплексного
числа, используется формула Муавра:
( )
zr
k
n
i
rknik
kn
nn
n
=⋅
+
⋅
⎛
⎝
⎜
⎞
⎠
⎟
=
=⋅ + +⋅ +
=−
exp
cos( ) sin( ) ,
, , , ...,
ϕπ
ϕπ ϕπ
2
22
012 1 .
n
θ
При этом алгоритм предполагает вычисление n корней
уравнения z
n
= x + iy. Область применения его очевидна -
это задачи, связанные с комплексной арифметикой.
Формальные параметры процедуры. Входные: x, y
(тип real) - действительная и мнимая части комплексного
числа; n (тип integer) - показатель степени. Выходные: од-
номерные массивы Re[1:n], Im[1:n], в которых запомина-
ются соответственно действительные и мнимые части
комплексных корней.
Алгоритм реализован в следующей процедуре:
P
ROCEDURE CROOT (X,Y: REAL; N: INTEGER;
VAR RE, IM : MAS1);
CONST PI = 3.14159265;
VAR A, M, R, T : REAL; I : INTEGER;
BEGIN M:=1/N;
R := EXP((M/2) *LN (X*X+Y*Y));
IF X=0 THEN T := SIGN(Y)*PI/2;
IF X>0 THEN T := ARCTAN(Y/X) ELSE
T := ARCTAN(Y/X)+PI;
T := M*T; A:=2*PI*M;
FOR I:=1 TO N DO
BEGIN
RE[I]:=S*COS(T);
IM[I]:=S*SIN(T);
T:=T+A;
END;
END { *** CROOT *** };
Точность вычислений по данной подпрограмме опре-
деляется точностью представления действительных чисел
в используемой ЭВМ и точностью вычисления функций
sin и cos в соответствующих библиотеках подпрограмм.
Подпрограмма тестировалась на примерах извлечения
корней 3-й и 5-й степени из комплексных чисел z
1
= 8 + i6
и z
2
= - 8 + i6 (выбор чисел определялся требованием срав-
нимости результатов с вычислениями по аналогичной про-
цедуре, описанной Агеевым и др. (1976) ). Результаты рас-
четов представлены в табл. 1.1.
Данные результаты совпадают с результатами работ
Агеева и ручного счета с точностью 10
- 6
.
Замечание. В работе Нестора [Nestor, 1961] в целях
экономии машинного времени при n > 3 предлагается
вместо обращения к стандартным функциям sin и cos в
цикле использовать рекуррентные формулы (1.1):
sin( ) sin( ) cos cos( ) sin ;
cos( ) cos( ) cos sin( ) sin ,
nn n
nn n
+= ⋅ + ⋅
+= ⋅ − ⋅
⎫
⎬
⎭
1
1
θθθθθ
θθθθ
(1.1)
что, однако, требует некоторых дополнительных затрат
памяти ЭВМ [Агеев и др., 1976]. По оценкам
специалистов [Nestor, 1961] такая процедура оказывается
весьма эффективной в задачах, связанных с разложением в
ряд Фурье, как это было предложено в работе [Goerzel,
1961].
Таблица 1.1
Формула расчета
x
n
= 8 + i 6 x
n
= — 8 + i 6
n = 3
x = 2.1050612 + i 0.4585914
x = — 1.4496824 + i 1.5937408
x = — 0.6553788 — i 2.0523322
x = 1.4496824 + i 1.5937408
x = — 2.1050612 + i 0.4585914
x = 0.6553788 — i 2.0523322
n = 5
x = 1.5717854 + i 0.2034135
x = 0.2922507 + i 1.5577150
x = — 1.3911645 + i 0.7593073
x = — 1.1520377 — i 1.0884372
x = 0.6791661 — i 1.4319985
x = 1.3911646 + i 0.7593073
x = — 0.2922507 + i 1.5577150
x = — 1.5717854 + i 0.2034135
x = — 0.6791661 — i 1.4319985
x = 1.1520377 — i 1.0884372
9