/* xdet1.h freeware [[Email Removed]] */
/* --------------------------------- FUNCTION ------------------------------ */
/* Do : */
/* */
/* Call : */
/* Debug : */
/* -------------------------------------------------------------------------- */
fraction detFbasic(
pmatrix mA)
{
int row1;
int row2;
int n;
double coefnulldoNothing = 1;
fraction deter;
fraction tf;
double pbAT [MXR][MXC*TWOCOL];matrix mAT ={MXR,MXC*TWOCOL,&pbAT [0][0]};
n = mA->rows;
mAT.rows=n ;
mAT.cols=n*TWOCOL;
deter.numer = 1;
deter.denom = 1;
copymF(mA,&mAT);
/*-------------------------------------------------------------------- gauss */
for (row1 = 0 ; row1 < mAT.rows - 1 ; row1++)
{
deter.numer *= pivotntzeroF(&mAT,row1,row1); /* Pivot row */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
for (row2 = row1+1 ; row2 < mAT.rows ; row2++)
{ /* Before the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
coefnulldoNothing = *(mAT.pblock+row2 *mAT.cols+row1*TWOCOL);
if(!(coefnulldoNothing==0))
{
pivotworkF(&mAT,row1,row2); /* After the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter = miniF(deter);
}
}
}
/*------------------------------------------------------------------ Diagonal */
for (row1 = 0 ; row1 < mAT.rows ; row1++)
{
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL +1);
deter = miniF(deter);
}
return(deter);
}
/* --------------------------------- FUNCTION ------------------------------ */
/* Do : */
/* */
/* Call : */
/* Debug : */
/* -------------------------------------------------------------------------- */
fraction detFbasicT(
pmatrix mA)
{
int row1;
int row2;
int n;
double coefnulldoNothing = 1;
fraction deter;
fraction tf;
double pbAT [MXR][MXC*TWOCOL];matrix mAT ={MXR,MXC*TWOCOL,&pbAT [0][0]};
n = mA->rows;
mAT.rows=n ;
mAT.cols=n*TWOCOL;
deter.numer = 1;
deter.denom = 1;
transposemF(mA,&mAT);
/* copymF(mA,&mAT); */
/*-------------------------------------------------------------------- gauss */
for (row1 = 0 ; row1 < mAT.rows - 1 ; row1++)
{
deter.numer *= pivotntzeroF(&mAT,row1,row1); /* Pivot row */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
for (row2 = row1+1 ; row2 < mAT.rows ; row2++)
{ /* Before the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
coefnulldoNothing = *(mAT.pblock+row2 *mAT.cols+row1*TWOCOL);
if(!(coefnulldoNothing==0))
{
pivotworkF(&mAT,row1,row2); /* After the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter = miniF(deter);
}
}
}
/*------------------------------------------------------------------ Diagonal */
for (row1 = 0 ; row1 < mAT.rows ; row1++)
{
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter = miniF(deter);
}
return(deter);
}
/* --------------------------------- FUNCTION ------------------------------ */
/* Do : */
/* */
/* Call : */
/* Debug : */
/* -------------------------------------------------------------------------- */
fraction detFnumerMini(
pmatrix mA)
{
int row1;
int row2;
int n;
double coefnulldoNothing = 1;
fraction deter;
fraction tf;
double pbAT [MXR][MXC*TWOCOL];matrix mAT ={MXR,MXC*TWOCOL,&pbAT [0][0]};
n = mA->rows;
mAT.rows=n ;
mAT.cols=n*TWOCOL;
deter.numer = 1;
deter.denom = 1;
copymF(mA,&mAT);
/*-------------------------------------------------------------------- gauss */
for (row1 = 0 ; row1 < mAT.rows - 1 ; row1++)
{
deter.numer *= pivotntzeroF(&mAT,row1,row1); /* Pivot row */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
deter.numer *= pivotbestFnumer(&mAT,row1,row1);
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
for (row2 = row1+1 ; row2 < mAT.rows ; row2++)
{ /* Before the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
coefnulldoNothing = *(mAT.pblock+row2 *mAT.cols+row1*TWOCOL);
if(!(coefnulldoNothing==0))
{
pivotworkF(&mAT,row1,row2); /* After the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row1); /* a) fraction mini */
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter = miniF(deter);
}
}
}
/*------------------------------------------------------------------ Diagonal */
for (row1 = 0 ; row1 < mAT.rows ; row1++)
{
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter = miniF(deter);
}
return(deter);
}
/* --------------------------------- FUNCTION ------------------------------ */
/* Do : */
/* */
/* Call : */
/* Debug : */
/* -------------------------------------------------------------------------- */
fraction detFnumerMiniT(
pmatrix mA)
{
int row1;
int row2;
int n;
double coefnulldoNothing = 1;
fraction deter;
fraction tf;
double pbAT [MXR][MXC*TWOCOL];matrix mAT ={MXR,MXC*TWOCOL,&pbAT [0][0]};
n = mA->rows;
mAT.rows=n ;
mAT.cols=n*TWOCOL;
deter.numer = 1;
deter.denom = 1;
transposemF(mA,&mAT);
/*-------------------------------------------------------------------- gauss */
for (row1 = 0 ; row1 < mAT.rows - 1 ; row1++)
{
deter.numer *= pivotntzeroF(&mAT,row1,row1); /* Pivot row */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
deter.numer *= pivotbestFnumer(&mAT,row1,row1);
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
for (row2 = row1+1 ; row2 < mAT.rows ; row2++)
{ /* Before the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
coefnulldoNothing = *(mAT.pblock+row2 *mAT.cols+row1*TWOCOL);
if(!(coefnulldoNothing==0))
{
pivotworkF(&mAT,row1,row2); /* After the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row1); /* a) fraction mini */
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter = miniF(deter);
}
}
}
/*------------------------------------------------------------------ Diagonal */
for (row1 = 0 ; row1 < mAT.rows ; row1++)
{
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter = miniF(deter);
}
return(deter);
}
/* --------------------------------- FUNCTION ------------------------------ */
/* Do : */
/* */
/* Call : */
/* Debug : */
/* -------------------------------------------------------------------------- */
fraction detFdenomMini(
pmatrix mA)
{
int row1;
int row2;
int n;
double coefnulldoNothing = 1;
fraction deter;
fraction tf;
double pbAT [MXR][MXC*TWOCOL];matrix mAT ={MXR,MXC*TWOCOL,&pbAT [0][0]};
n = mA->rows;
mAT.rows=n ;
mAT.cols=n*TWOCOL;
deter.numer = 1;
deter.denom = 1;
copymF(mA,&mAT);
/*-------------------------------------------------------------------- gauss */
for (row1 = 0 ; row1 < mAT.rows - 1 ; row1++)
{
deter.numer *= pivotntzeroF(&mAT,row1,row1); /* Pivot row */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
deter.numer *= pivotbestFdenom(&mAT,row1,row1);
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
for (row2 = row1+1 ; row2 < mAT.rows ; row2++)
{ /* Before the work */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
coefnulldoNothing = *(mAT.pblock+row2 *mAT.cols+row1*TWOCOL);
if(!(coefnulldoNothing==0))
{
pivotworkF(&mAT,row1,row2); /* After the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row1); /* a) fraction mini */
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter = miniF(deter);
}
}
}
/*------------------------------------------------------------------ Diagonal */
for (row1 = 0 ; row1 < mAT.rows ; row1++)
{
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter = miniF(deter);
}
return(deter);
}
/* ------------------------------ FUNCTION ---------------------------- det() */
/* */
/* -------------------------------------------------------------------------- */
fraction detFdenomMiniT(
pmatrix mA)
{
int row1;
int row2;
int n;
double coefnulldoNothing = 1;
fraction deter;
fraction tf;
double pbAT [MXR][MXC*TWOCOL];matrix mAT ={MXR,MXC*TWOCOL,&pbAT [0][0]};
n = mA->rows;
mAT.rows=n ;
mAT.cols=n*TWOCOL;
deter.numer = 1;
deter.denom = 1;
transposemF(mA,&mAT);
/*-------------------------------------------------------------------- gauss */
for (row1 = 0 ; row1 < mAT.rows - 1 ; row1++)
{
deter.numer *= pivotntzeroF(&mAT,row1,row1); /* Pivot row */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
deter.numer *= pivotbestFdenom(&mAT,row1,row1);
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row1 ); /* a) fraction mini */
for (row2 = row1+1 ; row2 < mAT.rows ; row2++)
{ /* Before the work */
deter = rowminiF(&mAT,row1,deter);
frowminiF(&mAT,row2); /* a) fraction mini */
coefnulldoNothing = *(mAT.pblock+row2 *mAT.cols+row1*TWOCOL);
if(!(coefnulldoNothing==0))
{
pivotworkF(&mAT,row1,row2); /* After the work */
deter = rowminiF(&mAT,row2,deter);
frowminiF(&mAT,row1); /* a) fraction mini */
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter = miniF(deter);
}
}
}
/*------------------------------------------------------------------ Diagonal */
for (row1 = 0 ; row1 < mAT.rows ; row1++)
{
deter.numer *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL );
deter.denom *= *(mAT.pblock+row1 *mAT.cols+row1*TWOCOL+1);
deter = miniF(deter);
}
return(deter);
}