Sophie

Sophie

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

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: examples/smith.C</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="headertitle">
<div class="title">examples/smith.C</div>  </div>
</div>
<div class="contents">
<p>mod m Smith form by elmination</p>
<dl class="author"><dt><b>Author:</b></dt><dd>bds &amp; zw</dd></dl>
<p>Various Smith form algorithms may be used for matrices over the integers or over Z_m. Moduli greater than 2^32 are not supported. Several types of example matrices may be constructed or matrix read from file. Run the program with no arguments for a synopsis of the command line parameters.</p>
<p>For the "adaptive" method, the matrix must be over the integers. This is expected to work best for large matrices.</p>
<p>For the "2local" method, the computaattion is done mod 2^32.</p>
<p>For the "local" method, the modulus must be a prime power.</p>
<p>For the "ilio" method, the modulus may be arbitrary composite. If the modulus is a multiple of the integer determinant, the intege Smith form is obtained. Determinant plus ilio may be best for smaller matrices.</p>
<p>This example was used during the design process of the adaptive algorithm.</p>
<div class="fragment"><pre class="fragment"><span class="comment">/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */</span>
<span class="comment">// vim:sts=8:sw=8:ts=8:noet:sr:cino=&gt;s,f0,{0,g0,(0,\:0,t0,+0,=s</span>
<span class="comment">/*</span>
<span class="comment"> * examples/smith.C</span>
<span class="comment"> *</span>
<span class="comment"> * Copyright (C) 2005, 2010  D. Saunders, Z. Wang, J-G Dumas</span>
<span class="comment"> *</span>
<span class="comment"> * This file is part of LinBox.</span>
<span class="comment"> *</span>
<span class="comment"> *   LinBox is free software: you can redistribute it and/or modify</span>
<span class="comment"> *   it under the terms of the GNU Lesser General Public License as</span>
<span class="comment"> *   published by the Free Software Foundation, either version 2 of</span>
<span class="comment"> *   the License, or (at your option) any later version.</span>
<span class="comment"> *</span>
<span class="comment"> *   LinBox is distributed in the hope that it will be useful,</span>
<span class="comment"> *   but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="comment"> *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="comment"> *   GNU Lesser General Public License for more details.</span>
<span class="comment"> *</span>
<span class="comment"> *   You should have received a copy of the GNU Lesser General Public</span>
<span class="comment"> *   License along with LinBox.  If not, see</span>
<span class="comment"> *   &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="comment"> */</span>

<span class="preprocessor">#include &lt;iostream&gt;</span>
<span class="preprocessor">#include &lt;string&gt;</span>
<span class="preprocessor">#include &lt;vector&gt;</span>
<span class="preprocessor">#include &lt;list&gt;</span>

<span class="keyword">using namespace </span>std;


<span class="preprocessor">#include &quot;linbox/field/modular-int32.h&quot;</span>
<span class="preprocessor">#include &quot;linbox/blackbox/sparse.h&quot;</span>
<span class="preprocessor">#include &quot;linbox/algorithms/smith-form-sparseelim-local.h&quot;</span>

<span class="preprocessor">#include &quot;<a class="code" href="timer_8h.html" title="LinBox timer is Givaro&#39;s.">linbox/util/timer.h</a>&quot;</span>

<span class="preprocessor">#include &quot;linbox/field/unparametric.h&quot;</span>
<span class="preprocessor">#include &quot;linbox/field/local2_32.h&quot;</span>
<span class="preprocessor">#include &quot;linbox/field/PIR-modular-int32.h&quot;</span>
<span class="preprocessor">#include &quot;linbox/algorithms/smith-form-local.h&quot;</span>
<span class="preprocessor">#include &quot;linbox/algorithms/smith-form-local2.h&quot;</span>
<span class="preprocessor">#include &lt;linbox/algorithms/smith-form-iliopoulos.h&gt;</span>
<span class="preprocessor">#include &quot;<a class="code" href="smith-form-adaptive_8h.html" title="Implement the adaptive algorithm for Smith form computation.">linbox/algorithms/smith-form-adaptive.h</a>&quot;</span>
<span class="preprocessor">#include &quot;<a class="code" href="blackbox_2dense_8h.html" title="NO DOC.">linbox/blackbox/dense.h</a>&quot;</span>

