1 /** @file check_matrices.cpp
3 * Here we test manipulations on GiNaC's symbolic matrices. */
6 * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 /* determinants of some sparse symbolic matrices with coefficients in
26 * an integral domain. */
27 static unsigned integdom_matrix_determinants(void)
32 for (int size=3; size<20; ++size) {
34 for (int r=0; r<size-1; ++r) {
35 // populate one element in each row:
36 A.set(r,unsigned(rand()%size),dense_univariate_poly(a,5));
38 for (int c=0; c<size; ++c) {
39 // set the last line to a linear combination of two other lines
40 // to guarantee that the determinant is zero:
41 A.set(size-1,c,A(0,c)-A(size-2,c));
43 if (!A.determinant().is_zero()) {
44 clog << "Determinant of " << size << "x" << size << " matrix "
46 << "was not found to vanish!" << endl;
54 /* determinants of some sparse symbolic matrices with multivariate rational
55 * function coefficients. */
56 static unsigned rational_matrix_determinants(void)
59 symbol a("a"), b("b"), c("c");
61 for (int size=3; size<8; ++size) {
63 for (int r=0; r<size-1; ++r) {
64 // populate one element in each row:
65 ex numer = sparse_tree(a, b, c, 4, false, false, false);
68 denom = sparse_tree(a, b, c, 1, false, false, false);
69 } while (denom.is_zero());
70 A.set(r,unsigned(rand()%size),numer/denom);
72 for (int c=0; c<size; ++c) {
73 // set the last line to a linear combination of two other lines
74 // to guarantee that the determinant is zero:
75 A.set(size-1,c,A(0,c)-A(size-2,c));
77 if (!A.determinant().is_zero()) {
78 clog << "Determinant of " << size << "x" << size << " matrix "
80 << "was not found to vanish!" << endl;
88 /* Some quite wild determinants with functions and stuff like that. */
89 static unsigned wild_matrix_determinants(void)
92 symbol a("a"), b("b"), c("c");
94 for (int size=3; size<6; ++size) {
96 for (int r=0; r<size-1; ++r) {
97 // populate one element in each row:
98 ex numer = sparse_tree(a, b, c, 3, true, true, false);
101 denom = sparse_tree(a, b, c, 1, false, true, false);
102 } while (denom.is_zero());
103 A.set(r,unsigned(rand()%size),numer/denom);
105 for (int c=0; c<size; ++c) {
106 // set the last line to a linear combination of two other lines
107 // to guarantee that the determinant is zero:
108 A.set(size-1,c,A(0,c)-A(size-2,c));
110 if (!A.determinant().is_zero()) {
111 clog << "Determinant of " << size << "x" << size << " matrix "
113 << "was not found to vanish!" << endl;
121 unsigned check_matrices(void)
125 cout << "checking symbolic matrix manipulations" << flush;
126 clog << "---------symbolic matrix manipulations:" << endl;
128 result += integdom_matrix_determinants(); cout << '.' << flush;
129 result += rational_matrix_determinants(); cout << '.' << flush;
130 result += wild_matrix_determinants(); cout << '.' << flush;
133 cout << " passed " << endl;
134 clog << "(no output)" << endl;
136 cout << " failed " << endl;