source: git/Singular/maps_ip.cc @ 9ae5a3

fieker-DuValspielwiese
Last change on this file since 9ae5a3 was 9ae5a3, checked in by Hans Schoenemann <hannes@…>, 6 years ago
add: polyBucket stuff
  • Property mode set to 100644
File size: 11.4 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT - the mapping of polynomials to other rings
6*/
7#define TRANSEXT_PRIVATES
8
9#include "kernel/mod2.h"
10#include "omalloc/omalloc.h"
11
12#include "coeffs/numbers.h"
13#include "coeffs/coeffs.h"
14
15#include "polys/monomials/ring.h"
16#include "polys/monomials/maps.h"
17#include "polys/matpol.h"
18#include "polys/prCopy.h"
19#include "polys/ext_fields/transext.h"
20
21//#include "polys/ext_fields/longtrans.h"
22// #include "kernel/longalg.h"
23
24#include "misc/options.h"
25#include "kernel/GBEngine/kstd1.h"
26#include "kernel/maps/gen_maps.h"
27
28#include "maps_ip.h"
29#include "ipid.h"
30
31
32#include "lists.h"
33#include "tok.h"
34
35/* debug output: Tok2Cmdname in maApplyFetch*/
36#include "ipshell.h"
37
38/*2
39* maps the expression w to res,
40* switch what: MAP_CMD: use theMap for mapping, N for preimage ring
41*              //FETCH_CMD: use pOrdPoly for mapping
42*              IMAP_CMD: use perm for mapping, N for preimage ring
43*              default: map only poly-structures,
44*                       use perm and par_perm, N and P,
45*/
46BOOLEAN maApplyFetch(int what,map theMap,leftv res, leftv w, ring preimage_r,
47                     int *perm, int *par_perm, int P, nMapFunc nMap)
48{
49  BOOLEAN use_mult=FALSE;
50#ifdef HAVE_PLURAL
51  if ((what==IMAP_CMD)
52  && rIsPluralRing(currRing)
53  && rIsPluralRing(preimage_r))
54  {
55    assume(perm!=NULL);
56    int i=1;
57    while((i<currRing->N)&&(perm[i]==0)) i++;
58    if (i<currRing->N)
59    {
60      int prev_nonnull=i;
61      i++;
62      for(;i<=currRing->N;i++)
63      {
64        if (perm[prev_nonnull] > perm[i])
65        {
66          if (TEST_V_ALLWARN)
67          {
68            Warn("imap not usable for permuting variables, use map (%s <-> %s)",currRing->names[prev_nonnull-1],currRing->names[i-1]);
69          }
70          use_mult=TRUE;
71          break;
72        }
73        else
74          prev_nonnull=i;
75      }
76    }
77  }
78#endif
79  int i;
80  int N = preimage_r->N;
81#if 0
82  Print("N=%d what=%s ",N,Tok2Cmdname(what));
83  if (perm!=NULL) for(i=1;i<=N;i++) Print("%d -> %d ",i,perm[i]);
84  PrintS("\n");
85  Print("P=%d ",P);
86  if (par_perm!=NULL) for(i=0;i<P;i++) Print("%d -> %d ",i,par_perm[i]);
87  PrintS("\n");
88#endif
89
90  void *data=w->Data();
91  res->rtyp = w->rtyp;
92  switch (w->rtyp)
93  {
94    case NUMBER_CMD:
95      if (P!=0)
96      {
97// poly n_PermNumber(const number z, const int *par_perm, const int OldPar, const ring src, const ring dst);
98        res->data= (void *) n_PermNumber((number)data, par_perm, P, preimage_r, currRing);
99        res->rtyp=POLY_CMD;
100        if (nCoeff_is_algExt(currRing->cf))
101          res->data=(void *)p_MinPolyNormalize((poly)res->data, currRing);
102        pTest((poly) res->data);
103      }
104      else
105      {
106        assume( nMap != NULL );
107        number a = nMap((number)data, preimage_r->cf, currRing->cf);
108        if (nCoeff_is_Extension(currRing->cf))
109        {
110          n_Normalize(a, currRing->cf);
111/*
112          number a = (number)res->data;
113          number one = nInit(1);
114          number product = nMult(a, one );
115          nDelete(&one);
116          nDelete(&a);
117          res->data=(void *)product;
118 */
119        }
120        #ifdef LDEBUG
121        n_Test(a, currRing->cf);
122        #endif
123        res->data=(void *)a;
124
125      }
126      break;
127    case BUCKET_CMD:
128      if ((what==FETCH_CMD)&& (preimage_r->cf==currRing->cf))
129        res->data=(void *)prCopyR(sBucketPeek((sBucket_pt)data), preimage_r, currRing);
130      else
131        if ( (what==IMAP_CMD) || /*(*/ (what==FETCH_CMD) /*)*/) /* && (nMap!=nCopy)*/
132        res->data=(void *)p_PermPoly(sBucketPeek((sBucket_pt)data),perm,preimage_r,currRing, nMap,par_perm,P,use_mult);
133      else /*if (what==MAP_CMD)*/
134      {
135        matrix s=mpNew(N,maMaxDeg_P(sBucketPeek((sBucket_pt)data), preimage_r));
136        res->data=(void *)maEval(theMap, sBucketPeek((sBucket_pt)data), preimage_r, nMap, (ideal)s, currRing);
137        idDelete((ideal *)&s);
138      }
139      if (nCoeff_is_Extension(currRing->cf))
140        res->data=(void *)p_MinPolyNormalize(sBucketPeek((sBucket_pt)data), currRing);
141      break;
142    case POLY_CMD:
143    case VECTOR_CMD:
144      if ((what==FETCH_CMD)&& (preimage_r->cf==currRing->cf))
145        res->data=(void *)prCopyR( (poly)data, preimage_r, currRing);
146      else
147        if ( (what==IMAP_CMD) || /*(*/ (what==FETCH_CMD) /*)*/) /* && (nMap!=nCopy)*/
148        res->data=(void *)p_PermPoly((poly)data,perm,preimage_r,currRing, nMap,par_perm,P,use_mult);
149      else /*if (what==MAP_CMD)*/
150      {
151        p_Test((poly)data,preimage_r);
152        matrix s=mpNew(N,maMaxDeg_P((poly)data, preimage_r));
153        res->data=(void *)maEval(theMap, (poly)data, preimage_r, nMap, (ideal)s, currRing);
154        idDelete((ideal *)&s);
155      }
156      if (nCoeff_is_Extension(currRing->cf))
157        res->data=(void *)p_MinPolyNormalize((poly)res->data, currRing);
158      pTest((poly)res->data);
159      break;
160    case MODUL_CMD:
161    case MATRIX_CMD:
162    case IDEAL_CMD:
163    case MAP_CMD:
164    {
165      int C=((matrix)data)->cols();
166      int R;
167      if (w->rtyp==MAP_CMD) R=1;
168      else R=((matrix)data)->rows();
169      matrix m=mpNew(R,C);
170      char *tmpR=NULL;
171      if(w->rtyp==MAP_CMD)
172      {
173        tmpR=((map)data)->preimage;
174        ((matrix)data)->rank=((matrix)data)->rows();
175      }
176      if ((what==FETCH_CMD)&& (preimage_r->cf == currRing->cf))
177      {
178        for (i=R*C-1;i>=0;i--)
179        {
180          m->m[i]=prCopyR(((ideal)data)->m[i], preimage_r, currRing);
181          pTest(m->m[i]);
182        }
183      }
184      else if ((what==IMAP_CMD) || (what==FETCH_CMD))
185      {
186        for (i=R*C-1;i>=0;i--)
187        {
188          m->m[i]=p_PermPoly(((ideal)data)->m[i],perm,preimage_r,currRing,
189                          nMap,par_perm,P,use_mult);
190          pTest(m->m[i]);
191        }
192      }
193      else /* (what==MAP_CMD) */
194      {
195        assume(what==MAP_CMD);
196        matrix s=mpNew(N,maMaxDeg_Ma((ideal)data,preimage_r));
197        for (i=R*C-1;i>=0;i--)
198        {
199          m->m[i]=maEval(theMap, ((ideal)data)->m[i], preimage_r, nMap, (ideal)s, currRing);
200          pTest(m->m[i]);
201        }
202        idDelete((ideal *)&s);
203      }
204      if (nCoeff_is_algExt(currRing->cf))
205      {
206        for (i=R*C-1;i>=0;i--)
207        {
208          m->m[i]=p_MinPolyNormalize(m->m[i], currRing);
209          pTest(m->m[i]);
210        }
211      }
212      if(w->rtyp==MAP_CMD)
213      {
214        ((map)data)->preimage=tmpR;
215        ((map)m)->preimage=omStrDup(tmpR);
216      }
217      else
218      {
219        m->rank=((matrix)data)->rank;
220      }
221      res->data=(char *)m;
222      idTest((ideal) m);
223      break;
224    }
225
226    case LIST_CMD:
227    {
228      lists l=(lists)data;
229      lists ml=(lists)omAllocBin(slists_bin);
230      ml->Init(l->nr+1);
231      for(i=0;i<=l->nr;i++)
232      {
233        if (((l->m[i].rtyp>BEGIN_RING)&&(l->m[i].rtyp<END_RING))
234        ||(l->m[i].rtyp==LIST_CMD))
235        {
236          if (maApplyFetch(what,theMap,&ml->m[i],&l->m[i],
237                           preimage_r,perm,par_perm,P,nMap))
238          {
239            ml->Clean();
240            omFreeBin((ADDRESS)ml, slists_bin);
241            res->rtyp=0;
242            return TRUE;
243          }
244        }
245        else
246        {
247          ml->m[i].Copy(&l->m[i]);
248        }
249      }
250      res->data=(char *)ml;
251      break;
252    }
253    default:
254    {
255      return TRUE;
256    }
257  }
258  return FALSE;
259}
260
261/*2
262* substitutes the parameter par (from 1..N) by image,
263* does not destroy p and  image
264*/
265poly pSubstPar(poly p, int par, poly image)
266{
267  const ring R = currRing->cf->extRing;
268  ideal theMapI = idInit(rPar(currRing),1);
269  nMapFunc nMap = n_SetMap(R->cf, currRing->cf);
270  int i;
271  for(i = rPar(currRing);i>0;i--)
272  {
273    if (i != par)
274      theMapI->m[i-1]= p_NSet(n_Param(i, currRing), currRing);
275    else
276      theMapI->m[i-1] = p_Copy(image, currRing);
277    p_Test(theMapI->m[i-1],currRing);
278  }
279  //iiWriteMatrix((matrix)theMapI,"map:",1,currRing,0);
280
281  map theMap=(map)theMapI;
282  theMap->preimage=NULL;
283
284  leftv v=(leftv)omAllocBin(sleftv_bin);
285  sleftv tmpW;
286  poly res=NULL;
287
288  p_Normalize(p,currRing);
289  if (currRing->cf->rep==n_rep_rat_fct )
290  {
291    while (p!=NULL)
292    {
293      memset(v,0,sizeof(sleftv));
294
295      number d = n_GetDenom(pGetCoeff(p), currRing->cf);
296      p_Test((poly)NUM((fraction)d), R);
297
298      if ( n_IsOne (d, currRing->cf) )
299      {
300        n_Delete(&d, currRing->cf); d = NULL;
301      }
302      else if (!p_IsConstant((poly)NUM((fraction)d), R))
303      {
304        WarnS("ignoring denominators of coefficients...");
305        n_Delete(&d, currRing->cf); d = NULL;
306      }
307
308      number num = n_GetNumerator(pGetCoeff(p), currRing->cf);
309      memset(&tmpW,0,sizeof(sleftv));
310      tmpW.rtyp = POLY_CMD;
311      p_Test((poly)NUM((fraction)num), R);
312
313      tmpW.data = NUM ((fraction)num); // a copy of this poly will be used
314
315      p_Normalize(NUM((fraction)num),R);
316      if (maApplyFetch(MAP_CMD,theMap,v,&tmpW,R,NULL,NULL,0,nMap))
317      {
318        WerrorS("map failed");
319        v->data=NULL;
320      }
321      n_Delete(&num, currRing->cf);
322      //TODO check for memory leaks
323      poly pp = pHead(p);
324      //PrintS("map:");pWrite(pp);
325      if( d != NULL )
326      {
327        pSetCoeff(pp, n_Invers(d, currRing->cf));
328        n_Delete(&d, currRing->cf); // d = NULL;
329      }
330      else
331        pSetCoeff(pp, nInit(1));
332
333      //PrintS("->");pWrite((poly)(v->data));
334      poly ppp = pMult((poly)(v->data),pp);
335      //PrintS("->");pWrite(ppp);
336      res=pAdd(res,ppp);
337      pIter(p);
338    }
339  }
340  else if (currRing->cf->rep==n_rep_poly )
341  {
342    while (p!=NULL)
343    {
344      memset(v,0,sizeof(sleftv));
345
346      number num = n_GetNumerator(pGetCoeff(p), currRing->cf);
347      memset(&tmpW,0,sizeof(sleftv));
348      tmpW.rtyp = POLY_CMD;
349      p_Test((poly)num, R);
350
351
352      p_Normalize((poly)num,R);
353      if (num==NULL) num=(number)R->qideal->m[0];
354      tmpW.data = num; // a copy of this poly will be used
355      if (maApplyFetch(MAP_CMD,theMap,v,&tmpW,R,NULL,NULL,0,nMap))
356      {
357        WerrorS("map failed");
358        v->data=NULL;
359      }
360      if (num!=(number)R->qideal->m[0]) n_Delete(&num, currRing->cf);
361      //TODO check for memory leaks
362      poly pp = pHead(p);
363      //PrintS("map:");pWrite(pp);
364      pSetCoeff(pp,n_Init(1,currRing->cf));
365      //PrintS("cf->");pWrite((poly)(v->data));
366      poly ppp = pMult((poly)(v->data),pp);
367      //PrintS("->");pWrite(ppp);
368      res=pAdd(res,ppp);
369      pIter(p);
370    }
371  }
372  else
373  {
374    WerrorS("cannot apply subst for these coeffcients");
375  }
376  idDelete((ideal *)(&theMap));
377  omFreeBin((ADDRESS)v, sleftv_bin);
378  return res;
379}
380
381/*2
382* substitute the n-th parameter by the poly e in id
383* does not destroy id and e
384*/
385ideal  idSubstPar(ideal id, int n, poly e)
386{
387  int k=MATROWS((matrix)id)*MATCOLS((matrix)id);
388  ideal res=(ideal)mpNew(MATROWS((matrix)id),MATCOLS((matrix)id));
389
390  res->rank = id->rank;
391  for(k--;k>=0;k--)
392  {
393    res->m[k]=pSubstPar(id->m[k],n,e);
394  }
395  return res;
396}
397
398/*2
399* substitutes the variable var (from 1..N) by image,
400* does not destroy p and  image
401*/
402poly pSubstPoly(poly p, int var, poly image)
403{
404  if (p==NULL) return NULL;
405#ifdef HAVE_PLURAL
406  if (rIsPluralRing(currRing))
407  {
408    return pSubst(pCopy(p),var,image);
409  }
410#endif
411  return p_SubstPoly(p,var,image,currRing,currRing,ndCopyMap);
412}
413
414/*2
415* substitute the n-th variable by the poly e in id
416* does not destroy id and e
417*/
418ideal  idSubstPoly(ideal id, int n, poly e)
419{
420
421#ifdef HAVE_PLURAL
422  if (rIsPluralRing(currRing))
423  {
424    int k=MATROWS((matrix)id)*MATCOLS((matrix)id);
425    ideal res=(ideal)mpNew(MATROWS((matrix)id),MATCOLS((matrix)id));
426    res->rank = id->rank;
427    for(k--;k>=0;k--)
428    {
429      res->m[k]=pSubst(pCopy(id->m[k]),n,e);
430    }
431    return res;
432  }
433#endif
434  return id_SubstPoly(id,n,e,currRing,currRing,ndCopyMap);
435}
Note: See TracBrowser for help on using the repository browser.