#include <math.h>
// =======================================================================
// Модификация метода единственного деления - вычисление определителей.
// #define ABS(x) (((x)<0) ? -(x) : (x) )
#define ABS(x) (fabs(x))
/* =======================================================================
  Входные данные:
    - Rows - матрица 
    - Det - адрес, по которому будет записано значение определителя.
    - N - порядок матрицы.
======================================================================= */
extern void __pascal mp_mtMatDeterm(double **Rows, double *Det, int N)
{
  int i,j,k, ind;
  double lead, elem, max, *row, res;
  res=1;
  for(k=0;k<N;k++)
  {
    // Поиск ведущего элемента ведем по поддиагональной части k-го столбца.
    ind=k; max=ABS(Rows[k][k]);
    for(i=k+1;i<N;i++)
    {
      elem=ABS(Rows[i][k]);
      if(max<elem)
      {
        max=elem;
        ind=i;
      }
    }
    if(max==0.0) 
    {
      *Det=0;
      return;
    }
    // Перестановка строк.
    if(k!=ind)
    {
      row=Rows[ind];
      Rows[ind]=Rows[k];
      Rows[k]=row;
      res=-res;
    }
    // Следующий шаг прямого хода метода единственного деления.
    lead=Rows[k][k];
    res*=lead;
    for(j=k+1;j<N;j++) Rows[k][j]/=lead;
    for(i=k+1;i<N;i++)
      for(j=k+1;j<N;j++) Rows[i][j]-=Rows[i][k]*Rows[k][j];
  }
  *Det=res;
}