<span class="keyword">using namespace </span>LinBox;

<span class="comment">// #ifndef BIG</span>


<span class="keyword">template</span>&lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> <a name="a0"></a><a class="code" href="smith_8_c.html#ac924a785b0083e0f26562df322262428" title="Output matrix is determined by src which may be: &quot;random-rough&quot; This mat will have s...">Mat</a>(<a name="_a1"></a><a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> n,
     <span class="keywordtype">string</span> src, <span class="keywordtype">string</span> file, <span class="keywordtype">string</span> format);

<span class="keyword">template</span>&lt;<span class="keyword">class</span> I1, <span class="keyword">class</span> Lp&gt; <span class="keywordtype">void</span> distinct (I1 a, I1 b, Lp&amp; c);
<span class="keyword">template</span> &lt;<span class="keyword">class</span> I&gt; <span class="keywordtype">void</span> display(I b, I e);

<span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>* argv[])
{
    <span class="keyword">typedef</span> PIRModular&lt;int32_t&gt; PIR;

    <span class="keywordflow">if</span> (argc &lt; 5) {

        cout &lt;&lt; <span class="stringliteral">&quot;usage: &quot;</span> &lt;&lt; argv[0] &lt;&lt; <span class="stringliteral">&quot; alg m n source format \n&quot;</span>  &lt;&lt; endl;

        cout &lt;&lt; <span class="stringliteral">&quot;alg = `adaptive&#39;, `ilio&#39;, `local&#39;, or `2local&#39;, \n&quot;</span>
        &lt;&lt; <span class="stringliteral">&quot;m is modulus (ignored by 2local, adaptive), &quot;</span>
        &lt;&lt; <span class="stringliteral">&quot;n is matrix order, \n&quot;</span>
        &lt;&lt; <span class="stringliteral">&quot;source is `random&#39;, `random-rough&#39;, `fib&#39;, `tref&#39;, or a filename \n&quot;</span>
        &lt;&lt; <span class="stringliteral">&quot;format is `dense&#39; or `sparse&#39; (if matrix from a file)\n&quot;</span>
        &lt;&lt; <span class="stringliteral">&quot;compile with -DBIG if you want big integers used.\n&quot;</span>;

        <span class="keywordflow">return</span> 0;
    }

    <span class="keywordtype">string</span> algo = argv[1];

    <span class="keywordtype">int</span> m = atoi(argv[2]);

    <span class="keywordtype">int</span> n = atoi(argv[3]);

    <span class="keywordtype">string</span> src = argv[4];

    <span class="keywordtype">string</span> file = src;

    <span class="keywordtype">string</span> format = (argc &gt;= 6 ? argv[5] : <span class="stringliteral">&quot;&quot;</span>);

    UserTimer T;

    <span class="keywordflow">if</span> (algo == <span class="stringliteral">&quot;adaptive&quot;</span>)
    {
        <span class="keyword">typedef</span> <a name="_a2"></a><a class="code" href="class_lin_box_1_1_p_i_d__integer.html" title="Domain for integer operations.">PID_integer</a> Ints;
        Ints Z;
        <a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;Ints&gt;</a> M(Z);
        <a class="code" href="smith_8_c.html#ac924a785b0083e0f26562df322262428" title="Output matrix is determined by src which may be: &quot;random-rough&quot; This mat will have s...">Mat</a>(M, Z, n, src, file, format);
        vector&lt;integer&gt; v(n);
        T.start();
        <a name="a3"></a><a class="code" href="group__solutions.html#gadebecfaca29a9dbb684a65b9e1e4bc72" title="Compute the Smith form of A.">SmithFormAdaptive::smithForm</a>(v, M);
        T.stop();
        list&lt;pair&lt;integer, size_t&gt; &gt; p;

        distinct(v.begin(), v.end(), p);

        cout &lt;&lt; <span class="stringliteral">&quot;#&quot;</span>;

        display(p.begin(), p.end());

        cout &lt;&lt; <span class="stringliteral">&quot;# adaptive, Ints, n = &quot;</span> &lt;&lt; n &lt;&lt; endl;

        cout &lt;&lt; <span class="stringliteral">&quot;T&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;adaptive&quot;</span> &lt;&lt; m &lt;&lt; <span class="stringliteral">&quot; := &quot;</span>;

    }
    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (algo == <span class="stringliteral">&quot;ilio&quot;</span>) {

        PIR R(m);

        <a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a> M(R);

        <a class="code" href="smith_8_c.html#ac924a785b0083e0f26562df322262428" title="Output matrix is determined by src which may be: &quot;random-rough&quot; This mat will have s...">Mat</a>(M, R, n, src, file, format);

        T.start();

        SmithFormIliopoulos::smithFormIn (M);

        T.stop();

        <span class="keyword">typedef</span> list&lt; PIR::Element &gt; List;

        List L;

        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; M.rowdim(); ++i) L.push_back(M[i][i]);

        list&lt;pair&lt;PIR::Element, size_t&gt; &gt; p;

        distinct(L.begin(), L.end(), p);

        cout &lt;&lt; <span class="stringliteral">&quot;#&quot;</span>;

        display(p.begin(), p.end());

        cout &lt;&lt; <span class="stringliteral">&quot;# ilio, PIR-Modular-int32_t(&quot;</span> &lt;&lt; m &lt;&lt; <span class="stringliteral">&quot;), n = &quot;</span> &lt;&lt; n &lt;&lt; endl;

        cout &lt;&lt; <span class="stringliteral">&quot;T&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;ilio&quot;</span> &lt;&lt; m &lt;&lt; <span class="stringliteral">&quot; := &quot;</span>;
    }

    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (algo == <span class="stringliteral">&quot;local&quot;</span>) { <span class="comment">// m must be a prime power</span>

        <span class="keywordflow">if</span> (format == <span class="stringliteral">&quot;sparse&quot;</span> ) {
            <span class="keyword">typedef</span> <a name="_a4"></a><a class="code" href="class_lin_box_1_1_modular_3_01int32__t_01_4.html" title="Specialization of Modular to int32_t element type with efficient dot product.">Modular&lt;int32_t&gt;</a> <a name="_a5"></a><a class="code" href="class_lin_box_1_1_modular_3_01uint32__t_01_4.html" title="Specialization of class Modular for uint32_t element type.">Field</a>;
            Field F(m);
            std::ifstream input (argv[4]);
            <span class="keywordflow">if</span> (!input) { std::cerr &lt;&lt; <span class="stringliteral">&quot;Error opening matrix file: &quot;</span> &lt;&lt; argv[1] &lt;&lt; std::endl; <span class="keywordflow">return</span> -1; }

            <a name="_a6"></a><a class="code" href="class_lin_box_1_1_matrix_stream.html" title="MatrixStream.">MatrixStream&lt;Field&gt;</a> ms( F, input );
            <a name="_a7"></a><a class="code" href="class_lin_box_1_1_sparse_matrix.html" title="vector of sparse rows.">SparseMatrix&lt;Field, Vector&lt;Field&gt;::SparseSeq</a> &gt; B (ms);
            std::cout &lt;&lt; <span class="stringliteral">&quot;B is &quot;</span> &lt;&lt; B.rowdim() &lt;&lt; <span class="stringliteral">&quot; by &quot;</span> &lt;&lt; B.coldim() &lt;&lt; std::endl;
            <span class="keywordflow">if</span> (B.rowdim() &lt;= 20 &amp;&amp; B.coldim() &lt;= 20) B.write(std::cout) &lt;&lt; std::endl;



            Integer p(m), im(m);
            <span class="comment">// Should better ask user to give the prime !!!</span>
            <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> k = 2; ( ( ! ::Givaro::probab_prime(p) ) &amp;&amp; (p &gt; 1) ); ++k)
                ::Givaro::root( p, im, k );

            <span class="comment">// using Sparse Elimination</span>
            <a name="_a8"></a><a class="code" href="class_lin_box_1_1_power_gauss_domain.html" title="Repository of functions for rank modulo a prime power by elimination on sparse matrices.">LinBox::PowerGaussDomain&lt; Field &gt;</a> PGD( F );
            std::vector&lt;std::pair&lt;size_t,size_t&gt; &gt; local;

            PGD(local, B, m, (<span class="keywordtype">int</span>)p);

            <span class="keyword">typedef</span> list&lt; Field::Element &gt; List;
            List L;
            <span class="keywordflow">for</span> ( std::vector&lt;std::pair&lt;size_t,size_t&gt; &gt;::iterator
                  p_it = local.begin(); p_it != local.end(); ++p_it) {
                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; (size_t) p_it-&gt;first; ++i)
                    L.push_back((Field::Element)p_it-&gt;second);
            }
            <span class="keywordtype">size_t</span> M = (B.rowdim() &gt; B.coldim() ? B.coldim() : B.rowdim());
            <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = L.size(); i &lt; M; ++i)
                L.push_back(0);

            list&lt;pair&lt;Field::Element, size_t&gt; &gt; pl;

            distinct(L.begin(), L.end(), pl);

            std::cout &lt;&lt; <span class="stringliteral">&quot;#&quot;</span>;

            <span class="comment">//display(local.begin(), local.end());</span>
            display(pl.begin(), pl.end());
            cout &lt;&lt; <span class="stringliteral">&quot;# local, PowerGaussDomain&lt;int32_t&gt;(&quot;</span> &lt;&lt; M &lt;&lt; <span class="stringliteral">&quot;), n = &quot;</span> &lt;&lt; n &lt;&lt; endl;

        }
        <span class="keywordflow">else</span> {

            PIR R(m);

            <a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a> M(R);

            <a class="code" href="smith_8_c.html#ac924a785b0083e0f26562df322262428" title="Output matrix is determined by src which may be: &quot;random-rough&quot; This mat will have s...">Mat</a>(M, R, n, src, file, format);

            <span class="keyword">typedef</span> list&lt; PIR::Element &gt; List;

            List L;

            <a name="_a9"></a><a class="code" href="class_lin_box_1_1_smith_form_local.html" title="Smith normal form (invariant factors) of a matrix over a local ring.">SmithFormLocal&lt;PIR&gt;</a> SmithForm;

            T.start();

            SmithForm( L, M, R );

            T.stop();

            list&lt;pair&lt;PIR::Element, size_t&gt; &gt; p;

            distinct(L.begin(), L.end(), p);

            cout &lt;&lt; <span class="stringliteral">&quot;#&quot;</span>;

            display(p.begin(), p.end());

            cout &lt;&lt; <span class="stringliteral">&quot;# local, PIR-Modular-int32_t(&quot;</span> &lt;&lt; m &lt;&lt; <span class="stringliteral">&quot;), n = &quot;</span> &lt;&lt; n &lt;&lt; endl;

        }
        cout &lt;&lt; <span class="stringliteral">&quot;T&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;local&quot;</span> &lt;&lt; m &lt;&lt; <span class="stringliteral">&quot; := &quot;</span>;
    }

    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (algo == <span class="stringliteral">&quot;2local&quot;</span>) {

        <a name="_a10"></a><a class="code" href="struct_lin_box_1_1_local2__32.html" title="Fast arithmetic mod 2^32, including gcd.">Local2_32</a> R;

        <a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;Local2_32&gt;</a> M(R);

        <a class="code" href="smith_8_c.html#ac924a785b0083e0f26562df322262428" title="Output matrix is determined by src which may be: &quot;random-rough&quot; This mat will have s...">Mat</a>(M, R, n, src, file, format);

        <span class="keyword">typedef</span> list&lt; Local2_32::Element &gt; List;

        List L;

        <a class="code" href="class_lin_box_1_1_smith_form_local.html" title="Smith normal form (invariant factors) of a matrix over a local ring.">SmithFormLocal&lt;Local2_32&gt;</a> SmithForm;

        T.start();

        SmithForm( L, M, R );

        T.stop();

        list&lt;pair&lt;Local2_32::Element, size_t&gt; &gt; p;

        distinct(L.begin(), L.end(), p);

        cout &lt;&lt; <span class="stringliteral">&quot;#&quot;</span>;

        display(p.begin(), p.end());

        cout &lt;&lt; <span class="stringliteral">&quot;# 2local, Local2_32, n = &quot;</span> &lt;&lt; n &lt;&lt; endl;

        cout &lt;&lt; <span class="stringliteral">&quot;T&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;local2_32 := &quot;</span>;
    }

    <span class="keywordflow">else</span> {

        printf (<span class="stringliteral">&quot;Unknown algorithms\n&quot;</span>);

        exit (-1);

    }

    T.print(cout); cout &lt;&lt; <span class="stringliteral">&quot;;&quot;</span> &lt;&lt; endl;

    <span class="keywordflow">return</span> 0 ;
}

