source: git/kernel/ring.h @ 4d9fa54

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