source: git/Singular/LIB/involut.lib @ e2ce0c

spielwiese
Last change on this file since e2ce0c was e2ce0c, checked in by Sachin <sachinkm308@…>, 5 years ago
replacing execute with create_ring()
  • Property mode set to 100644
File size: 26.5 KB
Line 
1///////////////////////////////////////////////////////////////////
2version="version involut.lib 4.1.2.0 Feb_2019 "; // $Id$
3category="Noncommutative";
4info="
5LIBRARY:  involut.lib  Computations and operations with involutions
6AUTHORS:  Oleksandr Iena,       yena@mathematik.uni-kl.de,
7@*        Markus Becker,        mbecker@mathematik.uni-kl.de,
8@*        Viktor Levandovskyy,  levandov@mathematik.uni-kl.de
9
10OVERVIEW:
11Involution is an anti-automorphism of a non-commutative K-algebra
12with the property that applied an involution twice, one gets an identity.
13Involution is linear with respect to the ground field. In this library we
14compute linear involutions, distinguishing the case of a diagonal matrix
15(such involutions are called homothetic) and a general one.
16Also, linear automorphisms of different order can be computed.
17
18SUPPORT: Forschungsschwerpunkt 'Mathematik und Praxis' (Project of Dr. E. Zerz
19and V. Levandovskyy), Uni Kaiserslautern
20
21REMARK: This library provides algebraic tools for computations and operations
22with algebraic involutions and linear automorphisms of non-commutative algebras
23
24PROCEDURES:
25findInvo();          computes linear involutions on a basering;
26findInvoDiag();     computes homothetic (diagonal) involutions on a basering;
27findAuto(n);          computes linear automorphisms of order n of a basering;
28ncdetection();        computes an ideal, presenting an involution map on some particular noncommutative algebras;
29involution(m,theta);  applies the involution to an object;
30isInvolution(F); check whether a map F in an involution;
31isAntiEndo(F);   check whether a map F in an antiendomorphism.
32";
33
34LIB "nctools.lib";
35LIB "ncalg.lib";
36LIB "poly.lib";
37LIB "primdec.lib";
38LIB "ring.lib";
39///////////////////////////////////////////////////////////////////////////////
40proc ncdetection()
41"USAGE:  ncdetection();
42RETURN:  ideal, representing an involution map
43PURPOSE: compute classical involutions (i.e. acting rather on operators than on variables) for some particular noncommutative algebras
44ASSUME: the procedure is aimed at non-commutative algebras with differential, shift or advance operators arising in Control Theory.
45It has to be executed in a ring.
46EXAMPLE: example ncdetection; shows an example
47"{
48// in this procedure an involution map is generated from the NCRelations
49// that will be used in the function involution
50// in dieser proc. wird eine matrix erzeugt, die in der i-ten zeile die indices
51// der differential-, shift- oder advance-operatoren enthaelt mit denen die i-te
52// variable nicht kommutiert.
53  if ( nameof(basering)=="basering" )
54  {
55    "No current ring defined.";
56    return(ideal(0));
57  }
58  def r = basering;
59  setring r;
60  int i,j,k,LExp;
61  int NVars  = nvars(r);
62  matrix rel = ncRelations(r)[2];
63  intmat M[NVars][3];
64  int NRows = nrows(rel);
65  intvec v,w;
66  poly d,d_lead;
67  ideal I;
68  map theta;
69  for( j=NRows; j>=2; j-- )
70  {
71   if( rel[j] == w )       //the whole column is zero
72    {
73      j--;
74      continue;
75    }
76    for( i=1; i<j; i++ )
77    {
78      if( rel[i,j]==1 )        //relation of type var(j)*var(i) = var(i)*var(j) +1
79      {
80         M[i,1]=j;
81      }
82      if( rel[i,j] == -1 )    //relation of type var(i)*var(j) = var(j)*var(i) -1
83      {
84        M[j,1]=i;
85      }
86      d = rel[i,j];
87      d_lead = lead(d);
88      v = leadexp(d_lead); //in the next lines we check wether we have a  relation of differential or shift type
89      LExp=0;
90      for(k=1; k<=NVars; k++)
91      {
92        LExp = LExp + v[k];
93      }
94      //      if( (d-d_lead != 0) || (LExp > 1) )
95if ( ( (d-d_lead) != 0) || (LExp > 1) || ( (LExp==0) && ((d_lead>1) || (d_lead<-1)) ) )
96      {
97        return(theta);
98      }
99
100      if( v[j] == 1)                   //relation of type var(j)*var(i) = var(i)*var(j) -lambda*var(j)
101      {
102        if (leadcoef(d) < 0)
103        {
104          M[i,2] = j;
105        }
106        else
107        {
108          M[i,3] = j;
109        }
110      }
111      if( v[i]==1 )                    //relation of type var(j)*var(i) = var(i)*var(j) -lambda*var(i)
112      {
113        if (leadcoef(d) > 0)
114        {
115          M[j,2] = i;
116        }
117        else
118        {
119          M[j,3] = i;
120        }
121      }
122    }
123  }
124  // from here on, the map is computed
125  for(i=1;i<=NVars;i++)
126  {
127    I=I+var(i);
128  }
129
130  for(i=1;i<=NVars;i++)
131  {
132    if( M[i,1..3]==(0,0,0) )
133    {
134      i++;
135      continue;
136    }
137    if( M[i,1]!=0 )
138    {
139      if( (M[i,2]!=0) && (M[i,3]!=0) )
140      {
141        I[M[i,1]] = -var(M[i,1]);
142        I[M[i,2]] = var(M[i,3]);
143        I[M[i,3]] = var(M[i,2]);
144      }
145      if( (M[i,2]==0) && (M[i,3]==0) )
146      {
147        I[M[i,1]] = -var(M[i,1]);
148      }
149      if( ( (M[i,2]!=0) && (M[i,3]==0) )|| ( (M[i,2]!=0) && (M[i,3]==0) )
150)
151      {
152        I[i] = -var(i);
153      }
154    }
155    else
156    {
157      if( (M[i,2]!=0) && (M[i,3]!=0) )
158      {
159        I[i] = -var(i);
160        I[M[i,2]] = var(M[i,3]);
161        I[M[i,3]] = var(M[i,2]);
162      }
163      else
164      {
165        I[i] = -var(i);
166      }
167    }
168  }
169  return(I);
170}
171example
172{
173  "EXAMPLE:"; echo = 2;
174  ring R = 0,(x,y,z,D(1..3)),dp;
175  matrix D[6][6];
176  D[1,4]=1; D[2,5]=1;  D[3,6]=1;
177  def r = nc_algebra(1,D); setring r;
178  ncdetection();
179  kill r, R;
180  //----------------------------------------
181  ring R=0,(x,S),dp;
182  def r = nc_algebra(1,-S); setring r;
183  ncdetection();
184  kill r, R;
185  //----------------------------------------
186  ring R=0,(x,D(1),S),dp;
187  matrix D[3][3];
188  D[1,2]=1;  D[1,3]=-S;
189  def r = nc_algebra(1,D); setring r;
190  ncdetection();
191}
192
193static proc In_Poly(poly mm, list l, int NVars)
194// applies the involution to the polynomial mm
195// entries of a list l are images of variables under invo
196// more general than invo_poly; used in many rings setting
197{
198  int i,j;
199  intvec v;
200  poly pp, zz;
201  poly nn = 0;
202  i = 1;
203  while(mm[i]!=0)
204  {
205    v  = leadexp(mm[i]);
206    zz = 1;
207    for( j=NVars; j>=1; j--)
208    {
209      if (v[j]!=0)
210      {
211        pp = l[j];
212        zz = zz*(pp^v[j]);
213      }
214    }
215    nn = nn + (leadcoef(mm[i])*zz);
216    i++;
217  }
218  return(nn);
219}
220
221static proc Hom_Poly(poly mm, list l, int NVars)
222// applies the endomorphism to the polynomial mm
223// entries of a list l are images of variables under endo
224// should not be replaced by map-based stuff! used in
225// many rings setting
226{
227  int i,j;
228  intvec v;
229  poly pp, zz;
230  poly nn = 0;
231  i = 1;
232  while(mm[i]!=0)
233  {
234    v  = leadexp(mm[i]);
235    zz = 1;
236    for( j=NVars; j>=1; j--)
237    {
238      if (v[j]!=0)
239      {
240        pp = l[j];
241        zz = (pp^v[j])*zz;
242      }
243    }
244    nn = nn + (leadcoef(mm[i])*zz);
245    i++;
246  }
247  return(nn);
248}
249
250static proc invo_poly(poly m, map theta)
251// applies the involution map theta to m, where m=polynomial
252{
253  // compatibility:
254  ideal l = ideal(theta);
255  int i;
256  list L;
257  for (i=1; i<=size(l); i++)
258  {
259    L[i] = l[i];
260  }
261  int nv = nvars(basering);
262  return (In_Poly(m,L,nv));
263//   if (m==0) { return(m); }
264//   int i,j;
265//   intvec v;
266//   poly p,z;
267//   poly n = 0;
268//   i = 1;
269//   while(m[i]!=0)
270//   {
271//     v = leadexp(m[i]);
272//     z =1;
273//     for(j=nvars(basering); j>=1; j--)
274//     {
275//       if (v[j]!=0)
276//       {
277//         p = var(j);
278//         p = theta(p);
279//         z = z*(p^v[j]);
280//       }
281//     }
282//     n = n + (leadcoef(m[i])*z);
283//     i++;
284//   }
285//   return(n);
286}
287///////////////////////////////////////////////////////////////////////////////////
288proc involution(def m, map theta)
289"USAGE:  involution(m, theta); m is a poly/vector/ideal/matrix/module, theta is a map
290RETURN:  object of the same type as m
291PURPOSE: applies the involution, presented by theta to the object m
292THEORY: for an involution theta and two polynomials a,b from the algebra,
293@*  theta(ab) = theta(b) theta(a); theta is linear with respect to the ground field
294NOTE: This is generalized ''theta(m)'' for data types unsupported by ''map''.
295EXAMPLE: example involution; shows an example
296"{
297  // applies the involution map theta to m,
298  // where m= vector, polynomial, module, matrix, ideal
299  int i,j;
300  intvec v;
301  poly p,z;
302  if (typeof(m)=="poly")
303  {
304    return (invo_poly(m,theta));
305  }
306  if ( typeof(m)=="ideal" )
307  {
308    ideal n;
309    for (i=1; i<=size(m); i++)
310    {
311      n[i] = invo_poly(m[i], theta);
312    }
313    return(n);
314  }
315  if (typeof(m)=="vector")
316  {
317    for(i=1; i<=size(m); i++)
318    {
319      m[i] = invo_poly(m[i], theta);
320    }
321    return (m);
322  }
323  if ( (typeof(m)=="matrix") || (typeof(m)=="module"))
324  {
325    matrix n = matrix(m);
326    int @R=nrows(n);
327    int @C=ncols(n);
328    for(i=1; i<=@R; i++)
329    {
330      for(j=1; j<=@C; j++)
331      {
332        if (m[i,j]!=0)
333        {
334          n[i,j] = invo_poly( m[i,j], theta);
335        }
336      }
337    }
338    if (typeof(m)=="module")
339    {
340      return (module(n));
341    }
342    else // matrix
343    {
344      return(n);
345    }
346  }
347  // if m is not of the supported type:
348  "Error: unsupported argument type!";
349  return();
350}
351example
352{
353  "EXAMPLE:";echo = 2;
354  ring R = 0,(x,d),dp;
355  def r = nc_algebra(1,1); setring r; // Weyl-Algebra
356  map F = r,x,-d;
357  F(F);  // should be maxideal(1) for an involution
358  poly f =  x*d^2+d;
359  poly If = involution(f,F);
360  f-If;
361  poly g = x^2*d+2*x*d+3*x+7*d;
362  poly tg = -d*x^2-2*d*x+3*x-7*d;
363  poly Ig = involution(g,F);
364  tg-Ig;
365  ideal I = f,g;
366  ideal II = involution(I,F);
367  II;
368  matrix(I) - involution(II,F);
369  module M  = [f,g,0],[g,0,x^2*d];
370  module IM = involution(M,F);
371  print(IM);
372  print(matrix(M) - involution(IM,F));
373}
374///////////////////////////////////////////////////////////////////////////////////
375static proc new_var()
376//generates a string of new variables
377{
378
379  int NVars=nvars(basering);
380  int i,j;
381  //  string s="@_1_1";
382  string s="a11";
383  for(i=1; i<=NVars; i++)
384  {
385    for(j=1; j<=NVars; j++)
386    {
387      if(i*j!=1)
388      {
389        s = s+ ","+NVAR(i,j);
390      }
391    }
392  }
393  return(s);
394}
395
396static proc NVAR(int i, int j)
397{
398  //  return("@_"+string(i)+"_"+string(j));
399  return("a"+string(i)+string(j));
400}
401///////////////////////////////////////////////////////////////////////////////////
402static proc new_var_special()
403//generates a string of new variables
404{
405  int NVars=nvars(basering);
406  int i;
407  //  string s="@_1_1";
408  string s="a11";
409  for(i=2; i<=NVars; i++)
410  {
411    s = s+ ","+NVAR(i,i);
412  }
413  return(s);
414}
415///////////////////////////////////////////////////////////////////////////////////
416static proc RelMatr()
417// returns the matrix of relations
418// only Lie-type relations x_j x_i= x_i x_j + .. are taken into account
419{
420  int i,j;
421  int NVars = nvars(basering);
422  matrix Rel[NVars][NVars];
423  for(i=1; i<NVars; i++)
424  {
425    for(j=i+1; j<=NVars; j++)
426    {
427      Rel[i,j]=var(j)*var(i)-var(i)*var(j);
428    }
429  }
430  return(Rel);
431}
432/////////////////////////////////////////////////////////////////
433proc findInvo()
434"USAGE: findInvo();
435RETURN: a ring containing a list L of pairs, where
436@*        L[i][1]  =  ideal; a Groebner Basis of an i-th associated prime,
437@*        L[i][2]  =  matrix, defining a linear map, with entries, reduced with respect to L[i][1]
438PURPOSE: computed the ideal of linear involutions of the basering
439ASSUME: the relations on the algebra are of the form YX = XY + D, that is
440the current ring is a G-algebra of Lie type.
441NOTE: for convenience, the full ideal of relations @code{idJ}
442and the initial matrix with indeterminates @code{matD} are exported in the output ring
443SEE ALSO: findInvoDiag, involution
444EXAMPLE: example findInvo; shows examples
445
446"{
447  def @B    = basering; //save the name of basering
448  int NVars = nvars(@B); //number of variables in basering
449  int i, j;
450
451  // check basering is of Lie type:
452  if (!isLieType())
453  {
454    ERROR("Assume violated: basering is of non-Lie type");
455  }
456
457  matrix Rel = RelMatr(); //the matrix of relations
458
459  string @ss   = new_var(); //string of new variables
460  string Par = parstr(@B); //string of parameters in old ring
461
462  if (Par=="") // if there are no parameters
463  {
464    ring @@@KK = create_ring(0, "("+varstr(@B)+","+@ss+")", "dp"); //new ring with new variables
465  }
466  else //if there exist parameters
467  {
468     ring @@@KK = create_ring("(0,"+Par+")", "("+varstr(@B)+","+@ss+")", "dp"); //new ring with new variables
469  }
470
471  matrix Rel = imap(@B, Rel); //consider the matrix of relations in new ring
472
473  int Sz = NVars*NVars+NVars; // number of variables in new ring
474
475  matrix M[Sz][Sz]; //to be the matrix of relations in new ring
476
477  for(i=1; i<NVars; i++) //initialize that matrix of relations
478  {
479    for(j=i+1; j<=NVars; j++)
480    {
481      M[i,j] = Rel[i,j];
482    }
483  }
484
485  def @@K = nc_algebra(1, M); setring @@K; //now new ring @@K become a noncommutative ring
486
487  list l; //list to define an involution
488  poly @@F;
489  for(i=1; i<=NVars; i++) //initializing list for involution
490  {
491    @@F=0;
492    for(j=1; j<=NVars; j++)
493    {
494      execute( "@@F = @@F+"+NVAR(i,j)+"*"+string( var(j) )+";" );
495    }
496    l=l+list(@@F);
497  }
498
499  matrix N = imap(@@@KK,Rel);
500
501  for(i=1; i<NVars; i++)//get matrix by applying the involution to relations
502  {
503    for(j=i+1; j<=NVars; j++)
504    {
505      N[i,j]= l[j]*l[i] - l[i]*l[j] + In_Poly( N[i,j], l, NVars);
506    }
507  }
508  kill l;
509  //---------------------------------------------
510  //get the ideal of coefficients of N
511  ideal J;
512  ideal idN = simplify(ideal(N),2);
513  J = ideal(coeffs( idN, var(1) ) );
514  for(i=2; i<=NVars; i++)
515  {
516    J = ideal( coeffs( J, var(i) ) );
517  }
518  J = simplify(J,2);
519  //-------------------------------------------------
520  if ( Par=="" ) //initializes the ring of relations
521  {
522    ring @@KK = create_ring(0, "("+@ss+")", "dp");
523  }
524  else
525  {
526    ring @@KK = create_ring("(0,"+Par+")", "("+@ss+")", "dp");
527  }
528  ideal J = imap(@@K,J); // ideal, considered in @@KK now
529  string snv = "["+string(NVars)+"]";
530  execute("matrix @@D"+snv+snv+"="+@ss+";"); // matrix with entries=new variables
531
532  J = J, ideal( @@D*@@D-matrix( freemodule(NVars) ) ); // add the condition that involution to square is just identity
533  J = simplify(J,2); // without extra zeros
534  list mL = minAssGTZ(J); // components not in GB
535  int sL  = size(mL);
536  intvec saveopt=option(get);
537  option(redSB);       // important for reduced GBs
538  option(redTail);
539  matrix IM = @@D;     // involution map
540  list L    = list();  // the answer
541  list TL;
542  ideal tmp = 0;
543  for (i=1; i<=sL; i++) // compute GBs of components
544  {
545    TL    = list();
546    TL[1] = std(mL[i]);
547    tmp   = NF( ideal(IM), TL[1] );
548    TL[2] = matrix(tmp, NVars,NVars);
549    L[i]  = TL;
550  }
551  export(L); // main export
552  ideal idJ = J; // debug-comfortable exports
553  matrix matD = @@D;
554  export(idJ);
555  export(matD);
556  option(set,saveopt);
557  return(@@KK);
558}
559example
560{ "EXAMPLE:"; echo = 2;
561  def a = makeWeyl(1);
562  setring a; // this algebra is a first Weyl algebra
563  a;
564  def X = findInvo();
565  setring X; // ring with new variables, corr. to unknown coefficients
566  X;
567  L;
568  // look at the matrix in the new variables, defining the linear involution
569  print(L[1][2]);
570  L[1][1];  // where new variables obey these relations
571  idJ;
572}
573///////////////////////////////////////////////////////////////////////////
574proc findInvoDiag()
575"USAGE: findInvoDiag();
576RETURN: a ring together with a list of pairs L, where
577@*        L[i][1]  =  ideal; a Groebner Basis of an i-th associated prime,
578@*        L[i][2]  =  matrix, defining a linear map, with entries, reduced with respect to L[i][1]
579PURPOSE: compute homothetic (diagonal) involutions of the basering
580ASSUME: the relations on the algebra are of the form YX = XY + D, that is
581the current ring is a G-algebra of Lie type.
582NOTE: for convenience, the full ideal of relations @code{idJ}
583and the initial matrix with indeterminates @code{matD} are exported in the output ring
584SEE ALSO: findInvo, involution
585EXAMPLE: example findInvoDiag; shows examples
586"{
587  def @B    = basering; //save the name of basering
588  int NVars = nvars(@B); //number of variables in basering
589  int i, j;
590
591  // check basering is of Lie type:
592  if (!isLieType())
593  {
594    ERROR("Assume violated: basering is of non-Lie type");
595  }
596
597  matrix Rel = RelMatr(); //the matrix of relations
598
599  string @ss   = new_var_special(); //string of new variables
600  string Par = parstr(@B); //string of parameters in old ring
601
602  if (Par=="") // if there are no parameters
603  {
604    ring @@@KK = create_ring(0, "("+varstr(@B)+","+@ss+")", "dp"); //new ring with new variables
605  }
606  else //if there exist parameters
607  {
608    ring @@@KK = create_ring("(0,"+Par+")", "("+varstr(@B)+","+@ss+")", "dp"); //new ring with new variables
609  }
610
611  matrix Rel = imap(@B, Rel); //consider the matrix of relations in new ring
612
613  int Sz = 2*NVars; // number of variables in new ring
614
615  matrix M[Sz][Sz]; //to be the matrix of relations in new ring
616  for(i=1; i<NVars; i++) //initialize that matrix of relations
617  {
618    for(j=i+1; j<=NVars; j++)
619    {
620      M[i,j] = Rel[i,j];
621    }
622  }
623
624  def @@K = nc_algebra(1, M); setring @@K; //now new ring @@K become a noncommutative ring
625
626  list l; //list to define an involution
627
628  for(i=1; i<=NVars; i++) //initializing list for involution
629  {
630    execute( "l["+string(i)+"]="+NVAR(i,i)+"*"+string( var(i) )+";" );
631
632  }
633  matrix N = imap(@@@KK,Rel);
634
635  for(i=1; i<NVars; i++)//get matrix by applying the involution to relations
636  {
637    for(j=i+1; j<=NVars; j++)
638    {
639      N[i,j]= l[j]*l[i] - l[i]*l[j] + In_Poly( N[i,j], l, NVars);
640    }
641  }
642  kill l;
643  //---------------------------------------------
644  //get the ideal of coefficients of N
645
646  ideal J;
647  ideal idN = simplify(ideal(N),2);
648  J = ideal(coeffs( idN, var(1) ) );
649  for(i=2; i<=NVars; i++)
650  {
651    J = ideal( coeffs( J, var(i) ) );
652  }
653  J = simplify(J,2);
654  //-------------------------------------------------
655
656  if ( Par=="" ) //initializes the ring of relations
657  {
658    ring @@KK = create_ring(0, "("+@ss+")", "dp");
659  }
660  else
661  {
662    ring @@KK = create_ring("(0,"+Par+")", "("+@ss+")", "dp"); 
663  }
664
665  ideal J = imap(@@K,J); // ideal, considered in @@KK now
666
667  matrix @@D[NVars][NVars]; // matrix with entries=new variables to square i.e. @@D=@@D^2
668  for(i=1;i<=NVars;i++)
669  {
670    execute("@@D["+string(i)+","+string(i)+"]="+NVAR(i,i)+";");
671  }
672  J = J, ideal( @@D*@@D - matrix( freemodule(NVars) ) ); // add the condition that involution to square is just identity
673  J = simplify(J,2); // without extra zeros
674
675  list mL = minAssGTZ(J); // components not in GB
676  int sL  = size(mL);
677  intvec saveopt=option(get);
678  option(redSB); // important for reduced GBs
679  option(redTail);
680  matrix IM = @@D; // involution map
681  list L = list(); // the answer
682  list TL;
683  ideal tmp = 0;
684  for (i=1; i<=sL; i++) // compute GBs of components
685  {
686    TL    = list();
687    TL[1] = std(mL[i]);
688    tmp   = NF( ideal(IM), TL[1] );
689    TL[2] = matrix(tmp, NVars,NVars);
690    L[i]  = TL;
691  }
692  export(L);
693  ideal idJ = J; // debug-comfortable exports
694  matrix matD = @@D;
695  export(idJ);
696  export(matD);
697  option(set,saveopt);
698  return(@@KK);
699}
700example
701{ "EXAMPLE:"; echo = 2;
702  def a = makeWeyl(1);
703  setring a; // this algebra is a first Weyl algebra
704  a;
705  def X = findInvoDiag();
706  setring X; // ring with new variables, corresponding to unknown coefficients
707  X;
708  // print matrices, defining linear involutions
709  print(L[1][2]);  // a first matrix: we see it is constant
710  print(L[2][2]);  // and a second possible matrix; it is constant too
711  L; // let us take a look on the whole list
712  idJ;
713}
714/////////////////////////////////////////////////////////////////////
715proc findAuto(int n)
716"USAGE: findAuto(n); n an integer
717RETURN: a ring together with a list of pairs L, where
718@*        L[i][1]  =  ideal; a Groebner Basis of an i-th associated prime,
719@*        L[i][2]  =  matrix, defining a linear map, with entries, reduced with respect to L[i][1]
720PURPOSE: compute the ideal of linear automorphisms of the basering,
721@*  given by a matrix, n-th power of which gives identity (i.e. unipotent matrix)
722ASSUME: the relations on the algebra are of the form YX = XY + D, that is
723the current ring is a G-algebra of Lie type.
724NOTE: if n=0, a matrix, defining an automorphism is not assumed to be unipotent
725@* but just non-degenerate. A nonzero parameter @code{@@p} is introduced as the value of
726@* the determinant of the matrix above.
727@* For convenience, the full ideal of relations @code{idJ} and the initial matrix with indeterminates
728@* @code{matD} are mutually exported in the output ring
729SEE ALSO: findInvo
730EXAMPLE: example findAuto; shows examples
731"{
732  if ((n<0 ) || (n==1))
733  {
734    "The index of unipotency is too small.";
735    return(0);
736  }
737
738
739  def @B    = basering; //save the name of basering
740  int NVars = nvars(@B); //number of variables in basering
741  int i, j;
742
743  // check basering is of Lie type:
744  if (!isLieType())
745  {
746    ERROR("Assume violated: basering is of non-Lie type");
747  }
748
749  matrix Rel = RelMatr(); //the matrix of relations
750
751  string @ss = new_var(); //string of new variables
752  string Par = parstr(@B); //string of parameters in old ring
753
754  if (Par=="") // if there are no parameters
755  {
756    ring @@@K = create_ring(0, "("+varstr(@B)+","+@ss+")", "dp");  //new ring with new variables
757  }
758  else //if there exist parameters
759  {
760     ring @@@K = create_ring("(0,"+Par+")", "("+varstr(@B)+","+@ss+")", "dp");  //new ring with new variables
761  }
762
763  matrix Rel = imap(@B, Rel); //consider the matrix of relations in new ring
764
765  int Sz = NVars*NVars+NVars; // number of variables in new ring
766
767  matrix M[Sz][Sz]; //to be the matrix of relations in new ring
768
769  for(i=1; i<NVars; i++) //initialize that matrix of relations
770  {
771    for(j=i+1; j<=NVars; j++)
772    {
773      M[i,j] = Rel[i,j];
774    }
775  }
776
777  def @@K = nc_algebra(1, M); setring @@K; //now new ring @@K become a noncommutative ring
778
779  list l; //list to define a homomorphism(isomorphism)
780  poly @@F;
781  for(i=1; i<=NVars; i++) //initializing list for involution
782  {
783    @@F=0;
784    for(j=1; j<=NVars; j++)
785    {
786      execute( "@@F = @@F+"+NVAR(i,j)+"*"+string( var(j) )+";" );
787    }
788    l=l+list(@@F);
789  }
790
791  matrix N = imap(@@@K,Rel);
792
793  for(i=1; i<NVars; i++)//get matrix by applying the homomorphism  to relations
794  {
795    for(j=i+1; j<=NVars; j++)
796    {
797      N[i,j]= l[j]*l[i] - l[i]*l[j] - Hom_Poly( N[i,j], l, NVars);
798    }
799  }
800  kill l;
801  //---------------------------------------------
802  //get the ideal of coefficients of N
803  ideal J;
804  ideal idN = simplify(ideal(N),2);
805  J = ideal(coeffs( idN, var(1) ) );
806  for(i=2; i<=NVars; i++)
807  {
808    J = ideal( coeffs( J, var(i) ) );
809  }
810  J = simplify(J,2);
811  //-------------------------------------------------
812  if (( Par=="" ) && (n!=0)) //initializes the ring of relations
813  {
814    ring @@KK = create_ring(0, "("+@ss+")", "dp");
815  }
816  if (( Par=="" ) && (n==0)) //initializes the ring of relations
817  {
818    ring @@KK = create_ring("(0,@p)", "("+@ss+")", "dp");
819  }
820  if ( Par!="" )
821  {
822    ring @@KK = create_ring("(0,"+Par+")", "("+@ss+")", "dp");
823  }
824  //  basering;
825  ideal J = imap(@@K,J); // ideal, considered in @@KK now
826  string snv = "["+string(NVars)+"]";
827  execute("matrix @@D"+snv+snv+"="+@ss+";"); // matrix with entries=new variables
828
829  if (n>=2)
830  {
831    J = J, ideal( @@D*@@D-matrix( freemodule(NVars) ) ); // add the condition that homomorphism to square is just identity
832  }
833  if (n==0)
834  {
835    J = J, det(@@D)-@p; // det of non-unipotent matrix is nonzero
836  }
837  J       = simplify(J,2); // without extra zeros
838  list mL = minAssGTZ(J); // components not in GB
839  int sL  = size(mL);
840  intvec saveopt=option(get);
841  option(redSB); // important for reduced GBs
842  option(redTail);
843  matrix IM = @@D; //  map
844  list L = list(); // the answer
845  list TL;
846  ideal tmp = 0;
847  for (i=1; i<=sL; i++)// compute GBs of components
848  {
849    TL    = list();
850    TL[1] = std(mL[i]);
851    tmp   = NF( ideal(IM), TL[1] );
852    TL[2] = matrix(tmp,NVars, NVars);
853    L[i]  = TL;
854  }
855  export(L);
856  ideal idJ = J; // debug-comfortable exports
857  matrix matD = @@D;
858  export(idJ);
859  export(matD);
860  option(set,saveopt);
861  return(@@KK);
862}
863example
864{ "EXAMPLE:"; echo = 2;
865  def a = makeWeyl(1);
866  setring a; // this algebra is a first Weyl algebra
867  a;
868  def X = findAuto(2);  // in contrast to findInvo look for automorphisms
869  setring X; // ring with new variables - unknown coefficients
870  X;
871  size(L); // we have (size(L)) families in the answer
872  // look at matrices, defining linear automorphisms:
873  print(L[1][2]);  // a first one: we see it is the identity
874  print(L[2][2]);  // and a second possible matrix; it is diagonal
875  // L; // we can take a look on the whole list, too
876  idJ;
877  kill X; kill a;
878  //----------- find all the linear automorphisms --------------------
879  //----------- use the call findAuto(0)          --------------------
880  ring R = 0,(x,s),dp;
881  def r = nc_algebra(1,s); setring r; // the shift algebra
882  s*x; // the only relation in the algebra is:
883  def Y = findAuto(0);
884  setring Y;
885  size(L); // here, we have 1 parametrized family
886  print(L[1][2]); // here, @p is a nonzero parameter
887  det(L[1][2]-@p);  // check whether determinante is zero
888}
889
890
891proc isAntiEndo(def F)
892"USAGE: isAntiEndo(F); F is a map from current ring to itself
893RETURN: integer, 1 if F determines an antiendomorphism of
894current ring and 0 otherwise
895ASSUME: F is a map from current ring to itself
896SEE ALSO: isInvolution, involution, findInvo
897EXAMPLE: example isAntiEndo; shows examples
898"
899{
900  // assumes:
901  // (1) F is from br to br
902  // I don't see how to check it; in case of error it will happen in the body
903  // (2) do not assume: F is linear, F is bijective
904  int n = nvars(basering);
905  int i,j;
906  poly pi,pj,q;
907  int answer=1;
908  ideal @f = ideal(F); list L=@f[1..ncols(@f)];
909  for (i=1; i<n; i++)
910  {
911    for (j=i+1; j<=n; j++)
912    {
913      // F( x_j x_i) =def= F(x_i) F(x_j)
914      pi = var(i);
915      pj = var(j);
916      //      q = involution(pj*pi,F) - F(pi)*F(pj);
917      q = In_Poly(pj*pi,L,n) - F[i]*F[j];
918      if (q!=0)
919      {
920        answer=0; return(answer);
921      }
922    }
923  }
924  return(answer);
925}
926example
927{"EXAMPLE:";echo = 2;
928  def A = makeUsl(2); setring A;
929  map I = A,-e,-f,-h; //correct antiauto involution
930  isAntiEndo(I);
931  map J = A,3*e,1/3*f,-h; // antiauto but not involution
932  isAntiEndo(J);
933  map K = A,f,e,-h; // not antiendo
934  isAntiEndo(K);
935}
936
937
938proc isInvolution(def F)
939"USAGE: isInvolution(F); F is a map from current ring to itself
940RETURN: integer, 1 if F determines an involution and 0 otherwise
941THEORY: involution is an antiautomorphism of order 2
942ASSUME: F is a map from current ring to itself
943SEE ALSO: involution, findInvo, isAntiEndo
944EXAMPLE: example isInvolution; shows examples
945"
946{
947  // does not assume: F is an antiautomorphism, can be antiendo
948  // allows to detect endos which are not autos
949  // isInvolution == ( F isAntiEndo && F(F)==id )
950  if (!isAntiEndo(F))
951  {
952    return(0);
953  }
954  //  def G = F(F);
955  int j; poly p; ideal @f = ideal(F); list L=@f[1..ncols(@f)];
956  int nv = nvars(basering);
957  for(j=nv; j>=1; j--)
958  {
959    //    p = var(j); p = F(p); p = F(p) - var(j);
960    //p = G(p) - p;
961    p = In_Poly(var(j),L,nv);
962    p = In_Poly(p,L,nv) -var(j) ;
963
964    if (p!=0)
965    {
966      return(0);
967    }
968  }
969  return(1);
970}
971example
972{"EXAMPLE:";echo = 2;
973  def A = makeUsl(2); setring A;
974  map I = A,-e,-f,-h; //correct antiauto involution
975  isInvolution(I);
976  map J = A,3*e,1/3*f,-h; // antiauto but not involution
977  isInvolution(J);
978  map K = A,f,e,-h; // not antiauto
979  isInvolution(K);
980}
Note: See TracBrowser for help on using the repository browser.