<span class="keyword">template</span> &lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> <a class="code" href="smith_8_c.html#ac924a785b0083e0f26562df322262428" title="Output matrix is determined by src which may be: &quot;random-rough&quot; This mat will have s...">Mat</a>(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> n,
     <span class="keywordtype">string</span> src, <span class="keywordtype">string</span> file, <span class="keywordtype">string</span> format) {

    <span class="keyword">typename</span> PIR::Element zero; R.init(zero, 0);
    <span class="keywordflow">if</span> (src == <span class="stringliteral">&quot;random-rough&quot;</span>) RandomRoughMat(M, R, n);

    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (src == <span class="stringliteral">&quot;random&quot;</span>) RandomFromDiagMat(M, R, n);

    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (src == <span class="stringliteral">&quot;fib&quot;</span>) RandomFibMat(M, R, n);

    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (src == <span class="stringliteral">&quot;tref&quot;</span>) TrefMat(M, R, n);

    <span class="keywordflow">else</span> <span class="comment">// from file</span>
    {

        <span class="keywordtype">int</span> rdim, cdim;

        std::ifstream in (file.c_str(), std::ios::in);
        <span class="keywordflow">if</span> (! in) { cerr &lt;&lt; <span class="stringliteral">&quot;error: unable to open file&quot;</span> &lt;&lt; endl; exit(-1); }

        in &gt;&gt; rdim &gt;&gt; cdim;

        M. resize (rdim, cdim);

        <a class="code" href="group__integers.html#gad62eceb96963b157a2357aba991f6d6e" title="Integers in LinBox.">integer</a> Val;

        <span class="keywordflow">if</span> (format == <span class="stringliteral">&quot;dense&quot;</span> ) {

            <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; rdim; ++ i)

                <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> j = 0; j &lt; cdim; ++ j) {

                    in &gt;&gt; Val;

                    R. init (M[i][j], Val);

                }
        }

        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (format == <span class="stringliteral">&quot;sparse&quot;</span>) {

            <span class="keywordtype">int</span> i, j;

            <span class="keywordtype">char</span> mark;

            in &gt;&gt; mark;

            <a class="code" href="group__integers.html#gad62eceb96963b157a2357aba991f6d6e" title="Integers in LinBox.">LinBox::integer</a> val;

            <span class="keywordflow">do</span> {

                in &gt;&gt; i &gt;&gt; j;
                in. ignore (1);
                in &gt;&gt; val;

                <span class="keywordflow">if</span> ( i == 0) <span class="keywordflow">break</span>;

                R. init (M[i-1][j-1], val);

            } <span class="keywordflow">while</span> (<span class="keyword">true</span>);

        }
        <span class="comment">//Krattenthaler&#39;s q^e matrices, given by exponent</span>
        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (format == <span class="stringliteral">&quot;kdense&quot;</span>) KratMat(M, R, n, in);

        <span class="keywordflow">else</span> {

            cout &lt;&lt; <span class="stringliteral">&quot;Format: &quot;</span> &lt;&lt; format &lt;&lt; <span class="stringliteral">&quot; Unknown\n&quot;</span>;

            exit (-1);

        }
    }

    <span class="comment">/*show some entries</span>
<span class="comment">      for (int k = 0; k &lt; 10; ++k)</span>
<span class="comment">      cout &lt;&lt; M.getEntry(0,k) &lt;&lt;  &quot; &quot; &lt;&lt; M.getEntry(M.rowdim()-1, M.coldim()-1 - k) &lt;&lt; endl;</span>
<span class="comment">      cout &lt;&lt; endl &lt;&lt; M.rowdim() &lt;&lt; &quot; &quot; &lt;&lt; M.coldim() &lt;&lt; endl;</span>
<span class="comment">      */</span>

    <span class="comment">/* some row ops and some col ops */</span>
} <span class="comment">// Mat</span>

