source: git/kernel/ring.h @ af3d2a

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