Текст подпрограммы и версий
pa09r_c.zip  pa09d_c.zip 
Тексты тестовых примеров
tpa09r_c.zip  tpa09d_c.zip 

Подпрограмма:  pa09r_c

Назначение

Вычисление корней N - й степени из комплексного числа.

Математическое описание

Подпрограмма pa09r_c вычисляет корни N - й степени (N ≥ 2) из комплексного числа y = XR + i XI по формуле

           (Y)1/N = (R)1/N (cos Ak + i sin Ak) ,

   где  R = (XR2 + XI2)1/2 ,
         Ak = θ / N + 2πk / N,  k = 0, 1, ..., N-1 ,
           θ = arctn(XI / XR) 

Для экономии машинного времени, которая имеет место для N ≥ 3, значения cosAk и sinAk вычисляются при помощи рекуррентного процесса, основанного на формулах сложения углов:

          cos(α + β) = cosα cosβ - sinα sinβ        
           sin(α + β) = sinα cosβ + cosα sinβ 

Использование

    int pa09r_c(real *xr, real *xi, integer *n, real *yr,
                            real *yi)

Параметры

    xr, xi - действительная и мнимая части заданного комплексного числа (тип: вещественный);
n - заданная степень корня (тип: целый);
    yr, yi - вещественные одномерные массивы длины n, содержащие на выходе вещественные и мнимые части вычисленных корней соответственно, т.е. вещественная часть j - го корня содержится в yr (j), а его мнимая часть  - в yi (j), j = 1, 2, ..., n .

Версии

pa09d_c - вычисление корней N - й степени из комплексного числа в режиме удвоенной точности; при этом параметры xr, xi, yr и yi должны иметь тип double.

Вызываемые подпрограммы

pa02r_c - вычисление модуля комплексного числа; используется в подпрограмме pa09r_c.
pa02d_c - вычисление модуля комплексного числа в режиме удвоенной точности; используется в подпрограмме pa09d_c.

Замечания по использованию: нет

Пример использования

int main(void)
{
    /* Local variables */
    extern int pa09r_c(float *, float *, int *, float *, float *);
    static float xi, yi[3], xr, yr[3];

    xr = 1.f;
    xi = 0.f;
    pa09r_c(&xr, &xi, &c__3, yr, yi);

    printf("\n %16.7e %16.7e %16.7e \n", yr[0], yr[1], yr[2]);
    printf("\n %16.7e %16.7e %16.7e \n", yi[0], yi[1], yi[2]);
    return 0;
} /* main */


Результаты:

       yr = ( 1.0,  -0.5,  -0.5 )
       xi = ( 0.0,  0.866025,  -0.866026 )