<span class="comment">// This mat will have s, near sqrt(n), distinct invariant factors,</span>
<span class="comment">// each repeated twice), involving the s primes 101, 103, ...</span>
<span class="keyword">template</span> &lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> RandomRoughMat(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> n) {
    <span class="keyword">typename</span> PIR::Element zero; R.init(zero, 0);
    M.<a name="a11"></a><a class="code" href="class_lin_box_1_1_dense_matrix_base.html#a0a4488dda5f370f56b9eab4fe8a54683" title="Resize the matrix to the given dimensions.">resize</a>(n, n, zero);
    <span class="keywordflow">if</span> (n &gt; 10000) {cerr &lt;&lt; <span class="stringliteral">&quot;n too big&quot;</span> &lt;&lt; endl; exit(-1);}
    <span class="keywordtype">int</span> jth_factor[130] =
    {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
        71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
        151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
        233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
        317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
        419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
        503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
        607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
        701, 709, 719, 727, 733};

    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j= 0, i = 0 ; i &lt; n; ++j)
    {
        <span class="keyword">typename</span> PIR::Element v; R.init(v, jth_factor[25+j]);
        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = j ; k &gt; 0 &amp;&amp; i &lt; n ; --k)
        {   M[i][i] = v; ++i;
            <span class="keywordflow">if</span> (i &lt; n) {M[i][i] = v; ++i;}
        }
    }
    scramble(M);
}

