source: git/kernel/ring.h @ 388f91e

spielwiese
Last change on this file since 388f91e was 388f91e, checked in by Oliver Wienand <wienand@…>, 18 years ago
ring.h --> comment verbessert (minimal) kutil.cc --> homogene Ideale bleiben in Anwesenheit von Nullpolynomen nicht homogen (Nullpolynome sind nicht homogen) (Hannes: das war das Problem mit den Ordnungen, ueber das ich berichtet habe) kstd2.cc --> kurze Nullpolynome aktiviert und ein bisschen aufgeraeumt git-svn-id: file:///usr/local/Singular/svn/trunk@8997 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 10.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: ring.h,v 1.14 2006-03-07 04:48:29 wienand Exp $ */
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
18
19void   rChangeCurrRing(ring r);
20void   rSetHdl(idhdl h);
21ring   rInit(sleftv* pn, sleftv* rv, sleftv* ord);
22idhdl  rDefault(char *s);
23ring   rDefault(int ch, int N, char **n);
24#define rIsRingVar(A) r_IsRingVar(A,currRing)
25int    r_IsRingVar(const char *n, ring r);
26void   rWrite(ring r);
27void   rKill(idhdl h);
28void   rKill(ring r);
29ring   rCopy(ring r);
30ring rCopy0(ring r, BOOLEAN copy_qideal = TRUE, BOOLEAN copy_ordering = TRUE);
31void   rNameCheck(ring R);
32ring   rOpposite(ring r);
33ring   rEnvelope(ring r);
34
35
36
37
38#ifdef PDEBUG
39#define rChangeSComps(c,s,l) rDBChangeSComps(c,s,l)
40#define rGetSComps(c,s,l) rDBGetSComps(c,s,l)
41void rDBChangeSComps(int* currComponents,
42                     long* currShiftedComponents,
43                     int length,
44                     ring r = currRing);
45void rDBGetSComps(int** currComponents,
46                  long** currShiftedComponents,
47                  int *length,
48                  ring r = currRing);
49#else
50#define rChangeSComps(c,s,l) rNChangeSComps(c,s)
51#define rGetSComps(c,s,l) rNGetSComps(c,s)
52#endif
53
54void rNChangeSComps(int* currComponents, long* currShiftedComponents, ring r = currRing);
55void rNGetSComps(int** currComponents, long** currShiftedComponents, ring r = currRing);
56
57idhdl  rFindHdl(ring r, idhdl n, idhdl w);
58idhdl rSimpleFindHdl(ring r, idhdl root, idhdl n);
59const char * rSimpleOrdStr(int ord);
60int rOrderName(char * ordername);
61char * rOrdStr(ring r);
62char * rVarStr(ring r);
63char * rCharStr(ring r);
64char * rString(ring r);
65int    rChar(ring r=currRing);
66#define rPar(r) (r->P)
67#define rVar(r) (r->N)
68char * rParStr(ring r);
69int    rIsExtension(ring r);
70int    rIsExtension();
71int    rSum(ring r1, ring r2, ring &sum);
72
73BOOLEAN rEqual(ring r1, ring r2, BOOLEAN qr = 1);
74void   rUnComplete(ring r);
75
76#define  rInternalChar(r) ((r)->ch)
77
78BOOLEAN rRing_is_Homog(ring r=currRing);
79BOOLEAN rRing_has_CompLastBlock(ring r=currRing);
80
81#ifdef HAVE_RING2TOM
82inline BOOLEAN rField_is_Ring_2toM(ring r=currRing)
83{ return (r->cring == 1); }
84
85inline BOOLEAN rField_is_Zp(ring r=currRing)
86{ return (r->cring == 0) && (r->ch > 1) && (r->parameter==NULL); }
87
88inline BOOLEAN rField_is_Zp(ring r, int p)
89{ return (r->cring == 0) && (r->ch > 1 && r->ch == ABS(p) && r->parameter==NULL); }
90
91inline BOOLEAN rField_is_Q(ring r=currRing)
92{ return (r->cring == 0) && (r->ch == 0) && (r->parameter==NULL); }
93
94inline BOOLEAN rField_is_numeric(ring r=currRing) /* R, long R, long C */
95{ return (r->cring == 0) && (r->ch ==  -1); }
96
97inline BOOLEAN rField_is_R(ring r=currRing)
98{
99  if (rField_is_numeric(r) && (r->float_len <= (short)SHORT_REAL_LENGTH))
100    return (r->cring == 0) && (r->parameter==NULL);
101  return FALSE;
102}
103
104inline BOOLEAN rField_is_GF(ring r=currRing)
105{ return (r->cring == 0) && (r->ch > 1) && (r->parameter!=NULL); }
106
107inline BOOLEAN rField_is_GF(ring r, int q)
108{ return (r->cring == 0) && (r->ch == q); }
109
110inline BOOLEAN rField_is_Zp_a(ring r=currRing)
111{ return (r->cring == 0) && (r->ch < -1); }
112
113inline BOOLEAN rField_is_Zp_a(ring r, int p)
114{ return (r->cring == 0) && (r->ch < -1 ) && (-(r->ch) == ABS(p)); }
115
116inline BOOLEAN rField_is_Q_a(ring r=currRing)
117{ return (r->cring == 0) && (r->ch == 1); }
118
119inline BOOLEAN rField_is_long_R(ring r=currRing)
120{
121  if (rField_is_numeric(r) && (r->float_len >(short)SHORT_REAL_LENGTH))
122    return (r->cring == 0) && (r->parameter==NULL);
123  return FALSE;
124}
125
126inline BOOLEAN rField_is_long_C(ring r=currRing)
127{
128  if (rField_is_numeric(r))
129    return (r->cring == 0) && (r->parameter!=NULL);
130  return FALSE;
131}
132#else
133inline BOOLEAN rField_is_Zp(ring r=currRing)
134{ return (r->ch > 1) && (r->parameter==NULL); }
135
136inline BOOLEAN rField_is_Zp(ring r, int p)
137{ return (r->ch > 1 && r->ch == ABS(p) && r->parameter==NULL); }
138
139inline BOOLEAN rField_is_Q(ring r=currRing)
140{ return (r->ch == 0) && (r->parameter==NULL); }
141
142inline BOOLEAN rField_is_numeric(ring r=currRing) /* R, long R, long C */
143{ return (r->ch ==  -1); }
144
145inline BOOLEAN rField_is_R(ring r=currRing)
146{
147  if (rField_is_numeric(r) && (r->float_len <= (short)SHORT_REAL_LENGTH))
148    return (r->parameter==NULL);
149  return FALSE;
150}
151
152inline BOOLEAN rField_is_GF(ring r=currRing)
153{ return (r->ch > 1) && (r->parameter!=NULL); }
154
155inline BOOLEAN rField_is_GF(ring r, int q)
156{ return (r->ch == q); }
157
158inline BOOLEAN rField_is_Zp_a(ring r=currRing)
159{ return (r->ch < -1); }
160
161inline BOOLEAN rField_is_Zp_a(ring r, int p)
162{ return (r->ch < -1 ) && (-(r->ch) == ABS(p)); }
163
164inline BOOLEAN rField_is_Q_a(ring r=currRing)
165{ return (r->ch == 1); }
166
167inline BOOLEAN rField_is_long_R(ring r=currRing)
168{
169  if (rField_is_numeric(r) && (r->float_len >(short)SHORT_REAL_LENGTH))
170    return (r->parameter==NULL);
171  return FALSE;
172}
173
174inline BOOLEAN rField_is_long_C(ring r=currRing)
175{
176  if (rField_is_numeric(r))
177    return (r->parameter!=NULL);
178  return FALSE;
179}
180#endif
181
182inline BOOLEAN rField_has_simple_inverse(ring r=currRing)
183/* { return (r->ch>1) || (r->ch== -1); } *//* Z/p, GF(p,n), R, long_R, long_C*/
184#ifdef HAVE_RING2TOM
185{ return (r->cring==1) || (r->ch>1) || ((r->ch== -1) && (r->float_len < 10)); } /* Z/2^n, Z/p, GF(p,n), R, long_R, long_C*/
186#else
187{ return (r->ch>1) || ((r->ch== -1) && (r->float_len < 10)); } /* Z/p, GF(p,n), R, long_R, long_C*/
188#endif
189
190inline BOOLEAN rField_has_simple_Alloc(ring r=currRing)
191#ifdef HAVE_RING2TOM
192{ return (rField_is_Ring_2toM(r) || rField_is_Zp(r) || rField_is_GF(r) || rField_is_R(r)); }
193#else
194{ return (rField_is_Zp(r) || rField_is_GF(r) || rField_is_R(r)); }
195#endif
196
197/* Z/p, GF(p,n), R: nCopy, nNew, nDelete are dummies*/
198inline BOOLEAN rField_is_Extension(ring r=currRing)
199{ return (rField_is_Q_a(r)) || (rField_is_Zp_a(r)); } /* Z/p(a) and Q(a)*/
200
201n_coeffType rFieldType(ring r);
202
203// this needs to be called whenever a new ring is created: new fields
204// in ring are created (like VarOffset), unless they already exist
205// with force == 1, new fields are _always_ created (overwritten),
206// even if they exist
207BOOLEAN rComplete(ring r, int force = 0);
208// use this to free fields created by rComplete
209
210BOOLEAN nc_rComplete(ring src, ring dest);
211
212void rUnComplete(ring r);
213inline int rBlocks(ring r)
214{
215  int i=0;
216  while (r->order[i]!=0) i++;
217  return i+1;
218}
219
220// misc things
221inline char* rRingVar(short i)
222{
223  return currRing->names[i];
224}
225inline char* rRingVar(short i, ring r)
226{
227  return r->names[i];
228}
229inline BOOLEAN rShortOut(ring r)
230{
231  return (r->ShortOut);
232}
233
234// order stuff
235typedef enum rRingOrder_t
236{
237  ringorder_no = 0,
238  ringorder_a,
239  ringorder_a64, // for int64 weights
240  ringorder_c,
241  ringorder_C,
242  ringorder_M,
243  ringorder_S,
244  ringorder_s,
245  ringorder_lp,
246  ringorder_dp,
247  ringorder_rp,
248  ringorder_Dp,
249  ringorder_wp,
250  ringorder_Wp,
251  ringorder_ls,
252  ringorder_ds,
253  ringorder_Ds,
254  ringorder_ws,
255  ringorder_Ws,
256  ringorder_L,
257  // the following are only used internally
258  ringorder_aa, // for idElimination, like a, except pFDeg, pWeigths ignore it
259  ringorder_unspec
260} rRingOrder_t;
261
262typedef enum rOrderType_t
263{
264  rOrderType_General = 0, // non-simple ordering as specified by currRing
265  rOrderType_CompExp,     // simple ordering, component has priority
266  rOrderType_ExpComp,     // simple ordering, exponent vector has priority
267                          // component not compatible with exp-vector order
268  rOrderType_Exp,         // simple ordering, exponent vector has priority
269                          // component is compatible with exp-vector order
270  rOrderType_Syz,         // syzygy ordering
271  rOrderType_Schreyer,    // Schreyer ordering
272  rOrderType_Syz2dpc,     // syzcomp2dpc
273  rOrderType_ExpNoComp    // simple ordering, differences in component are
274                          // not considered
275} rOrderType_t;
276
277inline BOOLEAN rIsSyzIndexRing(ring r)
278{ return r->order[0] == ringorder_s;}
279
280inline int rGetCurrSyzLimit(ring r = currRing)
281{ return (r->order[0] == ringorder_s ?
282          r->typ[0].data.syz.limit : 0);}
283
284// Ring Manipulations
285ring   rCurrRingAssure_SyzComp();
286void   rSetSyzComp(int k);
287ring   rCurrRingAssure_dp_S();
288ring   rCurrRingAssure_dp_C();
289ring   rCurrRingAssure_C_dp();
290// makes sure that c/C ordering is last ordering
291ring   rCurrRingAssure_CompLastBlock();
292// makes sure that c/C ordering is last ordering and SyzIndex is first
293ring   rCurrRingAssure_SyzComp_CompLastBlock();
294
295// return the max-comonent wchich has syzIndex i
296// Assume: i<= syzIndex_limit
297int rGetMaxSyzComp(int i);
298
299BOOLEAN rHasSimpleOrder(ring r);
300// returns TRUE, if simple lp or ls ordering
301BOOLEAN rHasSimpleLexOrder(ring r);
302// return TRUE if p->exp[r->pOrdIndex] holds total degree of p */
303BOOLEAN rOrd_is_Totaldegree_Ordering(ring r =currRing);
304// return TRUE if p_SetComp requires p_Setm
305BOOLEAN rOrd_SetCompRequiresSetm(ring r);
306rOrderType_t    rGetOrderType(ring r);
307/* returns TRUE if var(i) belongs to p-block */
308BOOLEAN rIsPolyVar(int i, ring r = currRing);
309
310inline BOOLEAN rOrd_is_Comp_dp(ring r)
311{
312  return ((r->order[0] == ringorder_c || r->order[0] == ringorder_C) &&
313          r->order[1] == ringorder_dp &&
314          r->order[2] == 0);
315}
316
317#ifdef HAVE_PLURAL
318inline BOOLEAN rIsPluralRing(ring r)
319{
320  return ((r != NULL) && (r->nc != NULL));
321}
322#else
323#define rIsPluralRing(r)  (0)
324#endif
325
326#ifdef RDEBUG
327#define rTest(r)    rDBTest(r, __FILE__, __LINE__)
328extern BOOLEAN rDBTest(ring r, char* fn, int l);
329#else
330#define rTest(r)
331#endif
332
333ring rModifyRing(ring r, BOOLEAN omit_degree,
334                         BOOLEAN omit_comp,
335                         unsigned long exp_limit);
336// construct Wp, C ring
337ring rModifyRing_Wp(ring r, int* weights);
338void rModify_a_to_A(ring r);
339
340void rKillModifiedRing(ring r);
341// also frees weights
342void rKillModified_Wp_Ring(ring r);
343
344ring rModifyRing_Simple(ring r, BOOLEAN omit_degree, BOOLEAN omit_comp, unsigned long exp_limit, BOOLEAN &simple);
345void rKillModifiedRing_Simple(ring r);
346
347void rDebugPrint(ring r);
348void pDebugPrint(poly p);
349
350int64 * rGetWeightVec(ring r);
351void rSetWeightVec(ring r, int64 *wv);
352
353lists rDecompose(const ring r);
354ring rCompose(const lists  L);
355/////////////////////////////
356// Auxillary functions
357//
358
359BOOLEAN rCheckIV(intvec *iv);
360int rTypeOfMatrixOrder(intvec * order);
361void rDelete(ring r);
362
363#endif
Note: See TracBrowser for help on using the repository browser.