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