<span class="comment">// This mat will have the same nontrivial invariant factors as</span>
<span class="comment">// diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).</span>
<span class="keyword">template</span> &lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> RandomFromDiagMat(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> n) {
    <span class="keyword">typename</span> PIR::Element zero; R.init(zero, 0);
    M.<a class="code" href="class_lin_box_1_1_dense_matrix_base.html#a0a4488dda5f370f56b9eab4fe8a54683" title="Resize the matrix to the given dimensions.">resize</a>(n, n, zero);

    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i= 0 ; i &lt; n; ++i)

        R.init(M[i][i], i % 1000 + 1);
    scramble(M);

}

<span class="comment">// This mat will have the same nontrivial invariant factors as</span>
<span class="comment">// diag(1,2,3,5,8, ... fib(k)), where k is about sqrt(n).</span>
<span class="comment">// The basic matrix is block diagonal with i-th block of order i and</span>
<span class="comment">// being a tridiagonal {-1,0,1} matrix whose snf = diag(i-1 1&#39;s, fib(i)),</span>
<span class="comment">// where fib(1) = 1, fib(2) = 2.  But note that, depending on n,</span>
<span class="comment">// the last block may be truncated, thus repeating an earlier fibonacci number.</span>
<span class="keyword">template</span> &lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> RandomFibMat(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> n) {
    <span class="keyword">typename</span> PIR::Element zero; R.init(zero, 0);
    M.<a class="code" href="class_lin_box_1_1_dense_matrix_base.html#a0a4488dda5f370f56b9eab4fe8a54683" title="Resize the matrix to the given dimensions.">resize</a>(n, n, zero);

    <span class="keyword">typename</span> PIR::Element one; R.init(one, 1);

    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i= 0 ; i &lt; n; ++i) M[i][i] = one;

    <span class="keywordtype">int</span> j = 1, k = 0;

    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i= 0 ; i &lt; n-1; ++i) {

        <span class="keywordflow">if</span> ( i == k) {

            M[i][i+1] = zero;

            k += ++j;
        }

        <span class="keywordflow">else</span> {

            M[i][i+1] = one;

            R.negin(one);
        }
        R.neg(M[i+1][i], M[i][i+1]);
    }
    scramble(M);
}

