00001
00002
00003
00004
00005
00006
00007
00008 #ifndef COOPER_H_
00009 #define COOPER_H_
00010
00011 #include <set>
00012 using namespace std;
00013 #include "bignum.h"
00014
00015 class CNode;
00016 class Term;
00017
00018 class Cooper {
00019 private:
00020 CNode* c;
00021 Term* elim_t;
00022 bignum delta;
00023 set<Term*> a_terms;
00024 set<Term*> b_terms;
00025 CNode* res;
00026
00027 public:
00028 Cooper(CNode* c, Term* elim_t);
00029 CNode* get_result();
00030 ~Cooper();
00031 private:
00032
00033
00034
00035
00036
00037 void remove_coefficients();
00038
00039 void collect_coefficients(CNode* c, set<bignum>& coefficients);
00040
00041 bignum get_lcm(set<bignum>& coefs);
00042
00043 CNode* normalize_coefficients(CNode* c, bignum lcm);
00044
00045
00046
00047
00048
00049 bignum compute_delta();
00050 bignum compute_delta_rec(bignum delta, CNode* c);
00051
00052
00053
00054
00055 void compute_a_and_b_terms(CNode* c, bool in_neg);
00056
00057
00058
00059
00060
00061 CNode* compute_infinite_projection(CNode* c, bool left,
00062 Term* rt);
00063
00064
00065
00066
00067 };
00068
00069 #endif