source: git/kernel/ring.h @ 98a77e

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