source: git/factory/int_poly.h @ 9ee586

spielwiese
Last change on this file since 9ee586 was abddbe, checked in by Martin Lee <martinlee84@…>, 10 years ago
chg: added brief descriptions to some files
  • Property mode set to 100644
File size: 5.5 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2
3#ifndef INCL_INT_POLY_H
4#define INCL_INT_POLY_H
5
6/**
7 * @file int_poly.h
8 *
9 * Factory's internal polynomials
10**/
11
12// #include "config.h"
13
14#ifndef NOSTREAMIO
15#ifdef HAVE_IOSTREAM
16#include <iostream>
17#define OSTREAM std::ostream
18#elif defined(HAVE_IOSTREAM_H)
19#include <iostream.h>
20#define OSTREAM ostream
21#endif
22#endif /* NOSTREAMIO */
23
24#include "cf_defs.h"
25#include "int_cf.h"
26#include "variable.h"
27#include "canonicalform.h"
28
29#ifdef HAVE_OMALLOC
30#ifndef OM_NDEBUG
31#define OM_NDEBUG
32#endif
33#  include <omalloc/omalloc.h>
34#endif
35
36class term {
37private:
38    term * next;
39    CanonicalForm coeff;
40    int exp;
41#ifdef HAVE_OMALLOC
42  static const omBin term_bin;
43#endif
44public:
45    term() : next(0), coeff(0), exp(0) {}
46    term( term * n, const CanonicalForm & c, int e ) : next(n), coeff(c), exp(e) {}
47    friend class InternalPoly;
48    friend class CFIterator;
49#ifdef HAVE_OMALLOC
50  void* operator new(size_t)
51    {
52      void* addr;
53      omTypeAllocBin(void*, addr, term_bin);
54      return addr;
55    }
56  void operator delete(void* addr, size_t)
57    {
58      omFreeBin(addr, term_bin);
59    }
60#endif
61};
62
63typedef term * termList;
64
65
66/**
67 * factory's class for polynomials
68 *
69 * polynomials are represented as a linked list termList, factory
70 * uses a sparse distributive representation of polynomials, i.e. each poly
71 * is viewed as a univariate poly in its main variable CanonicalForm::mvar()
72 * over a (polynomial) ring
73**/
74class InternalPoly : public InternalCF {
75private:
76    termList firstTerm, lastTerm;
77    Variable var;
78    InternalPoly( termList, termList, const Variable & );
79
80    static termList copyTermList ( termList, termList&, bool negate = false );
81    static termList deepCopyTermList ( termList, termList& );
82    static void freeTermList ( termList );
83    static void negateTermList ( termList );
84    static termList addTermList ( termList, termList, termList&, bool negate );
85    static void mulTermList ( termList, const CanonicalForm& , const int );
86    static termList divideTermList ( termList, const CanonicalForm&, termList& );
87    static termList divTermList ( termList, const CanonicalForm&, termList& );
88    static termList tryDivTermList ( termList, const CanonicalForm&, termList&, const CanonicalForm&, bool& );
89    static termList modTermList ( termList, const CanonicalForm&, termList& );
90    static void appendTermList ( termList&, termList&, const CanonicalForm&, const int );
91    static termList mulAddTermList ( termList theList, termList aList, const CanonicalForm & c, const int exp, termList & lastTerm, bool negate );
92    static termList reduceTermList ( termList first, termList redterms, termList & last );
93public:
94    InternalPoly();
95    InternalPoly( const Variable & v, const int e, const CanonicalForm& c );
96    InternalPoly( const InternalPoly& );
97    ~InternalPoly();
98    InternalCF* deepCopyObject() const;
99    const char * classname() const { return "InternalPoly"; }
100    int level() const { return var.level(); }
101    Variable variable() const { return var; }
102    int degree();
103    CanonicalForm lc();
104    CanonicalForm Lc();
105    CanonicalForm LC();
106    int taildegree();
107    CanonicalForm tailcoeff();
108    CanonicalForm coeff( int i );
109#ifndef NOSTREAMIO
110    void print( OSTREAM&, char* );
111#endif /* NOSTREAMIO */
112    bool inBaseDomain() const { return false; }
113    bool inExtension() const { return var.level() < 0; }
114    bool inCoeffDomain() const { return var.level() < 0; }
115    bool inPolyDomain() const { return var.level() > 0; }
116    bool inQuotDomain() const { return false; }
117    InternalCF* genZero();
118    InternalCF* genOne();
119
120    bool isUnivariate() const;
121
122    InternalCF* neg();
123    InternalCF* invert();
124    InternalCF* tryInvert( const CanonicalForm&, bool& );
125    int comparesame ( InternalCF* );
126
127    InternalCF* addsame( InternalCF* );
128    InternalCF* subsame( InternalCF* );
129    InternalCF* mulsame( InternalCF* );
130    InternalCF* tryMulsame ( InternalCF*, const CanonicalForm&);
131    InternalCF* dividesame( InternalCF* );
132    InternalCF* modulosame( InternalCF* );
133    InternalCF* divsame( InternalCF* );
134    InternalCF* tryDivsame ( InternalCF*, const CanonicalForm&, bool& );
135    InternalCF* modsame( InternalCF* );
136    void divremsame( InternalCF*, InternalCF*&, InternalCF*& );
137    bool divremsamet( InternalCF*, InternalCF*&, InternalCF*& );
138    bool tryDivremsamet( InternalCF*, InternalCF*&, InternalCF*&, const CanonicalForm&, bool& );
139
140    int comparecoeff ( InternalCF* );
141
142    InternalCF* addcoeff( InternalCF* );
143    InternalCF* subcoeff( InternalCF*, bool );
144    InternalCF* mulcoeff( InternalCF* );
145    InternalCF* dividecoeff( InternalCF*, bool );
146    InternalCF* tryDividecoeff ( InternalCF*, bool, const CanonicalForm&, bool& );
147    InternalCF* modulocoeff( InternalCF*, bool );
148    InternalCF* divcoeff( InternalCF*, bool );
149    InternalCF* tryDivcoeff ( InternalCF*, bool, const CanonicalForm&, bool& );
150    InternalCF* modcoeff( InternalCF*, bool );
151    void divremcoeff( InternalCF*, InternalCF*&, InternalCF*&, bool );
152    bool divremcoefft( InternalCF*, InternalCF*&, InternalCF*&, bool );
153    bool tryDivremcoefft ( InternalCF*, InternalCF*&, InternalCF*&, bool, const CanonicalForm&, bool& );
154
155    int sign() const;
156
157#ifdef HAVE_OMALLOC
158  static const omBin InternalPoly_bin;
159  void* operator new(size_t)
160    {
161      void* addr;
162      omTypeAllocBin(void*, addr, InternalPoly_bin);
163      return addr;
164    }
165  void operator delete(void* addr, size_t)
166    {
167      omFreeBin(addr, InternalPoly_bin);
168    }
169#endif
170    friend class CFIterator;
171};
172
173#endif /* ! INCL_INT_POLY_H */
Note: See TracBrowser for help on using the repository browser.