<span class="keyword">template</span> &lt; <span class="keyword">class</span> Ring &gt;
<span class="keywordtype">void</span> scramble(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;Ring&gt;</a>&amp; M)
{

    Ring R = M.<a name="a12"></a><a class="code" href="class_lin_box_1_1_dense_matrix.html#a66be394bace6f92c18729a119581d7bd" title="Retrieve the field over which this matrix is defined.">field</a>();

    <span class="keywordtype">int</span> N,n = (int)M.<a name="a13"></a><a class="code" href="class_lin_box_1_1_dense_matrix.html#a0fee90e6b8ef7fcd8d76a7f3e1f268e6" title="Get the number of rows in the matrix.">rowdim</a>(); <span class="comment">// number of random basic row and col ops.</span>
    N = n;

    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> k = 0; k &lt; N; ++k) {

        <span class="keywordtype">int</span> i = rand()%(int)M.<a class="code" href="class_lin_box_1_1_dense_matrix.html#a0fee90e6b8ef7fcd8d76a7f3e1f268e6" title="Get the number of rows in the matrix.">rowdim</a>();

        <span class="keywordtype">int</span> j = rand()%(int)M.<a name="a14"></a><a class="code" href="class_lin_box_1_1_dense_matrix.html#a32edb490d3597f5553152d14b102e227" title="Get the number of columns in the matrix.">coldim</a>();

        <span class="keywordflow">if</span> (i == j) <span class="keywordflow">continue</span>;

        <span class="comment">// M*i += alpha M*j and Mi* += beta Mj</span>

        <span class="comment">//int a = rand()%2;</span>
        <span class="keywordtype">int</span> a = 0;

        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> l = 0; l &lt; M.<a class="code" href="class_lin_box_1_1_dense_matrix.html#a0fee90e6b8ef7fcd8d76a7f3e1f268e6" title="Get the number of rows in the matrix.">rowdim</a>(); ++l) {

            <span class="keywordflow">if</span> (a)

                R.subin(M[l][i], M[l][j]);

            <span class="keywordflow">else</span>

                R.addin(M[l][i], M[l][j]);

            <span class="comment">//K.axpy(c, M.getEntry(l, i), x, M.getEntry(l, j));</span>
            <span class="comment">//M.setEntry(l, i, c);</span>
        }

        <span class="comment">//a = rand()%2;</span>

        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> l = 0; l &lt; M.<a class="code" href="class_lin_box_1_1_dense_matrix.html#a32edb490d3597f5553152d14b102e227" title="Get the number of columns in the matrix.">coldim</a>(); ++l) {

            <span class="keywordflow">if</span> (a)

                R.subin(M[i][l], M[j][l]);
            <span class="keywordflow">else</span>

                R.addin(M[i][l], M[j][l]);
        }
    }

    std::ofstream out(<span class="stringliteral">&quot;matrix&quot;</span>, std::ios::out);

    out &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;

    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; n; ++ i) {

        <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> j = 0; j &lt; n; ++ j) {

            R. write(out, M[i][j]);

            out &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;
        }

        out &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;

    }

    <span class="comment">//}</span>
}

