source: git/kernel/maps/find_perm.cc @ c57af60

spielwiese
Last change on this file since c57af60 was 6cf934, checked in by Frédéric Chapoton <chapoton@…>, 17 months ago
more typos fixed in kernel
  • Property mode set to 100644
File size: 2.5 KB
Line 
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
19static 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
69matrix 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
Note: See TracBrowser for help on using the repository browser.