Текст подпрограммы и версий
adp8r_c.zip , adp8d_c.zip , adp8c_c.zip
Тексты тестовых примеров
tadp8r_c.zip , tadp8d_c.zip , tadp8c_c.zip

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

Назначение

Вычисление определителя матрицы на основе преобразований вращения.

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

Матрица А размера N на N с помощью преобразований вращения R21, R31, ..., RNN приводится к верхней треугольной матрице:

     RNN ... R21*A = L  . 

Определитель матрицы А вычисляется как произведение диагональных элементов матрицы L и записывается в виде:

     det A = D1*2D2,  где  0.0625 ≤ D1 < 1.

В.В.Воеводин, Вычислительные основы линейной алгебры, М., "Наука", 1977.

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

    int adp8r_c (real *a, real *d1, integer *d2, integer *n)

Параметры

a - вещественный двумерный массив размера n на n, в котором задается исходная матрица;
d1 - вещественная переменная, в которой запоминается мантисса определителя;
d2 - целая переменная, в которой запоминается двоичный порядок определителя;
n - заданный порядок исходной матрицы (тип: целый).

Версии

adp8d_c - вычисление определителя матрицы, заданной с удвоенной точностью, на основе преобразований вращения.
adp8c_c - вычисление определителя комплексной матрицы на основе преобразования вращения.

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

afp8r_c - приведение прямоугольной матрицы к верхнему треугольному виду преобразованиями вращения.
afp8d_c - приведение прямоугольной матрицы, заданной с удвоенной точностью, к верхнему треугольному виду преобразованиями вращения.
afp8c_c - приведение комплексной прямоугольной матрицы к верхнему треугольному виду преобразованиями вращения.

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

  1. 

В подпрограмме adp8d_c массив a и переменная d1 имеют тип double.

  2.  В подпрограмме adp8c_c массив a и переменная d1 имеют тип complex.

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

int main(void)
{
    /* Initialized data */
    static float a[9]  /* was [3][3] */ = { .6f,.8f,0.f,.4f,2.2f,0.f,2.6f,
                                           6.8f,.6f };

    /* Local variables */
    extern int adp8r_c(float *, float *, int *, int *);
    static int n;
    static float d1;
    static int d2;

    n = 3;
    adp8r_c(a, &d1, &d2, &n);

    printf("\n  %16.7e \n",d1);
    printf("\n  %5i \n",d2);
    return 0;
} /* main */


Результат:

          d1 = 0.6,   d2 = 0,
    т.е.  det a = 0.6*20 = 0.6