<span class="comment">// special mats tref and krat</span>

<span class="comment">// Trefethen&#39;s challenge #7 mat (primes on diag, 1&#39;s on 2^e bands).</span>
<span class="keyword">template</span> &lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> TrefMat(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> n) {
    <span class="keyword">typename</span> PIR::Element zero; R.init(zero, 0);
    M.<a class="code" href="class_lin_box_1_1_dense_matrix_base.html#a0a4488dda5f370f56b9eab4fe8a54683" title="Resize the matrix to the given dimensions.">resize</a>(n, n, zero);

    std::vector&lt;int&gt; power2;

    <span class="keywordtype">int</span> i = 1;

    <span class="keywordflow">do</span> {

        power2. push_back(i);

        i *= 2;
    } <span class="keywordflow">while</span> (i &lt; n);

    std::ifstream in (<span class="stringliteral">&quot;prime&quot;</span>, std::ios::in);

    <span class="keywordflow">for</span> ( i = 0; i &lt; n; ++ i)

        in &gt;&gt; M[i][i];

    std::vector&lt;int&gt;::iterator p;

    <span class="keywordflow">for</span> ( i = 0; i &lt; n; ++ i) {

        <span class="keywordflow">for</span> ( p = power2. begin(); (p != power2. end()) &amp;&amp; (*p &lt;= i); ++ p)
            M[i][i - *p] = 1;

        <span class="keywordflow">for</span> ( p = power2. begin(); (p != power2. end()) &amp;&amp; (*p &lt; n - i); ++ p)
            M[i][i + *p] = 1;
    }

}

<span class="keyword">struct </span>pwrlist
{
    vector&lt;integer&gt; m;
    pwrlist(<a class="code" href="group__integers.html#gad62eceb96963b157a2357aba991f6d6e" title="Integers in LinBox.">integer</a> q)
    { m.push_back(1); m.push_back(q); <span class="comment">//cout &lt;&lt; &quot;pwrlist &quot; &lt;&lt; m[0] &lt;&lt; &quot; &quot; &lt;&lt; m[1] &lt;&lt; endl;</span>
    }
    <a class="code" href="group__integers.html#gad62eceb96963b157a2357aba991f6d6e" title="Integers in LinBox.">integer</a> operator[](<span class="keywordtype">int</span> e)
    {
        <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = (<span class="keywordtype">int</span>)m.size(); i &lt;= e; ++i) m.push_back(m[1]*m[i-1]);
        <span class="keywordflow">return</span> m[e];
    }
};

