source: git/kernel/GBEngine/ringgb.cc @ b3594cb

fieker-DuValspielwiese
Last change on this file since b3594cb was 8e8744, checked in by Hans Schoenemann <hannes@…>, 18 months ago
fix: (number)0 is not valid for generic cf
  • Property mode set to 100644
File size: 6.2 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: ringgb interface
6*/
7//#define HAVE_TAIL_RING
8#define NO_BUCKETS
9
10#include "kernel/mod2.h"
11#include "kernel/GBEngine/kutil.h"
12#include "kernel/structs.h"
13#include "kernel/polys.h"
14#include "polys/monomials/p_polys.h"
15#include "kernel/ideals.h"
16#include "kernel/GBEngine/kstd1.h"
17#include "kernel/GBEngine/khstd.h"
18#include "polys/kbuckets.h"
19#include "polys/weight.h"
20#include "misc/intvec.h"
21#include "kernel/polys.h"
22#ifdef HAVE_PLURAL
23#include "polys/nc/nc.h"
24#endif
25
26#include "kernel/GBEngine/ringgb.h"
27
28#ifdef HAVE_RINGS
29poly reduce_poly_fct(poly p, ring r)
30{
31   return kFindZeroPoly(p, r, r);
32}
33
34/*
35 * Returns maximal k, such that
36 * 2^k | n
37 */
38int indexOf2(number n)
39{
40  long test = (long) n;
41  int i = 0;
42  while (test%2 == 0)
43  {
44    i++;
45    test = test / 2;
46  }
47  return i;
48}
49
50/***************************************************************
51 *
52 * Lcm business
53 *
54 ***************************************************************/
55// get m1 = LCM(LM(p1), LM(p2))/LM(p1)
56//     m2 = LCM(LM(p1), LM(p2))/LM(p2)
57BOOLEAN ring2toM_GetLeadTerms(const poly p1, const poly p2, const ring p_r,
58                               poly &m1, poly &m2, const ring m_r)
59{
60  int i;
61  int x;
62  m1 = p_Init(m_r);
63  m2 = p_Init(m_r);
64
65  for (i = p_r->N; i; i--)
66  {
67    x = p_GetExpDiff(p1, p2, i, p_r);
68    if (x > 0)
69    {
70      p_SetExp(m2,i,x, m_r);
71      p_SetExp(m1,i,0, m_r);
72    }
73    else
74    {
75      p_SetExp(m1,i,-x, m_r);
76      p_SetExp(m2,i,0, m_r);
77    }
78  }
79  p_Setm(m1, m_r);
80  p_Setm(m2, m_r);
81  long cp1 = (long) pGetCoeff(p1);
82  long cp2 = (long) pGetCoeff(p2);
83  if (cp1 != 0 && cp2 != 0)
84  {
85    while (cp1%2 == 0 && cp2%2 == 0)
86    {
87      cp1 = cp1 / 2;
88      cp2 = cp2 / 2;
89    }
90  }
91  p_SetCoeff(m1, (number) cp2, m_r);
92  p_SetCoeff(m2, (number) cp1, m_r);
93  return TRUE;
94}
95
96void printPolyMsg(const char * start, poly f, const char * end)
97{
98  PrintS(start);
99  wrp(f);
100  PrintS(end);
101}
102
103poly spolyRing2toM(poly f, poly g, ring r)
104{
105  poly m1 = NULL;
106  poly m2 = NULL;
107  ring2toM_GetLeadTerms(f, g, r, m1, m2, r);
108  // printPolyMsg("spoly: m1=", m1, " | ");
109  // printPolyMsg("m2=", m2, "");
110  // PrintLn();
111  poly sp = pSub(p_Mult_mm(f, m1, r), pp_Mult_mm(g, m2, r));
112  pDelete(&m1);
113  pDelete(&m2);
114  return(sp);
115}
116
117poly ringRedNF (poly f, ideal G, ring r)
118{
119  // If f = 0, then normal form is also 0
120  if (f == NULL) { return NULL; }
121  poly h = NULL;
122  poly g = pCopy(f);
123  int c = 0;
124  while (g != NULL)
125  {
126    Print("%d-step RedNF - g=", c);
127    wrp(g);
128    PrintS(" | h=");
129    wrp(h);
130    PrintLn();
131    g = ringNF(g, G, r);
132    if (g != NULL) {
133      h = pAdd(h, pHead(g));
134      pLmDelete(&g);
135    }
136    c++;
137  }
138  return h;
139}
140
141#endif
142
143#ifdef HAVE_RINGS
144
145/*
146 * Find an index i from G, such that
147 * LT(rside) = x * LT(G[i]) has a solution
148 * or -1 if rside is not in the
149 * ideal of the leading coefficients
150 * of the suitable g from G.
151 */
152int findRingSolver(poly rside, ideal G, ring r)
153{
154  if (rside == NULL) return -1;
155  int i;
156//  int iO2rside = indexOf2(pGetCoeff(rside));
157  for (i = 0; i < IDELEMS(G); i++)
158  {
159    if // (indexOf2(pGetCoeff(G->m[i])) <= iO2rside &&    / should not be necessary any more
160       (p_LmDivisibleBy(G->m[i], rside, r))
161    {
162      return i;
163    }
164  }
165  return -1;
166}
167
168poly plain_spoly(poly f, poly g)
169{
170  number cf = nCopy(pGetCoeff(f)), cg = nCopy(pGetCoeff(g));
171  (void)ksCheckCoeff(&cf, &cg, currRing->cf); // gcd and zero divisors
172  poly fm, gm;
173  k_GetLeadTerms(f, g, currRing, fm, gm, currRing);
174  pSetCoeff0(fm, cg);
175  pSetCoeff0(gm, cf);  // and now, m1 * LT(p1) == m2 * LT(p2)
176  poly sp = pSub(ppMult_mm(f, fm), ppMult_mm(g, gm));
177  pDelete(&fm);
178  pDelete(&gm);
179  return(sp);
180}
181
182/*2
183* Generates spoly(0, h) if applicable. Assumes ring has zero divisors
184*/
185poly plain_zero_spoly(poly h)
186{
187  poly p = NULL;
188  number zero=n_Init(0,currRing->cf);
189  number gcd = n_Gcd(zero, pGetCoeff(h), currRing->cf);
190  if (!n_IsOne( gcd,  currRing->cf ))
191  {
192    number tmp=n_Ann(gcd,currRing->cf);
193    p = p_Copy(h->next, currRing);
194    p = __p_Mult_nn(p, tmp, currRing);
195    n_Delete(&tmp,currRing->cf);
196  }
197   n_Delete(&zero,currRing->cf);
198  return p;
199}
200
201poly ringNF(poly f, ideal G, ring r)
202{
203  // If f = 0, then normal form is also 0
204  if (f == NULL) { return NULL; }
205  poly tmp = NULL;
206  poly h = pCopy(f);
207  int i = findRingSolver(h, G, r);
208  int c = 1;
209  while (h != NULL && i >= 0) {
210//    Print("%d-step NF - h:", c);
211//    wrp(h);
212//    PrintS(" ");
213//    PrintS("G->m[i]:");
214//    wrp(G->m[i]);
215//    PrintLn();
216    tmp = h;
217    h = plain_spoly(h, G->m[i]);
218    pDelete(&tmp);
219//    PrintS("=> h=");
220//    wrp(h);
221//    PrintLn();
222    i = findRingSolver(h, G, r);
223    c++;
224  }
225  return h;
226}
227
228int testGB(ideal I, ideal GI) {
229  poly f, g, h, nf;
230  int i = 0;
231  int j = 0;
232  PrintS("I included?");
233  for (i = 0; i < IDELEMS(I); i++) {
234    if (ringNF(I->m[i], GI, currRing) != NULL) {
235      PrintS("Not reduced to zero from I: ");
236      wrp(I->m[i]);
237      PrintS(" --> ");
238      wrp(ringNF(I->m[i], GI, currRing));
239      PrintLn();
240      return(0);
241    }
242    PrintS("-");
243  }
244  PrintS(" Yes!\nspoly --> 0?");
245  for (i = 0; i < IDELEMS(GI); i++)
246  {
247    for (j = i + 1; j < IDELEMS(GI); j++)
248    {
249      f = pCopy(GI->m[i]);
250      g = pCopy(GI->m[j]);
251      h = plain_spoly(f, g);
252      nf = ringNF(h, GI, currRing);
253      if (nf != NULL)
254      {
255        PrintS("spoly(");
256        wrp(GI->m[i]);
257        PrintS(", ");
258        wrp(GI->m[j]);
259        PrintS(") = ");
260        wrp(h);
261        PrintS(" --> ");
262        wrp(nf);
263        PrintLn();
264        return(0);
265      }
266      pDelete(&f);
267      pDelete(&g);
268      pDelete(&h);
269      pDelete(&nf);
270      PrintS("-");
271    }
272  }
273  if (!(rField_is_Domain(currRing)))
274  {
275    PrintS(" Yes!\nzero-spoly --> 0?");
276    for (i = 0; i < IDELEMS(GI); i++)
277    {
278      f = plain_zero_spoly(GI->m[i]);
279      nf = ringNF(f, GI, currRing);
280      if (nf != NULL) {
281        PrintS("spoly(");
282        wrp(GI->m[i]);
283        PrintS(", ");
284        wrp(0);
285        PrintS(") = ");
286        wrp(h);
287        PrintS(" --> ");
288        wrp(nf);
289        PrintLn();
290        return(0);
291      }
292      pDelete(&f);
293      pDelete(&nf);
294      PrintS("-");
295    }
296  }
297  PrintS(" Yes!");
298  PrintLn();
299  return(1);
300}
301
302#endif
Note: See TracBrowser for help on using the repository browser.