Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > c5653a35bb94fee65ffe21230992c863 > files > 616

linbox-doc-1.2.1-1.fc15.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>linbox: solutions</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<script type="text/javascript">
function hasClass(ele,cls) {
  return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function addClass(ele,cls) {
  if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}

function removeClass(ele,cls) {
  if (hasClass(ele,cls)) {
    var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
    ele.className=ele.className.replace(reg,' ');
  }
}

function toggleVisibility(linkObj) {
 var base = linkObj.getAttribute('id');
 var summary = document.getElementById(base + '-summary');
 var content = document.getElementById(base + '-content');
 var trigger = document.getElementById(base + '-trigger');
 if ( hasClass(linkObj,'closed') ) {
   summary.style.display = 'none';
   content.style.display = 'block';
   trigger.src = 'open.png';
   removeClass(linkObj,'closed');
   addClass(linkObj,'opened');
 } else if ( hasClass(linkObj,'opened') ) {
   summary.style.display = 'block';
   content.style.display = 'none';
   trigger.src = 'closed.png';
   removeClass(linkObj,'opened');
   addClass(linkObj,'closed');
 }
 return false;
}
</script>
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">linbox</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
      <li><a href="dirs.html"><span>Directories</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="summary">
<a href="#groups">Modules</a> &#124;
<a href="#files">Files</a> &#124;
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle">
<div class="title">solutions</div>  </div>
</div>
<div class="contents">

<p>These are problem oriented drivers providing simple interfaces to the linear algebra algorithms.  
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="groups"></a>
Modules</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__charpoly.html">Characteristic polynomial</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__determin.html">Determinant</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__minpoly.html">Minimal polynomial</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__nullsp.html">Nullspace</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__rk.html">Rank</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__reducedforms.html">Recuded forms</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__systemsolving.html">System solving</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC YET. </p>
<br/></td></tr>
</p>
<tr><td colspan="2"><h2><a name="files"></a>
Files</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="det_8h.html">det.h</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC. </p>
<br/></td></tr>
</p>
<tr><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="methods_8h.html">methods.h</a></td></tr>

<p><tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>NO DOC. </p>
<br/></td></tr>
</p>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Blackbox , class MyMethod &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">Blackbox::Field::Element &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#gaf0ab7d8c85bc20cfd21f6f3a0b3d6fd1">lif_cra_det</a> (typename Blackbox::Field::Element &amp;d, const Blackbox &amp;A, const RingCategories::IntegerTag &amp;tag, const MyMethod &amp;M)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the determinant of A over the integers.  <a href="#gaf0ab7d8c85bc20cfd21f6f3a0b3d6fd1"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Blackbox , class DetMethod , class DomainCategory &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">Blackbox::Field::Element &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#ga9cfcc847d3a7deac68ad6d98e0cd384f">det</a> (typename Blackbox::Field::Element &amp;d, const Blackbox &amp;A, const DomainCategory &amp;tag, const DetMethod &amp;Meth)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the determinant of A.  <a href="#ga9cfcc847d3a7deac68ad6d98e0cd384f"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Field &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">Field::Element &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#ga0f81b856e81c10fb0fd51feac04d93ea">detin</a> (typename Field::Element &amp;d, BlasBlackbox&lt; <a class="el" href="class_lin_box_1_1_modular_3_01uint32__t_01_4.html">Field</a> &gt; &amp;A)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Rank of Blackbox <code>A</code>.  <a href="#ga0f81b856e81c10fb0fd51feac04d93ea"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Blackbox , class Method , class DomainCategory &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">unsigned long &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#gaae3c1f7fd3319410ac4fc3e4e3afdd01">rank</a> (unsigned long &amp;r, const Blackbox &amp;A, const DomainCategory &amp;tag, const Method &amp;M)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the rank of a linear transform A over a field by selected method.  <a href="#gaae3c1f7fd3319410ac4fc3e4e3afdd01"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Blackbox &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">unsigned long &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#gafb22cbd97ffc18527d2b3175367b9430">rank</a> (unsigned long &amp;r, const Blackbox &amp;A)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the rank of a linear transform A over a field.  <a href="#gafb22cbd97ffc18527d2b3175367b9430"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Blackbox , class Method &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">unsigned long &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#ga4a75466958f4a212f09223d0c3eb1edc">rank</a> (unsigned long &amp;r, const Blackbox &amp;A, const Method &amp;M)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the rank of a linear transform A over a field.  <a href="#ga4a75466958f4a212f09223d0c3eb1edc"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Output , class Blackbox , class MyMethod &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">Output &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#gadebecfaca29a9dbb684a65b9e1e4bc72">smithForm</a> (Output &amp;S, const Blackbox &amp;A, const MyMethod &amp;M)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the Smith form of A.  <a href="#gadebecfaca29a9dbb684a65b9e1e4bc72"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Vector , class Blackbox , class SolveMethod &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">Vector &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#gaeb41d28dc7bebfd5a24b7642631e9817">solve</a> (Vector &amp;x, const Blackbox &amp;A, const Vector &amp;b, const SolveMethod &amp;M)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Solve Ax = b, for x.  <a href="#gaeb41d28dc7bebfd5a24b7642631e9817"></a><br/></td></tr>
<tr><td class="memTemplParams" colspan="2">template&lt;class Blackbox , class MyMethod &gt; </td></tr>
<tr><td class="memTemplItemLeft" align="right" valign="top">Blackbox::Field::Element &amp;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="group__solutions.html#ga4c6000cb4741bed819d3c384bc254954">valence</a> (typename Blackbox::Field::Element &amp;v, const Blackbox &amp;A, const MyMethod &amp;M)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute the valence of A.  <a href="#ga4c6000cb4741bed819d3c384bc254954"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<p>These are problem oriented drivers providing simple interfaces to the linear algebra algorithms. </p>
<p>The arguments to each are discussed in detail in the documentation of each function. The optional method parameter is discussed in general terms just below the list. </p>
<ul>
<li>
<code>rank(r, A[, method])</code> r gets rank of A </li>
<li>
<code>determinant(d, A[, method])</code> d gets determinant of A </li>
<li>
<code>solve(x, A, b[, method[, status]])</code> get x such that Ax = b, random solution if sigular and consistent, x = 0 if inconsistent (also inconsistency is indicated in the status). The method parameter may include specifications that can make the computation faster. These include symmetry, nonsingularity, and that an arbitrary solution is acceptable rather than a random sample. </li>
<li>
<code>minpoly(m, A[, method, status])</code> m gets minimal polynomial of A </li>
<li>
<code>charpoly(c, A[, method, status])</code> c gets characteristic polynomial of A </li>
<li>
<p class="startli"><code>smithForm(S, A[, method])</code> S gets Smith Normal Form of A. Smith form is unitarily equivalent to A and is diag(s<sub>1</sub> .. s<sub>n</sub>) such that s<sub>i</sub> | s<sub>i+1</sub>. </p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000036">Todo:</a></b></dt><dd>its multipliers? its output form variants? </dd></dl>
<p class="endli"></p>
</li>
<li>
<p class="startli"><code>frobeniusForm(F, A, method, status)</code> F gets Frobenius (Rational) normal form of A. Frobenius form is similar to A and is a direct sum of companion matrices C<sub>f<sub>i</sub></sub> such that, f<sub>i</sub> divides f<sub>i+1</sub>.</p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000037">Todo:</a></b></dt><dd>primary form? Relative primary form of A? Primary form is similar to A and finest which is a direct sum of companion matrices C<sub>f<sub>i</sub></sub> such that, for all i, j, gcd(f<sub>i</sub>, f<sub>j</sub>) = 1 or f<sub>i</sub> or f<sub>j</sub>. Relative primary form is coarsest such decomposition.</dd></dl>
<p class="endli"></p>
</li>
<li>
<code>signature(s, A, method)</code> </li>
<li>
<code>bool isPositiveDefinite(A, method_symm)</code> </li>
<li>
<code>bool isPositiveSemidefinite(A, method_symm)</code> </li>
</ul>
<p>The algorithms are actively under development, and there is an algorithm choice to be made for each function. The choice is determined by an optional argument to the function which is a method object. The class of the method object determines the approach used and data in the object may help determine algorithm variants at run time. This makes it easy to try out and compare several approaches for a given matrix.</p>
<p>The first method classes to consider are the <a class="el" href="struct_lin_box_1_1_method.html#a377698356a430aa5b72f8588d2fa8cdb">Blackbox</a>, <a class="el" href="struct_lin_box_1_1_method.html#a2f13daea324591d9cd6539b4bbc13851">Elimination</a>, and <a class="el" href="struct_lin_box_1_1_method.html#add971f81e2dc236b0141a022827fa9c5">Hybrid</a> classes. <code>Blackbox</code> and <code>Elimination</code> methods may be used for virtually every solution function.</p>
<ul>
<li>The <a class="el" href="struct_lin_box_1_1_method.html#a2f13daea324591d9cd6539b4bbc13851">Elimination</a> class provides access to algorithms based on dense or sparse elimination and the algorithms take advantage of the numeric BLAS routines when the underlying field or ring is the integers or a prime field of appropriate cardinality.</li>
</ul>
<ul>
<li>The <a class="el" href="struct_lin_box_1_1_method.html#a377698356a430aa5b72f8588d2fa8cdb">Blackbox</a> class provides functions which are space efficient and are particularly effective for very large and very sparse systems. They are also fast and useful for structured systems such as Toeplitz, Hankel, Vandermonde, etc. Currently in LinBox the superfast methods for structured matrices are not implemented.</li>
</ul>
<ul>
<li>The <a class="el" href="struct_lin_box_1_1_method.html#add971f81e2dc236b0141a022827fa9c5">Hybrid</a> class chooses <code>Blackbox</code>, <code>Elimination</code>, or a mix of them based on matrix properties checked at runtime. It is the default method. Thus for each problem (e.g. rank) the function call without a method, <code>rank(r, A)</code>, is equivalent to a call using the default Hybrid object, <code>rank(r, A, Method::Hybrid())</code>.</li>
</ul>
<p>Hybrid algorithms are under development and not in final form. The method used under the Hybrid designation may be a sophisticated hybrid algorithm, a very basic one, or simply our guess of the most widely useful of the available algorithms. The basic hybrid method is to use the elimination approach if the matrix is small or in a dense representation, and a blackbox method otherwise. A dense representation is one which inherits from <code>DenseMatrix</code> or <code>BlasMatrix</code>. Small means both row and column dimensions are less than 10<sup>3</sup>. The threshold values can be changed in the hybrid method object. For instance </p>
<div class="fragment"><pre class="fragment">  Hybrid h;
  h.setSmallThreshold(5000);
  <a class="code" href="group__solutions.html#gaae3c1f7fd3319410ac4fc3e4e3afdd01" title="Compute the rank of a linear transform A over a field by selected method.">rank</a>(r, A, h) ;
</pre></div><p>Additional method classes exist to focus in greater detail on the method. For instance, in the <code>Blackbox</code> situation there are the <a class="el" href="struct_lin_box_1_1_method.html#a95658bcef98e7d0868b2e35d7ce03392">Wiedemann</a>, <a class="el" href="">BlockWiedemann</a>, <a class="el" href="struct_lin_box_1_1_method.html#afd5f21592e0f3fae8a6197fb5d041e27">Lanczos</a>, and <a class="el" href="struct_lin_box_1_1_method.html#ac24179fa0ac59b75ab87d31275164bf0">BlockLanczos</a> approaches, to name a few. Actually, for each solution function, the <code>Blackbox</code> class simply chooses from among these the best one as currently implemented. They may be used specifically to override that default. Thus <code>rank(r, A,Blackbox())</code> uses the Wiedemann method. But <code>rank(r, A, BlockLanczos())</code> could be called as well.</p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000038">Todo:</a></b></dt><dd>this may soon be reversed, in fact.</dd></dl>
<p>Also choice of preconditioner may be possible either at runtime by putting an indicator in the method object or at compile time by using a more special class of method such as <a class="el" href="">BlockWiedemannButterfly</a>.</p>
<p>Other method classes focus on algorithms attuned to specific matrix properties. For instance, there may be <a class="el" href="">HybridSymmetric</a>, <a class="el" href="">EliminationSymmetric</a>, and <a class="el" href="">BlackboxSymmetric</a>. Using these method choices, several functions are about twice as fast as those where the symmetry is unspecified. To get the same effect as a runtime choice, objects of the basic method classes may contain an indicator of symmetry, </p>
<div class="fragment"><pre class="fragment">  Method::Elimination e;
  e.setSymmetric();
  <a class="code" href="group__solutions.html#gaae3c1f7fd3319410ac4fc3e4e3afdd01" title="Compute the rank of a linear transform A over a field by selected method.">rank</a>(r, A, e);
</pre></div><p>Not every implemented algorithm is available through solution functions and their methods, but this is a good starting point. See <a class="el" href="group__algorithms.html">algorithms</a> for the other possibilities and <code><a class="el" href="struct_lin_box_1_1_method.html" title="Method specifiers for controlling algorithm choice.">LinBox::Method</a></code> for available methods.</p>
<p>If the status parameter is given, it is used for output of side information. For instance the solve function will set it's <code>isConsistent()</code> property indicating whether or not the system was found to be consistent. Also an upper bound on the probability of error is given by <code>errorBound()</code>. In the future, it may even provide consistency certificates and cofactors for normal forms. </p>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="gaf0ab7d8c85bc20cfd21f6f3a0b3d6fd1"></a><!-- doxytag: member="LinBox::lif_cra_det" ref="gaf0ab7d8c85bc20cfd21f6f3a0b3d6fd1" args="(typename Blackbox::Field::Element &amp;d, const Blackbox &amp;A, const RingCategories::IntegerTag &amp;tag, const MyMethod &amp;M)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">Blackbox::Field::Element&amp; LinBox::lif_cra_det </td>
          <td>(</td>
          <td class="paramtype">typename Blackbox::Field::Element &amp;&#160;</td>
          <td class="paramname"><em>d</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const RingCategories::IntegerTag &amp;&#160;</td>
          <td class="paramname"><em>tag</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const MyMethod &amp;&#160;</td>
          <td class="paramname"><em>M</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the determinant of A over the integers. </p>
<p>The determinant of a linear operator A, represented as a black box, is computed over the integers.</p>
<p>This variant is a hybrid between Last Invariant Factor and Chinese Remaindering It performs several determinants mod primes Then switches to the LIF method, producing a factor of det. It then comes back to the CRA if necessary to compute the remaining (usually small) factor of the determinant.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">d</td><td>Field element into which to store the result </td></tr>
    <tr><td class="paramname">A</td><td>Black box of which to compute the determinant </td></tr>
    <tr><td class="paramname">tag</td><td>explicit over the integers </td></tr>
    <tr><td class="paramname">M</td><td>may be a <a class="el" href="struct_lin_box_1_1_method.html#ae72ae4bbae70adf0514c807be2037706" title="Method::BlasElimination : no doc.">Method::BlasElimination</a> (default) or a <a class="el" href="struct_lin_box_1_1_method.html#a95658bcef98e7d0868b2e35d7ce03392" title="Method::Wiedemann : no doc.">Method::Wiedemann</a>. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="ga9cfcc847d3a7deac68ad6d98e0cd384f"></a><!-- doxytag: member="LinBox::det" ref="ga9cfcc847d3a7deac68ad6d98e0cd384f" args="(typename Blackbox::Field::Element &amp;d, const Blackbox &amp;A, const DomainCategory &amp;tag, const DetMethod &amp;Meth)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">Blackbox::Field::Element&amp; LinBox::det </td>
          <td>(</td>
          <td class="paramtype">typename Blackbox::Field::Element &amp;&#160;</td>
          <td class="paramname"><em>d</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const DomainCategory &amp;&#160;</td>
          <td class="paramname"><em>tag</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const DetMethod &amp;&#160;</td>
          <td class="paramname"><em>Meth</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the determinant of A. </p>
<p>The determinant of a linear operator A, represented as a black box, is computed over the ring or field of A.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">d</td><td>Field element into which to store the result </td></tr>
    <tr><td class="paramname">A</td><td>Black box of which to compute the determinant </td></tr>
    <tr><td class="paramname">tag</td><td>optional tag. Specifies Integer, Rational or modular ring/field </td></tr>
    <tr><td class="paramname">M</td><td>optional method. The default is <a class="el" href="struct_lin_box_1_1_method.html#add971f81e2dc236b0141a022827fa9c5" title="Method::Hybrid : no doc.">Method::Hybrid()</a>, Other options include Blackbox, Elimination, Wiedemann, BlasElimination and SparseElimination. Sometimes it helps to indicate properties of the matrix in the method object (for instance symmetry). See class <a class="el" href="struct_lin_box_1_1_method.html" title="Method specifiers for controlling algorithm choice.">Method</a> for details. </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Examples: </b></dt><dd><a class="el" href="examples_2det_8_c-example.html#a8">examples/det.C</a>, <a class="el" href="examples_2doubledet_8_c-example.html#a7">examples/doubledet.C</a>, and <a class="el" href="examples_2sparseelimdet_8_c-example.html#a8">examples/sparseelimdet.C</a>.</dd>
</dl>
</div>
</div>
<a class="anchor" id="ga0f81b856e81c10fb0fd51feac04d93ea"></a><!-- doxytag: member="LinBox::detin" ref="ga0f81b856e81c10fb0fd51feac04d93ea" args="(typename Field::Element &amp;d, BlasBlackbox&lt; Field &gt; &amp;A)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">Field::Element&amp; LinBox::detin </td>
          <td>(</td>
          <td class="paramtype">typename Field::Element &amp;&#160;</td>
          <td class="paramname"><em>d</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">BlasBlackbox&lt; <a class="el" href="class_lin_box_1_1_modular_3_01uint32__t_01_4.html">Field</a> &gt; &amp;&#160;</td>
          <td class="paramname"><em>A</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Rank of Blackbox <code>A</code>. </p>
<p>A will be modified. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramdir">[out]</td><td class="paramname">d</td><td>determinant of <code>A</code>. </td></tr>
    <tr><td class="paramdir"></td><td class="paramname">A</td><td>this <a class="el" href="class_lin_box_1_1_blas_blackbox.html" title="Dense matrix representation for BLAS based elimination.">BlasBlackbox</a> matrix will be modified in place in the process. </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd><code>d</code> </dd></dl>

</div>
</div>
<a class="anchor" id="gaae3c1f7fd3319410ac4fc3e4e3afdd01"></a><!-- doxytag: member="LinBox::rank" ref="gaae3c1f7fd3319410ac4fc3e4e3afdd01" args="(unsigned long &amp;r, const Blackbox &amp;A, const DomainCategory &amp;tag, const Method &amp;M)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">unsigned long&amp; LinBox::rank </td>
          <td>(</td>
          <td class="paramtype">unsigned long &amp;&#160;</td>
          <td class="paramname"><em>r</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const DomainCategory &amp;&#160;</td>
          <td class="paramname"><em>tag</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Method &amp;&#160;</td>
          <td class="paramname"><em>M</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the rank of a linear transform A over a field by selected method. </p>
<p>For very large and/or very sparse matrices the Wiedemann method will be faster (and it is memory efficient). For some sparse matrices SparseElimination may outperform Wiedemann. For small or dense matrices BlasElimination will be faster. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>output rank of A. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">A</td><td>linear transform, member of any blackbox class. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">M</td><td>may be a <code><a class="el" href="struct_lin_box_1_1_method.html#a95658bcef98e7d0868b2e35d7ce03392" title="Method::Wiedemann : no doc.">Method::Wiedemann</a></code> (the default), a <code><a class="el" href="struct_lin_box_1_1_method.html#ae72ae4bbae70adf0514c807be2037706" title="Method::BlasElimination : no doc.">Method::BlasElimination</a></code>, or a <code><a class="el" href="struct_lin_box_1_1_method.html#abc071c5d851893868ab7a0c0d8ee34cb" title="Method::SparseElimination : no doc.">Method::SparseElimination</a></code>.. </td></tr>
    <tr><td class="paramdir"></td><td class="paramname">tag</td><td>UNDOC </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>a reference to r. </dd></dl>
<dl><dt><b>Examples: </b></dt><dd><a class="el" href="examples_2rank_8_c-example.html#a7">examples/rank.C</a>, and <a class="el" href="examples_2sparseelimrank_8_c-example.html#a7">examples/sparseelimrank.C</a>.</dd>
</dl>
</div>
</div>
<a class="anchor" id="gafb22cbd97ffc18527d2b3175367b9430"></a><!-- doxytag: member="LinBox::rank" ref="gafb22cbd97ffc18527d2b3175367b9430" args="(unsigned long &amp;r, const Blackbox &amp;A)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">unsigned long&amp; LinBox::rank </td>
          <td>(</td>
          <td class="paramtype">unsigned long &amp;&#160;</td>
          <td class="paramname"><em>r</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the rank of a linear transform A over a field. </p>
<p>The default method is Wiedemann(), using diagonal preconditioning and the minpoly. For small or dense matrices BlasElimination will be faster. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramdir"></td><td class="paramname">A</td><td>linear transform, member of any blackbox class. </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>rank of <code>A</code> </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd><code>r</code> rank of <code>A</code>. </dd></dl>

</div>
</div>
<a class="anchor" id="ga4a75466958f4a212f09223d0c3eb1edc"></a><!-- doxytag: member="LinBox::rank" ref="ga4a75466958f4a212f09223d0c3eb1edc" args="(unsigned long &amp;r, const Blackbox &amp;A, const Method &amp;M)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">unsigned long&amp; LinBox::rank </td>
          <td>(</td>
          <td class="paramtype">unsigned long &amp;&#160;</td>
          <td class="paramname"><em>r</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Method &amp;&#160;</td>
          <td class="paramname"><em>M</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the rank of a linear transform A over a field. </p>
<p>The default method is <code>Wiedemann()</code>, using diagonal preconditioning and the minpoly. For small or dense matrices <code>BlasElimination</code> will be faster. </p>
<dl class="return"><dt><b>Returns:</b></dt><dd><code>r</code> rank of <code>A</code>. </dd></dl>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramdir"></td><td class="paramname">A</td><td>linear transform, member of any blackbox class. </td></tr>
    <tr><td class="paramdir">[out]</td><td class="paramname">r</td><td>rank of <code>A</code> </td></tr>
    <tr><td class="paramdir"></td><td class="paramname">M</td><td>method (see ???) </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="gadebecfaca29a9dbb684a65b9e1e4bc72"></a><!-- doxytag: member="LinBox::smithForm" ref="gadebecfaca29a9dbb684a65b9e1e4bc72" args="(Output &amp;S, const Blackbox &amp;A, const MyMethod &amp;M)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">Output&amp; LinBox::smithForm </td>
          <td>(</td>
          <td class="paramtype">Output &amp;&#160;</td>
          <td class="paramname"><em>S</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const MyMethod &amp;&#160;</td>
          <td class="paramname"><em>M</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the Smith form of A. </p>
<p>The Smith form of a linear operator A, represented as a black box, is computed over a representation of <img class="formulaInl" alt="$Z$" src="form_70.png"/> or <img class="formulaInl" alt="$Z_m$" src="form_71.png"/>.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramdir">[out]</td><td class="paramname">S</td><td>a list of invariant/repcount pairs. </td></tr>
    <tr><td class="paramdir"></td><td class="paramname">A</td><td>Matrix of which to compute the Smith form </td></tr>
    <tr><td class="paramdir"></td><td class="paramname">M</td><td>may be a <code><a class="el" href="struct_lin_box_1_1_method.html#add971f81e2dc236b0141a022827fa9c5" title="Method::Hybrid : no doc.">Method::Hybrid</a></code> (default), which uses the algorithms/smith-form-adaptive. </td></tr>
  </table>
  </dd>
</dl>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000035">Todo:</a></b></dt><dd>Other methods will be provided later. For now see the <a class="el" href="smith_8_c.html">examples/smith.C</a> for ways to call other smith form algorithms. </dd></dl>
<dl><dt><b>Examples: </b></dt><dd><a class="el" href="examples_2smith_8_c-example.html#a3">examples/smith.C</a>.</dd>
</dl>
</div>
</div>
<a class="anchor" id="gaeb41d28dc7bebfd5a24b7642631e9817"></a><!-- doxytag: member="LinBox::solve" ref="gaeb41d28dc7bebfd5a24b7642631e9817" args="(Vector &amp;x, const Blackbox &amp;A, const Vector &amp;b, const SolveMethod &amp;M)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">Vector&amp; LinBox::solve </td>
          <td>(</td>
          <td class="paramtype">Vector &amp;&#160;</td>
          <td class="paramname"><em>x</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Vector &amp;&#160;</td>
          <td class="paramname"><em>b</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const SolveMethod &amp;&#160;</td>
          <td class="paramname"><em>M</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Solve Ax = b, for x. </p>
<p>Vector x such that Ax = b is returned. In the case of a singular matrix A, if the system is consistent, a random solution is returned by default. The method parameter may contain an indication that an arbitrary element of the solution space is acceptable, which can be faster to compute. If the system is inconsistent the zero vector is returned. </p>

</div>
</div>
<a class="anchor" id="ga4c6000cb4741bed819d3c384bc254954"></a><!-- doxytag: member="LinBox::valence" ref="ga4c6000cb4741bed819d3c384bc254954" args="(typename Blackbox::Field::Element &amp;v, const Blackbox &amp;A, const MyMethod &amp;M)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">Blackbox::Field::Element&amp; LinBox::valence </td>
          <td>(</td>
          <td class="paramtype">typename Blackbox::Field::Element &amp;&#160;</td>
          <td class="paramname"><em>v</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const Blackbox &amp;&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const MyMethod &amp;&#160;</td>
          <td class="paramname"><em>M</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Compute the valence of A. </p>
<p>The valence of a linear operator A, represented as a black box, is computed over the ring or field of A.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">v</td><td>Field element into which to store the result </td></tr>
    <tr><td class="paramname">A</td><td>Black box of which to compute the determinant </td></tr>
    <tr><td class="paramname">M</td><td>may is a <a class="el" href="struct_lin_box_1_1_method.html" title="Method specifiers for controlling algorithm choice.">Method</a>. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Tue Aug 30 2011 for linbox by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>