7e156487bc10f16e1dad4a3fdef4572ad2786907
[ginac.git] / check / exam_factor.cpp
1 /** @file exam_factor.cpp
2  *
3  *  Factorization test suite. */
4
5 /*
6  *  GiNaC Copyright (C) 1999-2008 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  */
22
23 #include <iostream>
24 #include "ginac.h"
25 using namespace std;
26 using namespace GiNaC;
27
28 static symbol w("w"), x("x"), y("y"), z("z");
29
30 static unsigned check_factor(const ex& e)
31 {
32         ex ee = e.expand();
33         ex answer = factor(ee);
34         if ( answer.expand() != ee || answer != e ) {
35                 clog << "factorization of " << e << " == " << ee << " gave wrong result: " << answer << endl;
36                 return 1;
37         }
38         return 0;
39 }
40
41 static unsigned exam_factor1()
42 {
43         unsigned result = 0;
44         ex e, d;
45         symbol x("x");
46         lst syms;
47         syms.append(x);
48         
49         e = ex("1+x-x^3", syms);
50         result += check_factor(e);
51
52         e = ex("1+x^6+x", syms);
53         result += check_factor(e);
54
55         e = ex("1-x^6+x", syms);
56         result += check_factor(e);
57
58         e = ex("(1+x)^3", syms);
59         result += check_factor(e);
60
61         e = ex("(x+1)*(x+4)", syms);
62         result += check_factor(e);
63
64         e = ex("x^6-3*x^5+x^4-3*x^3-x^2-3*x+1", syms);
65         result += check_factor(e);
66
67         e = ex("(-1+x)^3*(1+x)^3*(1+x^2)", syms);
68         result += check_factor(e);
69
70         e = ex("-(-168+20*x-x^2)*(30+x)", syms);
71         result += check_factor(e);
72
73         e = ex("x^2*(x-3)^2*(x^3-5*x+7)", syms);
74         result += check_factor(e);
75
76         e = ex("-6*x^2*(x-3)", syms);
77         result += check_factor(e);
78
79         e = ex("x^16+11*x^4+121", syms);
80         result += check_factor(e);
81
82         e = ex("x^8-40*x^6+352*x^4-960*x^2+576", syms);
83         result += check_factor(e);
84
85         e = ex("x*(2+x^2)*(1+x+x^3+x^2+x^6+x^5+x^4)*(1+x)^2*(1-x+x^2)^2*(-1+x)", syms);
86         result += check_factor(e);
87
88         e = ex("(x+4+x^2-x^3+43*x^4)*(x+1-x^2-3*x^3+4*x^4)", syms);
89         result += check_factor(e);
90
91         e = ex("-x^2*(x-1)*(1+x^2)", syms);
92         result += check_factor(e);
93
94         e = x;
95         result += check_factor(e);
96
97         return result;
98 }
99
100 unsigned exam_factor()
101 {
102         unsigned result = 0;
103
104         cout << "examining polynomial factorization" << flush;
105
106         result += exam_factor1(); cout << '.' << flush;
107
108         return result;
109 }
110
111 int main(int argc, char** argv)
112 {
113         return exam_factor();
114 }