* Exam some simple square free factorizations.
[ginac.git] / check / exam_misc.cpp
1 /** @file exam_misc.cpp
2  *
3  */
4
5 /*
6  *  GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
7  *
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.
12  *
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.
17  *
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
21  */
22
23
24 #include "exams.h"
25
26 #define VECSIZE 30
27 static unsigned exam_expand_subs(void)
28 {
29         unsigned result = 0;
30         symbol a[VECSIZE];
31         ex e, aux;
32         
33         for (unsigned i=0; i<VECSIZE; ++i)
34                 e = e + a[i];
35         
36         // prepare aux so it will swallow anything but a1^2:
37         aux = -e + a[0] + a[1];
38         e = expand(subs(expand(pow(e, 2)), a[0] == aux));
39         
40         if (e != pow(a[1],2)) {
41                 clog << "Denny Fliegner's quick consistency check erroneously returned "
42                      << e << "." << endl;
43                 ++result;
44         }
45         
46         return result;
47 }
48
49 /*  A simple modification of Denny Fliegner's three step consistency test:
50  *  1)  e = (a0 + a1)^200
51  *  2)  expand e
52  *  3)  substitute a0 by -a1 in e
53  *  after which e should return 0 (without expanding). */
54 static unsigned exam_expand_subs2(void)
55 {
56         unsigned result = 0;
57         symbol a("a"), b("b");
58         ex e, f;
59         
60         e = pow(a+b,200).expand();
61         f = e.subs(a == -b);
62         
63         if (f != 0) {
64                 clog << "e = pow(a+b,200).expand(); f = e.subs(a == -b); erroneously returned "
65                      << f << " instead of simplifying to 0." << endl;
66                 ++result;
67         }
68         
69         return result;
70 }
71
72 static unsigned exam_expand_power(void)
73 {
74         unsigned result = 0;
75         symbol x("x"), a("a"), b("b");
76         ex e;
77         
78         e = pow(x,pow(a+b,2)-pow(a,2)-pow(b,2)-a*b*2).expand();
79         
80         if (e != 1) {
81                 clog << "e = pow(x,pow(a+b,2)-pow(a,2)-pow(b,2)-a*b*2).expand(); erroneously returned "
82                      << e << " instead of simplifying to 1." << endl;
83                 ++result;
84         }
85         
86         return result;
87 }
88
89 static unsigned exam_sqrfree(void)
90 {
91         unsigned result = 0;
92         symbol x("x"), y("y");
93         ex e1, e2;
94         
95         e1 = (1+x)*pow((2+x),2)*pow((3+x),3)*pow((4+x),4);
96         e2 = sqrfree(expand(e1),lst(x));
97         if (e1 != e2) {
98                 clog << "sqrfree(expand(" << e1 << ")) erroneously returned "
99                      << e2 << endl;
100                 ++result;
101         }
102         
103         e1 = (x+y)*pow((x+2*y),2)*pow((x+3*y),3)*pow((x+4*y),4);
104         e2 = sqrfree(expand(e1));
105         if (e1 != e2) {
106                 clog << "sqrfree(expand(" << e1 << ")) erroneously returned "
107                      << e2 << endl;
108                 ++result;
109         }
110         e2 = sqrfree(expand(e1),lst(x));
111         if (e1 != e2) {
112                 clog << "sqrfree(expand(" << e1 << "),[x]) erroneously returned "
113                      << e2 << endl;
114                 ++result;
115         }
116         e2 = sqrfree(expand(e1),lst(y));
117         if (e1 != e2) {
118                 clog << "sqrfree(expand(" << e1 << "),[y]) erroneously returned "
119                      << e2 << endl;
120                 ++result;
121         }
122         e2 = sqrfree(expand(e1),lst(x,y));
123         if (e1 != e2) {
124                 clog << "sqrfree(expand(" << e1 << "),[x,y]) erroneously returned "
125                      << e2 << endl;
126                 ++result;
127         }
128         
129         return result;
130 }
131
132 unsigned exam_misc(void)
133 {
134         unsigned result = 0;
135         
136         cout << "examining miscellaneous other things" << flush;
137         clog << "----------miscellaneous other things:" << endl;
138         
139         result += exam_expand_subs();  cout << '.' << flush;
140         result += exam_expand_subs2();  cout << '.' << flush;
141         result += exam_expand_power(); cout << '.' << flush;
142         result += exam_sqrfree(); cout << '.' << flush;
143         
144         if (!result) {
145                 cout << " passed " << endl;
146                 clog << "(no output)" << endl;
147         } else {
148                 cout << " failed " << endl;
149         }
150         
151         return result;
152 }