1 /****************************************
2 *  Computer Algebra System SINGULAR     *
3 ****************************************/
4 /***************************************************************
5  *  File:    find_perm.cc
6  *  Purpose: is a map a permuation ?
7  *  Author:  hannes
8  *  Created: 16/01
9  *******************************************************************/
10 
11 
12 
13 #include "kernel/mod2.h"
14 #include "polys/monomials/p_polys.h"
15 #include "kernel/ideals.h"
16 #include "polys/monomials/ring.h"
17 #include "kernel/maps/find_perm.h"
18 
find_perm_for_map(const ring preimage_r,const ring image_r,const ideal image)19 static int* find_perm_for_map(const ring preimage_r, const ring image_r, const ideal image)
20 {
21   int i;
22   int *perm=(int *)omAlloc0((preimage_r->N+1)*sizeof(int));
23   for (i=si_min(IDELEMS(image),preimage_r->N)-1; i>=0; i--)
24   {
25     if (image->m[i]!=NULL)
26     {
27       if((pNext(image->m[i])==NULL)
28       && (n_IsOne(pGetCoeff(image->m[i]),image_r->cf)))
29       {
30         int v=p_IsUnivariate(image->m[i],image_r);
31         if (v<=0) /*not univariate */
32         {
33           omFreeSize(perm,(preimage_r->N+1)*sizeof(int));
34           return NULL;
35         }
36         else if (v>0) /* image is univaritate */
37         {
38           if (p_GetExp(image->m[i],v,image_r)==1)
39           {
40             perm[i+1]=v; /* and of exp 1 */
41           }
42           else
43           {
44             omFreeSize(perm,(preimage_r->N+1)*sizeof(int));
45             return NULL;
46           }
47         }
48       }
49       else /* image is not a monomial */
50       {
51         omFreeSize(perm,(preimage_r->N+1)*sizeof(int));
52         return NULL;
53       }
54     }
55   }
56   //Print("elms:%d, N:%d\n",IDELEMS(image),preimage_r->N);
57   //iiWriteMatrix((matrix)image,"_",1,image_r,0);
58   //PrintS("\npreimage:\n");rWrite(preimage_r);
59   //PrintS("image:\n");rWrite(image_r);
60   //PrintS("\nperm:");
61   //for (i=1; i<=preimage_r->N; i++)
62   //{
63   //  Print(" %d",perm[i]);
64   //}
65   //PrintLn();
66   return perm;
67 }
68 
ma_ApplyPermForMap(const matrix to_map,const ring preimage_r,const ideal image,const ring image_r,const nMapFunc nMap)69 matrix ma_ApplyPermForMap(const matrix to_map, const ring preimage_r,
70          const ideal image, const ring image_r, const nMapFunc nMap)
71 {
72   if ((rPar(preimage_r)>0)||(rPar(image_r)>0)) return NULL; /* not applicable */
73   int *perm=find_perm_for_map(preimage_r,image_r,image);
74   if (perm==NULL) return NULL; /* could not find permutation */
75   int C=to_map->cols();
76   int R=to_map->rows();
77   matrix m=mpNew(R,C);
78   for (int i=R*C-1;i>=0;i--)
79   {
80     if (to_map->m[i]!=NULL)
81     {
82       m->m[i]=p_PermPoly(to_map->m[i],perm,preimage_r,image_r, nMap,NULL,0);
83       p_Test(m->m[i],image_r);
84     }
85   }
86   ideal ii=(ideal)m;
87   ii->rank=((ideal)to_map)->rank;
88   omFreeSize(perm,(preimage_r->N+1)*sizeof(int));
89   return m;
90 }
91 
92