1 #ifndef GRING_SA_MULT_FORMULA_H
2 #define GRING_SA_MULT_FORMULA_H
3 /*****************************************
4  *  Computer Algebra System SINGULAR     *
5  *****************************************/
6 #ifdef HAVE_PLURAL
7 
8 // //////////////////////////////////////////////////////////////////////// //
9 
10 #include "polys/monomials/ring.h"
11 #include "polys/nc/nc.h"
12 
13 bool ncInitSpecialPowersMultiplication(ring r);
14 
15 enum Enum_ncSAType
16 {
17   _ncSA_notImplemented = -1,
18   _ncSA_1xy0x0y0 = 0x00, // commutative
19   _ncSA_Mxy0x0y0 = 0x01, // anti-commutative
20   _ncSA_Qxy0x0y0 = 0x02, // quasi-commutative
21   _ncSA_1xyAx0y0 = 0x10, // shift 1
22   _ncSA_1xy0xBy0 = 0x20, // shift 2
23   _ncSA_1xy0x0yG = 0x30, // Weyl
24   _ncSA_1xy0x0yT2 = 0x100 // homogenized Weyl algebra?
25 };
26 
27 class CFormulaPowerMultiplier
28 {
29   private:
30     Enum_ncSAType* m_SAPairTypes; // upper triangular submatrix of pairs 1 <= i < j <= N of a N x N matrix.
31 
32     const int m_NVars;
33     const ring m_BaseRing;
34 
35 
36 
37   public:
NVars()38     inline int NVars() const { return m_NVars; }
GetBasering()39     inline ring GetBasering() const { return m_BaseRing; }
40 
41     CFormulaPowerMultiplier(ring r);
42     virtual ~CFormulaPowerMultiplier();
43 
GetPair(int i,int j)44     inline Enum_ncSAType GetPair(int i, int j) const
45     {
46       assume( m_SAPairTypes != NULL );
47       assume( i > 0 );
48       assume( i < j );
49       assume( j <= NVars() );
50 
51       return m_SAPairTypes[( (NVars() * ((i)-1) - ((i) * ((i)-1))/2 + (j)-1) - (i) )];
52     }
53 
GetPair(int i,int j)54     inline Enum_ncSAType& GetPair(int i, int j)
55     {
56       assume( m_SAPairTypes != NULL );
57       assume( i > 0 );
58       assume( i < j );
59       assume( j <= NVars() );
60 
61       return m_SAPairTypes[( (NVars() * ((i)-1) - ((i) * ((i)-1))/2 + (j)-1) - (i) )];
62     }
63 
64     // Lowest level routines!
65     static Enum_ncSAType AnalyzePair(const ring r, int i, int j);
66     static poly Multiply( Enum_ncSAType type, const int i, const int j, const int n, const int m, const ring r);
67 
68     static poly ncSA_1xy0x0y0(const int i, const int j, const int n, const int m, const ring r);
69     static poly ncSA_Mxy0x0y0(const int i, const int j, const int n, const int m, const ring r);
70 
71     static poly ncSA_Qxy0x0y0(const int i, const int j, const int n, const int m, const number m_q, const ring r);
72 
73     static poly ncSA_1xy0x0yG(const int i, const int j, const int n, const int m, const number m_g, const ring r);
74     static poly ncSA_1xy0x0yT2(const int i, const int j, const int n, const int m, const int k, const ring r);
75 
76     static poly ncSA_1xyAx0y0(const int i, const int j, const int n, const int m, const number m_shiftCoef, const ring r);
77     static poly ncSA_1xy0xBy0(const int i, const int j, const int n, const int m, const number m_shiftCoef, const ring r);
78 
79 
80 
81     // Higher level abstraction for keeping track of all the pair types!
82     poly Multiply( int i, int j, const int n, const int m);
83 
84   private: // no copy constuctors!
85     CFormulaPowerMultiplier();
86     CFormulaPowerMultiplier(const CFormulaPowerMultiplier&);
87     CFormulaPowerMultiplier& operator=(const CFormulaPowerMultiplier&);
88 
89 
90 };
91 
92 
GetFormulaPowerMultiplier(const ring r)93 static inline CFormulaPowerMultiplier* GetFormulaPowerMultiplier(const ring r)
94 {
95   return r->GetNC()->GetFormulaPowerMultiplier();
96 }
97 
98 
99 
100 
101 #endif // HAVE_PLURAL :(
102 #endif //
103