source: git/kernel/ring.h @ 91f1a3

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