source: git/polys/monomials/ring.h @ 208cd5

fieker-DuValspielwiese
Last change on this file since 208cd5 was 879cc3c, checked in by Mohamed Barakat <mohamed.barakat@…>, 14 years ago
monmials: . data structures, allocation/deallocation, comparing monomials tests for monomials, Setm, Degree operations: . operations on polynomials as lists (e.g. length, Maps, Sort, ...) templates: . templates for inline procedures and code to generate them ext_fields: . quotient fields of polynomial rings and algebraic extensions
  • Property mode set to 100644
File size: 13.2 KB
Line 
1#ifndef RING_H
2#define RING_H
3/****************************************
4*  Computer Algebra System SINGULAR     *
5****************************************/
6/*
7* ABSTRACT - the interpreter related ring operations
8*/
9/* $Id$ */
10
11/* includes */
12#include <coeffs.h>
13#include "polys-impl.h"
14
15#define SHORT_REAL_LENGTH 6 // use short reals for real <= 6 digits
16
17// #ifdef HAVE_PLURAL
18#if 0
19enum nc_type
20{
21  nc_error = -1, // Something's gone wrong!
22  nc_general = 0, /* yx=q xy+... */
23  nc_skew, /*1*/ /* yx=q xy */
24  nc_comm, /*2*/ /* yx= xy */
25  nc_lie,  /*3*/ /* yx=xy+... */
26  nc_undef, /*4*/  /* for internal reasons */
27
28  nc_exterior /*5*/ // Exterior Algebra(SCA): yx= -xy & (!:) x^2 = 0
29};
30#endif
31// #endif
32
33enum tHomog
34{
35   isNotHomog = FALSE,
36   isHomog    = TRUE,
37   testHomog
38};
39
40//extern ring      currRing;
41//extern ideal     currQuotient;
42//extern idhdl      currRingHdl;
43
44
45void   rChangeCurrRing(ring r);
46void   rSetHdl(idhdl h);
47ring   rInit(sleftv* pn, sleftv* rv, sleftv* ord);
48idhdl  rDefault(const char *s);
49ring   rDefault(int ch, int N, char **n);
50ring rDefault(int ch, int N, char **n,int ord_size, int *ord, int *block0, int *block1);
51
52#define rIsRingVar(A) r_IsRingVar(A,currRing)
53int    r_IsRingVar(const char *n, ring r);
54void   rWrite(ring r);
55void   rKill(idhdl h);
56void   rKill(ring r);
57ring   rCopy(ring r);
58ring   rCopy0(const ring r, BOOLEAN copy_qideal = TRUE, BOOLEAN copy_ordering = TRUE);
59ring   rOpposite(ring r);
60ring   rEnvelope(ring r);
61
62/// we must always have this test!
63static inline bool rIsPluralRing(const ring r)
64{
65#ifdef HAVE_PLURAL
66  nc_struct *n;
67  return (r != NULL) && ((n=r->GetNC()) != NULL) /*&& (n->type != nc_error)*/; 
68#else
69  return false;
70#endif
71}
72
73static inline bool rIsRatGRing(const ring r)
74{
75#ifdef HAVE_PLURAL
76  /* nc_struct *n; */
77  return (r != NULL) /* && ((n=r->GetNC()) != NULL) */
78          && (r->real_var_start>1);
79#else
80  return false;
81#endif
82}
83
84
85
86
87// The following are for LaScala3 only!
88#ifdef PDEBUG
89#define rChangeSComps(c,s,l) rDBChangeSComps(c,s,l)
90#define rGetSComps(c,s,l) rDBGetSComps(c,s,l)
91void rDBChangeSComps(int* currComponents,
92                     long* currShiftedComponents,
93                     int length,
94                     ring r = currRing);
95void rDBGetSComps(int** currComponents,
96                  long** currShiftedComponents,
97                  int *length,
98                  ring r = currRing);
99#else
100#define rChangeSComps(c,s,l) rNChangeSComps(c,s)
101#define rGetSComps(c,s,l) rNGetSComps(c,s)
102#endif
103
104void rNChangeSComps(int* currComponents, long* currShiftedComponents, ring r = currRing);
105void rNGetSComps(int** currComponents, long** currShiftedComponents, ring r = currRing);
106
107idhdl  rFindHdl(ring r, idhdl n, idhdl w);
108idhdl rSimpleFindHdl(ring r, idhdl root, idhdl n);
109const char * rSimpleOrdStr(int ord);
110int rOrderName(char * ordername);
111char * rOrdStr(ring r);
112char * rVarStr(ring r);
113char * rCharStr(ring r);
114char * rString(ring r);
115int    rChar(ring r=currRing);
116#define rPar(r) (r->P)
117#define rVar(r) (r->N)
118char * rParStr(ring r);
119int    rIsExtension(const ring r=currRing);
120int    rSum(ring r1, ring r2, ring &sum);
121int rSumInternal(ring r1, ring r2, ring &sum, BOOLEAN vartest, BOOLEAN dp_dp);
122
123BOOLEAN rEqual(ring r1, ring r2, BOOLEAN qr = 1);
124BOOLEAN rSamePolyRep(ring r1, ring r2);
125void   rUnComplete(ring r);
126
127#define  rInternalChar(r) ((r)->ch)
128
129BOOLEAN rRing_is_Homog(ring r=currRing);
130BOOLEAN rRing_has_CompLastBlock(ring r=currRing);
131
132#ifdef HAVE_RINGS
133static inline BOOLEAN rField_is_Ring_2toM(ring r=currRing)
134{ return (r->ringtype == 1); }
135
136static inline BOOLEAN rField_is_Ring_ModN(ring r=currRing)
137{ return (r->ringtype == 2); }
138
139static inline BOOLEAN rField_is_Ring_PtoM(ring r=currRing)
140{ return (r->ringtype == 3); }
141
142static inline BOOLEAN rField_is_Ring_Z(ring r=currRing)
143{ return (r->ringtype == 4); }
144
145static inline BOOLEAN rField_is_Ring(ring r=currRing)
146{ return (r->ringtype != 0); }
147
148static inline BOOLEAN rField_is_Domain(ring r=currRing)
149{ return (r->ringtype == 4 || r->ringtype == 0); }
150
151static inline BOOLEAN rField_has_Units(ring r=currRing)
152{ return ((r->ringtype == 1) || (r->ringtype == 2) || (r->ringtype == 3)); }
153#else
154#define rField_is_Ring(A) (0)
155#define rField_is_Ring_2toM(A) (0)
156#define rField_is_Ring_ModN(A) (0)
157#define rField_is_Ring_PtoM(A) (0)
158#define rField_is_Ring_Z(A) (0)
159#define rField_is_Domain(A) (1)
160#define rField_has_Units(A) (1)
161#endif
162
163#ifdef HAVE_RINGS
164static inline BOOLEAN rField_is_Zp(ring r=currRing)
165{ return (r->ringtype == 0) && (r->ch > 1) && (r->parameter==NULL); }
166
167static inline BOOLEAN rField_is_Zp(ring r, int p)
168{ return (r->ringtype == 0) && (r->ch > 1 && r->ch == ABS(p) && r->parameter==NULL); }
169
170static inline BOOLEAN rField_is_Q(ring r=currRing)
171{ return (r->ringtype == 0) && (r->ch == 0) && (r->parameter==NULL); }
172
173static inline BOOLEAN rField_is_numeric(ring r=currRing) /* R, long R, long C */
174{ return (r->ringtype == 0) && (r->ch ==  -1); }
175
176static inline BOOLEAN rField_is_R(ring r=currRing)
177{
178  if (rField_is_numeric(r) && (r->float_len <= (short)SHORT_REAL_LENGTH))
179    return (r->ringtype == 0) && (r->parameter==NULL);
180  return FALSE;
181}
182
183static inline BOOLEAN rField_is_GF(ring r=currRing)
184{ return (r->ringtype == 0) && (r->ch > 1) && (r->parameter!=NULL); }
185
186static inline BOOLEAN rField_is_GF(ring r, int q)
187{ return (r->ringtype == 0) && (r->ch == q); }
188
189static inline BOOLEAN rField_is_Zp_a(ring r=currRing)
190{ return (r->ringtype == 0) && (r->ch < -1); }
191
192static inline BOOLEAN rField_is_Zp_a(ring r, int p)
193{ return (r->ringtype == 0) && (r->ch < -1 ) && (-(r->ch) == ABS(p)); }
194
195static inline BOOLEAN rField_is_Q_a(ring r=currRing)
196{ return (r->ringtype == 0) && (r->ch == 1); }
197
198static inline BOOLEAN rField_is_long_R(ring r=currRing)
199{
200  if (rField_is_numeric(r) && (r->float_len >(short)SHORT_REAL_LENGTH))
201    return (r->ringtype == 0) && (r->parameter==NULL);
202  return FALSE;
203}
204
205static inline BOOLEAN rField_is_long_C(ring r=currRing)
206{
207  if (rField_is_numeric(r))
208    return (r->ringtype == 0) && (r->parameter!=NULL);
209  return FALSE;
210}
211#else
212static inline BOOLEAN rField_is_Zp(ring r=currRing)
213{ return (r->ch > 1) && (r->parameter==NULL); }
214
215static inline BOOLEAN rField_is_Zp(ring r, int p)
216{ return (r->ch > 1 && r->ch == ABS(p) && r->parameter==NULL); }
217
218static inline BOOLEAN rField_is_Q(ring r=currRing)
219{ return (r->ch == 0) && (r->parameter==NULL); }
220
221static inline BOOLEAN rField_is_numeric(ring r=currRing) /* R, long R, long C */
222{ return (r->ch ==  -1); }
223
224static inline BOOLEAN rField_is_R(ring r=currRing)
225{
226  if (rField_is_numeric(r) && (r->float_len <= (short)SHORT_REAL_LENGTH))
227    return (r->parameter==NULL);
228  return FALSE;
229}
230
231static inline BOOLEAN rField_is_GF(ring r=currRing)
232{ return (r->ch > 1) && (r->parameter!=NULL); }
233
234static inline BOOLEAN rField_is_GF(ring r, int q)
235{ return (r->ch == q); }
236
237static inline BOOLEAN rField_is_Zp_a(ring r=currRing)
238{ return (r->ch < -1); }
239
240static inline BOOLEAN rField_is_Zp_a(ring r, int p)
241{ return (r->ch < -1 ) && (-(r->ch) == ABS(p)); }
242
243static inline BOOLEAN rField_is_Q_a(ring r=currRing)
244{ return (r->ch == 1); }
245
246static inline BOOLEAN rField_is_long_R(ring r=currRing)
247{
248  if (rField_is_numeric(r) && (r->float_len >(short)SHORT_REAL_LENGTH))
249    return (r->parameter==NULL);
250  return FALSE;
251}
252
253static inline BOOLEAN rField_is_long_C(ring r=currRing)
254{
255  if (rField_is_numeric(r))
256    return (r->parameter!=NULL);
257  return FALSE;
258}
259#endif
260
261static inline BOOLEAN rField_has_simple_inverse(ring r=currRing)
262/* { return (r->ch>1) || (r->ch== -1); } *//* Z/p, GF(p,n), R, long_R, long_C*/
263#ifdef HAVE_RINGS
264{ return (r->ringtype > 0) || (r->ch>1) || ((r->ch== -1) && (r->float_len < 10)); } /* Z/2^n, Z/p, GF(p,n), R, long_R, long_C*/
265#else
266{ return (r->ch>1) || ((r->ch== -1) && (r->float_len < 10)); } /* Z/p, GF(p,n), R, long_R, long_C*/
267#endif
268
269static inline BOOLEAN rField_has_simple_Alloc(ring r=currRing)
270{ return (rField_is_Zp(r)
271       || rField_is_GF(r)
272#ifdef HAVE_RINGS
273       || rField_is_Ring_2toM(r)
274#endif
275       || rField_is_R(r)); }
276
277/* Z/p, GF(p,n), R: nCopy, nNew, nDelete are dummies*/
278static inline BOOLEAN rField_is_Extension(ring r=currRing)
279{ return (rField_is_Q_a(r)) || (rField_is_Zp_a(r)); } /* Z/p(a) and Q(a)*/
280
281n_coeffType rFieldType(ring r);
282
283/// this needs to be called whenever a new ring is created: new fields
284/// in ring are created (like VarOffset), unless they already exist
285/// with force == 1, new fields are _always_ created (overwritten),
286/// even if they exist
287BOOLEAN rComplete(ring r, int force = 0);
288// use this to free fields created by rComplete //?
289
290static inline int rBlocks(ring r)
291{
292  int i=0;
293  while (r->order[i]!=0) i++;
294  return i+1;
295}
296
297// misc things
298static inline char* rRingVar(short i)
299{
300  return currRing->names[i];
301}
302static inline char* rRingVar(short i, ring r)
303{
304  return r->names[i];
305}
306static inline BOOLEAN rShortOut(ring r)
307{
308  return (r->ShortOut);
309}
310
311/// order stuff
312typedef enum rRingOrder_t
313{
314  ringorder_no = 0,
315  ringorder_a,
316  ringorder_a64, ///< for int64 weights
317  ringorder_c,
318  ringorder_C,
319  ringorder_M,
320  ringorder_S, ///< S?
321  ringorder_s, ///< s?
322  ringorder_lp,
323  ringorder_dp,
324  ringorder_rp,
325  ringorder_Dp,
326  ringorder_wp,
327  ringorder_Wp,
328  ringorder_ls,
329  ringorder_ds,
330  ringorder_Ds,
331  ringorder_ws,
332  ringorder_Ws,
333  ringorder_L,
334  // the following are only used internally
335  ringorder_aa, ///< for idElimination, like a, except pFDeg, pWeigths ignore it
336  ringorder_rs, ///< ???
337  ringorder_IS, ///< Induced (Schreyer) ordering
338  ringorder_unspec
339} rRingOrder_t;
340
341typedef enum rOrderType_t
342{
343  rOrderType_General = 0, ///< non-simple ordering as specified by currRing
344  rOrderType_CompExp,     ///< simple ordering, component has priority
345  rOrderType_ExpComp,     ///< simple ordering, exponent vector has priority
346                          ///< component not compatible with exp-vector order
347  rOrderType_Exp,         ///< simple ordering, exponent vector has priority
348                          ///< component is compatible with exp-vector order
349  rOrderType_Syz,         ///< syzygy ordering
350  rOrderType_Schreyer,    ///< Schreyer ordering
351  rOrderType_Syz2dpc,     ///< syzcomp2dpc
352  rOrderType_ExpNoComp    ///< simple ordering, differences in component are
353                          ///< not considered
354} rOrderType_t;
355
356static inline BOOLEAN rIsSyzIndexRing(const ring r)
357{ return r->order[0] == ringorder_s;}
358
359static inline int rGetCurrSyzLimit(const ring r = currRing)
360{ return (rIsSyzIndexRing(r)? r->typ[0].data.syz.limit : 0);}
361
362// Ring Manipulations
363ring   rAssure_HasComp(ring r);
364ring   rCurrRingAssure_SyzComp();
365void   rSetSyzComp(int k);
366ring   rCurrRingAssure_dp_S();
367ring   rCurrRingAssure_dp_C();
368ring   rCurrRingAssure_C_dp();
369
370/// makes sure that c/C ordering is last ordering
371ring   rCurrRingAssure_CompLastBlock();
372
373/// makes sure that c/C ordering is last ordering and SyzIndex is first
374ring   rCurrRingAssure_SyzComp_CompLastBlock();
375ring rAssure_TDeg(ring r, int start_var, int end_var, int &pos);
376
377/// return the max-comonent wchich has syzIndex i
378/// Assume: i<= syzIndex_limit
379int rGetMaxSyzComp(int i);
380
381BOOLEAN rHasSimpleOrder(const ring r);
382
383/// returns TRUE, if simple lp or ls ordering
384BOOLEAN rHasSimpleLexOrder(const ring r);
385
386// return TRUE if p->exp[r->pOrdIndex] holds total degree of p */
387//inline BOOLEAN rHasGlobalOrdering(const ring r=currRing)
388//{ return (r->OrdSgn==1); }
389#define rHasGlobalOrdering(R) ((R)->OrdSgn==1)
390#define rHasGlobalOrdering_currRing() (pOrdSgn==1)
391//inline BOOLEAN rHasLocalOrMixedOrdering(const ring r=currRing)
392//{ return (r->OrdSgn==-1); }
393#define rHasLocalOrMixedOrdering(R) ((R)->OrdSgn==-1)
394#define rHasLocalOrMixedOrdering_currRing() (pOrdSgn==-1)
395BOOLEAN rOrd_is_Totaldegree_Ordering(ring r =currRing);
396
397/// return TRUE if p_SetComp requires p_Setm
398BOOLEAN rOrd_SetCompRequiresSetm(ring r);
399rOrderType_t    rGetOrderType(ring r);
400
401/// returns TRUE if var(i) belongs to p-block
402BOOLEAN rIsPolyVar(int i, ring r = currRing);
403
404static inline BOOLEAN rOrd_is_Comp_dp(ring r)
405{
406  return ((r->order[0] == ringorder_c || r->order[0] == ringorder_C) &&
407          r->order[1] == ringorder_dp &&
408          r->order[2] == 0);
409}
410
411#ifdef RDEBUG
412#define rTest(r)    rDBTest(r, __FILE__, __LINE__)
413extern BOOLEAN rDBTest(ring r, const char* fn, const int l);
414#else
415#define rTest(r)
416#endif
417
418ring rModifyRing(ring r, BOOLEAN omit_degree,
419                         BOOLEAN omit_comp,
420                         unsigned long exp_limit);
421
422/// construct Wp, C ring
423ring rModifyRing_Wp(ring r, int* weights);
424void rModify_a_to_A(ring r);
425
426void rKillModifiedRing(ring r);
427// also frees weights
428void rKillModified_Wp_Ring(ring r);
429
430ring rModifyRing_Simple(ring r, BOOLEAN omit_degree, BOOLEAN omit_comp, unsigned long exp_limit, BOOLEAN &simple);
431void rKillModifiedRing_Simple(ring r);
432
433#ifdef RDEBUG
434void rDebugPrint(ring r);
435void pDebugPrint(poly p);
436void p_DebugPrint(poly p, const ring r);
437#endif
438
439#ifndef NDEBUG
440/// debug-print at most nTerms (2 by default) terms from poly/vector p,
441/// assuming that lt(p) lives in lmRing and tail(p) lives in tailRing.
442void p_DebugPrint(const poly p, const ring lmRing, const ring tailRing, const int nTerms = 2);
443#endif
444
445int64 * rGetWeightVec(ring r);
446void rSetWeightVec(ring r, int64 *wv);
447
448lists rDecompose(const ring r);
449ring rCompose(const lists  L);
450/////////////////////////////
451// Auxillary functions
452//
453
454BOOLEAN rCheckIV(intvec *iv);
455int rTypeOfMatrixOrder(intvec * order);
456void rDelete(ring r);
457
458extern omBin sip_sring_bin;
459#endif
Note: See TracBrowser for help on using the repository browser.