source: git/Singular/LIB/ncdecomp.lib @ 4713c6

fieker-DuValspielwiese
Last change on this file since 4713c6 was 4d978ec, checked in by Viktor Levandovskyy <levandov@…>, 20 years ago
*levandov: minor changes to plural libs git-svn-id: file:///usr/local/Singular/svn/trunk@7207 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.4 KB
Line 
1///////////////////////////////////////////////////////////////////////////////
2version="$Id: ncdecomp.lib,v 1.2 2004-06-01 13:53:35 levandov Exp $";
3category="Noncommutative";
4info="
5LIBRARY:  ncdecomp.lib      Central character decomposition of a module
6AUTHORS:  Viktor Levandovskyy,     levandov@mathematik.uni-kl.de,
7@*        Oleksandr Khomenko,      Oleksandr.Khomenko@math.uni-freiburg.de.
8
9PROCEDURES:
10CentralQuot(I,G);       for a module I and an ideal G, returns I:G,
11CentralSaturation(M,T); for a module M and an ideal T, returns M:T^{\infty},
12CenCharDec(I,C);        for a module I and a list C of generators of a center, returns a list L, where each entry consists of three records, namely
13L[*][1] is the character, L[*][2] is the Groebner basis of corresponding weight module, L[*][3] is the K-dimension of the weight module;
14";
15
16  LIB "ncalg.lib";
17///////////////////////////////////////////////////////////////////////////////
18static proc CharKernel(list L, int i)
19{
20// compute \cup L[j], j!=i
21  int sL = size(L);
22  if ( (i<=0) || (i>sL))  { return(0); }
23  int j;
24  list Li;
25  if (i ==1 )
26  {
27    Li = L[2..sL];
28  }
29  if (i ==sL )
30  {
31    Li = L[1..sL-1];
32  }
33  if ( (i>1) && (i < sL))
34  {
35    Li = L[1..i-1];
36    for (j=i+1; j<=sL; j++)
37    {
38      Li[j-1] = L[j];
39    }
40  }
41//  print("intersecting kernels...");
42  module Cres = intersect(Li[1..size(Li)]);
43  return(Cres);
44}
45///////////////////////////////////////////////////////////////////////////////
46static proc CentralQuotPoly(module M, poly g)
47{
48// here an elimination of components should be used !
49  int N=nrows(M); // M = A^N /I_M
50  module @M;
51  int i,j;
52  for(i=1; i<=N; i++)
53  {
54   @M=@M,g*gen(i);
55  }
56  @M = simplify(@M,2);
57  @M = @M,M;
58  module S = syz(@M);
59  matrix s = S;
60  module T;
61  vector t;
62  for(i=1; i<=ncols(s); i++)
63  {
64    t = 0*gen(N);
65    for(j=1; j<=N; j++)
66    {
67      t = t + s[j,i]*gen(j);
68    }
69    T[i] = t;
70  }
71  T = simplify(T,2);
72  return(T);
73}
74///////////////////////////////////////////////////////////////////////////////
75static proc MyIsEqual(module A, module B)
76{
77  option(redSB);
78  option(redTail);
79  if (attrib(A,"isSB")!=1)
80  {
81    A = std(A);
82  }
83  if (attrib(B,"isSB")!=1)
84  {
85    B = std(B);
86  }
87  int ANSWER = 1;
88  if ( ( ncols(A) == ncols(B) ) && ( nrows(A) == nrows(B) ) )
89  {
90    module @AB = A-B;
91    @AB = simplify(@AB,2);
92    if (@AB[1]!=0) { ANSWER = 0; }
93  }
94  else { ANSWER = 0; }
95  return(ANSWER);
96}
97///////////////////////////////////////////////////////////////////////////////
98proc CentralQuot(module I, ideal G)
99"USAGE:  CentralQuot(M, T), for a module M and an ideal T,
100RETURN:  module of the central quotient I:G,
101NOTE:    the output module is not necessarily a Groebner basis,
102SEE ALSO: CentralSaturation, CenCharDec
103EXAMPLE: example CentralQuot; shows examples
104"{
105  int i;
106  list @L;
107  for(i=1; i<=size(G); i++)
108  {
109    @L[i] = CentralQuotPoly(I,G[i]);
110  }
111  module @I = intersect(@L[1..size(G)]);
112  if (nrows(@I)==1)
113  {
114    @I = ideal(@I);
115  }
116  return(@I);
117}
118example
119{ "EXAMPLE:"; echo = 2;
120   option(returnSB);
121   def a = sl2();
122   setring a;
123   ideal I = e3,f3,h3-4*h;
124   I = std(I);
125   poly C=4*e*f+h^2-2*h;
126   ideal G = (C-8)*(C-24);
127   ideal R = CentralQuot(I,G);
128   R;
129}
130///////////////////////////////////////////////////////////////////////////////
131proc CentralSaturation(module M, ideal T)
132"USAGE:  CentralSaturation(M, T), for a module M and an ideal T,
133RETURN:  module of the central saturation M:T^{\infty},
134NOTE:    the output module is not necessarily a Groebner basis,
135SEE ALSO: CentralQuot, CenCharDec
136EXAMPLE: example CentralSaturation; shows examples
137"{
138  option(redSB);
139  option(redTail);
140  option(returnSB);
141  module Q=0;
142  module S=M;
143  while ( !MyIsEqual(Q,S) )
144  {
145    Q = CentralQuot(M, T);
146    S = CentralQuot(Q, T);
147  }
148  if (nrows(Q)==1)
149  {
150    Q = ideal(Q);
151  }
152//  Q = std(Q);
153  return(Q);
154}
155example
156{ "EXAMPLE:"; echo = 2;
157   option(returnSB);
158   def a = sl2();
159   setring a;
160   ideal I = e3,f3,h3-4*h;
161   I = std(I);
162   poly C=4*e*f+h^2-2*h;
163   ideal G = C*(C-8);
164   ideal R = CentralSaturation(I,G);
165   R=std(R);
166   vdim(R);
167   R;
168}
169///////////////////////////////////////////////////////////////////////////////
170proc CenCharDec(ideal I, list Center)
171"USAGE:  CenCharDec(I, L), I an ideal and Center a list of generators of the center;
172RETURN:  a list L, where each entry consists of three records, namely
173L[*][1] is the character, L[*][2] is the Groebner basis of corresponding weight module, L[*][3] is the K-dimension of the weight module;
174NOTE:   
175SEE ALSO: CentralQuot, CentralSaturation
176EXAMPLE: example CenCharDec; shows examples
177"
178{
179// M = A/I
180//1. Find the Zariski closure of Supp_Z M
181// J = Ann_M 1 == I
182// J \cap Z:
183  option(redSB);
184  option(redTail);
185  option(returnSB);
186  def @A = basering;
187  setring @A;
188  int sZ=size(Center);
189  int i,j;
190  poly t=1;
191  for(i=1; i<=nvars(@A); i++)
192  {
193    t=t*var(i);
194  }
195  ring @Z=0,(@z(1..sZ)),dp;
196//  @Z;
197  def @ZplusA = @A+@Z;
198  setring @ZplusA;
199//  @ZplusA;
200  ideal I     = imap(@A,I);
201  list Center = imap(@A,Center);
202  poly t      = imap(@A,t);
203  ideal @Ker;
204  for(i=1; i<=sZ; i++)
205  {
206    @Ker[i]=@z(i) - Center[i];
207  }
208  @Ker = @Ker,I;
209  ideal @JcapZ = eliminate(@Ker,t);
210// do not forget parameters of a basering!
211  string strZ="ring @@Z=("+charstr(@A)+"),(@z(1.."+string(sZ)+")),dp;";
212//  print(strZ);
213  execute(strZ);
214  setring @@Z;
215  ideal @JcapZ = imap(@ZplusA,@JcapZ);
216  @JcapZ = std(@JcapZ);
217//  @JcapZ;
218  int sJ = vdim(@JcapZ);
219  if (sJ==-1)
220  {
221    "There is no finite decomposition";
222    return(0);
223  }
224//  print(@JcapZ);
225// 2. compute the min.ass.primes of the ideal in the center
226  LIB "primdec.lib";
227  list @L = minAssGTZ(@JcapZ);
228  int sL = size(@L);
229  list @CharKer;
230  for(i=1; i<=sL; i++)
231  {
232    @L[i] = std(@L[i]);
233  }
234//  print("etL:");
235//  @L;
236// 3. compute the intersections of characters
237  for(i=1; i<=sL; i++)
238  {
239    @CharKer[i] = CharKernel(@L,i);
240  }
241//  print("Charker:");
242//  @CharKer;
243// 4. Go back to the algebra and compute central saturations
244  setring @A;
245  map @M = @@Z,Center[1..size(Center)];
246  list L = @M(@CharKer);
247  list R,@R;
248  for(i=1; i<=sL; i++)
249  {
250    @R[1] = L[i];
251    @R[2] = CentralSaturation(I,L[i]);
252    if (nrows(@R[2])==1)
253    {
254      @R[2] = ideal(@R[2]);
255    }
256    @R[2] = std(@R[2]);
257    @R[3] = vdim(@R[2]);
258     R[i] = @R;
259  }
260  return(R);
261}
262example
263{ "EXAMPLE:"; echo = 2;
264
265   option(returnSB);
266   def a = sl2();
267   setring a;
268   ideal I = e3,f3,h3-4*h;
269   I = twostd(I);
270   poly C=4*e*f+h^2-2*h;
271   list T = CenCharDec(I,C);
272   T;
273}
Note: See TracBrowser for help on using the repository browser.