<span class="comment">// Read &quot;1&quot; or &quot;q&quot; or &quot;q^e&quot;, for some (small) exponent e.</span>
<span class="comment">// Return value of the power of q at q = _q.</span>
<span class="keyword">template</span> &lt;<span class="keyword">class</span> num&gt;
num&amp; qread(num&amp; Val, pwrlist&amp; M, istream&amp; in)
{
    <span class="keywordtype">char</span> c;
    in &gt;&gt; c; <span class="comment">// next nonwhitespace</span>
    <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;0&#39;</span>) <span class="keywordflow">return</span> Val = 0;
    <span class="keywordflow">if</span> (c == <span class="charliteral">&#39;1&#39;</span>) <span class="keywordflow">return</span> Val = 1;
    <span class="keywordflow">if</span> (c != <span class="charliteral">&#39;p&#39;</span> &amp;&amp; c != <span class="charliteral">&#39;q&#39;</span>) { cout &lt;&lt; <span class="stringliteral">&quot;exiting due to unknown char &quot;</span> &lt;&lt; c &lt;&lt; endl; exit(-1);}
    in.get(c);
    <span class="keywordflow">if</span> (c !=<span class="charliteral">&#39;^&#39;</span>) {in.putback(c); <span class="keywordflow">return</span> Val = M[1];}
    <span class="keywordflow">else</span>
    { <span class="keywordtype">int</span> expt; in &gt;&gt; expt;
        <span class="keywordflow">return</span> Val = M[expt];
    };
}

<span class="keyword">template</span> &lt;<span class="keyword">class</span> PIR&gt;
<span class="keywordtype">void</span> KratMat(<a class="code" href="class_lin_box_1_1_dense_matrix.html" title="Blackbox interface to dense matrix representation.">DenseMatrix&lt;PIR&gt;</a>&amp; M, PIR&amp; R, <span class="keywordtype">int</span> q, istream&amp; in)
{
    pwrlist pwrs(q);
    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; M.<a name="a15"></a><a class="code" href="class_lin_box_1_1_dense_matrix.html#a0fee90e6b8ef7fcd8d76a7f3e1f268e6" title="Get the number of rows in the matrix.">rowdim</a>(); ++ i)

        <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0; j &lt; M.<a name="a16"></a><a class="code" href="class_lin_box_1_1_dense_matrix.html#a32edb490d3597f5553152d14b102e227" title="Get the number of columns in the matrix.">coldim</a>(); ++ j) {
            <span class="keywordtype">int</span> Val;
            qread(Val, pwrs, in);
            R. init (M[i][j], Val);
        }
}

<span class="keyword">template</span>&lt;<span class="keyword">class</span> I1, <span class="keyword">class</span> Lp&gt;
<span class="keywordtype">void</span> distinct (I1 a, I1 b, Lp&amp; c)
{ <span class="keyword">typename</span> I1::value_type e;
    <span class="keywordtype">size_t</span> count = 0;
    <span class="keywordflow">if</span> (a != b) {e = *a; ++a; count = 1;}
    <span class="keywordflow">else</span> <span class="keywordflow">return</span>;
    <span class="keywordflow">while</span> (a != b)
    {  <span class="keywordflow">if</span> (*a == e) ++count;
        <span class="keywordflow">else</span>
        { c.push_back(<span class="keyword">typename</span> Lp::value_type(e, count));
            e = *a; count = 1;
        }
        ++a;
    }
    c.push_back(<span class="keyword">typename</span> Lp::value_type(e, count));
    <span class="keywordflow">return</span>;
}

<span class="keyword">template</span> &lt;<span class="keyword">class</span> I&gt;
<span class="keywordtype">void</span> display(I b, I e)
{ cout &lt;&lt; <span class="stringliteral">&quot;(&quot;</span>;
    <span class="keywordflow">for</span> (I p = b; p != e; ++p) cout &lt;&lt; p-&gt;first &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; p-&gt;second &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;
    cout &lt;&lt; <span class="stringliteral">&quot;)&quot;</span> &lt;&lt; endl;
}
</pre></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>