1 | /**************************************** |
---|
2 | * Computer Algebra System SINGULAR * |
---|
3 | ****************************************/ |
---|
4 | /*************************************************************** |
---|
5 | * File: find_perm.cc |
---|
6 | * Purpose: is a map a permutation ? |
---|
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 | |
---|
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 | |
---|
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 | |
---|