88854b29ff552d3d4222e12bc27aad44306dc86c
[ginac.git] / check / time_lw_Pprime.cpp
1 /** @file time_lw_Pprime.cpp
2  *
3  *  Test P' from the paper "Comparison of Polynomial-Oriented CAS" by Robert H.
4  *  Lewis and Michael Wester. */
5
6 /*
7  *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 #include "times.h"
25 #include "time_lw_w101n.h"
26
27 static unsigned test(void)
28 {
29     matrix m(101,101);
30     for (unsigned r=0; r<101; ++r) {
31         for (unsigned c=0; c<10; ++c) {
32             m.set(r,
33                   unsigned(ex_to_numeric(w101_numeric[r][2*c+1]).to_int()-1),
34                   w101_numeric[r][2*c+2]);
35         }
36     }
37     matrix m2(m);
38     ex a;
39     for (unsigned r=0; r<101; ++r) {
40         a = m2(r,0);
41         for (unsigned c=0; c<100; ++c) {
42             m2.set(r,c,m2(r,c+1));
43         }
44         m2.set(r,100,a);
45     }
46     for (unsigned r=0; r<101; ++r) {
47         for (unsigned c=0; c<101; ++c) {
48             if (!m(r,c).is_zero())
49                 m2.set(r,c,m(r,c));
50         }
51     }
52     ex det = m2.determinant();
53     
54     if (det!=numeric("140816284877507872414776")) {
55         clog << "det of less sparse rank 101 matrix erroneously returned " << det << endl;
56         return 1;
57     }
58     return 0;
59 }
60
61 unsigned time_lw_Pprime(void)
62 {
63     unsigned result = 0;
64     unsigned count = 1;
65     timer rolex;
66     double time = .0;
67     
68     cout << "timing Lewis-Wester test P' (det of less sparse rank 101)" << flush;
69     clog << "-------Lewis-Wester test P' (det of less sparse rank 101)" << endl;
70     
71     rolex.start();
72     // correct for very small times:
73     do {
74         result = test();
75         ++count;
76     } while ((time=rolex.read())<0.1 && !result);
77     cout << '.' << flush;
78     
79     if (!result) {
80         cout << " passed ";
81         clog << "(no output)" << endl;
82     } else {
83         cout << " failed ";
84     }
85     cout << int(1000*(time/count))*0.001 << 's' << endl;
86     
87     return result;
88 }