lines 8-171 of file: include/cppad/speed/det_of_minor.hpp

{xrst_begin det_of_minor}
{xrst_spell
   factorial
}

Determinant of a Minor
######################

Syntax
******

| ``# include <cppad/speed/det_of_minor.hpp>``
| *d* = ``det_of_minor`` ( *a* , *m* , *n* , *r* , *c* )

Prototype
*********
{xrst_literal
   // BEGIN_DET_OF_MINOR
   // END_DET_OF_MINOR
}

Inclusion
*********
The template function ``det_of_minor`` is defined in the ``CppAD``
namespace by including the file ``cppad/speed/det_of_minor.hpp`` .

Purpose
*******
This template function
returns the determinant of a minor of the matrix :math:`A`
using expansion by minors.
This template function
is for example and testing purposes only.
Expansion by minors is chosen as an example because it uses
a lot of floating point operations yet does not require much source code
(on the order of *m* factorial floating point operations and
about 100 lines of source code including comments).
This is not an efficient method for computing a determinant;
for example, using an LU factorization would be faster.

Minor
*****
The elements of the :math:`n \times n` minor :math:`M`
of the matrix :math:`A` are defined,
for :math:`i = 0 , \ldots , n-1` and :math:`j = 0 , \ldots , n-1`, by

.. math::

   M_{i,j} = A_{R(i), C(j)}

where the functions
:math:`R(i)` is defined by the :ref:`argument r<det_of_minor@r>` and
:math:`C(j)` is defined by the :ref:`argument c<det_of_minor@c>` .


Determinant of A
****************
If the following conditions hold, the minor is the
entire matrix :math:`A` and hence ``det_of_minor``
will return the determinant of :math:`A`:

#. :math:`n = m`.
#. for :math:`i = 0 , \ldots , m-1`, :math:`r[i] = i+1`,
   and :math:`r[m] = 0`.
#. for :math:`j = 0 , \ldots , m-1`, :math:`c[j] = j+1`,
   and :math:`c[m] = 0`.

Scalar
******
This is the type of the elements of *a* .
If *x* and *y* are *Scalar* objects,
the type *Scalar* must support the following operations:

.. csv-table::
   :widths: auto

   **Syntax**,**Description**,**Result Type**
   *Scalar* (0),constructor for *Scalar* object equal to zero,*Scalar*
   *x* = *y*,set value of *x* to current value of *y*
   *x* + *y*,value of *x* plus *y*,*Scalar*
   *x* ``-`` *y*,value of *x* minus *y*,*Scalar*
   *x* * *y*,value of *x* times value of *y*,*Scalar*

a
*
The elements of the :math:`m \times m` matrix :math:`A` are defined,
for :math:`i = 0 , \ldots , m-1` and :math:`j = 0 , \ldots , m-1`, by

.. math::

   A_{i,j} = a[ i * m + j]

m
*
This is the number of rows (and columns) in the square matrix :math:`A`.

n
*
This is the number of rows (and columns) in the square minor :math:`M`.

r
*
This defines the function :math:`R(i)`
which specifies the rows of the minor :math:`M`.
To be specific, the function :math:`R(i)`
for :math:`i = 1, \ldots , n-1` is defined by

.. math::
   :nowrap:

   \begin{eqnarray}
      R(0)   & = & r[m]
      \\
      R(i) & = & r[ R(i-1) ]
   \end{eqnarray}

All the elements of *r* have value less than or equal *m* ;
:math:`R(i) < m` and :math:`r[ R(n-1) ] = m` .
The elements of vector *r* are modified during the computation,
and restored to their original value before the return from ``det_of_minor`` .

c
*
This defines the function :math:`C(i)`
which specifies the columns of the minor :math:`M`.
To be specific, the function :math:`C(i)`
for :math:`j = 1, \ldots , n-1` is defined by

.. math::
   :nowrap:

   \begin{eqnarray}
      C(0)   & = & c[m]
      \\
      C(j) & = & c[ C(j-1) ]
   \end{eqnarray}

All the elements of *c* must have value less than or equal *m* ;
:math:`C(j) < m` and :math:`c[ C(n-1) ] = m` .
The elements of vector *c* are modified during the computation,
and restored to their original value before the return from ``det_of_minor`` .

d
*
The return value *d* is equal to the determinant of the minor :math:`M`.

{xrst_toc_hidden
   speed/example/det_of_minor.cpp
   xrst/det_of_minor_hpp.xrst
}

Example
*******
The file
:ref:`det_of_minor.cpp-name`
contains an example and test of ``det_of_minor.hpp`` .

Source Code
***********
The file
:ref:`det_of_minor.hpp-name`
contains the source for this template function.

{xrst_end det_of_minor}
