[BACK]Return to os_muldif.rr CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / src

Diff for /OpenXM/src/asir-contrib/packages/src/os_muldif.rr between version 1.23 and 1.96

version 1.23, 2017/10/06 02:30:33 version 1.96, 2022/07/28 04:08:41
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.22 2017/08/29 01:13:54 takayama Exp $ */  /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.95 2022/07/22 23:09:09 takayama Exp $ */
 /* The latest version will be at ftp://akagi.ms.u-tokyo.ac.jp/pub/math/muldif  /* The latest version will be at https://www.ms.u-tokyo.ac.jp/~oshima/index-j.html
  scp os_muldif.[dp]* ${USER}@lemon.math.kobe-u.ac.jp:/home/web/OpenXM/Current/doc/other-docs   scp os_muldif.[dp]* ${USER}@lemon.math.kobe-u.ac.jp:/home/web/OpenXM/Current/doc/other-docs
 */  */
 #define USEMODULE 1  #define USEMODULE 1
 /* #undef USEMODULE */  /* #undef USEMODULE */
   
 /*             os_muldif.rr (Library for Risa/Asir)  /*             os_muldif.rr (Library for Risa/Asir)
  *          Toshio Oshima (Nov. 2007 - Sep. 2017)   *          Toshio Oshima (Nov. 2007 - July. 2022)
  *   *
  *   For polynomials and differential operators with coefficients   *   For polynomials and differential operators with coefficients
  *   in rational funtions (See os_muldif.pdf)   *   in rational funtions (See os_muldif.pdf)
Line 21  module os_md;
Line 21  module os_md;
 static Muldif.rr$  static Muldif.rr$
 static TeXEq$  static TeXEq$
 static TeXLim$  static TeXLim$
   static TeXPages$
 static DIROUT$  static DIROUT$
 static DIROUTD$  static DIROUTD$
 static DVIOUTL$  static DVIOUTL$
Line 43  static Canvas$
Line 44  static Canvas$
 static ID_PLOT$  static ID_PLOT$
 static Rand$  static Rand$
 static LQS$  static LQS$
   static SVORG$
 localf spType2$  localf spType2$
 localf erno$  localf erno$
 localf chkfun$  localf chkfun$
Line 58  localf countin$
Line 60  localf countin$
 localf mycoef$  localf mycoef$
 localf mydiff$  localf mydiff$
 localf myediff$  localf myediff$
   localf mypdiff$
   localf difflog$
   localf pTaylor$
   localf pwTaylor$
 localf m2l$  localf m2l$
 localf m2ll$  localf m2ll$
 localf mydeg$  localf mydeg$
Line 76  localf ndict$
Line 82  localf ndict$
 localf nextsub$  localf nextsub$
 localf nextpart$  localf nextpart$
 localf transpart$  localf transpart$
   localf getCatalan$
   localf pg2tg$
   localf pg2tgb;
   localf pgpart$
   localf xypg2tg;
 localf trpos$  localf trpos$
 localf sprod$  localf sprod$
   localf sadj$
 localf sinv$  localf sinv$
 localf slen$  localf slen$
   localf sexps$
 localf sord$  localf sord$
 localf vprod$  localf vprod$
 localf dvangle$  localf dvangle$
 localf dvprod$  localf dvprod$
 localf dnorm$  localf dnorm$
   localf dext$
 localf mulseries$  localf mulseries$
 localf pluspower$  localf pluspower$
 localf vtozv$  localf vtozv$
Line 92  localf dupmat$
Line 106  localf dupmat$
 localf matrtop$  localf matrtop$
 localf mytrace$  localf mytrace$
 localf mydet$  localf mydet$
   localf permanent$
 localf mperm$  localf mperm$
 localf mtranspose$  localf mtranspose$
 localf mtoupper$  localf mtoupper$
 localf mydet2$  localf mydet2$
 localf myrank$  localf myrank$
 localf meigen$  localf lext2$
   localf meigen$
   localf pf2kz$
   localf mext2$
 localf transm$  localf transm$
 localf vgen$  localf vgen$
 localf mmc$  localf mmc$
Line 112  localf myimage$
Line 130  localf myimage$
 localf mymod$  localf mymod$
 localf mmod$  localf mmod$
 localf ladd$  localf ladd$
   localf lsub$
 localf lchange$  localf lchange$
 localf llsize$  localf llsize$
 localf llbase$  localf llbase$
   localf llget$
   localf lcut$
   localf rev$
   localf qsortn$
 localf lsort$  localf lsort$
   localf rsort$
 localf lpair$  localf lpair$
 localf lmax$  localf lmax$
 localf lmin$  localf lmin$
Line 137  localf mpower$
Line 161  localf mpower$
 localf mrot$  localf mrot$
 localf texlen$  localf texlen$
 localf isdif$  localf isdif$
   localf isfctr$
 localf fctrtos$  localf fctrtos$
 localf texlim$  localf texlim$
 localf fmult$  localf fmult$
Line 145  localf getel$
Line 170  localf getel$
 localf ptol$  localf ptol$
 localf rmul$  localf rmul$
 localf mtransbys$  localf mtransbys$
   localf trcolor$
   localf mcolor$
 localf drawopt$  localf drawopt$
 localf execdraw$  localf execdraw$
 localf execproc$  localf execproc$
 localf myswap$  localf myswap$
 localf mysubst$  localf mysubst$
   localf sort2$
   localf n2a$
 localf evals$  localf evals$
 localf myval$  localf myval$
 localf myeval$  localf myeval$
Line 169  localf myasin$
Line 198  localf myasin$
 localf myacos$  localf myacos$
 localf myatan$  localf myatan$
 localf mylog$  localf mylog$
   localf nlog$
   localf dlog10$
 localf mypow$  localf mypow$
 localf scale$  localf scale$
   localf catalan$
   localf iceil$
 localf arg$  localf arg$
 localf sqrt$  localf sqrt$
 localf gamma$  localf gamma$
Line 198  localf mmulbys$
Line 231  localf mmulbys$
 localf appldo$  localf appldo$
 localf appledo$  localf appledo$
 localf muldo$  localf muldo$
   localf caldo$
 localf jacobian$  localf jacobian$
 localf hessian$  localf hessian$
 localf wronskian$  localf wronskian$
 localf adj$  localf adj$
 localf laplace1$  localf laplace1$
 localf laplace$  localf laplace$
 localf mce$  localf mce$
   localf mcme$
 localf mc$  localf mc$
 localf rede$  localf rede$
 localf ad$  localf ad$
Line 214  localf addl$
Line 249  localf addl$
 localf cotr$  localf cotr$
 localf rcotr$  localf rcotr$
 localf muledo$  localf muledo$
 localf mulpdo$  localf mulpdo$
   localf transppow$
 localf transpdosub$  localf transpdosub$
 localf transpdo$  localf transpdo$
 localf translpdo$  localf translpdo$
Line 235  localf sftpowext$
Line 271  localf sftpowext$
 localf polinsft$  localf polinsft$
 localf pol2sft$  localf pol2sft$
 localf polroots$  localf polroots$
   localf sgnstrum$
   localf polstrum$
   localf polrealroots$
   localf polradiusroot$
 localf fctri$  localf fctri$
 localf binom$  localf binom$
 localf expower$  localf expower$
 localf seriesHG$  localf seriesHG$
 localf seriesMc$  localf seriesMc$
 localf seriesTaylor$  localf seriesTaylor$
   localf mulpolyMod$
   localf solveEq$
   localf res0$
   localf eqs2tex$
   localf baseODE$
   localf baseODE0$
   localf taylorODE$
 localf evalred$  localf evalred$
 localf toeul$  localf toeul$
 localf fromeul$  localf fromeul$
Line 254  localf expat$
Line 301  localf expat$
 localf polbyroot$  localf polbyroot$
 localf polbyvalue$  localf polbyvalue$
 localf pcoef$  localf pcoef$
   localf pmaj$
 localf prehombf$  localf prehombf$
 localf prehombfold$  localf prehombfold$
 localf sub3e$  localf sub3e$
Line 291  localf iscoef$
Line 339  localf iscoef$
 localf iscombox$  localf iscombox$
 localf sproot$  localf sproot$
 localf spgen$  localf spgen$
   localf spbasic$
 localf chkspt$  localf chkspt$
 localf cterm$  localf cterm$
 localf terms$  localf terms$
Line 300  localf cutgrs$
Line 349  localf cutgrs$
 localf mcgrs$  localf mcgrs$
 localf mc2grs$  localf mc2grs$
 localf mcmgrs$  localf mcmgrs$
   localf spslm$
 localf anal2sp$  localf anal2sp$
 localf delopt$  localf delopt$
 localf str_char$  localf str_char$
Line 320  localf s2euc$
Line 370  localf s2euc$
 localf s2sjis$  localf s2sjis$
 localf r2ma$  localf r2ma$
 localf evalma$  localf evalma$
   localf evalcoord$
   localf readTikZ$
 localf ssubgrs$  localf ssubgrs$
 localf verb_tex_form$  localf verb_tex_form$
 localf tex_cuteq$  localf tex_cuteq$
Line 330  localf divmattex$
Line 382  localf divmattex$
 localf dviout0$  localf dviout0$
 localf myhelp$  localf myhelp$
 localf isMs$  localf isMs$
   localf getline$
 localf showbyshell$  localf showbyshell$
 localf readcsv$  localf readcsv$
 localf tocsv$  localf tocsv$
Line 337  localf getbyshell$
Line 390  localf getbyshell$
 localf show$  localf show$
 localf dviout$  localf dviout$
 localf rtotex$  localf rtotex$
   localf togreek$
 localf mtotex$  localf mtotex$
 localf ltotex$  localf ltotex$
 localf texbegin$  localf texbegin$
Line 345  localf texsp$
Line 399  localf texsp$
 localf getbygrs$  localf getbygrs$
 localf mcop$  localf mcop$
 localf shiftop$  localf shiftop$
   localf shiftPfaff;
 localf conf1sp$  localf conf1sp$
   localf confexp$
   localf confspt$
   localf vConv$
   localf mcvm$
   localf s2cspb$
   localf s2csp$
   localf partspt$
 localf pgen$  localf pgen$
 localf diagm$  localf diagm$
 localf mgen$  localf mgen$
Line 371  localf powsum$
Line 433  localf powsum$
 localf bernoulli$  localf bernoulli$
 localf lft01$  localf lft01$
 localf linfrac01$  localf linfrac01$
 localf nthmodp$  localf nthmodp$
   localf issquare$
 localf issquaremodp$  localf issquaremodp$
 localf rootmodp$  localf rootmodp$
 localf rabin$  localf rabin$
Line 379  localf primroot$
Line 442  localf primroot$
 localf varargs$  localf varargs$
 localf ptype$  localf ptype$
 localf pfargs$  localf pfargs$
   localf regress$
 localf average$  localf average$
 localf tobig$  localf tobig$
 localf sint$  localf sint$
 localf frac2n$  localf frac2n$
   localf openGlib$
 localf xyproc$  localf xyproc$
 localf xypos$  localf xypos$
 localf xyput$  localf xyput$
   localf xylabel$
 localf xybox$  localf xybox$
 localf xyline$  localf xyline$
 localf xylines$  localf xylines$
Line 403  localf periodicf$
Line 469  localf periodicf$
 localf cmpf$  localf cmpf$
 localf areabezier$  localf areabezier$
 localf saveproc$  localf saveproc$
   localf xyplot$
   localf xyaxis$
 localf xygraph$  localf xygraph$
 localf xy2graph$  localf xy2graph$
 localf addIL$  localf addIL$
Line 412  localf xyarrow$
Line 480  localf xyarrow$
 localf xyarrows$  localf xyarrows$
 localf xyang$  localf xyang$
 localf xyoval$  localf xyoval$
   localf xypoch$
   localf xycircuit$
   localf ptline$
 localf ptcommon$  localf ptcommon$
   localf ptinversion$
   localf ptcontain$
 localf ptcopy$  localf ptcopy$
 localf ptaffine$  localf ptaffine$
 localf ptlattice$  localf ptlattice$
 localf ptpolygon$  localf ptpolygon$
 localf ptwindow$  localf ptwindow$
   localf pt5center$
   localf ptconvex$
 localf ptbbox$  localf ptbbox$
   localf darg$
   localf dwinding$
 localf lninbox$  localf lninbox$
 localf ptcombezier$  localf ptcombezier$
 localf ptcombz$  localf ptcombz$
Line 434  localf msort$
Line 511  localf msort$
 extern Muldif.rr$  extern Muldif.rr$
 extern TeXEq$  extern TeXEq$
 extern TeXLim$  extern TeXLim$
   extern TeXPages$
 extern DIROUT$  extern DIROUT$
 extern DIROUTD$  extern DIROUTD$
 extern DVIOUTL$  extern DVIOUTL$
Line 453  extern XYPrec$
Line 531  extern XYPrec$
 extern XYcm$  extern XYcm$
 extern TikZ$  extern TikZ$
 extern XYLim$  extern XYLim$
   extern TeXPages$
 extern Canvas$  extern Canvas$
 extern ID_PLOT$  extern ID_PLOT$
 extern Rand$  extern Rand$
 extern LQS$  extern LQS$
   extern SV=SVORG$
 #endif  #endif
 static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$  static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$
 static S_FDot$  static S_FDot$
 extern AMSTeX$  extern AMSTeX$
 Muldif.rr="00171005"$  extern Glib_math_coordinate$
   extern Glib_canvas_x$
   extern Glib_canvas_y$
   Muldif.rr="00220719"$
 AMSTeX=1$  AMSTeX=1$
 TeXEq=5$  TeXEq=5$
 TeXLim=80$  TeXLim=80$
   TeXPages=20$
 TikZ=0$  TikZ=0$
 XYcm=0$  XYcm=0$
 XYPrec=3$  XYPrec=3$
Line 480  LCOPT=["red","green","blue","yellow","cyan","magenta",
Line 564  LCOPT=["red","green","blue","yellow","cyan","magenta",
 COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$  COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$
 LPOPT=["above","below","left","right"]$  LPOPT=["above","below","left","right"]$
 LFOPT=["very thin","thin","dotted","dashed"]$  LFOPT=["very thin","thin","dotted","dashed"]$
   SVORG=["x","y","z","w","u","v","p","q","r","s"]$
 Canvas=[400,400]$  Canvas=[400,400]$
 LQS=[[1,0]]$  LQS=[[1,0]]$
   
Line 619  def mycat(L)
Line 704  def mycat(L)
                 Do = 1;                  Do = 1;
         }          }
         if(CR) print("");          if(CR) print("");
           else print("",2);
 }  }
   
 def fcat(S,X)  def fcat(S,X)
Line 629  def fcat(S,X)
Line 715  def fcat(S,X)
                                 [getenv("HOME"),get_rootdir(),"/"])+"/";                                  [getenv("HOME"),get_rootdir(),"/"])+"/";
                         if(isMs()) DIROUTD=str_subst(DIROUTD,"/","\\"|sjis=1);                          if(isMs()) DIROUTD=str_subst(DIROUTD,"/","\\"|sjis=1);
                 }                  }
                 if(S==-1) return;  
                 T="fcat";                  T="fcat";
                 if(S>=2&&S<=9) T+=rtostr(S);                  if(S>=2&&S<=9) T+=rtostr(S);
                 T=DIROUTD+T+".txt";                  T=DIROUTD+T+".txt";
Line 657  def mycat0(L,T)
Line 742  def mycat0(L,T)
                 Do = 1;                  Do = 1;
         }          }
         if(T) print("");          if(T) print("");
           else print("",2);
 }  }
   
 def findin(M,L)  def findin(M,L)
Line 766  def myediff(P,X)
Line 852  def myediff(P,X)
         return red(X*diff(P,X));          return red(X*diff(P,X));
 }  }
   
   def mypdiff(P,L)
   {
           if(type(P)>3) return map(os_md.mypdiff,P,L);
           for(Q=0;L!=[];L=cdr(L)){
                   Q+=mydiff(P,car(L))*L[1];
                   L=cdr(L);
           }
           return red(Q);
   }
   
   def difflog(L)
   {
           if(!isvar(X=getopt(var))) X=x;
           if(type(L)!=4) return 0;
           for(S=0;L!=[];L=cdr(L)){
                   if(type(L0=car(L))==4) S+=L0[1]*mydiff(L0[0],X)/L0[0];
                   if(type(L0)<4) S+=mydiff(L[0],X);
           }
           S=red(S);
           if(type(F=getopt(mc))>0){
                   X=vweyl(X);
                   S=mc(X[1]-S,X,F);
           }
           return red(S);
   }
   
   def pTaylor(S,X,N)
   {
           if(!isvar(T=getopt(time))) T=t;
           if(type(S)<4) S=[S];
           if(type(X)<4) X=[X];
           if(findin(T,varargs(S|all=2))>=0){
                   S=cons(z_z,S);X=cons(z_z,X);FT=1;
           }else FT=0;
           LS=length(S);
           FR=(getopt(raw)==1)?1:0;
           if(!FR) R=newvect(LS);
           else R=R1=[];
           for(L=[],I=0,TS=S,TX=X;I<LS;I++,TS=cdr(TS),TX=cdr(TX)){
                   if(!FR) R[I]=car(TX)+car(TS)*T;
                   else{
                           R=cons(car(TX),R);R1=cons(car(TS),R1);
                   }
                   L=cons(car(TS),cons(car(TX),L));
           }
           L=reverse(L);
           if(FR) R=[reverse(R1),reverse(R)];
           for(K=M=1;N>1;N--){
                   S=mypdiff(S,L);
                   K*=++M;
                   for(TS=S,I=0,R1=[];TS!=[];TS=cdr(TS),I++){
                           if(!FR) R[I]+=car(TS)*t^M/K;
                           else R1=cons(car(TS)/K,R1);
                   }
                   if(FR) R=cons(reverse(R1),R);
           }
           if(FT){
                   if(!FR){
                           S=newvect(LS-1);
                           for(I=1;I<LS;I++) S[I-1]=R[I];
                   }else{
                           for(S=[];R!=[];R=cdr(R)){
                                   S=cons(cdr(car(R)),S);
                           }
                           R=S;
                   }
                   R=subst(S,z_z,0);
           }
           return (FR&&!FT)?reverse(R):R;
   }
   
 def m2l(M)  def m2l(M)
 {  {
         if(type(M) < 4)          if(type(M) < 4)
Line 788  def m2l(M)
Line 945  def m2l(M)
   
 def mydeg(P,X)  def mydeg(P,X)
 {  {
         if(type(P) < 3)          if(type(P) < 3 && type(X)==2)
                 return deg(P,X);                  return deg(P,X);
         II = -1;          II=(type(X)==4)?-100000:-1;
         Opt = getopt(opt);          Opt = getopt(opt);
         if(type(P) >= 4){          if(type(P) >= 4){
                 S=(type(P) == 6)?size(P)[0]:0;                  S=(type(P) == 6)?size(P)[0]:0;
                 P = m2l(P);                  P = m2l(P);
                 for(I = 0, Deg = -3; P != []; P = cdr(P), I++){                  for(I = 0, Deg = -100000; P != []; P = cdr(P), I++){
                         if( (DT = mydeg(car(P),X)) == -2)                          if( (DT = mydeg(car(P),X)) == -2&&type(X)!=4)
                                 return -2;                                  return -2;
                         if(DT > Deg){                          if(DT > Deg){
                                 Deg = DT;                                  Deg = DT;
Line 806  def mydeg(P,X)
Line 963  def mydeg(P,X)
                 return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;                  return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
         }          }
         P = red(P);          P = red(P);
         if(deg(dn(P),X) == 0)          if(type(X)==2){
                 return deg(nm(P),X);                  if(deg(dn(P),X) == 0)
                           return deg(nm(P),X);
           }else{
                   P=nm(red(P));
                   for(D=-100000,I=deg(P,X[1]);I>=0;I--){
                           if(TP=mycoef(P,I,X[1])){
                                   TD=mydeg(TP,X[0])-I;
                                   if(D<TD) D=TD;
                           }
                   }
                   return D;
           }
         return -2;          return -2;
 }  }
   
Line 884  def mulsubst(F,L)
Line 1052  def mulsubst(F,L)
         if(N == 0)          if(N == 0)
                 return F;                  return F;
         if(type(L[0])!=4)       L=[L];          if(type(L[0])!=4)       L=[L];
           if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
         if(getopt(inv)==1){          if(getopt(inv)==1){
                 for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);                  for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);
                 L=reverse(R);                  L=reverse(R);
Line 929  def cmpsimple(P,Q)
Line 1098  def cmpsimple(P,Q)
   
 def simplify(P,L,T)  def simplify(P,L,T)
 {  {
         if(type(P) > 3)          if(type(P) > 3){
 #ifdef USEMODULE  #ifdef USEMODULE
                 return map(os_md.simplify,P,L,T);                  return map(os_md.simplify,P,L,T);
 #else  #else
                 return map(simplify,P,L,T);                  return map(simplify,P,L,T);
 #endif  #endif
           }
         if(type(L[0]) == 4){          if(type(L[0]) == 4){
                 if(length(L[0]) > 1)                  if(length(L[0]) > 1)
 #if USEMODULE  #if USEMODULE
Line 1014  def vnext(V)
Line 1184  def vnext(V)
 def ldict(N, M)  def ldict(N, M)
 {  {
         Opt = getopt(opt);          Opt = getopt(opt);
           F=iand(Opt,4)/4;Opt=iand(Opt,3);
         R = S = [];          R = S = [];
         for(I = 2; N > 0; I++){          for(I = 2; N > 0; I++){
                 R = cons(irem(N,I), R);                  R = cons(irem(N,I), R);
Line 1028  def ldict(N, M)
Line 1199  def ldict(N, M)
                                 J++;                                  J++;
                 }                  }
                 T[I-1] = 1;                  T[I-1] = 1;
                 S = cons(LL-I+1, S);                  S = cons(LL-I+F+1, S);
         }          }
         for(I = 0; I <= LL; I++){          for(I = 0; I <= LL; I++){
                 if(T[I] == 0){                  if(T[I] == 0){
                         S = cons(LL-I, S);                          S = cons(LL-I+F, S);
                         break;                          break;
                 }                  }
         }          }
Line 1043  def ldict(N, M)
Line 1214  def ldict(N, M)
                 return 0;                  return 0;
         }          }
         T = [];          T = [];
         for(I = --M; I > LL; I--)          for(I = --M; I > LL;I--)
                 T = cons(I,T);                  T = cons(I+F,T);
         S = append(S,T);          S = append(S,T);
         if(Opt == 2 || Opt == 3)          if(Opt == 2 || Opt == 3)
                 S = reverse(S);                  S = reverse(S);
         if(Opt != 1 && Opt != 3)          if(Opt != 1 && Opt != 3)
                 return S;                  return S;
           M+=2*F;
         for(T = []; S != []; S = cdr(S))          for(T = []; S != []; S = cdr(S))
                 T = cons(M-car(S),T);                  T = cons(M-car(S),T);
         return T;          return T;
Line 1058  def ldict(N, M)
Line 1230  def ldict(N, M)
 def ndict(L)  def ndict(L)
 {  {
         Opt = getopt(opt);          Opt = getopt(opt);
           if(type(L)==5) L=vtol(L);
         R = [];          R = [];
         if(Opt != 1 && Opt != 2)          if(Opt != 1 && Opt != 2)
                 L = reverse(L);                  L = reverse(L);
Line 1125  def transpart(L)
Line 1298  def transpart(L)
   
 def trpos(A,B,N)  def trpos(A,B,N)
 {  {
           if(!N){
                   N=(A<B)?B:A;
                   N++;
           }
         S = newvect(N);          S = newvect(N);
         for(I = 0; I < N; I++)          for(I = 0; I < N; I++)
                 S[I]=(I==A)?B:((I==B)?A:I);                  S[I]=(I==A)?B:((I==B)?A:I);
Line 1133  def trpos(A,B,N)
Line 1310  def trpos(A,B,N)
   
 def sprod(S,T)  def sprod(S,T)
 {  {
         L = length(S);          if(F=isint(S)) S=vtol(ldict(S,0));
           if(isint(T)){
                   T=vtol(ldict(T,0));
                   F++;
           }
           if((L=length(S))==2&&S!=[0,1]){
                   S=trpos(S[0],S[1],0);
                   L=length(S);
           }
           if((R=length(T))==2&&T!=[0,1]){
                   T=trpos(T[0],T[1],0);
                   R=length(T);
           }
           if(L!=R){
                   if(L>R){
                           W=newvect(L);
                           for(I=0;I<L;I++) W[I]=(I<R)?T[I]:I;
                           T=W;
                   }
                   else{
                           W=newvect(R);
                           for(I=0;I<R;I++) W[I]=(I<L)?S[I]:I;
                           S=W;
                           L=R;
                   }
           }
         V = newvect(L);          V = newvect(L);
         while(--L >= 0)          while(--L >= 0) V[L] = S[T[L]];
                 V[L] = S[T[L]];          return (F==2)?ndict(V):V;
         return V;  
 }  }
   
   def sadj(S,T)
   {
           return sprod(sprod(S,T),sinv(S));
   }
   
 def sinv(S)  def sinv(S)
 {  {
         L = length(S);          if(F=isint(S)) S=ltov(ldict(S,0));
           L = length(S);
           if(L==2) return S;
         V = newvect(L);          V = newvect(L);
         while(--L >= 0)          while(--L >= 0)
                 V[S[L]] = L;                  V[S[L]] = L;
         return V;          return (F)?ndict(V):V;
 }  }
   
 def slen(S)  def slen(S)
Line 1159  def slen(S)
Line 1367  def slen(S)
         return V;          return V;
 }  }
   
   def sexps(S)
   {
           K=length(S);S=ltov(S);
           for(R=[],I=0;I<K-1;I++){
                   for(J=I;J>=0&&S[J]>S[J+1];J--){
                           T=S[J];S[J]=S[J+1];S[J+1]=T;
                           R=cons(J,R);
                   }
           }
           return R;
   }
   
 def sord(W,V)  def sord(W,V)
 {  {
         L = length(W);          L = length(W);
Line 1192  def sord(W,V)
Line 1412  def sord(W,V)
   
 def vprod(V1,V2)  def vprod(V1,V2)
 {  {
           V1=lsub(V1);V2=lsub(V2);
         for(R = 0, I = length(V1)-1; I >= 0; I--)          for(R = 0, I = length(V1)-1; I >= 0; I--)
                 R = radd(R, rmul(V1[I], V2[I]));                  R = radd(R, rmul(V1[I], V2[I]));
         return R;          return R;
Line 1199  def vprod(V1,V2)
Line 1420  def vprod(V1,V2)
   
 def dnorm(V)  def dnorm(V)
 {  {
         if(type(V)<2) return dabs(V);          if(type(V)<2) return ctrl("bigfloat")?abs(V):dabs(V);
           if((M=getopt(max))==1||M==2){
                   if(type(V)==5) V=vtol(V);
                   for(S=0;V!=[];V=cdr(V)){
                           if(M==2) S+=ctrl("bigfloat")?abs(car(V)):dabs(car(V));
                           else{
                                   if((T=ctrl("bigfloat")?abs(car(V)):dabs(car(V)))>S) S=T;
                           }
                   }
                   return S;
           }
         R=0;          R=0;
         if(type(V)!=4)          if(type(V)!=4)
                 for (I = length(V)-1; I >= 0; I--) R+= V[I]^2;                  for (I = length(V)-1; I >= 0; I--) R+= real(V[I])^2+imag(V[I])^2;
         else{          else{
                 if(type(V[0])>3){                  if(type(V[0])>3){
                         V=ltov(V[0])-ltov(V[1]);                          V=ltov(V[0])-ltov(V[1]);
                         return dnorm(V);                          return dnorm(V);
                 }                  }
                 for(;V!=[]; V=cdr(V))   R+=car(V)^2;                  for(;V!=[]; V=cdr(V))   R+=real(car(V))^2+imag(car(V))^2;
         }          }
         return dsqrt(R);          return ctrl("bigfloat")?pari(sqrt,R):dsqrt(R);
 }  }
   
 def dvprod(V1,V2)  def dvprod(V1,V2)
 {  {
         if(type(V1)<2) return V1*V2;          if(type(V1)<2) return V1*V2;
         R=0;          R=0;
           V1=lsub(V1);
           V2=lsub(V2);
         if(type(V1)!=4)          if(type(V1)!=4)
                 for(I = length(V1)-1; I >= 0; I--)                  for(I = length(V1)-1; I >= 0; I--)
                         R += V1[I]*V2[I];                          R += V1[I]*V2[I];
Line 1227  def dvprod(V1,V2)
Line 1460  def dvprod(V1,V2)
         return R;          return R;
 }  }
   
   def ptline(L,R)
   {
           P=L[0];Q=L[1];
           return (Q[1]-P[1])*(R[0]-P[0])-(Q[0]-P[0])*(R[1]-P[1]);
   }
   
   
 def dvangle(V1,V2)  def dvangle(V1,V2)
 {  {
         if(V2==0 && type(V1)==4 && length(V1)==3 &&          if(V2==0 && type(V1)==4 && length(V1)==3 &&
Line 1258  def mulseries(V1,V2)
Line 1498  def mulseries(V1,V2)
         return VV;          return VV;
 }  }
   
   def catalan(K)
   {
           if(isint(K)) return catalan([K,K]);
           if(type(K)==4){
                   if(length(K)==2){
                           M=K[0];N=K[1];
                           if(M<N||M<0||N<0) return 0;
                           if(N==0) return 1;
                           T=fac(M+N);
                           return T/fac(M)/fac(N)-T/fac(M+1)/fac(N-1);
                   }
                   if(length(K)==3){
                           T=K[0];N=K[1];K=K[2];
                           if(T=="P"||T=="01"||T=="H"){
                                   if(T=="P") return fac(N)/fac(N-K);
                                   if(T=="H") N+=K-1;
                                   if(K<0||K>N) return 0;
                                   return fac(N)/fac(K)/fac(N-K);
                           }
                           if(K<1||N<1||K>N) return 0;
                           if(N==K) return 1;
                           if(T==1){
                                   if(K==1) return fac(N-1);
                                   return catalan([1,N-1,K-1])+(N-1)*catalan([1,N-1,K]);
                           }else if(T==2){
                                   if(K==1) return 1;
                                   return catalan([2,N-1,K-1])+ K*catalan([2,N-1,K]);
                           }
                   }
           }
           return 0;
   }
   
   def sort2(L)
   {
           if(L[0]<=L[1]) return L;
           if(type(L)==4) return [L[1],L[0]];
           T=L[0];L[0]=L[1];L[1]=T;
           return L;
   }
   
   /* 01: 01 list
    * s : 01 str
    * T : tounament
    * # : #lines of vertexes (vector)
    * P : Polygon with tg
    */
   def getCatalan(X,N)
   {
           if(type(To=getopt(to))!=7) To=0;
            if(type(X)==7){        /* string: s or T */
                   X=strtoascii(X);
                   N=length(X);
                   if(X[0]==48){
                           if(To=="s") return R;
                           R=calc(X,["-",48]);  /* s -> 01 */
                           if(To) R=getCatalan(R,0|to=To);
                           return R;
                   }
                   if(To=="T") return X;
                   if(To!="P"&&To!="#"){   /* T -> 01 */
                           for(R=[];X!=[];X=cdr(X)){
                                   if(car(X)==41) R=cons(1,R);
                                   else if(car(X)==42) R=cons(0,R);
                           }
                           R=cdr(reverse(R));
                           if(To!="01") R=getCatalan(R,0|to=To);
                           return R;
                   }
                   if(N%3!=1) return 0;
                   M=(N+2)/3;      /* T -> # */
                   V=newvect(M+1);
                   V[0]=V[M]=-1;
                   for(;X!=[];X=cdr(X)){
                           if(car(X)==40||car(X)==41) V[I]++;
                           else I++;
                   }
                   V[M]+=F;
                   if(To!="P") return V;
                   X=V;
           }
           if(type(X)==5){ /* vector: # -> P */
                   if(To=="#") return X;
                   Y=newvect(length(X));K=dupmat(X);
                   M=length(X);
                   for(R=[],I=F=0;;I++){
                           if(I>=M){
                                   if(!F) break;
                                   F=0;I=-1;continue;
                           }
                           if(X[I]>0){
                                   if(I+1>=M ||K[I+1]>0) continue;
                                   for(J=I+2;J<M&&!K[J];J++);
                                   if(J>=M||findin([I,J],R)>=0) continue;
                                   R=cons([I,J],R);
                                   K[I]--;K[J]--;Y[J]++;
                                   I=J-1;
                                   F++;
                           }
                   }
                   if(To&&To!="P"){
                           for(V=[],J=0;J<M;J++){
                                   V=cons(0,V);
                                   for( ; Y[J]>0; Y[J]--) V=cons(1,V);
                           }
                           V=reverse(V);
                           if(To!=0&&To!="01") V=getCatalan(V,0|to=To);
                           return V;
                   }
                   R=qsort(R);
                   return R;
           }
           if(!isint(F=getopt(opt))) F=0;
           if(!isint(X)){
                   if(type(X)==4&&type(car(X))==4){ /* ptg */
                           N=length(X)+3;
                           V=newvect(N);R=newvect(N);
                           for(TX=X;TX!=[];TX=cdr(TX)){
                                   V[car(TX)[0]]++;R[car(TX)[1]]++;
                           }
                           if(To=="#"){
                                   for(I=0;I<N;I++) V[I]+=R[I];
                                   return V;
                           }else{
                                   for(K="(",I=0;;I){
                                           for(J=R[I];J>0;J--) K=K+")";
                                           for(J=V[I];J>0;J--) K=K+"(";
                                           if(++I<N) K=K+"*";
                                           else break;
                                   }
                                   K=K+")";
                                   if(To!="T") K=getCatalan(K,0|to=To);
                                   return K;
                           }
                   }
                           /* 01 list */
                   if(To=="s") return asciitostr(calc(X,["+",48]));
                   if(To=="T"||To=="#"||To=="P"){
                           for(R=["*"],TX=X;TX!=[];TX=cdr(TX)){
                                   if(car(TX)==0) R=cons("*",R);
                                   else{
                                           T=car(R);R=cdr(R);T="("+car(R)+T+")";
                                           R=cons(T,cdr(R));
                                   }
                           }
                           R=car(R);
                           if(To=="P"||To=="#") R=getCatalan(R,0|to=To);
                           return R;
                   }
                   K=length(X)/2;
                   if(K<2) return 0;
                   if(F){                  /* Not checked */
                           for(I=F=0,TX=X;TX!=[];I++,TX=cdr(TX)){
                                   if(!car(TX)){
                                           F++;continue;
                                   }
                                   F--;
                                   if(F<=0){
                                           for(J=1;J<I;J+=2) F+=catalan((J-1)/2)*catalan(K-(J+1)/2);
                                           J=lcut(X,1,I-1);J=getCatalan(J,(I-1)/2|opt=1);
                                           V=lcut(X,I+1,2*K-1);V=getCatalan(V,K-(I+1)/2|opt=1);
                                           F+=J*catalan(K-(I+1)/2)+V;
                                           break;
                                   }
                           }
                           return F;
                   }
                   for(R=M=N=0,TX=X;TX!=[];TX=cdr(TX)){
                           if(car(TX)==0){
                                   if(M>N) R+=catalan([K-N-1,K-M]);
                                   M++;
                           }else N++;
                   }
                   return R;
           }
           if(!isint(X)||X++<0) return 0;
                                           /* integer: */
           if(!N){
                   for(Y=N=1;X>Y;N++) Y*=(4*N+2)/(N+2);
           }else{
                   Y=catalan(N);
                   if(X>Y) return 0;
           }
           if(F){
                   X--;
                   if(N<3){
                           if(N==2) R=X>0?"0011":"0101";
                           else if(N==1) R="01";
                           else R="";
                   }
                   else for(I=0;I<N;I++){
                           V=catalan(I)*catalan(N-I-1);
                           if(X>=V) X-=V;
                           else{
                                   J=X%catalan(N-I-1);
                                   K=(X-J)/catalan(N-I-1);
                                   R=(I==0)?"01":"0"+getCatalan(K,I|opt=F+1)+"1";
                                   if(N-I>1) R=R+getCatalan(J,N-I-1|opt=F+1);
                                   break;
                           }
                   }
                   if(To=="s"||F>1) return R;
                   R=calc(strtoascii(R),["-",48]);
           }else{
                   for(R=[],M=N;M>0||N>0;){
                           Z=Y*(M-N)*(M+1)/(M-N+1)/(M+N);
                           if(X>Z){
                                   N--;X-=Z;Y-=Z;R=cons(0,R);
                           }else{
                                   M--;Y=Z;R=cons(1,R);
                           }
                   }
                   R=reverse(R);
           }
           if(To=="s") R=asciitostr(calc(R,["+",48]));
           else if(To=="T"||To=="#"||To=="P") R=getCatalan(R,0|to=To);
           return R;
   }
   
   def xypg2tg(K)
   {
           D=3.1416/2;Or=[0,0];Op="red";Every="";M=0.5;V=0.15;W=0.2;Num=St=Pr=F=0;Line=R=[];
           if(isint(T=getopt(pg))) S=T;
           if(isint(T=getopt(skip))) F=T;
           if(type(T=getopt(r))==1) M=T;
           else if(type(T)==4){
                   M=T[0];
                   if(length(T)>1) V=T[1];
                   if(length(T)>2) W=T[2];
           }
           if(isint(T=getopt(proc))) Pr=T;
           if(type(T=getopt(org))==4) Or=T;
           if(type(T=getopt(rot))==1||T==0) D=T;
           if(type(T=getopt(dviout))==1) Dvi=T;
           if(type(T=getopt(num))==1) Num=T;
           if(type(T=getopt(every))==7) Every=T;
   
           if(type(car(K)[0])==4){
                   if(type(T=getopt(line))==4) Line=T;
                   S=length(K);
                   Opt=delopt(getopt(),["Opt","skip","proc","dviout","num","line"]);
                   if(type(car(Or))!=4||length(Or)!=S){
                           Or0=[0,0]; Or1=[1.5,0]; Or2=[0,1.5]; M=10;
                           if(car(Or)==0&&type(Or[1])==4){
                                   Or0=Or[1];
                                   Or=cdr(cdr(Or));
                           }
                           if(length(Or)>1&&type(Or[1])==4){
                                   M=Or[0]; Or1=Or[1];
                           }
                           if(length(Or)>2) Or2=Or[3];
                           for(R=[],I=0;I<S;I++){
                                   J=I%M;T=ladd(Or0,Or1,J);
                                   J=(I-J)/M;T=ladd(T,Or2,-J);
                                   R=cons(T,R);
                           }
                           Or=reverse(R);
                   }
                   if(!Pr&&TikZ){
                           Tb=str_tb("%TikZ0%\n",0);
                           if(Line!=[]) F=ior(F,512);
                           for(I=0;K!=[];K=cdr(K),Or=cdr(Or),I++){
                                   T=append([["org",car(Or)],["skip",F],["num",I+1]],Opt);
                                   Tb=str_tb("%"+rtostr(I+1)+"%"+"\n",Tb);
                                   Tb=str_tb(xypg2tg(car(K)|option_list=T),Tb);
                                   F=ior(F,1);
                           }
                           if(length(Line)>0){
                                   Tb=str_tb("%%\n",Tb);
                                   if(type(car(Line))!=4) Line=[Line];
                           }
                           for(S="";Line!=[]; Line=cdr(Line)){
                                   T=car(Line);
                                   if(length(T)>2){
                                           S=T[2];
                                           if(S!="") S="["+S+"]";
                                   }
                                   Tb=str_tb("\\draw"+S+"(S"+rtostr(T[0])+")--(S"+rtostr(T[1])+");\n",Tb);
                           }
                           S=str_tb(0,Tb);
                           if(Dvi==1) xyproc(S|dviout=1);
                           else if(Dvi==-1) S=xyproc(S);
                           return S;
                   }
           }
   
           if(type(L=getopt(V))>3){
                   if(type(L)==4) L=ltov(L);
                   S=length(L);
           }else{
                   S=length(K)+3;
                   L=newvect(S);
           }
           if(Pr==1){
                   if(!L[0])
                           for(I=0;I<S;I++) L[I]=[Or[0]+M*dcos(D+3.1416*2*I/S),Or[1]+M*dsin(D+3.1416*2*I/S)];
                   if(!iand(F,2)) R=[xylines(L|proc=1,close=1)];
                   if(!iand(F,4)){
                           for(TK=K;TK!=[];TK=cdr(TK))
                                   R=append([xylines([L[car(TK)[0]],L[car(TK)[1]]]|proc=1,opt=Op)],R);
                   }
                   return R;
           }
           if(!TikZ) return "";
           if(Op!="" && strtoascii(Op)[0]!=91) Op="["+Op+"]";
   
           Tb=str_tb(0,0);
           J=iand(F,64)?-1:1;
           if(iand(F,256)){
                   M1=10;M2=6;
           }else{
                   M1=6;M2=3;
           }
           if(!L[0]){
                           for(I=0;I<S;I++) L[I]=["("+rtostr(I+St)+")",
                                   [Or[0]+M*dcos(D+3.1416*2*I*J/S),Or[1]+M*dsin(D+3.1416*2*I*J/S)]];
           }else{
                   for(I=0;I<S;I++)
                           if(length(L[I])==2) L[I]=["("+rtostr(I+St)+")", L[I][0],L[I],1];
           }
           if(!iand(F,1)){
                   for(I=0;I<S;I++) Tb=str_tb("\\coordinate"+(iand(F,256)?"(P"+rtostr(I+St)+")":car(L[I]))
                           +" at "+xypos(L[I][1])+";\n",Tb);
                   if(iand(F,32)){
                           for(I=0;I<S;I++){
                                   if(!iand(F,16))  VV=ladd(0,L[I][1],1+V/M);
                                   else{
                                           VV=ladd(L[I][1],L[(I+1)%S][1],1);
                                           J=dnorm(VV);
                                           VV=ladd(0,VV,1/2+V/J);
                                   }
                                   Tb=str_tb("\\coordinate("+(iand(F,16)?"E":"V")+rtostr(I+St)+")"
                                           +" at "+xypos(VV)+";\n",Tb);
                           }
                   }
                   Tb=str_tb("%\n",Tb);
           }
           if(!iand(F,4)){
                   Tb=str_tb("\\coordinate(S) at "+xypos(Or)+";\n",Tb);
                   if(iand(F,512)) str_tb("\\node(S"+rtostr(Num)+
                           ")[circle,minimum size=" +rtostr(2*(M+W))+ "cm] at (S){};\n",Tb);
                   if(iand(F,256)) for(I=0;I<S;I++)  Tb=str_tb("\\coordinate"+L[I][0]+" at " +
                           "($(S)+(P"+ rtostr(I+St) +")$);\n",Tb);
                   if(Every!=""){
                           Tb=str_tb(Every,Tb);Tb=str_tb("\n",Tb);
                   }
           }
           if(!iand(F,2)){
                   Tb=str_tb("\\draw ",Tb);
                   for(I=0;I<S;I++){
                           if(!(I%M1)) Tb=str_tb("\n",Tb);
                           if(I) Tb=str_tb("--",Tb);
                           Tb=iand(F,256)? str_tb(car(L[I]),Tb):str_tb("($(S)+"+car(L[I])+"$)",Tb);
                   }
                   Tb=str_tb("--cycle;\n",Tb);
           }
           if(!iand(F,8)){
                   for(I=0,T=K;T!=[];T=cdr(T),I++){
                           if(length(car(T))>2){
                                   if(I<=0) Tb=str_tb(";\n",Tb);
                                   TOp="["+car(T)[2]+"]";I=-1;
                           }else TOp=Op;
                           if(!I) Tb=str_tb("\\draw "+TOp,Tb);
                           Tb=str_tb((I%M2)?" ":"\n",Tb);
                           if(!iand(F,256))
                                   Tb=str_tb("($(S)+"+ car(L[car(T)[0]]) +"$)--($(S)+" +car(L[car(T)[1]]) +"$)",Tb);
                           else
                                   Tb=str_tb(car(L[car(T)[0]])+"--"+car(L[car(T)[1]]),Tb);
                   }
                   Tb=str_tb(";\n",Tb);
           }
           if(iand(F,32)) for(I=0;I<S;I++)
                   Tb=str_tb("\\node at ($(S)+("+(iand(F,16)?"E":"V") + rtostr(I+St) +
                           ")$) \{" +rtostr(I+St) +"\};\n",Tb);
           S=str_tb(0,Tb);
           if(Dvi==1) xyproc(S|dviout=1);
           else if(Dvi==-1) S=xyproc(S);
           return S;
   }
   
   /*
      F=0 : sort
      F<0 : circulate -F: [I,J] -> [I-F,J-F]
   *     1 : list of circulate
   *     2 : sorted above list
   *     3 : minimum in the above
   *     4 : minimum mirror
   *     5 : minimam extend
   *     6 : extend
      "std" :  to normal form
       "#"  :  #lines  (10)
       "-#" :  inverse of "#" (11)
       "del":  reduction points
           F=[I,J] => another diagonal (flip option)
           F=[I] : the other ends of diagonal starting from I
           ["ext",I] : [I-1,I] ‚É’¸“_‚ð•t‰Á
       ["del",I] : I‚ð’ׂ·
           ["pair",I] : I‚ð’Ê‚é‘Ίpü‚Ì‘¼•û
           ["pairb",I] : I‚Ƃ‚Ȃª‚Á‚½’¸“_i•Ó‚ł̂‚Ȃª‚è‚ðŠÜ‚Þj
           ["mirror",K]F[I,J] -> [K-I,K-J]
       ["flip0",[I,J]] : [I,J] ‚Ì‘¼•û‚̑Ίpü
           ["flip",[I,J]]  : [I,J] ‚ŃtƒŠƒbƒv
                              ["res",I]  :
    */
   def pgpart(K,F)
   {
           S=length(K)+3;
           if(type(F)==4){
                   if(length(F)==1){
                           F=car(F);
                           for(R=[];K!=[];K=cdr(K)){
                                   if(car(K)[0]==F) R=cons(car(K)[1],R);
                                   else if(car(K)[1]==F) R=cons(car(K)[0],R);
                           }
                           return R;
                   }
                   if(length(F)==2){
                           if(isint(F[0])){
                                   F=sort2(F);
                                   K0=pgpart(K,["pair",F[0]]);K0=cons((F[0]+1)%S,K0);K0=cons((F[0]+S-1)%S,K0);
                                   K1=pgpart(K,["pair",F[1]]);K1=cons((F[1]+1)%S,K1);K1=cons((F[1]+S-1)%S,K1);
                                   if(findin(F[1],K0)<0) return [];
                                   R=lsort(K1,K2,"cap");
                                   if(length(R)!=2) return [];
                                   R=sort2(R);
                                   if(getopt(flip)==1){
                                           for(RR=[R];K!=[];K=cdr(K))
                                                   RR=cons((F==car(K))?R:car(K),RR);
                                           R=pgpart(RR,0);
                                   }
                                   return R;
                           }
                           if(F[0]=="ext"){
                                   if(F[1]=="all"){
                                           for(I=0,R=[];I<S;I++) R=cons(pgpart(K,["ext",I]),R);
                                           return R;
                                   }
                                   if(F[1]=="sym"){
                                           R=pgpart(K,1);
                                           for(K=[];R!=[];R=cdr(R)) K=cons(pgpart(car(R),["ext",0]),K);
                                           for(R=[];K!=[];K=cdr(K)) R=cons(pgpart(car(K),3),R);
                                           return R;
                                   }
                                   F=F[1];
                                   R=[sort2([(F-1)%(S+1),(F+1)%(S+1)])];
                                   for(;K!=[];K=cdr(K)){
                                           I=car(K)[0];if(I>=F)I++;
                                           J=car(K)[1];if(J>=F)J++;
                                           R=cons([I,J],R);
                                   }
                                   return pgpart(R,0);
                           }
                           if(F[0]=="res"){
                                   F1=F[1];
                                   T=sort2([(F1-1)%S,(F1+1)%S]);
                                   for(R=[];K!=[];K=cdr(K)){
                                           if(car(K)==T) continue;
                                           if((I=car(K)[0])>F1)I--;
                                           if((J=car(K)[1])>F1)J--;
                                           R=cons([I,J],R);
                                   }
                                   if(length(R)!=S-4) return 0;
                                   return pgpart(R,0);
                           }
                           if(F[0]=="pair"||F[0]=="pairb"){
                                   for(R=[];K!=[];K=cdr(K)){
                                           if(car(K)[0]==F[1]) R=cons(car(K)[1],R);
                                           if(car(K)[1]==F[1]) R=cons(car(K)[0],R);
                                   }
                                   if(F[0]=="pairb"){
                                           R=cons((F[1]+1)%S,R);R=cons((F[1]-1)%S,R);
                                   }
                                   return qsort(R);
                           }
                           if(F[0]=="flip"||F[0]=="flip0"){
                                   S=sort2(F[1]);
                                   I=pgpart(K,["pairb",S[0]]);J=pgpart(K,["pairb",S[1]]);
                                   I=lsort(I,J,"cap");
                                   if(length(I)!=2) return 0;
                                   if(F[0]=="flip0") return I;
                                   for(R=[];K!=[];K=cdr(K))
                                           R=cons((car(K)==S)?I:car(K),R);
                                   return qsort(R);
                           }
                           if(F[0]=="mirror"){
                                   for(R=[];K!=[];K=cdr(K))
                                           R=cons([(F[1]-car(K)[0])%S,(F[1]-car(K)[1])%S],R);
                                   return pgpart(R,0);
                           }
                   }
           }
           if(F=="check"){
                   K=pgpart(K,0);
                   for(;K!=[];){
                           L=pgpart(K,"res");
                           if(L==[]) return 0;
                           for(L=reverse(L);L!=[];L=cdr(L)){
                                   R=pgpart(K,["res",car(L)]);
                                   if(R==0) return 0;
                                   K=R;
                           }
                   }
                   return 1;
           }
           if(F=="std") F=0;
           if(type(F)==7){
                   S0=[7,8,12,0,13];S1=["#","-#","res","std","cat"];
                   I=findin(F,S1);
                   if(I>=0) F=S0[I];
           }
           if(isint(F) && F<=0){
                   for(R=[];K!=[];K=cdr(K)){
                           I=(car(K)[0]-F)%S;
                           J=(car(K)[1]-F)%S;
                           R=cons(sort2([I,J]),R);
                   }
                   return qsort(R);
           }
           if(F>0&&F<4){
                   for(R=[],I=0;I<S;I++){
                           TR=pgpart(K,-I);
                           if(!I) R0=TR;
                           else if(R0==TR) break;
                           R=cons(TR,R);
                   }
                   if(F>1) R=lsort(R,[],1);
                   if(F==3) R=R[0];
                   return R;
           }
           if(F==4){
                   for(R=[];K!=[];K=cdr(K)){
                           I=S-car(K)[0]-1;
                           J=S-car(K)[1]-1;
                           R=cons([J,I],R);
                   }
                   return pgpart(R,3);
           }
           if(F==5){
                   K=pgpart(K,1);
                   for(R=[];K!=[];K=cdr(K)){
                           TK=cons([0,S-1],car(K));
                           R=cons(pgpart(TK,3),R);
                   }
                   return lsort(R,[],1);
           }
           if(F==6){
                   K=cons([0,S-1],K);
                   return lsort(pgpart(K,2),[],1);
           }
           if(F==7||F=="#"){
   /*
                   for(R=newvect(S);K!=[];K=cdr(K)){
                           R[car(K)[0]]++;
                           R[car(K)[1]]++;
                   }
                   return vtol(R);
   */
                   return vtol(getCatalan(K,0|to="#"));
           }
           if(F=="-#"||F==8){
                   if(type(K)==4) K=ltov(K);
                   return getCatalan(K,0|to="P");
           }
       if(F==10||F==11){
                   S=length(K);
                   K=ltov(K);L=newvect(S);
                   for(R=[],T=S-3;T>0;T--){
                           for(I=0;I<S;I++){
                                   if(L[I]||K[I]) continue;
                                   for(J=1;J<S;J++) if(K[T0=(I+J)%S]) break;
                                   for(J=S-1;J>0;J--) if(K[T1=(I+J)%S]) break;
                                   if(T1==T0||T0==I||T1==I) return [];
                                   K[T0]--;K[T1]--;L[I]--;
                                   R=cons([T1,T0],R);
                                   break;
                           }
                           if(I==S) return [];
                   }
                   if(F==11) return reverse(pgpart(R,8));
                   return pgpart(R,0);
           }
           if(F==12||F=="res"){
                   K=pgpart(K,7);
                   for(I=0,R=[];K!=[];I++,K=cdr(K)) if(!car(K)) R=cons(I,R);
                   return reverse(R);
           }
           if(F==13||F==14||F=="0"||F=="("||(F=="T"&&type(K)==7)){
                   ST=(F==13||F=="0")?48:40;
                   S=length(K)+3;
                   J=newvect(S);I=newvect(S);RR=newvect(S);
                   for(;K!=[];K=cdr(K)){
                           I[car(K)[0]]++;
                           J[car(K)[1]]++;
                   }
                   J[S-1]++;
                   for(R=[],K=S-1;K>1;K--){
                           for(T=J[K];T>0;T--) R=cons(ST+1,R);
                           for(T=I[K-2];T>0;T--) R=cons(ST,R);
                   }
                   R=cons(ST,R);
                   if(F!="T") return asciitostr(R);
                   F=="TT";
           }
           if(F==9){
                   for(R=[];K!=[];K=cdr(K)){
                           I=S-car(K)[0]-1;
                           J=S-car(K)[1]-1;
                           R=cons([J,I],R);
                   }
                   T=pgpart(R,3);
                   if(imod(S,1))return T;
                   for(R=[];K!=[];K=cdr(K)){
                           I=(-car(K)[0])%S;
                           J=(-car(K)[1])%S;
                           R=cons([J,I],R);
                   }
                   R=pgpart(R,3);
                   return T<R?T:R;
           }
           if(F=="T"||F=="TT"){
                   if(F=="T") K=asciitostr(K);
                   L=length(K);
                   for(R=[[0]],I=0,N=1;I<L;I++){
                           if(K[I]==ST)
                                   R=cons(n2a(N++|opt="[]",s=-1),R);
                           else{
                                   TR=append(R[0],[41]);
                                   TR=append(R[1],TR);
                                   TR=cons(40,TR);
                                   R=cons(TR,cdr(cdr(R)));
                           }
                   }
                   return asciitostr(car(R));
           }
   }
   
   def pg2tg(K)
   {
           if((Bis=getopt(bis))==1||K<0) return pg2tgb(K|option_list=getopt());
           if(!isint(Al=getopt(all))) Al=0;
           Zig=iand(Al,64);Al=iand(Al,63);
           if(K<4||!isint(K)) return [];
           R=[];F=0;N=catalan(K-2)-1;
           for(;N>=0;N--){
                   T=(Bis==2)?getCatalan(N,K-2|to="P",opt=2):getCatalan(N,K-2|to="P",opt=1);
                   if(Zig&&length(pgpart(T,"res"))!=2) continue;
                   if(Al==0||Al==2){
                           for(I=1;T!=0&&I<K;I++){
                                   S=pgpart(T,-I);
                                   if(S==T) break;
                                   if(S<T) T=0;
                           }
                           if(!T) continue;
                   }
                   if(Al==0){
                           U=pgpart(T,["mirror",0]);
                           if(U==T) I=K;
                           else if(U<T) T=0;
                           for(I=1;T!=0&&I<K;I++){
                                   S=pgpart(U,-I);
                                   if(S==U) break;
                                   if(S<T) T=0;
                           }
                           if(!T) continue;
                   }
                   R=cons(T,R);
           }
           if(Bis==2) R=qsort(R);
           return R;
   }
   
   def pg2tgb(K)
   {
           if((F=getopt(verb))!=1) F=0;
           if(!isint(Al=getopt(all))) Al=0;
           Al=iand(Al,63);
           if(!isint(M) || M<32) M=1024;
           if(isint(K)){
                   R=[];
                   if(K>3){
                           while(K-- > 3) R=pg2tgb(R|verb=F,red=M,all=Al);
                           return R;
                   }else if(K<-3){
                           for(RR=[],K=-K-3;K>0;K--) RR=cons(R=pg2tgb(R|verb=F,red=M,all=Al),RR);
                           return reverse(RR);
                   }
                   return [];
           }
           if(K==[]) return (Al==1)?[[[0,2]],[[1,3]]]:[[[0,2]]];
           S=length(car(K))+3;
           for(R=[],I=N=0;K!=[];K=cdr(K),I++){
                   TR=pgpart(car(K),(Al==1)?6:5);
                   if(!Al){
                           TR=append(pgpart(pgpart(car(K),4),5),TR);
                           for(T=TR,TR=[];T!=[];T=cdr(T)) if(pgpart(car(T),4) >= car(T)) TR=cons(car(T),TR);
                                   /* 4 => 9 */
                           TR=reverse(TR);
                   }
                   N+=length(TR);
                   R=append(TR,R);
                   if(N>M){
                           R=lsort(R,[],1);
                           M=length(R);
                           if(F) mycat([M,N]);
                           N=0;
                   }
           }
           R=lsort(R,[],1);
           if(F) mycat([length(R),N]);
           return R;
   }
   
   def n2a(T)
   {
           Opt=[40,41];M=61;
           if(type(U=getopt(opt))==7){
                   Opt=strtoascii(U);
           }
           if(!isint(S=getopt(s))) S=0;
           if(isint(N=getopt(m))&&N>8&&N<62) M=N;
           if(T>M){
                   TR=[Opt[1]];
                   TR=append(strtoascii(rtostr(T)),TR);
                   TR=cons(Opt[0],TR);
                   if(S==1) TR=asciitostr(TR);
                   return TR;
           }
           if(T<10) T+=48;
           else if(T<36) T+=87;
           else if(T<62) T+=29;
           if(S) T=[T];
           if(S==1) T=asciitostr(T);
           return T;
   }
   
 def scale(L)  def scale(L)
 {  {
         T=F=0;LS=1;          T=F=0;LS=1;
Line 1297  def scale(L)
Line 2272  def scale(L)
                                 [[1,5,1/2],[5,10,1],[10,50,5],[50,100,10], [100,500,50],[500,1000,100]]];                                  [[1,5,1/2],[5,10,1],[10,50,5],[50,100,10], [100,500,50],[500,1000,100]]];
                         LS=3;M2=[[1,5,1],[10,50,10],[100,500,100],[500,1000,500]];                          LS=3;M2=[[1,5,1],[10,50,10],[100,500,100],[500,1000,500]];
                 }else if(L>9&&L<18){                  }else if(L>9&&L<18){
                         if(L<14){       /* LL0 - LL3 */                          if(L<18){       /* LL0 - LL3, LL00 - LL03 */
                                 if(L==10){                                  if(L==10){
                                         L=[ [[1.001,1.002,0.00001],[1.002,1.005,0.00002],[1.005,1.0105,0.00005]],                                          L=[ [[1.001,1.002,0.00001],[1.002,1.005,0.00002],[1.005,1.0105,0.00005]],
                                                 [[1.001,1.002,0.00005],[1.002,1.005,0.0001], [1.005,1.0105,0.0001]],                                                  [[1.001,1.002,0.00005],[1.002,1.005,0.0001], [1.005,1.0105,0.0001]],
Line 1316  def scale(L)
Line 2291  def scale(L)
                                               [2.5,2.72,0.1]],                                                [2.5,2.72,0.1]],
                                                 [[1.105,1.2,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],                                                  [[1.105,1.2,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],
                                               [2.5,2.72,0.1]]];                                                [2.5,2.72,0.1]]];
                                         M2=[1.11,1.15,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.2,2.5];                                          M2=[1.11,1.15,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.5];
                                 }else if(L==13){                                  }else if(L==13){
                                         L=[ [[2.72,4,0.02],[4,6,0.05],[6,10,0.1],[10,15,0.2],[15,30,0.5],[30,50,1],                                          L=[ [[2.72,4,0.02],[4,6,0.05],[6,10,0.1],[10,15,0.2],[15,30,0.5],[30,50,1],
                                                  [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],                                                   [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],
Line 1329  def scale(L)
Line 2304  def scale(L)
                                                  [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];                                                   [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];
                                         M2=[3,4,5,6,7,8,9,10,15,20,30,40,50,100,200,500,1000,2000,5000,10000,20000];                                          M2=[3,4,5,6,7,8,9,10,15,20,30,40,50,100,200,500,1000,2000,5000,10000,20000];
                                 }else if(L==14){                                  }else if(L==14){
                                         L=[ [[0.998,0999,0.00001],[0.995,0.998,0.00002],[0.9895,0.995,0.00005]],                                          L=[ [[0.998,0.999,0.00001],[0.995,0.998,0.00002],[0.99,0.995,0.00005]],
                                                 [[0.998,0999,0.00005],[0.995,0.998,0.0001],[0.9895,0.995,0.0001]],                                                  [[0.998,0.999,0.00005],[0.995,0.998,0.0001],[0.99,0.995,0.0001]],
                                                 [[0.998,0999,0.0001],[0.995,0.998,0005], [0.9895,0.995,0.0005]]];                                                  [[0.998,0.999,0.0001],[0.995,0.998,0.0005],[0.99,0.995,0.0005]]];
                                         M2=[0.999,0.9985,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.991,0.99];                                          M2=[0.999,0.9985,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.991,0.99];
                                 }else if(L==15){                                  }else if(L==15){
                                         L=[ [[0.98,0.99,0.0001],[0.95,0.98,0.0002],[0.91,0.95,0.0005]],                                          L=[ [[0.98,0.9901,0.0001],[0.95,0.98,0.0002],[0.905,0.95,0.0005]],
                                                 [[0.98,0.99,0.0005],[0.95,0.98,0.001], [0.91,0.95,0.001]],                                                  [[0.98,0.99,0.0005],[0.95,0.98,0.001], [0.905,0.95,0.001]],
                                                 [[0.98,0.99,0.001],[0.95,0.98,0.005], [0.91,0.95,0.005]]];                                                  [[0.98,0.99,0.001],[0.95,0.98,0.005], [0.91,0.95,0.005]]];
                                         M2=[0.99,0.985,0.98,0.97,0.96,0.95,0.94,0.93,0.92,0.91];                                          M2=[0.99,0.985,0.98,0.97,0.96,0.95,0.94,0.93,0.92,0.91];
                                 }else if(L==16){                                  }else if(L==16){
                                         L=[ [[0.8,0.905,0.001],[1.2,1.4,0.002],[1.4,1.8,0.005],[1.8,2.5,0.01],                                          L=[ [[0.8,0.906,0.001],[0.6,0.8,0.002],[0.37,0.6,0.005]],
                                               [2.5,2.72,0.02]],                                                  [[0.8,0.906,0.005],[0.6,0.8,0.01],[0.37,0.6,0.01]],
                                                 [[0.8,0.905,0.005],[1.2,1.4,0.01],[1.4,1.8,0.01],[1.8,2.5,0.05],                                                  [[0.8,0.9,0.01],[0.6,0.8,0.05],[0.4,0.6,0.05]]];
                                               [2.5,2.72,0.1]],                                          M2=[0.9,0.85,0.8,0.75,0.7,0.65,0.6,0.55,0.5,0.45,0.4];
                                                 [[0.8,0.902,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],  
                                               [2.5,2.72,0.1]]];  
                                         M2=[0.9,0.985,0.8,0.85,0.7,0.65,0.6,0.55,0.45,0.4];  
                                 }else{                                  }else{
                                         L=[ [[2.72,4,0.02],[4,6,0.05],[6,10,0.1],[10,15,0.2],[15,30,0.5],[30,50,1],                                          L=[ [[0.05,0.37,0.002],[0.02,0.05,0.001],[0.01,0.02,0.0005],
                                                  [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],                                                   [0.005,0.01,0.0002],[0.001,0.005,0.0001],
                                                  [1000,2000,100],[2000,5000,200],[5000,10000,500],[10000,22000,1000]],                                                   [0.0005,0.001,0.00002],[0.0001,0.0005,0.00001],[0.00005,0.0001,0.000002]],
                                                 [[2.7,4,0.1],[4,6,0.1],[6,10,0.5],[10,15,1],[15,30,1],[30,50,5],                                                  [[0.05,0.37,0.01],[0.02,0.05,0.002],[0.01,0.02,0.001],
                                                  [50,100,10],[100,200,10],[200,400,50],[400,500,100],[500,1000,100],                                                   [0.005,0.01,0.001],[0.001,0.005,0.0002],
                                                  [1000,2000,500],[2000,5000,1000],[5000,10000,1000],[10000,22000,5000]],                                                   [0.0005,0.001,0.0001],[0.0001,0.0005,0.00002],[0.00005,0.0001,0.00001]],
                                                 [[3,4,0.5],[4,6,0.5],[6,10,1],[10,15,5],[15,30,5],[30,50,10],                                                  [[0.05,0.37,0.05],[0.02,0.05,0.01],[0.01,0.02,0.005],
                                                  [50,100,50],[100,200,50],[200,400,100],[400,500,100],[500,1000,500],                                                   [0.005,0.01,0.005],[0.002,0.005,0.001],
                                                  [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];                                                   [0.0005,0.001,0.0005],[0.0001,0.0005,0.0001],[0.00005,0.0001,0.00005]]];
                                         M2=[0.3,0.2,0.1,0.05,0.03,0.02,0.01,0.005,0.002,0.001,0.0005,0.0002,0.0001,                                          M2=[0.3,0.2,0.1,0.05,0.03,0.02,0.01,0.005,0.002,0.001,0.0005,0.0002,0.0001];
                                                 0.00005];  
                                 }                                  }
                         }                          }
                 }else{                  }else{
Line 1421  def scale(L)
Line 2392  def scale(L)
         }else return T;          }else return T;
         if(type(D=getopt(shift))==4){          if(type(D=getopt(shift))==4){
                 D0=D[0];D1=D[1];                  D0=D[0];D1=D[1];
         }else if(type(D)<2){          }else if(type(D)<2&&type(D)>=0){
                 D0=0;D1=D;                  D0=0;D1=D;
         }          };
         if(Inv==1){          if(Inv==1){
                 D0+=S0;S0=-S0;                  D0+=S0;S0=-S0;
         }          }
Line 1601  def mydet(M)
Line 2572  def mydet(M)
         }          }
 }  }
   
   def permanent(M)
   {
           SS=size(M);
           if((S=SS[0]) != SS[1] || S==0) return 0;
           if((Red=getopt(red))!=1){
                   MM = matrtop(M);
                   for(Dn = 1, I = 0; I < S; I++)
                           Dn *= MM[1][I];
                   return (!Dn)?0:red(permanent(MM[0]|red=1)/Dn);
           }
           if(S<3){
                   if(S==1) return M[0][0];
                   else return M[0][0]*M[1][1]+M[0][1]*M[1][0];
           }
           LL=m2ll(M);
           for(V=I=0;I<S;I++){
                   if(!(K=M[I][0])) continue;
                   for(TL=[],SL=LL,J=0;J<S;J++,SL=cdr(SL))
                           if(I!=J) TL=cons(cdr(car(SL)),TL);
                   if(K) V+=K*permanent(lv2m(TL));
           }
           return V;
   }
   
 def mperm(M,P,Q)  def mperm(M,P,Q)
 {  {
         if(type(M) == 6){          if(type(M) == 6){
Line 1685  def mtoupper(MM, F)
Line 2680  def mtoupper(MM, F)
         if(type(St = getopt(step))!=1) St=0;          if(type(St = getopt(step))!=1) St=0;
         Opt = getopt(opt);          Opt = getopt(opt);
         if(type(Opt)!=1) Opt=0;          if(type(Opt)!=1) Opt=0;
           if(type(Main=getopt(main))!=1) Main=0;
         TeX=getopt(dviout);          TeX=getopt(dviout);
         if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;          if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;
         Line="\\text{line}";          Line="\\text{line}";
Line 1715  def mtoupper(MM, F)
Line 2711  def mtoupper(MM, F)
                         Top+=(TeX)?"\\ ":" ";                          Top+=(TeX)?"\\ ":" ";
         }          }
         PC=IF=1;          PC=IF=1;
           if(Opt>3){
                   for(P=[1],K=0;K<Size[1]-F;K++){
                           for(J=0;J<Size[0];J++)
                                   if(type(dn(M[J][K]))==2) P=cons(dn(M[J][K]),P);
                   }
                   PC=llcm(P|poly=1);
           }
         for(K = JJ = 0; K < Size[1] - F; K++){          for(K = JJ = 0; K < Size[1] - F; K++){
                 for(J = JJ; J < Size[0]; J++){                  for(J = JJ; J < Size[0]; J++){
                         if(M[J][K] != 0){               /* search simpler element */                          if(M[J][K] != 0){               /* search simpler element */
Line 1795  def mtoupper(MM, F)
Line 2798  def mtoupper(MM, F)
                                                                 KRC=-KRC;Sgn=1;                                                                  KRC=-KRC;Sgn=1;
                                                         }else                                                          }else
                                                                 Sgn=0;                                                                  Sgn=0;
                                                         if(St){                                                          if(St&&!Main){
                                                                 if(TeX){                                                                  if(TeX){
                                                                         if(KRC==1)                                                                          if(KRC==1)
                                                                                 Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],                                                                                  Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
Line 1820  def mtoupper(MM, F)
Line 2823  def mtoupper(MM, F)
                                 }                                  }
                         /* a parameter Var */                          /* a parameter Var */
                                 Var=0;                                  Var=0;
   /* mycat(["start",J,K]); */
                                 if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){                                  if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){
                                         J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));                                          J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));
                                         for(I=JJ;I<Size[0]; I++){                                          for(I=JJ;I<Size[0]; I++){
Line 1829  def mtoupper(MM, F)
Line 2833  def mtoupper(MM, F)
                                                 }                                                  }
                                                 if(length(T)>1) continue;                                                  if(length(T)>1) continue;
                                                 if(mydeg(MIK,T[0])<Jv){                                                  if(mydeg(MIK,T[0])<Jv){
                                                         J0=I;Jv=mydeg(MIK);Var=T;       /* search minimal degree */                                                          J0=I;Jv=mydeg(MIK,T[0]);Var=T;  /* search minimal degree */
                                                 }                                                  }
                                         }                                          }
                                         if(length(Var)==1){                                          if(length(Var)==1){
                                                 Var=car(Var);                                                  Var=car(Var);
                                                 Q=nm(M[J0][K]);                                                  Q=nm(M[J0][K]);
   /* mycat(["min",Q,M[J0][K],"J0=",J0,"J=",J,"JJ=",JJ,K,M]); */
   J=J0;
                                                 for(I=JJ; I<Size[0]; I++){                                                  for(I=JJ; I<Size[0]; I++){
                                                         if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;                                                          if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;
                                                         T=rpdiv(nm(M[I][K]),Q,Var);                                                          T=rpdiv(nm(M[I][K]),Q,Var);
Line 1845  def mtoupper(MM, F)
Line 2851  def mtoupper(MM, F)
                                 if(type(Var)==2){ /* 1 variable */                                  if(type(Var)==2){ /* 1 variable */
                                         if(I==Size[0]){                                          if(I==Size[0]){
                                                 for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){                                                  for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){
   /* mycat(["root",Q,QR,PC]); */
                                                         if(deg(T=QR[0][1],Var)>0){                                                          if(deg(T=QR[0][1],Var)>0){
                                                                 QF=1;Q0*=T; continue;                                                                  QF=1;Q0*=T; continue;
                                                         }                                                          }
Line 1855  def mtoupper(MM, F)
Line 2862  def mtoupper(MM, F)
                                                                 if(TeX){                                                                  if(TeX){
                                                                         Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",                                                                          Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                                                                                 Var,"=",T,","] ,Lout);                                                                                  Var,"=",T,","] ,Lout);
                                                                         Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),Lout);                                                                          Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),Lout);
                                                                 }else{                                                                  }else{
                                                                         mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);                                                                          mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);
                                                                         mtoupper(M0,F|step=St+1,opt=Opt);                                                                          mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
                                                                 }                                                                  }
                                                         }                                                          }
                                                 }                                                  }
Line 1875  def mtoupper(MM, F)
Line 2882  def mtoupper(MM, F)
                                                 KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));                                                  KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));
                                                 for(II=K;II<Size[1];II++)                                                  for(II=K;II<Size[1];II++)
                                                         M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));                                                          M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));
                                                 if(TeX)                                                  if(!Main){
                                                         Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,                                                          if(TeX)
                                                                 J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);                                                                  Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,
                                                 else                                                                          J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);
                                                         mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);                                                          else
                                                                   mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);
                                                   }
                                                 J=JJ-1;                                                  J=JJ-1;
                                                 continue;                                                  continue;
                                         }                                          }
Line 1914  def mtoupper(MM, F)
Line 2923  def mtoupper(MM, F)
                                                                         if(TeX){                                                                          if(TeX){
                                                                                 Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",                                                                                  Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                                                                                         X,"=",T,","] ,Lout);                                                                                          X,"=",T,","] ,Lout);
                                                                                 Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),                                                                                  Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
                                                                                         Lout);                                                                                          Lout);
                                                                         }else{                                                                          }else{
                                                                                 mycat([str_times(" ",St-1)+"If",X,"=",T,","]);                                                                                  mycat([str_times(" ",St-1)+"If",X,"=",T,","]);
                                                                                 mtoupper(M0,F|step=St+1,opt=Opt);                                                                                  mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
                                                                         }                                                                          }
                                                                         break;                                                                          break;
                                                                 }                                                                  }
Line 1945  def mtoupper(MM, F)
Line 2954  def mtoupper(MM, F)
                                                                                         if(TeX){                                                                                          if(TeX){
                                                                                                 Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",                                                                                                  Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                                                                                                         X0,"=",T0,","] ,Lout);                                                                                                          X0,"=",T0,","] ,Lout);
                                                                                                 Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),                                                                                                  Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
                                                                                                         Lout);                                                                                                          Lout);
                                                                                         }else{                                                                                          }else{
                                                                                                 mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);                                                                                                  mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);
                                                                                                 mtoupper(M0,F|step=St+1,opt=Opt);                                                                                                  mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
                                                                                         }                                                                                          }
                                                                                 }                                                                                  }
   
Line 1993  def mtoupper(MM, F)
Line 3002  def mtoupper(MM, F)
                                                 for(I = K+1; I < Size[1]; I++)                                                  for(I = K+1; I < Size[1]; I++)
                                                         M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));                                                          M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));
                                                 M[J][K] = 0;                                                  M[J][K] = 0;
                                                 if(St){                                                  if(St&&!Main){
                                                         if(Mul<0){                                                          if(Mul<0){
                                                                 Mul=-Mul;Sgn=0;                                                                  Mul=-Mul;Sgn=0;
                                                         }else   Sgn=1;                                                          }else   Sgn=1;
Line 2064  def myrank(MM)
Line 3073  def myrank(MM)
 }  }
   
 def meigen(M)  def meigen(M)
 {  {
           if(getopt(vec)==1){
                   V=[];
                   if(type(M)==4&&length(M)==2&&M[0]*M[1]==M[1]*M[0]){
                           M0=M[0];M1=M[1];
                           R0=meigen(M0|mult=1);R1=meigen(M1|mult=1);
                           S=size(M0)[0];
                           for(TR0=R0;TR0!=[];TR0=cdr(TR0)){
                                   E0=car(TR0)[1];
                                   if(findin(zz,vars(E0))>=0) continue;
                                   N0=M0-diagm(S,[E0]);
                                   for(TR1=R1;TR1!=[];TR1=cdr(TR1)){
                                           E1=car(TR1)[1];
                                           if(findin(zz,vars(E1))>=0) continue;
                                           N=newbmat(2,1,[[N0],[M1-diagm(S,[E1])]]);
                                           L=mykernel(N|opt=1);
                                           if(length(L)>0) V=cons([[E0,E1], L],V);
                                   }
                           }
                   }
                   if(type(M)==6){
                           M=mtranspose(M);
                           S=size(M)[0];
                           R=meigen(M|mult=1);
                           for(TR=R;TR!=[];TR=cdr(TR)){
                                   E=car(TR)[1];
                                   if(findin(zz,vars(E))>=0) continue;
                                   N=M-diagm(S,[E]);
                                   V=cons([E,mykernel(N)],V);
                           }
                   }
                   V=reverse(V);
                   if(getopt(TeX)==1||getopt(dviout)==1){
                           Sp0="&:";
                           if(type(Sp=getopt(sep))!=7){
                                   if(type(Sp)==4){
                                           Sp0=Sp[0];Sp=Sp[1];
                                   }else Sp="\\\\\n";
                           }
                           for(S="",TV=V;TV!=[];TV=cdr(TV)){
                                   S+=my_tex_form(car(TV)[0])+Sp0+mtotex(mtranspose(lv2m(car(TV)[1])));
                                   if(length(TV)>1) S+=Sp;
                           }
                           if(getopt(dviout)==1) dviout(texbegin("align*",S));
                           return S;
                   }
                   return V;
           }
         F = getopt(mult);          F = getopt(mult);
         if(type(M)==4 || type(M)==5){          if(type(M)==4 || type(M)==5){
                 II=length(M);                  II=length(M);
Line 2079  def meigen(M)
Line 3135  def meigen(M)
         S = size(M)[0];          S = size(M)[0];
         P = mydet2(mgen(S,0,[zz],0)-M);          P = mydet2(mgen(S,0,[zz],0)-M);
         return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);          return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);
   }
   
   def lext2(L)
   {
           if(length(L)==2){
                   for(S=0,I=1;I<L[1];I++){
                           S+=L[1]-I;
                           if(S>L[0]) break;
                   }
                   return [I-1,L[0]+L[1]-S];
           }
           if(L[0]==L[1]) return [0,0];
           if(L[0]<L[1]){
                   L0=L[0];L1=L[1];S=1;
           }else{
                   L0=L[1];L1=L[0];S=-1;
           }
           return [(2*L[2]-L0-3)*L0/2+L1-1,S];
 }  }
   
   def pf2kz(M)
   {
           L=length(M);
           for(S=0,N=1;S<=L;N++){
                   S+=N;
           }
           if(S!=L+1) return 0;
           for(L=[],I=0;I<N-2;I++){
                   for(S=J=0;J<N;J++)
                           if(I!=J) S+=M[car(lext2([I,J,N]))];
                   L=cons(-S,L);
           }
           for(S=0,K=M;K!=[];K=cdr(K)) S-=car(K);
           S0=S;
           for(I=0;I<N-2;I++) S+=M[car(lext2([I,N-2,N]))];
           L=cons(-S,L);
           for(S=0,K=L;K!=[];K=cdr(K)) S+=car(K);
           L=cons(-S,L);L=reverse(L);
           if(getopt(all)==1){
                   for(LL=[],I=0;I<N-2;I++){
                           for(J=I+1;J<N;J++) LL=cons(M[car(lext2([I,J,N]))],LL);
                           LL=cons(car(L),LL); L=cdr(L);
                   }
                   LL=cons(S0,LL); LL=cons(car(L),LL);LL=cons(L[1],LL);
                   return reverse(LL);
           }
           return cons(S0,L);
   }
   
   def mext2(M)
   {
           S=size(M);
           if(S[0]!=S[1]) return 0;
           S=S[0];
           SS=S*(S-1)/2;MM=matrix(SS,SS);
           for(I=0;I<S;I++){
                   for(J=I+1;J<S;J++){
                           II=lext2([I,J,S])[0];
                           for(I0=0;I0<S;I0++){
                                   L=lext2([I0,J,S]);
                                   MM[II][L[0]]+=L[1]*M[I][I0];
                           }
                           for(J0=0;J0<S;J0++){
                                   L=lext2([I,J0,S]);
                                   MM[II][L[0]]+=L[1]*M[J][J0];
                           }
                   }
           }
           return MM;
   }
   
 def transm(M)  def transm(M)
 {  {
         if(type(M)!=6) M=s2m(M);          if(type(M)!=6) M=s2m(M);
Line 2221  def vgen(V,W,S)
Line 3346  def vgen(V,W,S)
   
 def mmc(M,X)  def mmc(M,X)
 {  {
           if(getopt(full)==1){
                   M=mmc(M,X|option_list=delopt(getopt(),"full"));
                   if(type(M)<4) return -1;
                   L=length(M);
                   Mt=getopt(mult);
                   if((L>=6 && Mt!=0)||(L==3&&Mt==1)){
                           for(SS=2,I=3; I<L; I+=(++SS));
                           if(I==L) Mt=1;
                           else Mt=0;
                   }
                   if(Mt!=1){
                           for(R=[],I=S=0;I<L;I++){
                                   S=radd(S,M[I]);
                                   R=cons([[0,I+1],M[I]],R);
                           }
                           R=cons([[0,I+1],-S],R);
                           return reverse(R);
                   }
                   for(R=[],I=S=0;I<SS;I++)
                           for(J=I+1;J<=SS;J++,S++) R=cons([[I,J],M[S]],R);
                   for(I=0;I<=SS;I++){
                           for(J=S=0;J<=SS;J++){
                                   if(I==J) continue;
                                   S=radd(S,delopt(R,(I<J)?[I,J]:[J,I]|get=1));
                           }
                           R=cons([[I,SS+1],-S],R);
                   }
                   return qsort(R);
           }
   
         Mt=getopt(mult);          Mt=getopt(mult);
         if(type(M)==7) M=os_md.s2sp(M);          if(type(M)==7) M=s2sp(M);
         if(type(M)!=4||type(M[0])!=6) return 0;          if(type(M)!=4&&type(M)!=5) return 0;
           if(type(M[0])<=3){
                   if(type(M)==5) M=vtol(M);
                   for(RR=[];M!=[];M=cdr(M)) RR=cons(mat([car(M)]),RR);
                   M=reverse(RR);
           }
         if(type(M[0])!=6){                      /* spectre type -> GRS */          if(type(M[0])!=6){                      /* spectre type -> GRS */
                 G=s2sp(M|std=1);                  G=M;
                 L=length(G);                  L=length(G);
                 for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);                  for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                 V=cons(makev([L+9]),V);                  V=cons(makev([L+9]),V);
Line 2238  def mmc(M,X)
Line 3398  def mmc(M,X)
                 if(Mt!=1) Mt=0;                  if(Mt!=1) Mt=0;
                 if(R[2]!=2 || R[3]!=0 || !(R=getbygrs(G,1|mat=1))) return 0;                  if(R[2]!=2 || R[3]!=0 || !(R=getbygrs(G,1|mat=1))) return 0;
                 MZ=newmat(1,1);                  MZ=newmat(1,1);
                 SS=length(G);                  SS=length(G)-1;
                 if(Mt==1) SS=SS*(SS-1)/2;                  if(Mt==1) SS=SS*(SS+1)/2;
                 for(M=[],I=0;I<SS;I++) M=cons(MZ,M);                  for(M=[],I=0;I<SS;I++) M=cons(MZ,M);
                 for(RR=R; RR!=[]; RR=cdr(RR)){                  for(RR=R; RR!=[]; RR=cdr(RR)){
                         RT=car(RR)[0];                          RT=car(RR)[0];
                         if(type(RT)==4){                          if(type(RT)==4){
                                 if(RT[0]!=0) M=mmc(M,[RT[0]]|simplify=Simp);                                  if(RT[0]!=0) M=mmc(M,[RT[0]]|simplify=Simp);
                                 M=mmc(M,[cdr(RT)]);                                  for(TT=cdr(RT);TT!=[];TT=cdr(TT)){
                                           if(car(TT)!=0){
                                                   M=mmc(cdr(M),cdr(RT));
                                                   break;
                                           }
                                   }
                         }                          }
                 }                  }
 /*              for(R=cdr(R);R!=[];R=cdr(R)) M=mmc(M,[car(R)[0]]|mult=Mt); */  
         }          }
         if(X==0) return M;          if(X==0) return M;
         L=length(M);          L=length(M);
Line 2259  def mmc(M,X)
Line 3423  def mmc(M,X)
         }else{          }else{
                 SS=L;Mt=0;                  SS=L;Mt=0;
         }          }
           if(type(X[0])==4){
                   for(;X!=[];X=cdr(X)) M=mmc(M,car(X));
                   return M;
           }
         if(length(X)==SS+1){          if(length(X)==SS+1){
                 if(car(X)!=0&&(M=mmc(M,[car(X)]|mult=Mt))==0) return M;                  if(car(X)!=0) M=mmc(M,[car(X)]|simplify=Simp);
                 return mmc(M,cdr(X)|mult=Mt);                  return mmc(M,cdr(X));
         }          }
         for(I=X;I!=[];I=cdr(I)) if(I[0]!=0) break;          for(I=X;I!=[];I=cdr(I)) if(I[0]!=0) break;
         if(I==[]) return M;          if(I==[]) return M;
Line 2270  def mmc(M,X)
Line 3438  def mmc(M,X)
         N=newvect(L);          N=newvect(L);
         for(I=0;I<L;I++) N[I]=dupmat(M[I]);          for(I=0;I<L;I++) N[I]=dupmat(M[I]);
         S=size(N[0])[0];          S=size(N[0])[0];
         if(type(X)==4&&length(X)>SS){   /* addition */          if(type(X)==4&&length(X)>=SS){  /* addition */
                 for(I=0;I<SS;I++,X=cdr(X)) if(X[I] != 0) N[I] = radd(N[I],car(X));                  for(I=0;I<SS;I++,X=cdr(X)) if(car(X) != 0) N[I] = radd(N[I],diagm(S,[car(X)]));
         }          }
         if(length(X)!=1) return 0;          if(length(X)!=1||!X[0]) return N;
         X=X[0];          X=X[0];
         MZ = newmat(S,S);          MZ = newmat(S,S);
         MM = newvect(L);          MM = newvect(L);
           /* convolution */
         for(M1=J=0; J<SS; J++){          for(M1=J=0; J<SS; J++){
                 for(R=[],I=SS-1; I>=0; I--){                  for(R=[],I=SS-1; I>=0; I--){
                         if(I==J){                          if(I==J){
Line 2289  def mmc(M,X)
Line 3458  def mmc(M,X)
                 if(J==0) M1=MM[0];                  if(J==0) M1=MM[0];
                 else M1=radd(M1,MM[J]);                  else M1=radd(M1,MM[J]);
         }          }
         /* middle convolution */          /* convolution of KZ */
         for(P=0,Q=1;J<L;J++){   /* A_{P,Q} */          for(P=0,Q=1;J<L;J++){   /* A_{P,Q} */
                 for(R=[],I=SS-1; I>=0; I--){                  for(R=[],I=SS-1; I>=0; I--){
                         for(RR=[],K=SS-1;K>=0;K--){                          for(RR=[],K=SS-1;K>=0;K--){
                                 MT=MZ;                                  MT=MZ;
                                 if(I==K){                                  if(I==K){
                                         MT=N[J];                                          MT=N[J];
                                         if(I==P) MT-=N[Q];                                          if(I==P) MT+=N[Q];
                                         else if(I==Q) MT-=N[P];                                          else if(I==Q) MT+=N[P];
                                 }else if(I==P && K==Q) MT=N[Q];                                  }else if(I==P && K==Q) MT=-N[Q];
                                  else if(I==Q && K==P) MT=N[P];                                   else if(I==Q && K==P) MT=-N[P];
                                 RR=cons(MT,RR);                                  RR=cons(MT,RR);
                         }                          }
                         R=cons(RR,R);                          R=cons(RR,R);
Line 2308  def mmc(M,X)
Line 3477  def mmc(M,X)
                 if(++Q==SS){                  if(++Q==SS){
                         P++;Q=P+1;                          P++;Q=P+1;
                 }                  }
         }          }
           if(getopt(homog)==1) MM[L-1]-=diagm(S*SS,[X]);
           /* middle convolution */
         for(R=[],I=SS-1; I>=0; I--){          for(R=[],I=SS-1; I>=0; I--){
                 for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);                  for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);
                 R=cons(RR,R);                  R=cons(RR,R);
Line 2318  def mmc(M,X)
Line 3489  def mmc(M,X)
         if(length(KE) == 0) return MM;          if(length(KE) == 0) return MM;
         KK = mtoupper(lv2m(KE),0);          KK = mtoupper(lv2m(KE),0);
         for(I=0;I<L;I++) MM[I] = mmod(MM[I],KK);          for(I=0;I<L;I++) MM[I] = mmod(MM[I],KK);
         if(Simp!=0) MM = mdsimplify(MM|type=Simp);          if(Simp!=0){
                   MM = mdsimplify(MM|type=Simp,show=1);
                   if(getopt(verb)) show([size(MM[0][0]),MM[1]]);
                   MM=MM[0];
           }
         return MM;          return MM;
 }  }
   
Line 2590  def mdivisor(M,X)
Line 3765  def mdivisor(M,X)
                         P=M[0][0]; M[0][0]=1;                          P=M[0][0]; M[0][0]=1;
                         for(J=0;J<S1;J++){      /* (1,1) -> 1 */                          for(J=0;J<S1;J++){      /* (1,1) -> 1 */
                                 if(J>0) M[0][J]= red(M[0][J]/P);                                  if(J>0) M[0][J]= red(M[0][J]/P);
                                 if(Tr) GR[0][J]=red(GR[0][J]/P);                                  if(Tr) GC[0][J]=red(GC[0][J]/P);
                         }                          }
                         if(S0>1 && S1>1) N=newmat(S0-1,S1-1);                          if(S0>1 && S1>1) N=newmat(S0-1,S1-1);
                         else N=0;                          else N=0;
Line 2885  def mdsimplify(L)
Line 4060  def mdsimplify(L)
         return L;          return L;
 }  }
   
   #if 1
 def m2mc(M,X)  def m2mc(M,X)
 {  {
         if(type(M)<2){          if(type(M)<2){
         mycat([          mycat([
 "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",  "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
 " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",  " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
 " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",  " t : [a0,ay,a1,c], swap, GRS, GRSC, extend (eigen), sp, irreducible, pair, pairs, Pfaff, All\n",
 " s : TeX, dviout, GRSC\n",  " s : TeX, dviout, GRSC\n",
 " option : swap, small, simplify, operator, int\n",  " option : swap, small, simplify, operator, int\n",
 " Ex: m2mc(\"21,21,21,21\",\"All\")\n"  " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
 ]);  ]);
                 return 0;                  return 0;
         }          }
         if(type(M)==7) M=s2sp(M);          if(type(M)==7) M=s2sp(M);
           if(type(M)==4&&type(M[0])==6&&length(M)==10){
                   N=newvect(5);
                   N[0]=M[1];N[1]=M[0];N[2]=M[2];N[3]=M[4];N[4]=M[5];
                   M=vtol(N);
           }
         if(type(X)==7) X=[X];          if(type(X)==7) X=[X];
         Simp=getopt(simplify);          Simp=getopt(simplify);
         if(Simp!=0 && type(Simp)!=1) Simp=2;          if(Simp!=0 && type(Simp)!=1) Simp=2;
         Small=(getopt(small)==1)?1:0;          Small=(getopt(small)==1)?1:0;
         if(type(M[0])==4){          if(type(M[0])==4){
                 if(type(M[0][0])==1){ /* spectral type */                  if(type(M[0][0])==1){ /* spectral type */
                         XX=getopt(dep);                          XX=getopt(dep);
Line 2939  def m2mc(M,X)
Line 4120  def m2mc(M,X)
                 if(type(X)==4 && type(X[0])==7)                  if(type(X)==4 && type(X[0])==7)
                         return m2mc(N,X|keep=Keep,small=Small);                          return m2mc(N,X|keep=Keep,small=Small);
                 return N;                  return N;
         }          }
         if(type(X)==4 && type(X[0])==7){          if(type(X)==4 && type(X[0])==7){
                 Keep=(getopt(keep)==1)?1:0;                  Keep=(getopt(keep)==1)?1:0;
                 if(X[0]=="All"){                  if(X[0]=="All"){
Line 2974  def m2mc(M,X)
Line 4155  def m2mc(M,X)
                 if(length(X)>1){                  if(length(X)>1){
                         if(X[1]=="dviout") Show=2;                          if(X[1]=="dviout") Show=2;
                         if(X[1]=="TeX") Show=1;                          if(X[1]=="TeX") Show=1;
                 }                  }
                 if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"){                  if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"||X[0]=="extend"){
                         Y=radd(-M[0],-M[1]-M[2]);                          Y=radd(-M[0],-M[1]-M[2]);
                           if(X[0]=="extend"){
                                   R=[M[1],M[0],M[2],Y, M[3],M[4],radd(-M[1],-M[3]-M[4]),
                                           radd(Y,-M[3]-M[4]),radd(M[1],M[2]+M[4]), radd(M[0],M[1]+M[3])];
                                   if(length(X)>1){
                                           if(X[1]=="eigen"){
                                                   L=["x,y","x,0","x,1","x,\\infty","y,0","y,1","y,\\infty",
                                                           "0,1","0,\\infty","1,\\infty"];
                                                   U="\\\\\n";S="";
                                                   for(TR=R,TL=L;TR!=[];TL=cdr(TL),TR=cdr(TR)){
                                                           if(length(TL)==1) U="\n";
                                                           S+="A_{"+car(TL)+"}&\\rightarrow\ "
                                                                   +meigen(car(TR)|vec=1,TeX=1,sep=[":","\\quad"])+U;
                                                   }
                                                   return S;
                                           }
                                           if(type(X[1])==4){
                                                   TL=[x,y,0,1,2];
                                                   for(T=TL,TO=[];T!=[];T=cdr(TL)){
                                                           J=findin(TL[J],X[1][0]);
                                                           if(J<0) return 0;
                                                           TO=cons(X[1][1][J],TO);
                                                   }
                                                   TO=reverse(TO);
                                                   for(T=[],I=0;I<4;I++)
                                                           for(J=I+1;J<5;J++) T=cons([TL[I],TL[J]],T);
                                                   T=reverse(T);
                                                   for(R=[],I=0;I<4;I++){
                                                           for(J=I+1;J<5;J++){
                                                                   K=findin([TO[I],T0[J]],T);
                                                                   if(K<0) K=findin([TO[J],T0[I]],T);
                                                                   R=cons(R[K],R);
                                                           }
                                                   }
                                                   return reverse(R);
                                           }
                                   }
                                   if(Show){
                                           TL=["x","y","0","1","\\infty"];
                                           for(S="",TR=R,I=0,J=1;;TR=cdr(TR)){
                                                   S+="A_{"+TL[I]+","+TL[J]+"}&="+mtotex(car(TR));
                                                   if(length(X)>2&&X[2]=="spt")
                                                           S+="&&"+ltotex(meigen(car(TR)|mult=1)|vec=1,TeX=1,opt="spt");
                                                   if(J++==4){
                                                           if(I++==3) break;
                                                           J=I+1;
                                                   }
                                                   S+="\\\\\n";
                                           }
                                           return S;
                                   }
                                   return R;
                           }
                         if(X[0]!="GRSC"){                          if(X[0]!="GRSC"){
                                 L=meigen([M[0],M[1],M[2],M[3],M[4],Y,radd(-M[1],-M[3]-M[4]),radd(Y,-M[3]-M[4])]|mult=1);                                  L=meigen([M[0],M[1],M[2],M[3],M[4],Y,radd(-M[1],-M[3]-M[4]),radd(Y,-M[3]-M[4])]|mult=1);
                                 if(X[0]=="sp"){                                  if(X[0]=="sp"){
Line 2989  def m2mc(M,X)
Line 4222  def m2mc(M,X)
                         }else{                          }else{
                                 L=meigen([M[0],M[1],M[2],M[3],M[4],Y,radd(-M[1],-M[3]-M[4]),radd(Y,-M[3]-M[4]),                                  L=meigen([M[0],M[1],M[2],M[3],M[4],Y,radd(-M[1],-M[3]-M[4]),radd(Y,-M[3]-M[4]),
                                         radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);                                          radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                                 S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty&x=y=0&x=y=1\\\\\n";                                  S="x:0&x:y&x:1&y:0&y:1&x:\\infty&y:\\infty&0:1&1:\\infty&0:\\infty\\\\\n";
                         }                          }
                         T=ltotex(L|opt="GRS",pre=S,small=Small);                          T=ltotex(L|opt="GRS",pre=S,small=Small);
                         if(Show==2) dviout(T|eq=0,keep=Keep);                          if(Show==2) dviout(T|eq=0,keep=Keep);
Line 3046  def m2mc(M,X)
Line 4279  def m2mc(M,X)
         if(getopt(swap)==1)          if(getopt(swap)==1)
                  return m2mc(m2mc(m2mc(M,"swap"),X),"swap");                   return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
         N=newvect(5);          N=newvect(5);
         for(I=0;I<5;I++)          for(I=0;I<5;I++){
                 N[I]=M[I];                  if(type(T=M[I])<4) T=diagm(1,[T]);
                   N[I]=T;
           }
         S=size(N[0])[0];          S=size(N[0])[0];
         if(type(X)==4){          if(type(X)==4){
                  for(I=0;I<3;I++){                   for(I=0;I<3;I++){
Line 3063  def m2mc(M,X)
Line 4298  def m2mc(M,X)
         MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);          MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);
         MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);          MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);
         MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);          MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);
         MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);          MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);
         MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);          MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);
         M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);          M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
         M1 = radd(MM[0],MM[1]+MM[2]);          M1 = radd(MM[0],MM[1]+MM[2]);
         KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));          KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
         if(length(KE) == 0) return MM;          if(length(KE) == 0) return MM;
         KK = mtoupper(lv2m(KE),0);          KK = mtoupper(lv2m(KE),0);
         for(I=0;I<5;I++)          for(I=0;I<5;I++) MM[I] = mmod(MM[I],KK);
           if(Simp!=0) MM = mdsimplify(MM|type=Simp);
           return MM;
   }
   #else
   def m2mc(M,X)
   {
           if(type(M)<2){
           mycat([
   "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
   " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
   " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
   " s : TeX, dviout, GRSC\n",
   " option : swap, small, simplify, operator, int\n",
   " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
   ]);
                   return 0;
           }
           if(type(M)==7) M=s2sp(M);
           if(type(X)==7) X=[X];
           Simp=getopt(simplify);
           if(Simp!=0 && type(Simp)!=1) Simp=2;
           Small=(getopt(small)==1)?1:0;
           if(type(M[0])==4){
                   if(type(M[0][0])==1){ /* spectral type */
                           XX=getopt(dep);
                           if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
                           M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
                           if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
                           if(getopt(int)!=0){
                                   T=M[XX[0]-1][XX[1]-1][1];
                                   for(V=vars(T);V!=[];V=cdr(V)){
                                           F=coef(T,1,car(V));
                                           if(type(F)==1 && dn(F)>1)
                                            M = subst(M,car(V),dn(F)*car(V));
                                   }
                           }
                           V=vars(M);
                           if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
                                   M=subst(M,d1,d);
                   }
                   RC=chkspt(M|mat=1);
                   if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
                           erno(0);return 0;
                   }
                   R=getbygrs(M,1|mat=1);
                   if(getopt(anal)==1) return R;   /* called by mc2grs() */
                   Z=newmat(1,1,[[0]]);
                   N=[Z,Z,Z,Z,Z,Z];
                   for(RR=R; RR!=[]; RR=cdr(RR)){
                           RT=car(RR)[0];
                           if(type(RT)==4){
                                   if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
                                   N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
                           }
                   }
                   if(type(X)==4 && type(X[0])==7)
                           return m2mc(N,X|keep=Keep,small=Small);
                   return N;
           }
           if(type(X)==4 && type(X[0])==7){
                   Keep=(getopt(keep)==1)?1:0;
                   if(X[0]=="All"){
                           dviout("Riemann scheme"|keep=1);
                           m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
                           dviout("Spectral types : "|keep=1);
                           m2mc(M,["sp","dviout"]|keep=1);
                           dviout("\\\\\nBy the decompositions"|keep=1);
                           R=m2mc(M,["pairs","dviout"]|keep=1);
                           for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
                                   for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
                                   if(S==0) R0=cons(I,R0);
                                   else if(S<0) R1=cons(I,R1);
                           }
                           S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
                                   +"\\ \\emptyset=\\mathbb Z\\cap$";
                           dviout(S|keep=1);
                           m2mc(M,["irreducible","dviout"]|keep=1);
                           if(R0!=[])
                                   dviout(ltotex(reverse(R0))|eq=0,keep=1,
                                    title="The following conditions may not be necessary for the irreducibility.");
                           if(R1!=[])
                                   dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
                           if(getopt(operator)!=0){
                                   dviout("The equation in a Pfaff form is"|keep=1);
                                   m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
                           }
                           else if(Keep!=1) dviout(" ");
                           return M;
                   }
                   Show=0;
                   if(length(X)>1){
                           if(X[1]=="dviout") Show=2;
                           if(X[1]=="TeX") Show=1;
                   }
                   if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"||X[0]=="extend"){
                           Y=radd(-M[0],-M[1]-M[2]);
                           if(X[0]=="extend")
                                   return [M[1],M[0],M[2],Y, M[3],M[4],radd(-M[1],-M[3]-M[4]),
                                           radd(Y,-M[3]-M[4]),radd(M[1],M[2]+M[4]), radd(M[0],M[1]+M[3])];
                           if(X[0]!="GRSC"){
                                   L=meigen([M[0],M[1],M[2],M[3],M[4],Y,radd(-M[1],-M[3]-M[4]),radd(Y,-M[3]-M[4])]|mult=1);
                                   if(X[0]=="sp"){
                                           L=chkspt(L|opt="sp");
                                           V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
                                           if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
                                           return [V,W];
                                   }
                                   S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
                           }else{
                                   L=meigen([M[0],M[1],M[2],M[3],M[4],Y,radd(-M[1],-M[3]-M[4]),radd(Y,-M[3]-M[4]),
                                           radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                                   S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty&x=y=0&x=y=1\\\\\n";
                           }
                           T=ltotex(L|opt="GRS",pre=S,small=Small);
                           if(Show==2) dviout(T|eq=0,keep=Keep);
                           if(Show==1) L=T;
                           return L;
                   }
                   if(X[0]=="Pfaff"){
                           S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
                           if(Show==2) dviout(S|eq=0,keep=Keep);
                           return S;
                   }
                   if(X[0]=="irreducible"){
                           L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                           S=getbygrs(L,10|mat=1);
                           if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
                           return S;
                   }
                   if(X[0]=="pairs"||X[0]=="pair"){
                           L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                           S=chkspt(L|opt=0);
                           V=(Show==2)?1:0;
                           S=sproot(L,X[0]|dviout=V,keep=Keep);
                           return S;
                   }
                   if(X[0]=="swap"){
                           Swap=getopt(swap);
                           if(type(Swap)<1 || Swap==1)
                                   return newvect(6,[M[3],M[1],M[4],M[0],M[2],M[5]]);
                           if(Swap==2)
                                   return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
                           if(type(Swap)==4 && length(Swap)==3){
                                   MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
                                   if(Swap[0]==1){
                                           MX0=M[2];MY0=M[4];
                                   }
                                   else if(Swap[0]==2){
                                           MX0=MX;MY0=MY;
                                   }else{
                                           MX0=M[0];MY0=M[3];
                                   }
                                   if(Swap[1]==1){
                                           MX1=M[2];MY1=M[4];
                                   }
                                   else if(Swap[1]==2){
                                           MX1=MX;MY1=MY;
                                   }else{
                                           MX1=M[0];MY1=M[3];
                                   }
                                   return newvect(5,MX0,M[1],MX1,MY0,MY1);
                           }
                   }
                   return 0;
           }
           if(getopt(swap)==1)
                    return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
           N=newvect(6);
           for(I=0;I<6;I++)
                   N[I]=M[I];
           S=size(N[0])[0];
           if(type(X)==4){
                    for(I=0;I<3;I++){
                            if(X[I] != 0)
                                           N[I] = radd(N[I],X[I]);
                    }
                    if(length(X)==3) return N;
                    X=X[3];
           }
           MZ = newmat(S,S);
           ME = mgen(S,0,[X],0);
           MM = newvect(6);
           MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);        /* A01 */
           MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);        /* A02 */
           MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);        /* A03 */
           MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);       /* A12 */
           MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);       /* A23 */
           MM[5] = newbmat(3,3, [[MZ,N[5]+N[2],-N[2]], [N[5]], [MZ,-N[0],radd(N[5],N[0])]]);       /* A13 */
           M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
           M1 = radd(MM[0],MM[1]+MM[2]);
           KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
           if(length(KE) == 0) return MM;
           KK = mtoupper(lv2m(KE),0);
           for(I=0;I<6;I++)
                 MM[I] = mmod(MM[I],KK);                  MM[I] = mmod(MM[I],KK);
         if(Simp!=0) MM = mdsimplify(MM|type=Simp);          if(Simp!=0) MM = mdsimplify(MM|type=Simp);
         return MM;          return MM;
 }  }
   #endif
   
 def easierpol(P,X)  def easierpol(P,X)
 {  {
Line 3309  def llbase(VV,L)
Line 4739  def llbase(VV,L)
         T = length(L);          T = length(L);
         for(I = 0; I < S; I++)          for(I = 0; I < S; I++)
                 V[I] = nm(red(V[I]));                  V[I] = nm(red(V[I]));
         LV = 0;          LV = 0;
         for(J = 0; J < T; J++){          for(J = 0; J < T; J++){
                 X = var(L[J]); N = deg(L[J],X);                  X = var(L[J]); N = deg(L[J],X);
                 for(I = LV; I < S; I++){                  for(I = LV; I < S; I++){
                         if((C2=coef(V[I],N,X)) != 0){                          if((C2=coef(V[I],N,X)) != 0){
                                   if(type(C2)==1){
                                           for(K=I+1;K<S;K++){
                                                   if(!(C1=coef(V[K],N,X))||type(C1)!=1) continue;
                                                   if(abs(C2)>abs(C1)){
                                                           I=K;C2=C1;
                                                   }
                                           }
                                   }
                                 if(I > LV){                                  if(I > LV){
                                         Temp = V[I];                                          Temp = V[I];
                                         V[I] = V[LV];                                          V[I] = V[LV];
Line 3323  def llbase(VV,L)
Line 4761  def llbase(VV,L)
                                         if(I == LV || (C1 = coef(V[I],N,X)) == 0)                                          if(I == LV || (C1 = coef(V[I],N,X)) == 0)
                                                 continue;                                                  continue;
                                         Gcd = gcd(C1,C2);                                          Gcd = gcd(C1,C2);
                                         V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);                                          V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);
                                 }                                  }
                                 LV++;                                  LV++;
                         }                          }
                 }                  }
         }          }
         return V;          return V;
 }  }
   
   def rev(A,B){return A>B?-1:(A<B?1:0);}
   
   def qsortn(X) {return qsort(X,os_md.rev);}
   
   def rsort(L,T,K)
   {
           for(R=[];L!=[];L=cdr(L))
                   R=cons((type(car(L))==4)?rsort(car(L),T-1,K):car(L),R);
           if(T>0||iand(T,iand(K,2)/2)) return reverse(R);
           R=qsort(R);
           return (iand(K,1))? reverse(R):R;
   }
   
   def lcut(L,M,N)
   {
           for(I=0,R=[];L!=[]&&I<=N;I++,L=cdr(L)){
                   if(I<M) continue;
                   R=cons(car(L),R);
           }
           return reverse(R);
   }
   
   def llget(L,LL,LC)
   {
           if(type(LL)==4){
                   LM=length(L);
                   for(R=[];LL!=[];LL=cdr(LL)){
                           if(isint(TL=car(LL))) R=cons(TL,R);
                           else{
                                   IM=(length(TL)==1)?(LM-1):TL[1];
                                   for(I=car(TL);I<=IM;I++) R=cons(I,R);
                           }
                   }
                   LL=reverse(R);
                   if(LC==-1){
                           LL=lsort(LL,[],1);
                           return lsort(L,"num",["sub"]|c1=LL);
                   }
                   L=lsort(L,"num",["get"]|c1=LL);
           }
           if(type(LC)==4){
                   LM=length(L[0]);
                   for(R=[];LC!=[];LC=cdr(LC)){
                           if(isint(TL=car(LC))) R=cons(TL,R);
                           else{
                                   IM=(length(TL)==1)?(LM-1):TL[1];
                                   for(I>=car(TL);I<=IM;I++) R=cons(I,R);
                           }
                   }
                   LC=reverse(R);
                   if(LL==-1){
                           LC=lsort(LC,[],1);
                           return lsort(L,"col",["setminus"]|c1=LC);
                   }
                   L=lsort(L,"col",["put"]|c1=LC);
           }
           if(getopt(flat)==1) L=m2l(L|flat=1);
           return L;
   }
   
   
 def lsort(L1,L2,T)  def lsort(L1,L2,T)
 {  {
         C1=getopt(c1);C2=getopt(c2);          C1=getopt(c1);C2=getopt(c2);
Line 3376  def lsort(L1,L2,T)
Line 4875  def lsort(L1,L2,T)
                                         }else{                                          }else{
                                                 for(I=0;LT!=[];I++,LT=cdr(LT))                                                  for(I=0;LT!=[];I++,LT=cdr(LT))
                                                         if(findin(I,C1)<0) RT=cons(car(LT),RT);                                                          if(findin(I,C1)<0) RT=cons(car(LT),RT);
                                                 RT=reverse(RT);  
                                         }                                          }
                                         R=cons(RT,R);                                          R=cons(reverse(RT),R);
                                 }                                  }
                                 return reverse(R);                                  return reverse(R);
                         }                          }
Line 3734  def lgcd(L)
Line 5232  def lgcd(L)
         return [];          return [];
 }  }
   
 def llcm(L)  def llcm(R)
 {  {
         if(type(L)==4){          if(type(R)==5||type(R)==6) R=m2l(R);
                 F=getopt(poly);          if(type(R)<4) R=[R];
                 V=car(L);          if(type(R)!=4) return 0;
                 while((L=cdr(L))!=[]){          V=getopt(poly);
                         if(V!=0){          if(type(V)<1){
                                 if((V0=car(L))!=0)                  for(L=R;L!=[];L=cdr(L)){
                                         V=(F==1)?red(V*V0/gcd(V,V0)):ilcm(V,V0);                          if(type(car(L))>1){
                                   V=1; break;
                         }                          }
                         else V=car(L);  
                 }                  }
                 if(F!=1&&V<0) V=-V;  
                 return V;  
         }          }
         else if(type(L)==5||type(L)==6)          if(getopt(dn)!=1){
                 return llcm(m2l(L)|option_list=getopt());                  for(L=[];R!=[];R=cdr(R)) if(R!=0) L=cons(1/car(R),L);
         return [];                  R=L;
           }
           P=1;
           if(type(V)<1){
                   for(;R!=[];R=cdr(R)){
                           if(!(TL=car(R))) continue;
                           else P=ilcm(P,dn(TL));
                   }
                   return P;
           }
           for(;R!=[];R=cdr(R)){
                   if(!car(R)) continue;
                   D=dn(red(car(R)));
                   N=red(P/D);
                   if(type(V)<2){
                           if(type(N)!=3) continue;
                           P*=dn(N);
                           continue;
                   }
                   if(ptype(N,V)>2){
                           L=fctr(dn(N));
                           for(;L!=[];L=cdr(L)){
                                   if(ptype(car(L)[0],V)<2) continue;
                                   P*=car(L)[0]^car(L)[1];
                           }
                   }
           }
           return P;
 }  }
   
 def ldev(L,S)  def ldev(L,S)
Line 3828  def lnsol(VV,L)
Line 5351  def lnsol(VV,L)
   
 def ladd(X,Y,M)  def ladd(X,Y,M)
 {  {
           if(Y==0){
                   Y=X[1];X=X[0];
           }
         if(type(Y)==4) Y=ltov(Y);          if(type(Y)==4) Y=ltov(Y);
         if(type(X)==4) X=ltov(X);          if(type(X)==4) X=ltov(X);
         return vtol(X+M*Y);          if(type(M)==4){
                   if(length(M)==1)
                           N=1-(M=car(M));
                   else{
                           N=M[0];M=M[1];
                   }
           }else N=1;
           return vtol(N*X+M*Y);
 }  }
   
 def mrot(X)  def mrot(X)
Line 4114  def texsp(P)
Line 5647  def texsp(P)
 def fctrtos(P)  def fctrtos(P)
 {  {
         /* extern TeXLim; */          /* extern TeXLim; */
   
         if(!chkfun("write_to_tb", "names.rr"))          if(!chkfun("write_to_tb", "names.rr"))
                 return 0;                  return 0;
   
         TeX = getopt(TeX);          TeX = getopt(TeX);
         if(TeX != 1 && TeX != 2 && TeX != 3)          if(TeX != 1 && TeX != 2 && TeX != 3)
                 TeX = 0;                  TeX = 0;
         if((Dvi=getopt(dviout)==1) && TeX<2)    TeX=3;          if((Dvi=getopt(dviout)==1) && TeX<2) TeX=3;
         if(TeX>0){          if(TeX>0){
                 Lim=getopt(lim);                  Lim=getopt(lim);
                 if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;                  if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;
                 else if(type(Lim)!=1) Lim=0;                  else if(type(Lim)!=1) Lim=0;
                 CR=(TeX==2)?"\\\\\n":"\\\\\n&";                  CR=(TeX==2)?"\\\\\n":"\\\\\n&";
                 if(TeX==1 || Lim==0)    CR="";                  CR2="\\allowdisplaybreaks"+CR;
                 else if((Pages=getopt(pages))==1)       CR="\\allowdisplaybreaks"+CR;                  if(TeX==1 || Lim==0) CR=CR2="";
                   else if((Pages=getopt(pages))==1) CR2=CR;
                 if(!chkfun("print_tex_form", "names.rr"))                  if(!chkfun("print_tex_form", "names.rr"))
                         return 0;                          return 0;
                 Small=getopt(small);                  Small=getopt(small);
Line 4205  def fctrtos(P)
Line 5738  def fctrtos(P)
                 }                  }
                 VV=reverse(VV);VD=reverse(VD);                  VV=reverse(VV);VD=reverse(VD);
                 Rev=(getopt(rev)==1)?1:0;                  Rev=(getopt(rev)==1)?1:0;
                 Dic=(getopt(dic)==1)?1:0;                  Rdic=0;
                   if((Dic=getopt(dic))==2){
                           Dic=Rdic=1;
                   }else if(Dic!=1) Dic=0;
                 TT=terms(P,VV|rev=Rev,dic=Dic);                  TT=terms(P,VV|rev=Rev,dic=Dic);
                 if(TeX==0){                  if(TeX==0){
                         Pre="("; Post=")";                          Pre="("; Post=")";
Line 4213  def fctrtos(P)
Line 5749  def fctrtos(P)
                         Pre="{"; Post="}";                          Pre="{"; Post="}";
                 }                  }
                 Out = string_to_tb("");                  Out = string_to_tb("");
                 for(L=C=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){                  for(L=C=CC=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){
                         for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){                          for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){
                                 PC=mycoef(PC,D=car(T),VV[I]);                                  PC=mycoef(PC,D=car(T),VV[I]);
                                 if(PC==0) continue;                                  if(PC==0) continue;
Line 4225  def fctrtos(P)
Line 5761  def fctrtos(P)
                                                 else    PT="^"+rtostr(D);                                                  else    PT="^"+rtostr(D);
                                         }                                          }
                                         if(Dif>0)       PW+=(Dif==1)?"d":"\\partial ";                                          if(Dif>0)       PW+=(Dif==1)?"d":"\\partial ";
                                         PW+=VD[I]+PT;                                          if(Rdic) PW=VD[I]+PT+PW;
                                           else PW+=VD[I]+PT;
                                 }                                  }
                         }                          }
                         D=car(Tm)[0];                          D=car(Tm)[0];
Line 4234  def fctrtos(P)
Line 5771  def fctrtos(P)
                                 if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));                                  if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));
                                 PW=Op+Add+"}{"+PW+"}";                                  PW=Op+Add+"}{"+PW+"}";
                         }else if(Add!=0) PW=PW+Add;                          }else if(Add!=0) PW=PW+Add;
                           CD=0;
                         if(TeX>=1){                          if(TeX>=1){
                                 if(type(PC)==1 && ntype(PC)==0 && PC<0)                                  if(type(PC)==1 && ntype(PC)==0 && PC<0)
                                         OC="-"+my_tex_form(-PC);                                          OC="-"+my_tex_form(-PC);
                                 else OC=fctrtos(PC|TeX=1,br=1);                                  else OC=fctrtos(PC|TeX=1,br=1);
                                   if(isint(PC)&&(PC<-1||PC>1)) CD=1;
                         }else   OC=fctrtos(PC|br=1);                          }else   OC=fctrtos(PC|br=1);
                         if(PW!=""){                          if(PW!=""){
                                 if(OC == "1")        OC = "";                                  if(OC == "1")        OC = "";
Line 4259  def fctrtos(P)
Line 5798  def fctrtos(P)
                                 }                                  }
                         }                          }
                         if(Lim>0){                          if(Lim>0){
                                   CC++;
                                 LL=texlen(OC)+texlen(PW);                                  LL=texlen(OC)+texlen(PW);
                                 if(LL+L>=Lim){                                  if(LL+L>=Lim){
                                         if(L>0) str_tb(CR,Out);                                          if(L>0) str_tb(CR,Out);
                                         if(LL>Lim){                                          if(LL>Lim){
                                                 if(TOC==7)      OC=texlim(OC,Lim|cut=CR);                                                  if(TOC==7)      OC=texlim(OC,Lim|cut=[CR,CR2]);
                                                 PW+=CR; L=0;                                                  if(length(Tm)!=1) PW+=CR;
                                                   L=0;
                                         }else L=LL;                                          }else L=LL;
                                 }else L+=LL;                                  }else L+=LL;
                         }else if(length(Tm)!=1) PW += CR;       /* not final term */                          }else if(length(Tm)!=1){
                         if(TeX) OC=texsp(OC);                                  CC++;
                                   PW += CR;       /* not final term */
                           }
                           if(CC>TeXPages) CR=CR2;
                           if(TeX){
                                   OC=texsp(OC);
                                   if(CD){  /* 2*3^x */
                                           CD=strtoascii(str_cut(PW,0,1));
                                           if(length(CD)==2&&car(CD)==123&&isnum(CD[1])) OC+="\\cdots";
                                   }
                           }
                         if(str_chr(OC,0,"-") == 0 || C==0)      str_tb([OC,PW], Out);                          if(str_chr(OC,0,"-") == 0 || C==0)      str_tb([OC,PW], Out);
                         else{                          else{
                                 str_tb(["+",OC,PW],Out);                                  str_tb(["+",OC,PW],Out);
Line 4298  def fctrtos(P)
Line 5849  def fctrtos(P)
                 if(imag(P)==0) P = fctr(P);             /* usual polynomial */                  if(imag(P)==0) P = fctr(P);             /* usual polynomial */
                 else P=[[P,1]];                  else P=[[P,1]];
                 S = str_tb(0,0);                  S = str_tb(0,0);
                 for(J = N = 0; J < length(P); J++){                  for(J = N = CD = 0; J < length(P); J++){
                         if(type(P[J][0]) <= 1){                          if(type(V=P[J][0]) <= 1){
                                 if(P[J][0] == -1){                                  if(V == -1){
                                         write_to_tb("-",S);                                          write_to_tb("-",S);
                                         if(length(P) == 1)                                          if(length(P) == 1)
                                                 str_tb("1", S);                                                  str_tb("1", S);
                                 }else if(P[J][0] != 1){                                  }else if(V != 1){
                                         str_tb((TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]), S);                                          str_tb((TeX>=1)?my_tex_form(V):rtostr(V), S);
                                         N++;                                          N++;
                                 }else if(length(P) == 1)                                  }else if(length(P) == 1)
                                         str_tb("1", S);                                          str_tb("1", S);
Line 4313  def fctrtos(P)
Line 5864  def fctrtos(P)
                                         str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);                                          str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);
                                         J++;                                          J++;
                                 }                                  }
                                   if(J==0&&isint(V=P[J][0])&&(V<-1||V>1)) CD=1;
                                 continue;                                  continue;
                         }                          }
                         if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)                          if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)
Line 4323  def fctrtos(P)
Line 5875  def fctrtos(P)
                                 if(nmono(P[J][0])>1||                                  if(nmono(P[J][0])>1||
                                         (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";                                          (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";
                                 write_to_tb(SS,S);                                  write_to_tb(SS,S);
                                 str_tb(["^", (TeX>1)?rtotex(P[J][1]):monotos(P[J][1])],S);                                  str_tb(["^", (TeX>=1)?rtotex(P[J][1]):monotos(P[J][1])],S);
                         }else{                          }else{
                                 if(nmono(P[J][0])>1) SS="("+SS+")";                                  if(nmono(P[J][0])>1&&length(P)>1) SS="("+SS+")";
                                   else if(CD&&J==1){ /* 2*3^x */
                                           CD=strtoascii(str_cut(SS,0,1));
                                           if(length(CD)==2&&car(CD)==123&&isnum(CD[1])) SS="\\cdot"+SS;
                                   }
                                 write_to_tb(SS,S);                                  write_to_tb(SS,S);
                         }                          }
                 }                  }
                 S = str_tb(0,S);                  S = str_tb(0,S);
                 if((Lim>0 || TP!=2) && CR!="")  S=texlim(S,Lim|cut=CR);                  if((Lim>0 || TP!=2) && CR!="")  S=texlim(S,Lim|cut=[CR,CR2]);
         }          }
         if(TeX>0){          if(TeX>0){
                 if(Small==1)    S=str_subst(S,"\\frac{","\\tfrac{");                  if(Small==1)    S=str_subst(S,"\\frac{","\\tfrac{");
                 if(Dvi==1){                  if(Dvi==1){
                         dviout(strip(S,"(",")")|eq=(Pages==1)?6:0); S=1;                          dviout(strip(S,"(",")")|eq=(Pages==1||Pages==2)?6:0); S=1;
                 }                  }
         }          }
         return S;          return S;
Line 4359  def texlim(S,Lim)
Line 5915  def texlim(S,Lim)
                 mycat(["Set TeXLim =",Lim]);                  mycat(["Set TeXLim =",Lim]);
                 return 1;                  return 1;
         }          }
         if(type(Out=getopt(cut))!=7)    Out="\\\\\n&";          if(type(Out=getopt(cut))!=7){
                   if(type(Out)!=4) Out=Out2="\\\\\n&";
                   else{
                           Out2=Out[1];Out=Out[0];
                   }
           }
         if(type(Del=getopt(del))!=7)    Del=Out;          if(type(Del=getopt(del))!=7)    Del=Out;
         if(Lim<30)      Lim=TeXLim;          if(Lim<30)      Lim=TeXLim;
         S=ltov(strtoascii(S));          S=ltov(strtoascii(S));
Line 4390  def texlim(S,Lim)
Line 5951  def texlim(S,Lim)
         SS=str_tb(0,0);          SS=str_tb(0,0);
         L=cons(length(S),L);          L=cons(length(S),L);
         L=reverse(L);          L=reverse(L);
           if(length(L)>TeXPages) Out=Out2;
         for(I=0; L!=[]; I=J,L=cdr(L)){          for(I=0; L!=[]; I=J,L=cdr(L)){
                 str_tb((I==0)?"":Out,SS);                  str_tb((I==0)?"":Out,SS);
                 J=car(L);                  J=car(L);
Line 4537  def mtransbys(FN,F,LL)
Line 6099  def mtransbys(FN,F,LL)
         return call(FN, cons(F,LL)|option_list=Opt);          return call(FN, cons(F,LL)|option_list=Opt);
 }  }
   
   def trcolor(S)
   {
           if(type(S)!=7) return S;
           return ((I=findin(S,LCOPT))>=0)?COLOPT[I]:0;
   }
   
   def mcolor(L,P)
   {
           if(type(L)!=4) return L;
           if(!P||(S=length(L))==1){
                   if(type(V=car(L))!=7) return V;
                   return trcolor(V);
           }
           P-=ceil(P)-1;
           if(P==1){
                   if(type(V=L[S-1])!=7) return V;
                   return trcolor(V);
           }
           for(S=P*(S-1);S>1;S--,L=cdr(L));
           if(getopt(disc)==1) S=0;
           if(type(L0=L[0])==7) L0=trcolor(L0);
           if(type(L1=L[1])==7) L1=trcolor(L1);
           T=rint(iand(L0,0xff)*(1-S)+iand(L1,0xff)*S);
           TT=iand(L0,0xff00)*(1-S)+iand(L1,0xff00)*S;
           T+=rint(TT/0x100)*0x100;
           TT=iand(L0,0xff0000)*(1-S)+iand(L1,0xff0000)*S;
           return T+rint(TT/0x10000)*0x10000;
   }
   
 def drawopt(S,T)  def drawopt(S,T)
 {  {
         if(type(S)!=7) return -1;          if(type(S)!=7) return -1;
Line 4568  def drawopt(S,T)
Line 6159  def drawopt(S,T)
         return -1;          return -1;
 }  }
   
   def openGlib(W)
   {
           extern Glib_canvas_x;
           extern Glib_canvas_y;
           extern Glib_math_coordinate;
   
           if(W==0){
                   glib_clear();
                   return;
           }
           if(type(W)==4&&length(W)==2){
                   Glib_canvas_x=W[0];
                   Glib_canvas_y=W[1];
           }
           Glib_math_coordinate=1;
           if(getopt(null)!=1) return glib_open();
   }
   
 def execdraw(L,P)  def execdraw(L,P)
 {  {
         if((Proc=getopt(proc))!=1) Proc=0;          if((Proc=getopt(proc))!=1) Proc=0;
Line 4820  def execdraw(L,P)
Line 6429  def execdraw(L,P)
                                                 LOut=cons(T[2],Out);                                                  LOut=cons(T[2],Out);
                                         }                                          }
                                 }                                  }
                           }else if(T[0]==6){      /* plot */
                                   F++;
                                   if((T1=findin(T[1],LCOPT))>-1) T1=COLOPT(T1);
                                   else if(type(T1)!=1 && T1!=0) T1=0xffffff;
                                   for(T2=ptaffine(M,T[2]|option_list=Org);T2!=[];T2=cdr(T2))
                                           draw_obj(Id,Ind,[rint(car(T2)[0]),rint(car(T2)[1])],T1);
                         }else if(Proc==1&&type(T[0])==2){                          }else if(Proc==1&&type(T[0])==2){
                                 if(length(T)<3) call(T[0],T[1]);                                  if(length(T)<3) call(T[0],T[1]);
                                 else call(T[0],T[1]|option_list=T[2]);                                  else call(T[0],T[1]|option_list=T[2]);
Line 4869  def execdraw(L,P)
Line 6484  def execdraw(L,P)
                                         }                                          }
                                 }                                  }
                                 if(MM) V=ptaffine(MM,V|option_list=Org);                                  if(MM) V=ptaffine(MM,V|option_list=Org);
                                 if(length(T)>3) V=append(V,T[3]);                                  if(length(T)>3){
                                           if(type(T2=T[3])==7) T2=[T2];
                                           V=append(V,T2);
                                   }
                                 str_tb(xyput(V),Out);                                  str_tb(xyput(V),Out);
                         }else if(T[0]==3){                          }else if(T[0]==3){
                                 F++;                                  F++;
Line 4899  def execdraw(L,P)
Line 6517  def execdraw(L,P)
                                         if(P[0]==2)     dviout(T[2]|option_list=T[1]);                                          if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                                         else LOut=cons(T[2],Out);                                          else LOut=cons(T[2],Out);
                                 }                                  }
                           }else if(T[0]==6){      /* plot */
                                   F++;
                                   if(type(T[1])==7) T1=[T[1],"."];
                                   else T1=".";
                                   for(T2=ptaffine(M,T[2]|option_list=Org);T2!=[];T2=cdr(T2))
                                           str_tb(xypos([car(T2)[0],car(T2)[1],T1]),Out);
                         }else if(T[0]==-2)                          }else if(T[0]==-2)
                                 str_tb(["%",T[1],"\n"],Out);                                  str_tb(["%",T[1],"\n"],Out);
                         else if(Proc==1&&type(T[0])==2){                           else if(Proc==1&&type(T[0])==2){
                                 if(length(T)<3) call(T[0],T[1]);                                  if(length(T)<3) call(T[0],T[1]);
                                 else call(T[0],T[1]|option_list=T[2]);                                  else call(T[0],T[1]|option_list=T[2]);
                         }                          }
Line 4949  def myswap(P,L)
Line 6573  def myswap(P,L)
 def mysubst(P,L)  def mysubst(P,L)
 {  {
         if(P==0) return 0;          if(P==0) return 0;
           if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
         Inv=getopt(inv);          Inv=getopt(inv);
         if(type(L[0]) == 4){          if(type(L[0]) == 4){
                 while((L0 = car(L))!=[]){                  while((L0 = car(L))!=[]){
Line 5067  def mmulbys(FN,P,F,L)
Line 6692  def mmulbys(FN,P,F,L)
   
 def appldo(P,F,L)  def appldo(P,F,L)
 {  {
           if(getopt(Pfaff)==1){
                   L = vweyl(L);
                   X = L[0]; DX = L[1];
                   for(I=mydeg(P,DX);I>0;I--){
                           if(!(TP=mycoef(P,I,DX))) continue;
                           P=red(P-TP*DX^I+TP*muldo(DX^(I-1),F,L));
                   }
                   return P;
           }
         if(type(F) <= 3){          if(type(F) <= 3){
                 if(type(L) == 4 && type(L[0]) == 4)                  if(type(L) == 4 && type(L[0]) == 4)
                         return applpdo(P,F,L);                          return applpdo(P,F,L);
Line 5107  def appledo(P,F,L)
Line 6741  def appledo(P,F,L)
 #endif  #endif
 }  }
   
   def caldo(P,L)
   {
           for(R=0;P!=[];P=cdr(P)){
                   TP=car(P);
                   if(type(TP)<4){
                           R=red(R+TP);continue;
                   }
                   for(S=1;TP!=[];TP=cdr(TP)){
                           S0=car(TP);
                           if(type(S0)==4){
                                   TP0=S0;
                                   for(S0=1,K=TP0[1];K>0;K--) S0=muldo(S0,TP0[0],L);
                           }
                           S=muldo(S,S0,L);
                   }
                   R=red(R+S);
           }
           return R;
   }
   
 def muldo(P,Q,L)  def muldo(P,Q,L)
 {  {
         if(type(Lim=getopt(lim))!=1) Lim=100;          if(type(Lim=getopt(lim))!=1) Lim=100;
Line 5144  def muldo(P,Q,L)
Line 6798  def muldo(P,Q,L)
 def jacobian(F,X)  def jacobian(F,X)
 {  {
         F=ltov(F);X=ltov(X);          F=ltov(F);X=ltov(X);
         N=length(F);          N=length(F);L=length(X);
         M=newmat(N,N);          M=newmat(N,L);
         for(I=0;I<N;I++)          for(I=0;I<N;I++)
                 for(J=0;J<N;J++) M[I][J]=red(diff(F[I],X[J]));                  for(J=0;J<L;J++) M[I][J]=red(diff(F[I],X[J]));
         if(getopt(mat)==1) return M;          if(N!=L||getopt(mat)==1) return M;
         return mydet(M);          return mydet(M);
 }  }
   
Line 5231  def mce(P,L,V,R)
Line 6885  def mce(P,L,V,R)
 {  {
         L = vweyl(L);          L = vweyl(L);
         X = L[0]; DX = L[1];          X = L[0]; DX = L[1];
         P = sftexp(laplace1(P,L),L,V,R);          P=red(P);
           if(findin(DX,dn(P))>=0) return 0;
           PP=fctr(nm(P));
           for(P=1;PP!=[];PP=cdr(PP)){
                   TP=car(PP);
                   if(findin(DX,vars(TP[0]))>=0) P*=TP[0]^TP[1];
           }
           P = sftexp(laplace1(P,L),L,V,R|option_list=getopt());
         return laplace(P,L);          return laplace(P,L);
 }  }
   
 def mc(P,L,R)  def mc(P,L,R)
 {  {
         return mce(P,L,0,R);          return mce(P,L,0,R|option_list=getopt());
   }
   
   def mcme(P,L,V,R)
   {
           for(LL=[];L!=[];L=cdr(L)) LL=cons(car(L),LL);
           LL=reverse(LL);
           if(V==0) L=LL;
           else L=delopt(LL,V|inv=1);
           P=rede(P,LL);
           for(Q=laplace(P,L),E=0,TL=L;TL!=[];TL=cdr(TL)){
                   E+=TL[0]*TL[1];
                   Q=toeul(Q,car(TL),0);
           }
           N=length(L);
           for(R=[],TL=L;TL!=[];TL=cdr(TL))
                   R=cons([-E/car(TL),-TL[0]*TL[1]+(R-1)/N],R);
           Q=transpdo(Q,L,reverse(R)|ex=1);
           return rede(Q,LL);
 }  }
   
 def rede(P,L)  def rede(P,L)
Line 5411  def mulpdo(P,Q,L);
Line 7090  def mulpdo(P,Q,L);
         }          }
 }  }
 #endif  #endif
   
   def transppow(LL,M)
   {
           for(L=[];LL!=[];LL=cdr(LL))
                   L=cons(vweyl(car(LL)),L);
           L=reverse(L);N=length(L);
           if(type(M)==4) M=lv2m(M);
           MM=myinv(M);
           for(K=[],I=0;I<N;I++){
                   for(J=0,K0=1;J<N;J++) K0*=L[J][0]^M[J][I];
                   for(J=0,K1=0;J<N;J++) K1=red(K1+MM[I][J]*L[J][0]*L[J][1]/K0);
                   K=cons([K0,K1],K);
           }
           return reverse(K);
   }
   
 def transpdosub(P,LL,K)  def transpdosub(P,LL,K)
 {  {
           if(type(P)>3) return
   #ifdef  USEMODULE
                   mtransbys(os_md.transpdosub,P,[LL,K]);
   #else
                   mtransbys(transpdosub,P,[LL,K]);
   #endif
         Len = length(K)-1;          Len = length(K)-1;
         if(Len < 0 || P == 0)          if(Len < 0 || P == 0)
                 return P;                  return P;
Line 5438  def transpdosub(P,LL,K)
Line 7138  def transpdosub(P,LL,K)
 }  }
   
 def transpdo(P,LL,K)  def transpdo(P,LL,K)
 {  {
         if(type(K[0]) < 4)          if(type(K)==4&&type(K[0]==4)){
                 K = [K];                  for(TK=K;;TK=cdr(TK)) if(!isint(car(TK))) break;
                   if(TK==[]) K=transppow(LL,K);
           }
           if(type(K)==6) K=transppow(LL,K);
         Len = length(K)-1;          Len = length(K)-1;
         K1=K2=[];          K1=K2=[];
         if(type(LL)!=4) LL=[LL];          if(type(LL)!=4) LL=[LL];
         if(type(LL[0])!=4) LL=[LL];          if(type(LL[0])!=4) LL=[LL];
           if(type(car(K)) < 4 && length(LL)!=length(K)) K = [K];
         if(getopt(ex)==1){          if(getopt(ex)==1){
                 for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){                  for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){
                         L = vweyl(LL[J]);                          L = vweyl(LL[J]);
Line 5453  def transpdo(P,LL,K)
Line 7157  def transpdo(P,LL,K)
                 }                  }
                 K2=append(K1,K2);                  K2=append(K1,K2);
         }else{          }else{
                   if(length(LL)==length(K) && type(car(K))!=4){
                           for(DV=V=TL=[],J=length(LL)-1;J>=0;J--){
                                   TL=cons(vweyl(LL[J]),TL);
                                   V=cons(car(TL)[0],V);
                                   DV=cons(car(TL)[1],DV);
                           }
                           LL=TL;
                           if(type(RK=solveEq(K,V|inv=1))!=4) return TK;
                           if(!isint(Inv=getopt(inv))) Inv=0;
                           if(iand(Inv,1)){J=K;K=RK;RK=J;}
                           M=jacobian(RK,V|mat=1);
                           M=mulsubst(M,[V,K]|lpair=1);
                           RK=vtol(M*ltov(DV));
                           if(Inv>1) return RK;
                           K=lpair(K,RK);
                   }
                 for(J = length(K)-1; J >= 0; J--){                  for(J = length(K)-1; J >= 0; J--){
                         L = vweyl(LL[J]);                          L = vweyl(LL[J]);
                         if(L[0] != K[J][0])                          if(L[0]!= K[J][0]) K1=cons([L[0],K[J][0]],K1);
                                 K1 = cons([L[0],K[J][0]],K1);  
                         K2 = cons(K[J][1],K2);                          K2 = cons(K[J][1],K2);
                 }                  }
                 P = mulsubst(P, K1);                  P = mulsubst(P, K1);
Line 5509  def texbegin(T,S)
Line 7228  def texbegin(T,S)
 {  {
         if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";          if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";
         else Opt="\n";          else Opt="\n";
         return "\\begin{"+T+"}"+Opt+S+"%\n\\end{"+T+"}\n";          U=(str_chr(S,str_len(S)-1,"\n")<0)?"%\n":"";
           return "\\begin{"+T+"}"+Opt+S+U+"\\end{"+T+"}\n";
 }  }
   
 def mygcd(P,Q,L)  def mygcd(P,Q,L)
Line 5839  def divdo(P,Q,L)
Line 7559  def divdo(P,Q,L)
                 }                  }
                 P -= muldo(SR*(DX)^(J-I),Q,L);                  P -= muldo(SR*(DX)^(J-I),Q,L);
                 S += SR*(DX)^(J-I);                  S += SR*(DX)^(J-I);
         }      }
         return [S,P,M];          return [S,P,M];
 }  }
   
Line 6151  def seriesTaylor(F,N,V)
Line 7871  def seriesTaylor(F,N,V)
         return F;          return F;
 }  }
   
 def toeul(F,L,V)  def mulpolyMod(P,Q,X,N)
 {  {
         L = vweyl(L);          Red=(type(P)>2||type(Q)>2)?1:0;
         X = L[0]; DX = L[1];          for(I=R=0;I<=N;I++){
         I = mydeg(F,DX);                  P0=mycoef(P,I,X);
         if(V == "infty"){                  for(J=0;J<=N-I;J++){
                 for(II=I; II>=0; II--){                          R+=P0*mycoef(Q,J,X)*X^(I+J);
                         J = mydeg(P=mycoef(F,I,DX),X);                          if(Red) R=red(R);
                         if(II==I) S=II-J;  
                         else if(P!=0 && II-J>S) S=II-J;  
                 }                  }
                 F *= X^S;  
                 R = 0;  
                 for( ; I >= 0; I--)  
                          R += red((mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I));  
                 return(subst(pol2sft(R,DX),DX,-DX));  
         }          }
         F = subst(F,X,X+V);          return R;
         for(II=I; II>=0; II--){  }
                 J = mymindeg(P=mycoef(F,II,DX),X);  
                 if(II==I) S=II-J;  def solveEq(L,V)
                 else if(P!=0 && II-J>S) S=II-J;  {
           Inv=0;K=length(V);
           H=(getopt(h)==1)?1:0;
           if(getopt(inv)==1){
                   if(K!=length(L)) return -5;
                   Inv=1;
                   VN=makenewv(vars(L)|num=K);
                   for(TL=[],I=K-1;I>=0;I--) TL=cons(VN[I]-L[I],TL);
                   S=solveEq(TL,V|h=H);
                   if(type(S)!=4) return S;
                   return mysubst(S,[VN,V]|lpair=1);
         }          }
         F *= X^S;          for(TL=[];L!=[];L=cdr(L)) TL=cons(nm(red(car(L))),TL);
         R = 0;          S=gr(TL,reverse(V),2);
         for( ; I >= 0; I--)          if(length(S)!=K) return -1;
                 R += (red(mycoef(F,I,DX)/X^I))*DX^I;          for(R=[],I=F=0;I<K;I++){
         return pol2sft(R,DX);                  TS=S[I];
                   VI=lsort(vars(TS),V,2);
                   if(length(VI)!=1) return -2;
                   if((VI=car(VI))!=V[I]) return -3;
                   if(mydeg(TS,VI)!=1){
                           F=1;R=cons([VI,TS],R);
                   }else R=cons(-red(mycoef(TS,0,VI)/mycoef(TS,1,VI)),R);
           }
           R=reverse(R);
           if(!F||H==1) return R;
           return -4;
 }  }
   
   /* Opt: f, var, ord, to, in, TeX */
   def baseODE(L)
   {
           SV=SVORG;
           if(type(TeX=getopt(TeX))!=1) TeX=0;
           if(type(F=getopt(f))!=1) F=0;
           if(isint(In=getopt(in))!=1) In=0;
           if(type(Ord=getopt(ord))!=1&&Ord!=0) Ord=2;
           Pages=getopt(pages);
           if(Pages!=1&&Pages!=2) Pages=0;
           if(Ord>3){
                   Ord-=4; Hgr=1;
           }else Hgr=0;
           if(type(car(L0=L))==4&&type(L[1])==7){
                   Tt=L[1];L=car(L);
           }
           M=N=length(L);  SV=SVORG;
           if(type(Var=getopt(var))==4&&(In>0||length(Var)==N)){
                   SV=Var;
                   M=length(SV);
                   if(type(car(SV))==2){
                           for(R=[];SV!=[];SV=cdr(SV)) R=cons(rtostr(car(SV)),R);
                           SV=reverse(R);
                   }
           }else{
                   if(N>10){
                           R=[];
                           for(K=M-1;K>9;K++) R=cons(SV[floor(K/10)-1]+SV[K%10],R);
                           SV=append(SV,R);
                   }
                   for(Var=[],I=M-1;I>=0;I--) Var=cons(makev([SV[I]]),Var);
           }
           if(type(To=getopt(to))<2||type(To)>4) To=0;
           if(Ord<0){      /* cancell y1, z1,... by baseODE0() */
                   if(Ord==-1) Ord=2;
                   if(type(To)==4||!isvar(To)){
                           L=L0=baseODE(L0|to=To,f=-3)[1];
                           To=0;
                   }
                   R=baseODE0(L|option_list=
                           delopt(getopt(),[["var",Var],["ord",Ord]]|inv=1));
                   if(TeX){
                           if(type(R)==4&&length(R)>1&&type(R[1])==4) R=R[1];
                           if(type(To)==2 && !isvar(To)){
                                   S0=baseODE(L0|TeX=1,f=-1,to=To);
                                   V=baseODE0(L|step=-1,to=To);
                           }else{
                                   S0=baseODE(L0|TeX=1,f=-1);
                                   V=baseODE0(L|step=-1,to=To);
                           }
                           T=eqs2tex(R,[V,2,Pages]);
                           S=((F==1)?(Tt+"\n"):S0)+texbegin("align*",T);
                           if(TeX==2) dviout(S);
                           return S;
                   }
                   return R;
           }
           if(To&&!isvar(To)){
                   if(type(To)!=4){
                           To=red(To);
                           for(K=0;K<length(Var);K++){
                                   I=mydeg(nm(To),Var[K]);J=mydeg(dn(To),Var[K]);
                                   if(I+J>0&&I<2&&J<2) break;
                           }
                           if(K==length(Var)) return -9;
                           J=To;
                           for(To=[],I=length(Var)-1;I>=0;I--)
                                   if(I!=K) To=cons(Var[I],To);
                           To=cons(J,To);
                   }
                   if(type(To)==4){
                           if(type(car(To))==4){
                                   R=1;To=car(To);
                           }else R=0;
                           if(type(IL=solveEq(To,Var|inv=1))!=4) return IL;
                           if(R==1){
                                   R=To;To=IL;IL=R;
                           }
                           L=mulsubst(L,[Var,IL]|lpair=1);
                           if(!In){   /* X_i'=\sum_j(\p_{x_j}X_i)*x_j' */
                                   for(TL=[],I=M-1;I>=0;I--){
                                           P=To[I];Q=mydiff(P,t);
                                           for(J=0;J<M;J++) Q=red(Q+mydiff(P,Var[J])*L[J]);
                                           TL=cons(Q,TL);
                                   }
                                   L=TL;
                           }else{  /* x_i'=\sum_j(\p_{X_j}x_i)*X_j' */
                                   for(I=M-1;I>=0;I--){
                                           P=IL[I];Q=mydiff(P,t);
                                           for(J=0;J<M;J++){
                                                   V=makev([SV[J],1]);
                                                   Q=red(Q+mydiff(P,V)*V);
                                           }
                                           L=mysubst(L,[makev([SV[I],1]),TL[I]]);
                                   }
                                   for(TL=L,L=[],I=M-1;I>=0;I--) L=cons(num(TL[I]),L);
                           }
                   }
           }
           if(F==-3&&!TeX) return [Var,L];
           for(I=0;I<M;I++) L=subst(L,Var[I],makev([SV[I],0]));
           if(TeX){
                   for(TL=L,I=0;I<M;I++)
                           TL=subst(TL,makev([SV[I],0]),Var[I]);
                   for(I=0;I<N;I++){
                           if(I) S0+=",\\\\\n";
                           if(In) S0+=" "+my_tex_form(TL[I])+"=0";
                           else S0+=" "+SV[I]+"'\\!\\!\\! &= "+my_tex_form(TL[I]);
                   }
                   S0+=".\n";
                   S0=texbegin("cases", S0);
                   S0=texbegin("align",S0);
                   if(type(Tt)==7) S0=Tt+"\n"+S0;
                   if(F<0){
                           if(TeX==2)dviout(S0);
                           return S0;
                   }
           }
           for(I=0,TL=[];L!=[];L=cdr(L),I++){
                   T=car(L);
                   if(!In) T=makev([SV[I],1])-T;
                   TL=cons(nm(red(T)),TL);
           }
           if(isvar(To)){
                   T=rtostr(To);
                   IT=findin(T,SV);
                   if(IT>=0 && IT<M){
                           R=[SV[IT]];
                           for(J=0;SV!=[];SV=cdr(SV),J++){
                                   if(J==IT) continue;
                                   R=cons(car(SV),R);
                           }
                           SV=reverse(R);
                   }else{
                           IT=0;
                           mycat(["Cannot find variable", T, "!\n"]);
                   }
           }
           for(S=1;S<M;S++){
                   L=append(TL,L);
                   TL=reverse(TL);
                   for(RL=[];TL!=[];TL=cdr(TL)){
                           if(In==0&&S==N-1&&length(TL)!=N-IT) continue;
                           T=car(TL);R=mydiff(V,t);
                           for(I=0;I<M;I++){
                                   for(J=0;J<=S;J++){
                                           V=makev([SV[I],J]|num=1);
                                           if((DR=mydiff(T,V))!=0) R+=DR*makev([SV[I],J+1]|num=1);
                                   }
                           }
                           RL=cons(R,RL);
                   }
                   TL=RL;
           }
           L=append(TL,L);
           for(I=0;I<M;I++) L=subst(L,makev([SV[I],0]),Var[I]);
           if(!isint(Vl=getopt(vl))) Vl=0;
           if(!Vl||Vl==1){
                   V=[makev([SV[0]])];
                   for(VV=[],J=1;J<=M;J++)
                           V=cons(makev([SV[0],J]),V);
                   for(I=1;I<M;I++)
                           V=cons(makev([SV[I]]),V);
                   if(F==-2){
                           VV=cons(V,VV);
                           V=[];
                   }
                   for(I=1;I<M;I++){
                           for(J=1;J<M;J++) V=cons(makev((!Vl)?[SV[I],J]:[SV[J],I]),V);
                           if(In) V=cons(makev([SV[0],M]),V);
                           if(F==-2){
                                   VV=cons(V,VV);
                                   V=[];
                           }
                   }
           }else{
                   for(V=VV=[],I=0;I<M;I++){
                           for(J=0;J<M;J++) V=cons(J?makev([SV[I],J]):makev([SV[I]]),V);
                           if(!I||In) V=cons(makev([SV[0],M]),V);
                           if(F==-2){
                                   VV=cons(V,VV);
                                   V=[];
                           }
                   }
           }
           if(F>=0&&!chkfun("gr",0)){
                   mycat("load(\"gr\"); /* <- do! */\n");
                   F=-1;
           }
           if(F==-2) return [VV,L];
           if(F<0) return [V,L];
           LL=(Hgr==1)?hgr(L,V,Ord):gr(L,V,Ord);
           if(F==2) return [V,L,LL];
           if(Ord==2) P=LL[0];
           else{
                   P=LL[length(LL)-1];
                   for(RV=reverse(V), I=0;I<M+1;I++) RV=cdr(RV);
                   if(lsort(vars(P),RV,2)!=[]){
                           LL=tolex_tl(LL,V,Ord,V,2);P=LL[0];
                   }
           }
           if(TeX){
                   for(V0=[],I=1;I<=M;I++) V0=cons(makev([car(SV),I]),V0);
                   T=eqs2tex(P,[V0,2,Pages]);
                   if(!Vl||Vl==1){
                           for(I=1,K=0;I<length(LL);I++){
                                   TV=makev([SV[I-K]]);
                                   if(findin(TV,vars(LL[I]))<0){
                                                   K++;continue;
                                   }
                                   T+=eqs2tex(LL[I],[cons(TV,V0),2,Pages,1]);
                           }
                   }
                   S=((F==1)?(Tt+"\n"):S0)+texbegin("align*",T);
                   if(TeX==2) dviout(S);
                   return S;
           }
           return (F==1)? P:[P,V,L,LL];
   }
   
   
   def eqs2tex(P,L)
   {
           if(isvar(L)) L=[0,L];
           if(type(L)!=4) L=[];
           Sgn=0;
           if(L!=[]){
                   if(car(L)==0) L=[L];
                   else if(length(L)>1 && isvar(L[1])) L=[L];
                   R=car(L);L=cdr(L);Sgn=1;
           }else R=[];
           if(type(R)==4&&car(R)==0){
                   Sgn=0;R=cdr(R);
           }
           if(L!=[]){
                   Dic=car(L);L=cdr(L);
           }
           if(L!=[]){
                   Pages=car(L);L=cdr(L);
           }
           if(L!=[]) Cont=car(L);
           if(type(P)==4){
                   for(S="";P!=[];P=cdr(P)){
                           S+=eqs2tex(car(P),[R,Dic,Pages,Cont]);
                           if(!Cont) Cont=1;
                   }
   /*              S=str_subst(S,"\\\\&,\\\\",",\\\\&"); */
                   if(getopt(dviout)==1) dviout(S|eq=6);
                   return S;
           }
           if(type(R)==2) R=[R];
           if(Sgn){
                   for(;R!=[];R=cdr(R))
                           if((Deg=mydeg(P,car(R)))>0) break;
                   if(Deg>0){
                           CP=mycoef(P,Deg,car(R));
                           if(cmpsimple(-CP,CP)<0) P=-P;
                   }
           }
           S="&\\!\\!\\!";
           if(Cont)
                    S=(Pages?",\\allowdisplaybreaks":",")+"\\\\\n"+S;
           S+=fctrtos(P|var=R,dic=Dic,TeX=3,pages=Pages);
           if(getopt(dviout)==1) dviout(S|eq=6);
           return S;
   }
   
   /* Opt: var, opt, dbg */
   def res0(P,Q,X)
   {
           if(!isvar(X)){
                   if(!isvar(P)) return -1;
                   Y=P;P=Q;Q=X;X=Y;
           }
           if(isvar(Var=getopt(var))) Var=[Var];
           else if(type(Var)!=4) Var=0;
           if(type(W=getopt(w))!=4) W=[];
           if(!isint(Opt=getopt(opt))&&type(Opt)!=4) Opt=0;
           if(type(Dbg=getopt(dbg))==4){
                   Fct=Dbg[1];Dbg=Dbg[0];
           }
           if(!isint(Dbg)) Dbg=0;
           P=nm(P);Q=nm(Q);
           Fctr=isfctr(P)*isfctr(Q);
           DP=deg(P,X);DQ=deg(Q,X);
           if(DP==DQ&&nmono(coef(P,DP,X))<nmono(coef(Q,DQ,X))){
                   R=P;P=Q;Q=R;
                   R=DP;DP=DQ;DQ=R;
           }
           while(DQ>0){
                   if(DP<DQ){
                           R=P;P=Q;Q=R;
                           R=DP;DP=DQ;DQ=R;
                           if(Opt==-1) return [P,Q,DP,DQ];
                           if(DQ<1) break;
                   }
                   if(Dbg){
                           if(Dbg>=2) mycat([DP,"(",nmono(P), nmono(coef(P,DP,X)),") :",
                                   DQ, "(",nmono(Q),nmono(coef(Q,DQ,X)), ")"]);
                           else mycat0([DP,":",DQ,","],0);
                   }
                   TQ=coef(Q,DQ,X);TP=coef(P,DP,X);
                   if(Fctr){
                           T=gcd(TP,TQ);M=red(TQ/T);
                           if(Var&&M!=car(W)&&type(TV=vars(M))==4&&lsort(TV,Var,2)!=[]) W=cons(M,W);
                           P=M*(P-coef(P,DP,X)*X^DP)-red(TP/T)*X^(DP-DQ)*(Q-coef(Q,DQ,X)*X^DQ);
                           if(Var){
   #if 1
                                   if(Dbg>2) mycat0(">",0);
                                   for(S=SS=fctr(P),P=1,C=0;S!=[];S=cdr(S)){
                                           TV=vars(S0=car(S)[0]);
                                           if(type(TV)==4&&lsort(TV,Var,2)!=[]){
                                                   for(TW=W;TW!=[];TW=cdr(TW)){
                                                           if(gcd(car(TW),S0)!=1){
                                                                   S0=1;break;
                                                           }
                                                   }
                                                   if(Dbg>1){
                                                           if(S0==1) mycat(["Reduced by :",nmono(car(TW))]);
                                                           else if(C++>0){
                                                                   mycat(["Product :", nmono(P), nmono(S0)]);
                                                                   if(Dbg==3){
                                                                           if(!Fct||Fct==[]){
                                                                                   if(C>1) P=1;
                                                                           }else{
                                                                                   if(car(Fct)==C){
                                                                                           C=10000;Fct=cdr(Fct);P=1;
                                                                                   }else S0=1;
                                                                           }
                                                                   }else if(Dbg==4) return [SS,Q,DP,DQ,W];
                                                           }
                                                   }
                                                   P*=S0;
                                           }
                                   }
   #else
                                   for(TW=W;TW!=[];TW=cdr(TW)){
                                           if((C=gcd(P,car(TW)))!=1){
                                                   P=red(P/C);
                                                   if(Dbg>=2&&nmono(Q)>1) mycat(["Reduce :",nmono(C)]);
                                           }
                                   }
   #endif
                           }
                   }else{
                           if(type(TQ)==1){
                                   Q/=TQ;
                                   P=P-TP*X^(DP-DQ)*Q;
                           }else P=TQ*P-TP*X^(DP-DQ);
                           if(deg(P,X)==DP) P-=coef(P,DP,X)*X^DP;
                   }
                   DP=deg(P,X);
                   if(Opt==-2||(type(Opt)==4&&Opt[0]==DP&&Opt[1]==DQ)) return [P,Q,DP,DQ,W];
           }
           if(Dbg){
                   if(Dbg>1)  mycat([DP,"(",nmono(P), nmono(coef(P,DP,X)),") :",
                           DQ, "(",nmono(Q), nmono(coef(Q,DQ,X)), ")"]);
                   else mycat0([DP,":",DQ," "],0);
           }
           if(Opt==1) Q=[P,Q,DP,DQ,W];
           return (DQ==0)?Q:0;
   }
   
   /* Opt : f, var, ord, ord, step, f, to */
   def baseODE0(L)
   {
           if(!isint(Ord=getopt(ord))) Ord=-1;
           if(Ord==-1) Ord=2;
           if(Ord<O) Ord++;
           if(!isint(F=getopt(f))) F=0;
           if(!isint(Dbg=getopt(dbg))) Dbg=0;
           if(type(Step=getopt(step))==4) Dstep=Step;
           else Dstep=0;
           if(!isint(Step)) Step=0;
           if(F<0) Step=1;
           if(Step>0&&Ord>0) Ord=-1;
           N=length(L);
           if(type(To=getopt(to))==4&&length(To)==N){
                   V=cdr(To);To=car(To);
           }
           if(!isvar(To)) To=V=0;
           if(type(SV=Var=getopt(var))!=4){
                   SV=SVORG;
                   if(N>10){
                           R=[];
                           for(K=N-1;K>9;K++) R=cons(SV[floor(K/10)-1]+SV[K%10],R);
                           SV=append(SV,R);
                   }
                   for(Var=[],I=N-1;I>=0;I--) Var=cons(makev([SV[I]]),Var);
           }
           if((J=findin(To,Var))>0){
                   TV=TL=[];
                   for(I=N-1;I>=0;I--){
                           if(I!=J){
                                   TV=cons(Var[I],TV);TL=cons(L[I],TL);
                           }
                   }
                   Var=cons(Var[J],TV);L=cons(L[J],TL);
           }
           if(!To) To=car(SV);
           Q=car(L);
           V0=makev([To,1]);
           R=[V0-Q];V0=[V0];
           for(I=2;I<=N;I++){
                   P=diff(t,Q);
                   if(type(P)==3) P=red(P);
                   for(TV=Var,TL=L;TV!=[];TV=cdr(TV),TL=cdr(TL)){
                           P+=diff(Q,car(TV))*car(TL);
                           if(type(P)==3) P=red(P);
                   }
                   Q=P;
                   TV=makev([To,I]);
                   R=cons(nm(TV-Q),R);
                   V0=cons(TV,V0);
           }
           if(Step==-1) return V0;
           if(!V) V=cdr(Var);
           if(Ord<0){
                   for(C=1,R0=[];V!=[];V=cdr(V),C++){
                           TR=R=reverse(R);
                           if(length(R)>1){        /* reduce common factor */
                                   P=car(TR);TR=cdr(TR);
                                   for(;TR!=[]&&P!=1;TR=cdr(TR))
                                           P=gcd(P,car(TR));
                                   if(P!=1){
                                           for(TR=[];R!=[];R=cdr(R)) TR=cons(red(car(R)/P),TR);
                                           R=reverse(TR);
                                   }
                           }
                           TR=[];
                           TV=car(V);
                           if(length(V)==1) V0=[car(V0)];
                           if(C==Step) return [append(V,V0),R];
                           while(R!=[]&&findin(TV,vars(car(R)))<0){
                                   TR=cons(car(R),TR);
                                   R=cdr(R);
                           }
                           R0=(F==2)?append(R,R0):cons(car(R),R0);
                           if(R!=[]){
                                   for(W=[],P=car(R),R=cdr(R); R!=[]; R=cdr(R)){
                                           if(Dbg) mycat0(["\nStep ",C,"-",length(R)," ",TV,
                                                   (type(Dbg)==4||Dbg>=2)?"\n":" "],0);
                                           if(findin(TV,vars(car(R)))<0){
                                                   TR=cons(car(R),TR);
                                                   continue;
                                           }
                                           if(Ord>-3){
                                                   if(Dstep&&Dstep[0]==C&&Dstep[1]==length(R))
                                                           return res0(P,car(R),TV|var=V0,opt=cdr(cdr(Dstep)),dbg=Dbg);
                                                   else TQ=res0(P,car(R),TV|var=V0,opt=1,dbg=Dbg,w=W);
                                                   if(Dbg==4&&type(car(TQ))==4) return TQ;
                                                   if(Ord==-2) P=car(TQ);
                                                   W=TQ[4];TQ=TQ[1];
                                           }else{
                                                   TQ=res(TV,P,car(R));
                                                   Q=fctr(TQ);     /* irreducible one */
                                                   for(TQ=1;Q!=[];Q=cdr(Q))
                                                           if(lsort(V0,vars(car(Q)[0]),2)!=[]) TQ*=car(Q)[0];
                                           }
                                           TR=cons(TQ,TR);
                                   }
                           }
                           R=TR;
                   }
                   if(Dbg==1) mycat([]);
                   return (F==1)?car(R):(F==2?append(R,R0):cons(car(R),R0));
           }
           V=append(V,[makev([To,N])]);
           if(Step==1) return [R,V];
           R=gr(R,V,Ord);
           return (F==1)?car(R):R; /* hgr(R,V,Ord); */
   }
   
   
   def taylorODE(D){
           Dif=(getopt(dif)==1)?1:0;
           if(D==0) return Dif?f:f_00;
           if(type(T=getopt(runge))!=1||ntype(T)!=0) T=0;
           if(type(F=getopt(f))!=7&&type(F)<2) F="f_";
           if(type(D)!=1||ntype(D)!=0||D<0||D>30) return 0;
           if(type(H=getopt(taylor))==4&&length(H)==2){
                   if(type(Lim=getopt(lim))==2) DD=D;
                   else if(type(Lim)==4){
                           DD=Lim[1];Lim=Lim[0];
                   }else Lim=0;
                   for(R=I=0;I<=D;I++){
                           if(I){
                                   if(Lim) H0=mulpolyMod(H0,H[0],Lim,DD);
                                   else H0*=H[0];
                           }else  H0=1;
                           if(type(F)!=7) G=I?mydiff(G,x):F;
                           for(J=0;J<=D-I;J++){
                                   if(J){
                                           if(Lim) H1=mulpolyMod(H1,H[1],Lim,DD);
                                           else H1*=H[1];
                                   }else H1=H0;
                                   if(type(F)==7) G=makev([F,I,J]);
                                   else if(J) G=mydiff(G,y);
                                   R+=G*H1/fac(I)/fac(J);
                           }
                   }
                   if(Lim) R=os_md.polcut(R,DD,Lim);
                   return R;
           }else{
                   if(type(H=getopt(series))>=0||getopt(list)==1){
                           if(type(F)!=7){
                                   for(PP=[F],I=1;I<D;I++)
                                           PP=cons(mydiff(car(PP),x)+mydiff(car(PP),y)*F,PP);
                                   if(type(H)<0) return PP;
                                   for(R=0,DD=D;DD>=1;DD--,PP=cdr(PP)) R+=car(PP)*H^DD/fac(DD);
                                   return red(R);
                           }
                           if(type(H)>=0) D--;
                           PP=taylorODE(D-1|list=1);
                           if(type(PP)!=4) PP=[PP];
                           P=car(PP);
                   }else P=taylorODE(D-1);
                   for(R=I=0;I<D;I++){
                           for(J=0;J<D-I;J++){
                                   Q=diff(P,makev([F,I,J]));
                                   if(Q!=0) R+=Q*(f_00*makev([F,I,J+1])+makev([F,I+1,J]));
                           }
                   }
                   if(getopt(list)==1){
                           R=cons(R,PP);
                           if(Dif!=1) return R;
                   }else if(type(H)>=0){
                           R=y+R*H^(D+1)/fac(D+1);
                           for(DD=D;DD>0;PP=cdr(PP),DD--) R+=car(PP)*H^(DD)/fac(DD);
                           if(T){
                                   if(T<0){
                                           Dif=0;TT=-T;
                                   }else TT=T;
                                   K=newvect(TT);K[0]=Dif?f:f_00;
                                   if(getopt(c1)==1) K[0]=taylorODE(D|taylor=[c_1*H,0]);
                                   for(I=1;I<TT;I++){
                                           for(S=J=0;J<I;J++) S+=makev(["a_",I+1,J+1])*K[J];
                                           K[I]=taylorODE(D|taylor=[makev(["c_",I+1])*H,S*H],lim=[H,D]);
                                   }
                                   for(S=I=0;I<TT;I++) S+=makev(["b_",I+1])*K[I];
                                   S=S*H+y;
                                   R=S-R;
                                   if(T<0){
                                           for(V=[H],I=0;I<=D;I++)
                                                   for(J=0;J<=D-I;J++) V=cons(makev([F,I,J]),V);
                                           return os_md.ptol(R,reverse(V)|opt=0);
                                   }
                           }else T=0;
                   }
           }
           if(Dif){
                   for(I=0;I<=D;I++){
                           for(J=0;J<=D;J++){
                                   if(I==0&&J==0){
                                           R=subst(R,f_00,f);
                                           continue;
                                   }
                                   V=makev([F,str_times("x",I),str_times("y",J)]);
                                   R=subst(R,makev([F,I,J]),V);
                           }
                   }
           }
           return R;
   }
   
   def toeul(F,L,V)
   {
           L = vweyl(L);
           X = L[0]; DX = L[1];
           I = mydeg(F,DX);
           if(V=="infty"){
                   if(getopt(raw)!=1){
                           for(II=I; II>=0; II--){
                                   J = mydeg(P=mycoef(F,I,DX),X);
                                   if(II==I) S=II-J;
                                   else if(P!=0 && II-J>S) S=II-J;
                           }
                           F *= X^S;
                   }
                   for(R=0 ; I >= 0; I--)
                            R += red(mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I);
                   return(subst(pol2sft(R,DX),DX,-DX));
           }
           F = subst(F,X,X+V);
           if(getopt(raw)!=1){
                   for(II=I; II>=0; II--){
                           J = mymindeg(P=mycoef(F,II,DX),X);
                           if(II==I) S=II-J;
                           else if(P!=0 && II-J>S) S=II-J;
                   }
                   F *= X^S;
           }
           for(R = 0 ; I >= 0; I--)
                   R += (red(mycoef(F,I,DX)/X^I))*DX^I;
           return pol2sft(R,DX);
   }
   
   
 /*  /*
 def topoldif(P,F,L)  def topoldif(P,F,L)
 {  {
Line 6212  def fromeul(P,L,V)
Line 8543  def fromeul(P,L,V)
                 S = DX*(S*X + mydiff(S,DX));                  S = DX*(S*X + mydiff(S,DX));
                 R += mycoef(P,J,DX)*S;                  R += mycoef(P,J,DX)*S;
         }          }
         while(mycoef(R,0,X) == 0)          if(getopt(raw)!=1){
                 R = tdiv(R,X);                  R=nm(R);
                   while(mycoef(R,0,X) == 0)
                           R = tdiv(R,X);
           }
         if(V != "infty" && V != 0)          if(V != "infty" && V != 0)
                 R = mysubst(R,[X,X-V]);                  R = mysubst(R,[X,X-V]);
         return R;          return R;
Line 6222  def fromeul(P,L,V)
Line 8556  def fromeul(P,L,V)
 def sftexp(P,L,V,N)  def sftexp(P,L,V,N)
 {  {
         L = vweyl(L); DX = L[1];          L = vweyl(L); DX = L[1];
         P = mysubst(toeul(P,L,V),[DX,DX+N]);          P = mysubst(toeul(P,L,V|opt_list=getopt()),[DX,DX+N]);
         return fromeul(P,L,V);          return fromeul(P,L,V|option_list=getopt());
 }  }
   
   
 def fractrans(P,L,N0,N1,N2)  def fractrans(P,L,N0,N1,N2)
 {  {
         L = vweyl(L);          L = vweyl(L);
Line 6460  def getroot(F,X)
Line 8793  def getroot(F,X)
                                 C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);                                  C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);
                                 C=sqrt2rat(C1^2-4*C0*C2);                                  C=sqrt2rat(C1^2-4*C0*C2);
                                 C0=[];                                  C0=[];
                                 if(type(C)==0&&ntype(C)==0&&pari(issquare,-C)) C0=sqrt(C);                                  if(type(C)==0&&ntype(C)==0&&issquare(-C)) C0=sqrt(C);
                                 else if(Cpx>1) C0=sqrtrat(C);                                  else if(Cpx>1) C0=sqrtrat(C);
                                 if(C0==[]&&Cpx>2) C0=C^(1/2);                                  if(C0==[]&&Cpx>2) C0=C^(1/2);
                                 if(C0!=[]){                                  if(C0!=[]){
Line 6618  def expat(F,L,V)
Line 8951  def expat(F,L,V)
   
 def polbyroot(P,X)  def polbyroot(P,X)
 {  {
           if(isvar(V=getopt(var))&&length(P)>1&&isint(car(P))){
                   for(Q=[],I=car(P);I<=P[1];I++) Q=cons(makev([V,I]),Q);
                   P=Q;
           }
         R = 1;          R = 1;
         while(length(P)){          while(length(P)){
                 R *= X-car(P);                  R *= X-car(P);
Line 6806  def pcoef(P,L,Q)
Line 9143  def pcoef(P,L,Q)
         return Coef;          return Coef;
 }  }
   
   def pmaj(P)
   {
           if(type(P)==4){
                   Opt=getopt(var);
                   Opt=(isvar(Opt))?[["var",Opt]]:[];
                   for(Q=[];P!=[];P=cdr(P)) Q=cons(pmaj(car(P)|option_list=Opt),Q);
                   if(Opt==[]) return reverse(Q);
                   X=Opt[0][1];
                   D=mydeg(Q,X);
                   for(S=0;D>=0;D--) S+=lmax(mycoef(Q,D,X))*X^D;
                   return S;
           }
           V=vars(P);
           Y=getopt(var);
           Abs=(Y==1)?1:0;
           if(!(K=length(V))) return Y==1?1:abs(P);
           for(R=0,D=deg(P,X=V[0]);D>=0;D--){
                   Q=coef(P,D,X);
                   if(Q!=0) R+=((type(Q)>1)?pmaj(Q|var=Abs):(Y==1?1:abs(Q)))*X^D;
           }
           if(isvar(Y)) for(;V!=[];V=cdr(V)) R=subst(R,car(V),Y);
           return R;
   }
   
 def prehombf(P,Q)  def prehombf(P,Q)
 {  {
         if((Mem=getopt(mem))!=1 && Mem!=-1)          if((Mem=getopt(mem))!=1 && Mem!=-1)
Line 7205  def stoe(M,L,N)
Line 9566  def stoe(M,L,N)
         L = vweyl(L);          L = vweyl(L);
         Size = size(M);          Size = size(M);
         S = Size[0];          S = Size[0];
         NN = 0;          NN = -1;
         if(type(N) == 4){          if(type(N) == 4){
                 NN=N[0]; N=N[1];                  NN=N[0]; N=N[1];
                   if(N==NN) return 1;
         }else if(N < 0){          }else if(N < 0){
                 NN=-N; N=0;                  NN=-N; N=0;
         }          }
Line 7217  def stoe(M,L,N)
Line 9579  def stoe(M,L,N)
         MN = dupmat(M);          MN = dupmat(M);
         MD = newmat(S,S);          MD = newmat(S,S);
         DD = D[0];          DD = D[0];
         DD[N] = 1; DD[S] = 1;          DD[N]=1; DD[S] = 1;
         for(Lcm = I = 1; ; ){          for(Lcm = I = 1; ; ){
                 DD = D[I];                  DD = D[I];
                 MM = MN[N];                  MM = MN[N];
Line 7230  def stoe(M,L,N)
Line 9592  def stoe(M,L,N)
                          DD[J] = red(DD[J]*Lcm);                           DD[J] = red(DD[J]*Lcm);
                 if(I++ >= S)                  if(I++ >= S)
                         break;                          break;
                 if(I==S && NN>0){                  if(I==S && NN>=0){
                         DD = D[I];                          DD = D[I];
                         DD[0]=-z_zz; DD[NN]=1;                          DD[S]=z_zz; DD[NN]=1;
                         break;                          break;
                 }                  }
                 Mm = dupmat(MN*M);                  Mm = dupmat(MN*M);
Line 7250  def stoe(M,L,N)
Line 9612  def stoe(M,L,N)
                 if(mydeg(P[I][0],L[1]) > 0)                  if(mydeg(P[I][0],L[1]) > 0)
                          R *= P[I][0]^P[I][1];                           R *= P[I][0]^P[I][1];
         }          }
         if(NN > 0)          if(NN >= 0)
                 R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));                  R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));
         return R;          return R;
 }  }
Line 7454  def okuboetos(P,L)
Line 9816  def okuboetos(P,L)
                 Phi[J+1] = Phi[J]*(X-L[J]);                  Phi[J+1] = Phi[J]*(X-L[J]);
         for(ATT = AT[N], J = 0; J < N; J++)          for(ATT = AT[N], J = 0; J < N; J++)
                 ATT[J] = mycoef(P,J,DX);                  ATT[J] = mycoef(P,J,DX);
   
         for(K = 1; K <= N; K++){          for(K = 1; K <= N; K++){
                 for(J = N; J >= K; J--){                  for(J = N; J >= K; J--){
                         Aj = A[J-1];                          Aj = A[J-1];
Line 7475  def okuboetos(P,L)
Line 9836  def okuboetos(P,L)
                         ATj[J-K-1] = red(ATj[J-K-1]-DAT);                          ATj[J-K-1] = red(ATj[J-K-1]-DAT);
                 }                  }
         }          }
   
         ATT  = newmat(N,N);          ATT  = newmat(N,N);
         for(J = 0; J < N; J++){          for(J = 0; J < N; J++){
                 for(K = 0; K < N; K++){                  for(K = 0; K < N; K++){
Line 7656  def sgn(X)
Line 10016  def sgn(X)
   
 def calc(X,L)  def calc(X,L)
 {  {
         if(type(X)<4||type(X)==7){          if((T=type(X))==4||T==5) return map(os_md.calc,X,L);
                 if(type(L)==4||type(L)==7){          if(type(L)==4){
                         V=L[1];                  V=L[1];
                         if(type(X)!=7){                  if((L0=L[0])==">")      X=(X>V);
                                 if((L0=L[0])=="+") X+=V;                  else if(L0=="<")        X=(X<V);
                                 else if(L0=="-")   X-=V;                  else if(L0=="=")        X=(X==V);
                                 else if(L0=="*")   X*=V;                  else if(L0==">=")   X=(X>=V);
                                 else if(L0=="/")   X/=V;                  else if(L0=="<=")   X=(X<=V);
                                 else if(L0=="^")   X^=V;                  else if(L0=="!=")       X=(X!=V);
                         }                  else if(type(X)==6 || type(X)<4){
                         if((L0=L[0])==">")      X=(X>V);                          if((L0=L[0])=="+") X+=V;
                         else if(L0=="<")        X=(X<V);                          else if(L0=="-")   X-=V;
                         else if(L0=="=")        X=(X==V);                          else if(L0=="*")   X*=V;
                         else if(L0==">=")   X=(X>=V);                          else if(L0=="/")   X/=V;
                         else if(L0=="<=")   X=(X<=V);                          else if(L0=="^")   X^=V;
                         else if(L0=="!=")       X=(X!=V);  
                 }else if(type(L)==7&&type(X)<4){  
                         if(L=="neg") X=-X;  
                         else if(L=="abs") X=abs(X);  
                         else if(L=="neg") X=-X;  
                         else if(L=="sqr") X*=X;  
                         else if(L=="inv") X=1/X;  
                         else if(L=="sgn"){  
                                 if(X>0)X=1;  
                                 else if(X<0) X=-1;  
                         }  
                 }                  }
                   return X;
         }          }
           if(type(L)!=7||T>7||T==4||T==5) return X;
           if(L=="neg") X=-X;
           else if(L=="sqr") X*=X;
           else if(L=="inv"){
                   if(T==6) X=myinv(X);
                   else X=1/X;
           }else if(T==6) return X;
           if(L=="abs") X=abs(X);
           else if(L=="sgn"){
                   if(X>0) X=1;
                   else if(X<0) X=-1;
           }
         return X;          return X;
 }  }
   
Line 7938  def spgen(MO)
Line 10300  def spgen(MO)
         if(F!=1&&F!=-1) F=0;          if(F!=1&&F!=-1) F=0;
         if(type(LP)==4){          if(type(LP)==4){
                 L0=LP[0]; L1=LP[1];                  L0=LP[0]; L1=LP[1];
           }else if(type(LP)==1){
                   L0=L1=LP;
         }else{          }else{
                 L0=0; L1=MO+1;                  L0=0; L1=MO+1;
         }          }
         if(MO<=0){          if(M0<=0){
                 MO=-MO;                  MO=-MO;
                 if(iand(MO,1)==1) return [];                  if(iand(MO,1)==1) return [];
                 if(MO>1){                  MO=MO/2;
                         if(isMs()==0) return [];                  B=spbasic(-2*MO,0|str=1);
                         Cmd="okubo "+rtostr(-MO);                  if(L1<3) L1=MO+4;
                         MO/=2;  
                         if(L1>0) Cmd=Cmd+"+"+rtostr(L0)+"-"+rtostr(L1);  
                         else L1=MO+4;  
                         Cmd=Cmd+" B";  
                         Id=getbyshell(Cmd);  
                         if(Id<0) return [];  
                         B=[];  
                         while((S=get_line(Id)) !=0){  
                                 P0=str_chr(S,1,":")+1;  
                                 if(P0>1){  
                                         P1=str_chr(S,P,"\n");  
                                         if(P1<0) P1=str_len(S);  
                                         B=cons(sub_str(S,P0,P1-1),B);  
                                 }  
                         }  
                         close_file(Id);  
                 }else{  
                         MO/=2;  
                         if(L1<=1) L1=MO+4;  
 BB=[  
 ["11,11,11,11","111,111,111","1^4,1^4,22","1^6,222,33"],  
 ["11,11,11,11,11","1^4,1^4,211","211,22,22,22","1^6,2211,33",  
 "2211,222,222","22211,2^4,44","2^511,444,66","1^4,22,22,31",  
 "2^5,3331,55","1^5,1^5,32","1^8,332,44","111,111,21,21","1^5,221,221"],  
 ["11,11,11,11,11,11","1^4,1^4,1^4","1^4,22,22,22","111,111,111,21",  
 "1^6,21^4,33","21^4,222,222","221^4,2^4,44","2^41^4,444,66",  
 "1^5,1^5,311","1^8,3311,44","1^6,222,321","321,33,33,33",  
 "3321,333,333","33321,3^4,66","3^721,666,99","2^5,3322,55",  
 "1^6,1^6,42","222,33,33,42","1^a,442,55","1^6,33,33,51",  
 "222,222,33,51","1^9,333,54","2^7,554,77","1^5,2111,221",  
 "2^41,333,441","1^7,2221,43","211,211,22,22","2211,2211,222",  
 "22211,22211,44","1^4,211,22,31","2^411,3331,55","1^4,1^4,31,31",  
 "22,22,22,31,31","1^7,331,331","2221,2221,331","111,21,21,21,21"],  
 ["11,11,11,11,11,11,11","111,111,111,111","1^6,1^6,33",  
 "1^6,222,222","222,33,33,33","1^5,1^5,221",  
 "1^4,211,22,22","1^4,1^4,22,31","22,22,22,22,31",  
 "111,111,21,21,21","21^6,2^4,44","2221^6,444,66",  
 "1^6,222,3111","3111,33,33,33","33111,333,333",  
 "333111,3^4,66","3^5111,666,99","2^5,33211,55",  
 "1^8,3221,44","3222,333,333","33222,3^4,66",  
 "3^4222,666,99","1^6,1^6,411","222,33,33,411",  
 "1^a,4411,55","2^4,2^4,431","431,44,44,44",  
 "2^6,4431,66","4431,444,444","44431,4^4,88",  
 "4^531,888,cc","1^a,433,55","1^7,1^7,52",  
 "1^c,552,66","3^4,444,552","1^8,2^4,53",  
 "1^8,44,44,71","3^5,555,771","21^4,2211,222",  
 "221^4,22211,44","2221^4,3331,55","1^6,2211,321",  
 "2^411,3322,55","1^7,322,331","2211,33,33,42",  
 "3^42,4442,77","2211,222,33,51","3^51,5551,88",  
 "2^611,554,77","2221,2221,322","2^41,2^41,54",  
 "1^5,2111,2111","222111,333,441","1^7,22111,43",  
 "1^5,1^5,41,41","1^9,441,441","22111,2221,331",  
 "1^5,221,32,41","221,221,221,41","211,211,211,22",  
 "2211,2211,2211","1^4,211,211,31","211,22,22,31,31",  
 "1^4,22,31,31,31","1^5,32,32,32","221,221,32,32","21,21,21,21,21,21"],  
 ["11,11,11,11,11,11,11,11","1^4,1^4,22,22","1^8,2^4,44",  
 "1^6,2211,222","2211,33,33,33","111,111,111,21,21",  
 "1^5,1^5,2111","1^4,211,211,22","1^4,1^4,211,31",  
 "211,22,22,22,31","1^4,22,22,31,31","111,21,21,21,21,21",  
 "221^8,444,66","2^5,331^4,55","1^8,32111,44",  
 "32211,333,333","332211,3^4,66","3^42211,666,99",  
 "2^5,32221,55","1^7,1^7,511","1^c,5511,66",  
 "3^4,444,5511","541,55,55,55","5541,555,555",  
 "55541,5^4,aa","5^541,aaa,ff","1^8,1^8,62",  
 "1^a1^4,662,77","1^a,55,55,91","2^71,555,87",  
 "21^6,22211,44","221^6,3331,55","1^6,2211,3111",  
 "2^411,33211,55","1^7,3211,331","2211,33,33,411",  
 "3^42,44411,77","22211,2^4,431","2^511,4431,66",  
 "1^8,332,431","3^42,4433,77","1^8,22211,53",  
 "2221,2221,3211","221^5,333,441","1^7,21^5,43",  
 "1^b,443,65","21^5,2221,331","2^51,3332,65",  
 "21^4,21^4,222","221^4,221^4,44","1^6,21^4,321",  
 "2221^4,3322,55","21^4,33,33,42","21^4,222,33,51",  
 "2^51^4,554,77","2^4,3311,3311","3^411,4442,77",  
 "321,321,33,33","3321,3321,333","33321,33321,66",  
 "222,321,33,42","1^6,321,33,51","222,222,321,51",  
 "1^9,3321,54","1^7,322,322","3^422,5551,88",  
 "1^6,33,42,42","1^6,222,42,51","33,33,33,42,51",  
 "1^6,1^6,51,51","222,33,33,51,51","1^b,551,551",  
 "1^5,221,311,41","2^41,3321,441","22111,2221,322",  
 "2^51,443,551","222111,2^41,54","21^4,2211,2211",  
 "1^5,311,32,32","3331,3331,442","2211,2211,33,51",  
 "221,221,311,32","22111,22111,331","1^5,2111,32,41",  
 "2111,221,221,41","2111,221,32,32","211,211,211,211",  
 "211,211,22,31,31","1^4,211,31,31,31","22,22,31,31,31,31"],  
 ["11,11,11,11,11,11,11,11,11","1^5,1^5,1^5","2^5,2^5,55",  
 "111,111,111,111,21","2^41,333,333","1^4,1^4,211,22",  
 "211,22,22,22,22","1^8,22211,44","1^4,1^4,1^4,31",  
 "1^4,22,22,22,31","1^7,1^7,43","1^7,2221,331",  
 "2221,2221,2221","1^6,21^4,222","21^4,33,33,33",  
 "1^6,1^6,321","222,321,33,33","1^6,33,33,42",  
 "222,222,33,42","1^6,222,33,51","222,222,222,51",  
 "33,33,33,33,51","1^6,2211,2211","111,111,21,21,21,21",  
 "1^5,1^5,32,41","1^5,221,221,41","1^5,221,32,32",  
 "221,221,221,32","1^4,211,211,211","211,211,22,22,31",  
 "1^4,211,22,31,31","1^4,1^4,31,31,31","22,22,22,31,31,31",  
 "21,21,21,21,21,21,21","21^a,444,66","1^8,31^5,44",  
 "321^4,333,333","3321^4,3^4,66","3^421^4,666,99",  
 "2^5,322111,55","32^41,3^4,66","3332^41,666,99",  
 "1^8,1^8,611","2^4,44,44,611","1^d,6611,77",  
 "4^5,66611,aa","2^6,444,651","3^4,3^4,651",  
 "651,66,66,66","3^6,6651,99","6651,666,666",  
 "66651,6^4,cc","6^551,ccc,ii","2^8,655,88",  
 "1^9,1^9,72","1^g,772,88","1^c,444,75",  
 "2^6,3^4,75","1^c,66,66,b1","3^4,444,66,b1",  
 "3^7,777,ba","1^7,2221,4111","2^41,333,4311",  
 "1^9,2^41,63","21^8,3331,55","2^411,331^4,55",  
 "1^7,31^4,331","2^411,32221,55","22211,2^4,422",  
 "2^511,4422,66","1^8,332,422","2^5,3331,541",  
 "22211,44,44,62","2^411,2^5,64","2^711,664,88",  
 "1^a,3331,64","2221,2221,31^4","21^7,333,441",  
 "333,333,441,81","2^6111,555,87","21^6,221^4,44",  
 "221^6,3322,55","2^41^6,554,77","1^6,21^4,3111",  
 "3111,321,33,33","33111,3321,333","333111,33321,66",  
 "222,3111,33,42","1^6,3111,33,51","222,222,3111,51",  
 "1^9,33111,54","2221^4,33211,55","1^7,3211,322",  
 "3^4211,5551,88","2^4,3221,3311","333221,4442,77",  
 "3222,3321,333","33222,33321,66","1^9,3222,54",  
 "21^4,33,33,411","3^411,44411,77","222,321,33,411",  
 "1^6,33,411,42","1^6,222,411,51","33,33,33,411,51",  
 "221^4,2^4,431","2^41^4,4431,66","1^8,3311,431",  
 "3^411,4433,77","33321,444,552","1^8,221^4,53",  
 "3311,44,44,53","4^42,5553,99","2^4,3311,44,71",  
 "3^421,555,771","4^52,7771,bb","3^611,776,aa",  
 "2^41,33111,441","22111,2221,3211","2^41,3222,441",  
 "2^61,4441,76","3331,3331,4411","22211,22211,431",  
 "3331,3331,433","3^41,3^41,76","1^7,1^7,61,61",  
 "1^d,661,661","21^5,2221,322","221^5,2^41,54",  
 "2^51,33311,65","21^5,22111,331","3^41,4441,661",  
 "1^7,331,43,61","2221,2221,43,61","2221,331,331,61",  
 "21^4,21^4,2211","21^4,2211,33,51","22211,3311,3311",  
 "1^5,311,311,32","2211,321,33,42","2211,222,321,51",  
 "3322,3331,442","2211,222,42,42","2^411,442,442",  
 "1^6,2211,42,51","2211,33,33,51,51","221,221,311,311",  
 "1^5,2111,311,41","222111,3321,441","22111,22111,322",  
 "222111,222111,54","2111,221,311,32","2111,2111,221,41",  
 "1^5,221,41,41,41","2221,43,43,43","1^5,32,32,41,41",  
 "331,331,43,43","221,221,32,41,41","221,32,32,32,41",  
 "211,211,211,31,31","211,22,31,31,31,31","1^4,31,31,31,31,31"]];  
                         B=BB[MO];  
                 }  
                 if(St!=1){                  if(St!=1){
                         for(R=[]; B!=[]; B=cdr(B)){                          for(R=[]; B!=[]; B=cdr(B)){
                                 RT=F?s2sp(car(B)|std=F):s2sp(car(B));                                  RT= F?s2sp(car(B)|std=F): s2sp(car(B));
                                 if(length(RT)<L0 || length(RT)>L1) continue;                                  if(length(RT)<L0 || length(RT)>L1) continue;
                                 R=cons(RT,R);                                  R=cons(RT,R);
                         }                          }
Line 8192  BB=[
Line 10415  BB=[
         return LL;          return LL;
 }  }
   
   def spbasic(Idx,D)
   {
   /*
     D<=3|Idx|+6,  D<=|Idx|+2 (p>3),  p<=|Idx|/2+4
     Idx=2*D^2-(D^2-\sum m_{j,\nu}^2); \sum(D-m_{j,1})>=2*D;
     \sum (m_{j,1)-m_{j,\nu})*m_{j,\nu)
     0<=(2*D-\sum(D-m_{j,1})})*D=\sum_(m_{j,1}-m_{j,\mu})*m_{j,\nu} -|Idx|
     (-2,0)                                    13ŒÂ (9+3+?)
     (-4,0)                                    37ŒÂ (25+9+?)
     (-6,0) :  8.5sec  ?sec          0.05sec   69ŒÂ (46+17+?)
     (-8,0) : 97  sec  1sec          0.13sec  113ŒÂ (73+29+?)   <- (-2,0)
     (-10,0):          4sec          0.27sec  198ŒÂ (127+50+?)
   @(-12,0)          28sec   4.2sec 0.64sec  291ŒÂ (182+76+?)
     (-14,0)          27sec  10.2sec 1.31sec  415ŒÂ (249+115+?)
     (-16,0)                 34.0sec 2.47sec  647ŒÂ (395+172+?) <- (-4,0)
     (-18,0)                         4.42sec  883ŒÂ (521+243+?) <- (-2,0)
     (-20,0)                         8.17sec 1186ŒÂ (680+345+?)
   */
           Idx=-Idx;
           if((Str=getopt(str))!=1) Str=0;
           if(!isint(Idx)||!isint(Idx/2)||Idx<0||!isint(D)||D<0||D==1||D>3*Idx+6) return [];
           if(D==0){
                   for(R=[],D=3*Idx+6;D>=2;D--) R=append(spbasic(-Idx,D|str=Str),R);
                   return R;
           }
           if(!Idx){
                   R=0;
                   if(D==2) R="11,11,11,11";
                   if(D==3) R="111,111,111";
                   if(D==4) R="22,1111,1111";
                   if(D==6) R="33,222,111111";
                   if(!R) return [];
                   return [(Str==1)?R:s2sp(R)];
           }
           if(D>Idx+2){
                   L=3;
                   if(D==3*Idx+6){
                           R=[[D/2,D/2],[D/3,D/3,D/3],[D/6,D/6,D/6,D/6,D/6,D/6-1,1]];
                           return [(Str==1)?s2sp(R):R];
                   }
                   if(iand(D,1)&&(D-3)/2>Idx) return [];
           }else L=Idx/2+4;
           V=newvect(L);SV=newvect(L);
           for(S1=[],I=0;I<D;I++) S1=cons(1,S1);
           for(T=D-1;T>1;T--){
                   K=D%T;
                   if((T-K)*K<=Idx) break;
           }
           J=(T-K)*K;SJ=K^2+(D-K)*T;
           TV=K?[K]:[];
           for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
           for(I=0;I<L;I++){
                   SV[I]=2*D^2-(I+1)*(D^2-J)-Idx;
                   V[I]=TV;
           }
           if(SV[2]>0) return [];
           if(D>Idx+2 && V[0][0]+V[1][0]>=D && V[1][0]>1){
                   T=V[1][0]-1;K=D%T;TV=K?[K]:[];
                   for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                   V[1]=V[2]=TV;
           }
           for(R=[];;){
                   if(D>Idx+2){
                           if(3*V[0][0]<D) break;
                           if(V[0][0]+V[1][0]>=D && (T=D-V[0][0]-1)>0){
                                   K=D%T;TV=K?[K]:[];
                                   for(I=(D-K)/T;I>0;I--) TV=cons(T,TV);
                                   V[1]=V[2]=TV;
                           }
                           S2=V[0][0]+V[1][0]+V[2][0]-D;
                           if(V[0][0]+2*V[1][0]<D ||(S2<0&&V[1][0]==1) ){
                                   V[0]=V[1]=V[2]=nextpart(V[0]);
                                   T=V[0][0];
                                   T=D-2*T;
                                   if(T==0){
                                           V[1]=[D/2-1,1];
                                           V[2]=S1;
                                   }else if(T>0){
                                           J=D%T;
                                           K=J?[J]:[];
                                           for(J=(D-J)/T;J>0;J--) K=cons(T,K);
                                           V[2]=K;
                                   }
                                   continue;
                           }
                           if(S2<0||V[2][0]<=S2){
                                   V[1]=V[2]=nextpart(V[1]);
                                   continue;
                           }else if(S2>0){
                                   T=V[2][0]-S2;J=D%T;
                                   K=J?[J]:[];
                                   for(J=(D-J)/T;J>0;J--) K=cons(T,K);
                                   V[2]=K;
                           }
                   }
                   for(S=-2*D,IL=0;IL<L;IL++){
                           S+=D-car(V[IL]);
                           if(S>=0) break;
                   }
                   if((I=IL)==L){  /* reducible i.e. IL=L && S<0 */
                           for(LL=L-1;LL>=0;LL--){
                                   if((K=car(V[LL]))+S>0){
                                           K+=S;
                                           for(TV=[],TD=D;TD>=K;TD-=K) TV=cons(K,TV);
                                           if(TD>0) V[LL]=append(TV,[TD]);
                                           else V[LL]=TV;
                                           break;
                                   }else{
                                           S+=K-1;
                                           V[LL]=S1;
                                   }
                           }
                           if(LL<0) break;
                           continue;
                   }
                   for(S0=K=0;K<=IL;K++){
                           ST=car(V[K]);J=V[K][length(V[K])-1];S0+=(ST-J)*J;
                           if(S0>Idx) break;
                   }
                   if(S0>Idx && car(V[K])!=1){
                           ST=car(V[K]);
                           S0-=(ST-J)*J;
                           for(ST--;ST>0;ST--){
                                   J=D%ST;
                                   if(S0+(ST-J)*J <= Idx) break;
                           }
                           V[K]=J?[J]:[];
                           for(J=D-J;J>0;J-=ST) V[K]=cons(ST,V[K]);
                           for(J=K+1;J<L;J++) V[J]=V[K];
                           continue;
                   }
   
                   for(K=SS=0;K<L&&SS<=Idx;K++){
                           ST=car(V[K]);
                           for(S0=0,TV=cdr(V[K]);TV!=[];TV=cdr(TV)) S0+=(ST-car(TV))*car(TV);
                           SS+=S0;
                   }
                   if(SS>Idx && K<=IL && K!=L){
                           SS0=Idx-SS+S0;
                           for(TV=car(V[K]);TV>1;TV--){
                                   U=D%TV;
                                   if((D-U)*U<=SS0) break;
                           }
                           if(TV==car(V[K])){
                                   K=K-1;
                                   V[K]=nextpart(V[K]); /* to be improves */
                           }else{
                                   V[K]=U?[U]:[];  /* to be improved */
                                   for(J=D-U;J>0;J-=TV) V[K]=cons(TV,V[K]);
                           }
                           for(J=K+1;J<L;J++) V[J]=V[K];
                           continue;
                   }
   
                   for(Ix=2*D^2+Idx,J=0;J<L;J++){
                           IxF=Ix;
                           for(Ix-=D^2,TV=V[J];TV!=[];TV=cdr(TV)) Ix+=car(TV)^2;
                           if(Ix<=0) break;
                   }
                   if(Ix==0&&(J>=I||IL==2)){
                           for(TR=[],K=J;K>=0;K--) TR=cons(V[K],TR);
                           R=cons((Str==1)?s2sp(TR):TR,R);
                   }
                   if(J>=0 && J<L && Ix<=0){
                           I=V[J][0];K=D%I;S0=(D-K)*I+K^2;
                           if(I>1&& IxF-D^2+S0<0){
                                   for(V[J]=[],K=D-I;K>0;K--) V[J]=cons(1,V[J]);
                                   V[J]=cons(I,V[J]);
                                   V[J]=nextpart(V[J]);
                                   for(I=J+1;I<L;I++) V[I]=V[J];
                                   continue;
                           }
                   }
                   if(J>=0 && J<L && Ix<=0 && car(V[J])>(U=V[J][length(V[J])-1])+1){
                           TV=reverse(V[J]);
                           for(S0=0,K=[];TV!=[];TV=cdr(TV),S0++){
                                   if((I=car(TV))<U+2||(length(TV)>1&&S0<2)){
                                           while(I-->0) K=cons(1,K);
                                   }else K=cons(car(TV),K);
                           }
                           V[I=J]=K;
                   }else{
                           if(J>=L) J=L-1;
                           for(I=J;I>=0&&length(V[I])==D;I--);
                           if(I<0) break;
                   }
                   V[I]=nextpart(V[I]);                    /* to be improved */
                   for(J=I+1;J<L;J++) V[J]=V[I];
           }
           return R;
   }
   
 def spType2(L)  def spType2(L)
 {  {
         C=0;R=[];          C=0;R=[];
Line 8228  def chkspt(M)
Line 10643  def chkspt(M)
         Opt= getopt(opt);          Opt= getopt(opt);
         Mat= getopt(mat);          Mat= getopt(mat);
         if(type(M)==7) M=s2sp(M);          if(type(M)==7) M=s2sp(M);
         if(type(Opt) >= 0){          if(type(Opt) >= 0&&Opt!="idx"){
                 if(type(Opt) == 7)                  if(type(Opt) == 7)
                         Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);                          Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);
                 if(Opt < 0){                  if(Opt < 0){
Line 8237  def chkspt(M)
Line 10652  def chkspt(M)
                 }                  }
                 return fspt(M,Opt);                  return fspt(M,Opt);
         }          }
         MR = fspt(M,1);  
         P  = length(M);          P  = length(M);
         OD = -1;          OD = -1;
         XM = newvect(P);          XM = newvect(P);
Line 8260  def chkspt(M)
Line 10674  def chkspt(M)
                 if(OD < 0)                  if(OD < 0)
                         OD = SM;                          OD = SM;
                 else if(OD != SM){                  else if(OD != SM){
                         print("irregal partitions");                          if(getopt(dumb)!=1) print("irregal partitions");
                         return 0;                          return -1;
                 }                  }
                 XM[I] = JM;                  XM[I] = JM;
         }          }
Line 8278  def chkspt(M)
Line 10692  def chkspt(M)
                 SM += MV;                  SM += MV;
         }          }
         SM -= (P-2)*OD;          SM -= (P-2)*OD;
           if(Opt=="idx") return SSM;
         if(SM > SMM && SM != 2*OD){          if(SM > SMM && SM != 2*OD){
                 print("not realizable");                  if(getopt(dumb)!=1) print("not realizable");
                 return -1;                  return 0;
         }          }
         if(JM==1 && Mat!=1)          if(JM==1 && Mat!=1)
                 Fu -= OD - SSM/2;                  Fu -= OD - SSM/2;
         return [P, OD, SSM, Fu, SM, XM, MR];          return [P, OD, SSM, Fu, SM, XM, fspt(M,1)];
 }  }
   
 def cterm(P)  def cterm(P)
Line 8399  def redgrs(M)
Line 10814  def redgrs(M)
                                 }                                  }
                                 L = cons([VM,EV], L);                                  L = cons([VM,EV], L);
 /*  /*
                                 if(R[2] >= 2){ */ /* digid */                                  if(R[2] >= 2){ */ /* rigid */
 /*          P = dx^(R[1]);  /*          P = dx^(R[1]);
                                 } */                                  } */
                         }                          }
Line 8426  def mcgrs(G, R)
Line 10841  def mcgrs(G, R)
 {  {
         NP = length(G);          NP = length(G);
         Mat = (getopt(mat)==1)?0:1;          Mat = (getopt(mat)==1)?0:1;
           if(Mat==0 && type(SM=getopt(slm))==4){
                   SM0=SM[0];SM1=anal2sp(SM[1],["*",-1]);
                   if(findin(0,SM0)>=0){
                           for(SM=[],I=length(G)-1;I>0;I--)
                                   if(findin(I,SM0)<0) SM=cons(I,SM);
                           SM=[SM,SM1];
                           G=mcgrs(G,R|mat=1,slm=SM);
                           return [G[0],anal2sp(G[1],["*",-1])];
                   }
           }else SM0=0;
         for(R = reverse(R) ; R != []; R = cdr(R)){          for(R = reverse(R) ; R != []; R = cdr(R)){
                 GN = [];                  GN = [];
                 L = length(G)-1;                  L = length(G)-1;
                 RT = car(R);                  RT = car(R);
                 if(type(RT) == 4){                  if(type(RT) == 4){
                         RT = reverse(RT); S = 0;                          if(length(RT)==L+1&&RT[0]!=0){
                         for(G = reverse(G); G != []; G = cdr(G), L--){                                  R=cons(cdr(RT),cdr(R));
                                 AD = car(RT); RT = cdr(RT);                                  R=cons(RT[0],R);
                                 if(L > 0)                                  R=cons(0,R);
                                   continue;
                           }               /* addition */
                           RT = reverse(RT); S = ADS = 0;
                           for(G = reverse(G); G != []; G = cdr(G), L--, RT=cdr(RT)){
                                   AD = car(RT);
                                   if(L > 0){
                                         S += AD;                                          S += AD;
                                 else                                          if(SM && findin(L,SM0)>=0) ADS+=AD;
                                   }else
                                         AD = -S;                                          AD = -S;
                                 for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))                                  for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))
                                         GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);                                          GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);
                                 GN = cons(GTN, GN);                                  GN = cons(GTN, GN);
                         }                          }
                         G = GN;                          G = GN;
                           if(SM0){
                                   for(ST=reverse(SM1),SM1=[]; ST!=[]; ST=cdr(ST))
                                           SM1 = cons([car(ST)[0],car(ST)[1]+ADS], SM1);
                           }
                         continue;                          continue;
                 }                  }
                 VP = newvect(L+1); GV = ltov(G);                  if(RT==0) continue;
                   VP = newvect(L+1); GV = ltov(G);        /* middle convolution */
                 for(I = S = OD = 0; I <= L; I++){                  for(I = S = OD = 0; I <= L; I++){
                         RTT = (I==0)?(Mat-RT):0;                          RTT = (I==0)?(Mat-RT):0;
                         VP[I] = -1;                          VP[I] = -1;
                         for(J = M = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){                          for(J = M = K = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){
                                 if(I == 0)                                  if(I == 0)
                                         OD += car(GT)[0];                                          OD += car(GT)[0];
                                 if(car(GT)[1] == RTT && car(GT)[0] > M){                                  if(car(GT)[1] == RTT && car(GT)[0] > M){
                                         S += car(GT)[0]-M;                                          S += car(GT)[0]-M;
                                           M=car(GT)[0];
                                         VP[I] = J;                                          VP[I] = J;
                                 }                                  }
                         }                          }
                         S -= (L-1)*OD;                  }
                         for(GN = [] ; L >= 0; L--){                  S -= (L-1)*OD;
                                 GT = GV[L];                  for(GN = []; L >= 0; L--){
                                 RTT = (L==0)?(-RT):RT;                          GT = GV[L];
                                 FTN = (VP[L] >= 0 || S == 0)?[]:[-S,(L==0)?(Mat-RT):0];                          RTT = (L==0)?(-RT):RT;
                                 for(J = 0; GT != []; GT = cdr(GT), J++){                          GTN = (VP[L]>=0 || S == 0)?[]:[[-S,(L==0)?(Mat-RT):0]];
                                         if(J != VP[L]){                          for(J = 0; GT != []; GT = cdr(GT), J++){
                                                 GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);                                  if(J != VP[L]){
                                                 continue;                                          GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);
                                         }                                          continue;
                                         K = car(GT)[0] - S;  
                                         if(K < 0){  
                                                 print("Not realizable");  
                                                 return;  
                                         }  
                                         GTN = cons([K,(L==0)?(Mat-RT):0], GTN);  
                                 }                                  }
                                 GN = cons(reverse(GTN), GN);                                  K = car(GT)[0] - S;
                                   if(K < 0){
                                           print("Not realizable");
                                           return;
                                   }
                                   if(K>0) GTN = cons([K,(L==0)?(Mat-RT):0], GTN);
                         }                          }
                           GN = cons(reverse(GTN), GN);
                 }                  }
                   if(SM0&&RT!=0){
                           for(M0=M1=-OD,L=length(G)-1;L>=0;L--){
                                   if(findin(L,SM0)>=0){
                                           M0+=OD;
                                           if(VP[L]>=0) M0-=GV[L][VP[L]][0];
                                   }else{
                                            M1+=OD;
                                           if(VP[L]>=0) M1-=GV[L][VP[L]][0];
                                   }
                           }
                           SM2=[];
                           if((Mx1=anal2sp(SM1,["max",1,-RT])[0])<0){
                                   if(M1>0) SM2=cons([M1,0],SM2);
                           }else M1+=car(SM1[Mx1]);
                           if((Mx0=anal2sp(SM1,["max",1,0])[0])<0){
                                   if(M0>0) SM2=cons([M0,RT],SM2);
                           }else M0+=car(SM1[Mx0]);
                           for(J=0;SM1!=[];J++,SM1=cdr(SM1)){
                                   if(J==Mx0){
                                           if(M0>0) SM2=cons([M0,-RT],SM2);
                                   }else if(J==Mx1){
                                           if(M1>0) SM2=cons([M1,0],SM2);
                                   }else SM2=cons([car(SM1)[0],car(SM1)[1]+RT],SM2);
                           }
                           SM1=reverse(SM2);
                   }
                 G = cutgrs(GN);                  G = cutgrs(GN);
         }          }
         return G;          return SM0?[G,SM1]:G;
 }  }
   
   def spslm(M,TT)
   {
           R=getbygrs(M,1|mat=1);
           if(type(R)!=4||type(R[0])!=4||type(S=R[0][1])!=4){
                   errno(0);return0;
           }
           if(S[1]!=[[1,0]]){
                   print("Not rigid!");return0;
           }
           if((F=S[0][0][1])!=0){
                   for(V=vars(F);V!=[];V=cdr(V)){
                           if(mydeg(F,car(V))==1){
                                   T=lsol(F,car(V));
                                   break;
                           }
                   }
                   if(V==[]){
                           print("Violate Fuchs condition!");
                           return0;
                   }
           }
           for(P=[];R!=[];R=cdr(R))
                   P=cons(car(R)[0],P);
           if(F!=0){
                   S=mysubst(S,[car(V),T]);P=mysubst(P,[car(V),T]);
           }
           return mcgrs(S,P|mat=1,slm=[TT,[[1,0]]]);
   }
   
 /*  /*
   F=0 : unify    F=0 : unify
   F=["add",S] :    F=["add",S] :
Line 8493  def mcgrs(G, R)
Line 10986  def mcgrs(G, R)
   F=["put",F,V] :    F=["put",F,V] :
   F=["get1",F,V] :    F=["get1",F,V] :
   F=["put1",F,V] :    F=["put1",F,V] :
     F=["max"] :
     F=["max",F.V] :
   F=["put1"] :    F=["put1"] :
   F=["val",F];    F=["val",F];
   F=["swap"];    F=["swap"];
Line 8537  def anal2sp(R,F)
Line 11032  def anal2sp(R,F)
                 return G;                  return G;
         }          }
         if(F[0]=="add") return append(R,F[1]);          if(F[0]=="add") return append(R,F[1]);
           if(F[0]=="max"){
                   if(length(F)==3) C=1;
                   else C=0;
                   M=-10^10;K=[-1];
                   for(I=0;R!=[];R=cdr(R),I++){
                           if(C>0&&car(R)[F[1]]!=F[2]) continue;
                           if(M<car(R)[0]){
                                   M=car(R)[0];K=[I,car(R)];
                           }
                   }
                   return K;
           }
         R=reverse(R);          R=reverse(R);
         if(F[0]=="sub"){          if(F[0]=="sub"){
                 for(S=F[1];S!=[];S=cdr(S))                  for(S=F[1];S!=[];S=cdr(S))
Line 8549  def anal2sp(R,F)
Line 11056  def anal2sp(R,F)
                 return G;                  return G;
         }          }
         if(F[0]=="+"){          if(F[0]=="+"){
                 for(G=[];R!=[];R=cdr(R))                  L=length(F);
                         G=cons([car(R)[0],car(R)[1]+F[1],car(R)[2]+F[2]],G);                  for(G=[];R!=[];R=cdr(R)){
                           for(S=[],I=L-1;I>0;I--) S=cons(car(R)[I]+F[I],S);
                           G=cons(cons(car(R)[0],S),G);
                   }
                 return G;                  return G;
         }          }
         if(F[0]=="*"){          if(F[0]=="*"){
                 for(G=[];R!=[];R=cdr(R))                  L=length(F);
                         G=cons([car(R)[0],car(R)[1]*F[1]+car(R)[2]*F[2]],G);                  for(G=[];R!=[];R=cdr(R)){
                           for(S=0,I=1;I<L;I++) S+=car(R)[I]*F[I];
                           G=cons([car(R)[0],S],G);
                   }
                 return G;                  return G;
         }          }
         if(F[0]=="mult"){          if(F[0]=="mult"){
Line 8618  def anal2sp(R,F)
Line 11131  def anal2sp(R,F)
  P=["eigen",I]   decomposition of A_I   P=["eigen",I]   decomposition of A_I
  P=["get0",[m,n],[m',n']] for the sum of residues   P=["get0",[m,n],[m',n']] for the sum of residues
  P=["rest",[m,n]] restriction   P=["rest",[m,n]] restriction
  P=["rest0",[m,n]] restriction  
  P=["swap",[m,n]] for symmetry   P=["swap",[m,n]] for symmetry
  P=["perm",[...]] for symmetry   P=["perm",[...]] for symmetry
  P=["deg"]   P=["deg"]
Line 8688  def mc2grs(G,P)
Line 11200  def mc2grs(G,P)
         }          }
         if(type(P)<2) return G;          if(type(P)<2) return G;
         F=0;          F=0;
         if(type(P)==7||(type(P)==4&&type(P[0])<4)) P=[P];          if(type(P)==7||(type(P)==4&&
                   (type(P[0])<4||(type(P[0])==4&&length(P[0])==2&&type(P[0][0])<4&&type(P[1])<4))
             )) P=[P];
         if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;          if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
         Keep=(Dvi==2)?1:0;          Keep=(Dvi==2)?1:0;
         if(type(P)==4&&type(F=car(P))==7){          if(type(P)==4&&type(F=car(P))==7){
Line 8718  def mc2grs(G,P)
Line 11232  def mc2grs(G,P)
                         return R;                          return R;
                 }                  }
                 if(F=="show0"){                  if(F=="show0"){
                           if(type(Fig=getopt(fig))>0){
                                   PP=[[-1.24747,-5.86889],[1.24747,-5.86889],[3.52671,-4.8541],[5.19615,-3],
                                     [5.96713,-0.627171],[5.70634,1.8541],[4.45887,4.01478],[2.44042,5.48127],
                                     [0,6],[-2.44042,5.48127],[-4.45887,4.01478],[-5.70634,1.8541],
                                     [-5.96713,-0.627171],[-5.19615,-3],[-3.52671,-4.8541]];
                                   PL=[[1.8,-5.2],[5.7,-1.7],[3.2,5],[-3.6,4.7],[2.2,3],[-2.8,2.8],
                                     [-1.5,-1.4],[-3.2,-2.5],[0.76,-1.4],[-2,0.2]];
                                   PC=["black,dashed","green,dashed","red,dashed","blue,dashed",
                                           "black","cyan","green","blue","red","magenta"];
                                   N=["1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
                                   LL=[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[7,10,13],[4,11,14],[5,8,15],[1,12,15],
                                     [2,9,14],[3,6,13]];
                                   TB=str_tb("\\draw\n",TB);
                                   if(type(Fig)==4){
                                           if(type(car(Fig))==1){
                                                   PP=ptaffine(car(Fig)/12,PP);PL=ptaffine(car(Fig)/12,PL);
                                                   Fig=cdr(Fig);
                                           }
                                           if(Fig!=[]&&length(Fig)==10) PC=Fig;
                                   }
                                   for(R=mc2grs(G,"show0"|dviout=-1),I=0;R!="";I++){       /* ’¸“_ */
                                           J=str_chr(R,0,",");
                                           if(J>0){
                                                   S=str_cut(R,0,J-1);
                                                   R=str_cut(R,J+1,1000);
                                           }else{
                                                   S=R;R="";
                                           }
                                           T=(str_chr(S,0,"1")==0)?"":"[red]";
                                           str_tb(["node",T,"(",N[I],") at ",xypos(PP[I]),"{$",S,"$}\n"],TB);
                                   }
                                   for(S=PC,P=PL,I=0;I<4;I++){
                                           for(J=I+1;J<5;J++,S=cdr(S),P=cdr(P)){                   /* ü‚̔Ԇ */
                                                   SS=car(S);
                                                   if((K=str_chr(SS,0,","))>0) SS=sub_str(SS,0,K-1);
                                                   str_tb(["node[",SS,"] at ",xypos(car(P)),
                                                           "{$[",rtostr(I),rtostr(J),"]$}\n"],TB);
                                           }
                                   }
                                   str_tb(";\n",TB);
                                   for(I=0;I<10;I++){              /* ü */
                                           S=car(PC);P0=car(PC);L0=car(LL);PC=cdr(PC);LL=cdr(LL);
                                           C=[N[L0[0]-1],N[L0[1]-1],N[L0[2]-1]];
                                           str_tb(["\\draw[",S,"] (", C[0],")--(",C[1],") (",
                                                   C[0],")--(",C[2],") (",C[1],")--(",C[2],");\n"],TB);
                                   }
                                   R=str_tb(0,TB);
                                   if(TikZ==1&&Dvi!=-1) dviout(xyproc(R)|dviout=1,keep=Keep);
                                   return R;
                           }
                         for(S="",L=[];G!=[];G=cdr(G)){                          for(S="",L=[];G!=[];G=cdr(G)){
                                 for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);                                  for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                                 TL=msort(TL,[-1,0]);                                  TL=msort(TL,[-1,0]);
Line 8795  def mc2grs(G,P)
Line 11359  def mc2grs(G,P)
                                                 else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;                                                  else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                                         }                                          }
                                         L=ltotex(R|opt="GRS",pre=S);                                          L=ltotex(R|opt="GRS",pre=S);
                                           if(type(D=getopt(div))==1 || type(D)==4) L=divmattex(L,D);
                                         if(Dvi>0) dviout(L|eq=0,keep=Keep);                                          if(Dvi>0) dviout(L|eq=0,keep=Keep);
                                 }                                  }
                                 return L; /* get all spct */                                  return L; /* get all spct */
Line 8806  def mc2grs(G,P)
Line 11371  def mc2grs(G,P)
                                         if(I[0]>I[0]){S=I;I=J;J=S;};                                          if(I[0]>I[0]){S=I;I=J;J=S;};
                                         K=lsort(I,J,0);                                          K=lsort(I,J,0);
                                         if(length(K)==4){                                          if(length(K)==4){
                                                 S=sp2grs(G,["get0",[I,J]]);                                                  S=mc2grs(G,["get0",[I,J]]);
                                                 return anal2sp(S,[["*",1,1],0]);                                                  return anal2sp(S,[["*",1,1],0]);
                                         }                                          }
                                         I=lsort(K,lsort(I,J,2),1);                                          I=lsort(K,lsort(I,J,2),1);
                                         S=lsort([0,1,2,3,4],K,1);                                          S=lsort([0,1,2,3,4],K,1);
                                         D=sp2grs(G,"deg");                                          D=mc2grs(G,"deg");
                                         if(findin(4,S)<0) D=-D;                                          if(findin(4,S)<0) D=-D;
                                         J=sp2grs(G,["get0",[I,S]]);                                          J=mc2grs(G,["get0",[I,S]]);
                                         if(I[0]>S[0]) J=sp2grs(J,"swap");                                          if(I[0]>S[0]) J=sp2grs(J,"swap");
                                         return anal2sp(J,[["+",0,D],["*",-1,1]]);                                          return anal2sp(J,[["+",0,D],["*",-1,1]]);
                                 }                                  }
Line 8851  def mc2grs(G,P)
Line 11416  def mc2grs(G,P)
                                 return (F=="get")?cons(T,L):L;                                  return (F=="get")?cons(T,L):L;
                         }                          }
                 }                  }
                 if(F=="rest"||F=="eigen"||F=="rest0"){                  if(F=="rest"||F=="eigen"||F=="rest0"||F=="rest1"){
                         if(F!="eigen") G=mc2grs(G,"homog");                          if((Hg=getopt(homog))!=0) Hg=1;
                           if(F!="eigen"&&Hg) G=mc2grs(G,"homog");
                           if(length(P)==1){
                                   for(R=[],I=0;I<4;I++){
                                           for(J=I+1;J<5;J++){
                                                   S=mc2grs(G,[F,[I,J]]|homog=Hg);
                                                   if(S!=[]) R=cons(cons([I,J],S),R);
                                           }
                                   }
                                   R=reverse(R);
                                   if(Dvi){
                                           TB=str_tb(0,0);
                                           if(F=="rest0"||F=="rest1"){
                                                   for(T=R;;){
                                                           TT=car(T);
                                                           S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                                                           str_tb(["[",S,"]","&: "],TB);
                                                           for(TR=[],TT=cdr(TT);TT!=[];TT=cdr(TT))
                                                                   TR=cons(car(TT)[1],TR);
                                                           for(TR=qsort(TR);TR!=[];TR=cdr(TR))
                                                                   str_tb([s2sp(car(TR)|short=1,std=-1),"\\ \\ "],TB);
                                                           if((T=cdr(T))==[]) break;
                                                           str_tb("\\\\\n",TB);
                                                   }
                                           }else{
                                                   TB=str_tb(0,0);
                                                   for(T=R;;){
                                                           TT=car(T);
                                                           S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                                                           str_tb(["[",S,"]",":\\ "],TB);
                                                           for(TR=[],TT=cdr(TT);;){
                                                                   T0=car(TT);
                                                                   str_tb(["&",my_tex_form(car(T0)),"&&\\to\\ \n",
                                                                           ltotex(cdr(T0)|opt="GRS")],TB);
                                                                   if((TT=cdr(TT))==[]) break;
                                                                   str_tb("\\\\\n",TB);
                                                           }
                                                           if((T=cdr(T))==[]) break;
                                                           str_tb("\\allowdisplaybreaks\\\\\n",TB);
                                                   }
                                           }
                                           R=texbegin("align*",str_tb(0,TB));
                                           if(Dvi!=-1) dviout(R|keep=Keep);
                                   }
                                   return R;
                           }
                         I=P[1];                          I=P[1];
                         if(I[0]>I[1]) I=[I[1],I[0]];                          if(I[0]>I[1]) I=[I[1],I[0]];
                         L=lsort([0,1,2,3,4],I,1);                          L=lsort([0,1,2,3,4],I,1);
                           if(F=="rest"&&length(P)==3){
                                   J=P[2];if(J[0]>J[1]) J=[J[1],J[0]];
                                   L=lsort(L,J,1);
                                   if(length(L)!=1) return 0;
                                   return [mc2grs(G,["get0",I]),mc2grs(G,["get0",[I[0],J[0]],[I[1],J[1]]]),
                                           mc2grs(G,["get0",[I[0],J[1]],[I[1],J[0]]]),mc2grs(G,["get0",[I[0],I[1],L[0]]])];
                           }
                         L=[[L[0],L[1]],[L[0],L[2]],[L[1],L[2]]];                          L=[[L[0],L[1]],[L[0],L[2]],[L[1],L[2]]];
                           if(F!="eigen"){
                                   if(I==[0,4]) L=reverse(L);
                                   else{
                                           for(V=[],J=2;J>=0;J--){
                                                   if(L[J][0]==0) V=cons([L[J][1],J],V);
                                                   else{
                                                           for(K=4;K>=0;K--){
                                                                   if(findin(K,L[J])<0){
                                                                           V=cons([K,J],V);break;
                                                                   }
                                                           }
                                                   }
                                           }
                                           V=qsort(V);
                                           L=[L[V[0][1]],L[V[1][1]],L[V[2][1]]];
                                   }
                           }
                         for(LL=[],T=L;T!=[];T=cdr(T))                          for(LL=[],T=L;T!=[];T=cdr(T))
                                 LL=cons(mc2grs(G,["get0",[I,car(T)]]),LL);                                  LL=cons(mc2grs(G,["get0",[I,car(T)]]),LL);
                         LL=reverse(LL);                          LL=reverse(LL);
                         for(R=[],Q=mc2grs(G,["get0",I]);Q!=[];Q=cdr(Q)){  /* mycat(["I",I,"\nL",L,"\nLL",LL]);
                                 V=car(Q)[1];  mycat([I,mc2grs(G,["get0",I])]); */
                                 for(T=[],J=2;J>=0;J--)                          for(R=[],Q=mc2grs(G,["get0",I]);Q!=[];Q=cdr(Q)){ /* Q : simultaneous spct */
                                         T=cons(anal2sp(LL[J],["get1",(I[0]<L[J][0])?1:2,V]),T);  /* mycat(["Q",Q,car(Q)[1]]); */
                                   for(T=[],J=2;J>=0;J--){
                                           V=anal2sp(LL[J],["get1",(I[0]<L[J][0])?1:2,car(Q)[1]]); /* an eigenvalue */
   /* mycat(["a",V]); */
                                           if(F=="rest"){
                                                   V=anal2sp(V,["+",-car(Q)[1]]);
                                                   if(I[0]==0){
                                                           if(I[1]!=4){
                                                                   if(L[J][1]!=4) V=anal2sp(V,["+",-car(Q)[1]]);
                                                           }else if (L[J][0]!=2&&L[J][1]!=2) V=anal2sp(V,["+",-car(Q)[1]]);
                                                   }else if(L[J][0]!=0) V=anal2sp(V,["+",-car(Q)[1]]);
   #endif
                                           }
   /* mycat(["b",V]); */
                                           T=cons(V,T);
                                   }
                                 R=cons(cons(car(Q)[1],T),R);                                  R=cons(cons(car(Q)[1],T),R);
                         }                          }
                         if(F=="rest0"){                          if(F=="rest0"||F=="rest1"){
                                 for(L=[];R!=[];R=cdr(R))                                  for(L=[];R!=[];R=cdr(R)){
                                         L=cons([car(R)[0],s2sp(chkspt(cdr(car(R))|opt=6))],L);                                          TR=cdr(car(R));
                                           if(F=="rest1"&&chkspt(TR|opt="idx")==2) continue;
                                           L=cons([car(R)[0],s2sp(chkspt(TR|opt=6))],L);
                                   }
                                 R=reverse(L);                                  R=reverse(L);
                         }                          }
                         return R;                          return R;
                 }                  }
                 if(F=="deg"){                  if(F=="deg"){
Line 8883  def mc2grs(G,P)
Line 11535  def mc2grs(G,P)
                         }                          }
                         return S/L[0];                          return S/L[0];
                 }                  }
                 if(F=="spct"){                  if(F=="spct"||F=="spct1"){
                           K=(F=="spct")?5:6;
                         G=mc2grs(G,"get");                          G=mc2grs(G,"get");
                         M=newmat(5,5);                          M=newmat(5,K);
                         for(;G!=[];G=cdr(G)){                          for(;G!=[];G=cdr(G)){
                                 GT=car(G);I=GT[0][0];J=GT[0][1];                                  GT=car(G);I=GT[0][0];J=GT[0][1];
                                 for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){                                  for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
Line 8902  def mc2grs(G,P)
Line 11555  def mc2grs(G,P)
                                         for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;                                          for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                                 }                                  }
                                 M[I][I]=S;                                  M[I][I]=S;
                                   if(K==6){
                                           for(S=[],J=4;J>=0;J--)
                                                   if(I!=J) S=cons(M[I][J],S);
                                           R=chkspt(S|opt=2);
                                           M[I][5]=((L=length(R))>1)?s2sp(R[L-2]|short=1):"";
                                   }
                         }                          }
                         if(Dvi){                          if(Dvi){
                                 S=[];                                  S=[];
                                 for(I=4;I>=0;I--){                                  for(I=4;I>=0;I--){
                                         L=[M[I][I]];                                          L=(K==6)?[M[I][5]]:[];
                                           L=cons(M[I][I],L);
                                         for(J=4;J>=0;J--){                                          for(J=4;J>=0;J--){
                                                 if(I==J) L=cons("",L);                                                  if(I==J) L=cons("",L);
                                                 else L=cons(s2sp([M[I][J]]),L);                                                  else L=cons(s2sp([M[I][J]]),L);
                                         }                                          }
                                         S=cons(L,S);                                          S=cons(L,S);
                                 }                                  }
                                 S=cons([x0,x1,x2,x3,x4,"idx"],S);                                  T=(K==6)?["reduction"]:[];
                                 M=ltotex(S|opt="tab",hline=[0,1,z],vline=[0,1,z-1,z],left=["","$x_0$","$x_1$","$x_2$","$x_3$","$x_4$"]);                                  S=cons(append([x0,x1,x2,x3,x4,"idx"],T),S);
                                   M=ltotex(S|opt="tab",hline=[0,1,z],
                                           vline=(K==6)?[0,1,z-2,z-1,z]:[0,1,z-1,z],
                                           left=["","$x_0$","$x_1$","$x_2$","$x_3$","$x_4$"]);
                                 if(Dvi>0) dviout(M|keep=Keep);                                  if(Dvi>0) dviout(M|keep=Keep);
                         }                          }
                         return M;                          return M;
Line 9177  def mcmgrs(G,P)
Line 11840  def mcmgrs(G,P)
         Keep=(Dvi==2)?1:0;          Keep=(Dvi==2)?1:0;
         if(type(P)==4 && type(F=car(P))==7){          if(type(P)==4 && type(F=car(P))==7){
                 if(F=="mult"){                  if(F=="mult"){
                         for(P=cdr(P);P!=[];P=cdr(P)) G=os_md.mc2grs(G,car(P)|option_list=getopt());                          for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
                         return G;                          return G;
                 }                  }
                 if(F=="get"||F=="get0"){                  if(F=="get"||F=="get0"){
Line 9290  def mcmgrs(G,P)
Line 11953  def mcmgrs(G,P)
                                 L=cons(TL,L);                                  L=cons(TL,L);
                         }                          }
                         if(Dvi){                          if(Dvi){
                                 if(Dvi!=-1) dviout(S|eq=0);                                  if(Dvi!=-1) dviout(S|eq=0,keep=Keep);
                                 return S;                                  return S;
                         }                          }
                         return reverse(L);                          return reverse(L);
Line 9551  def mcmgrs(G,P)
Line 12214  def mcmgrs(G,P)
   
 def delopt(L,S)  def delopt(L,S)
 {  {
         if((Inv=getopt(inv))!=1) Inv=0;          if(getopt(get)==1){
                   for(;L!=[];L=cdr(L)) if(car(L)[0]==S) return car(L)[1];
                   return [];
           }
           if((Inv=getopt(inv))!=1&&Inv!=2) Inv=0;
           if(Inv&&type(S)==4&&type(car(S))==4){
                   for(R=[];L!=[];L=cdr(L)){
                           L0=car(L)[0];
                           for(F=0,TS=[];S!=[];S=cdr(S)){
                                   if(!F&&L0==car(S)[0]){
                                           R=cons(car(S),R);
                                           F++;
                                           continue;
                                   }
                                   TS=cons(car(S),TS);
                           }
                           if(!F) R=cons(car(L),R);
                           S=reverse(TS);
                   }
                   R=reverse(R);
                   return Inv==1?append(S,R):append(R,S);
           }
         for(R=[];L!=[];L=cdr(L)){          for(R=[];L!=[];L=cdr(L)){
                 if(type(car(L))!=4) F=0;                  if(type(car(L))!=4) F=0;
                 else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;                  else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;
Line 9701  def str_str(S,T)
Line 12385  def str_str(S,T)
                 }else if(type(S)==4){                  }else if(type(S)==4){
                         for(; J<=LE; S=cdr(S),J++){                          for(; J<=LE; S=cdr(S),J++){
                                 if(car(S) != LP){                                  if(car(S) != LP){
                                         if(SJIS && (V=S[J])>128){                                          if(SJIS && (V=car(S))>128){
                                                 if(V<160 || (V>223 && V<240)) J++;                                                  if((V<160 || (V>223 && V<240))&&S!=[]) {
                                                           J++;S=cdr(S);
                                                   }
                                         }                                          }
                                         continue;                                          continue;
                                 }                                  }
Line 10007  def evalma(S)
Line 12693  def evalma(S)
         return S;          return S;
 }  }
   
   def evalcoord(L)
   {
           if(type(L)==7) L=strtoascii(L);
           I=str_str(L,"(");
           if(I>=0) J=str_pair(L,I+1,"(",")");
           if(I<0 || J<I) return [0,[]];
           for(F=1,K=I+1;K<J;K++){
                   C=L[K];
                   if(C>32&&(C<40||C>58)){F=0;break;}
           }
           S0=str_cut(L,I+1,J-1);
           for(;J>=0;J--) L=cdr(L);
           while(L!=[]&&car(L)<33) L=cdr(L);
           if(F){
                   S="["+S0+"]";
                   return [eval_str(S),L];
           }else return [[S0],L];
   }
   
   def readTikZ(L)
   {
           if(type(L)!=4) L=strtoascii(L);
           R=[];
           CMD=["draw","fill","filldraw","shade","shadedraw","clip","pattern","node","begin"];
           while(L!=0&&L!=[]){
                   while(L!=[]&&car(L)<33) L=cdr(L);
                   if(L==[]) break;
                   if(car(L)==34){                                                 /* % */
                           while(L!=[]&&car(L)!=10) L=cdr(L);
                           continue;
                   }
                   if(car(L)!=92) {L=0;break;}                             /* \ */
                   for(DF=0;DF<9;DF++) if(str_str(L,CMD[DF]|top=1,end=1)==1) break;
                   if(DF<7){
                           S=T=0;
                           I=str_str(L,"(");J=str_str(L,"[");
                           if(J>0&&I>J){
                                   K=str_str(L,"]");
                                   S=str_cut(L,J+1,K-1);
                           }
                           F0=F=0;C=[];
                           while(L!=0&&L!=[]){
                                   V=evalcoord(L);
                                   L=V[1];
                                   if(L==[]) break;
                                   if(F0){
                                           if (!F) C=cons(0,C);
                                           else if(F0!=3) C=cons(1,C);
                                   }
                                   C=cons(V[0],C);
                                   F0=F;F=0;
                                   if(L[0]==34){                                           /* % */
                                           while(L!=[]&&car(L)!=10) L=cdr(L);
                                           continue;
                                   }
                                   if(!str_str(L,"..")){                   /* .. */
                                           L=cdr(L);L=cdr(L);
                                           F=1;
                                   }else if(!str_str(L,"--")){             /* -- */
                                           L=cdr(L);L=cdr(L);
                                           F=2;
                                   }
                                   while(L!=[]&&car(L)<33) L=cdr(L);
                                   if(L==[]){L=0; break;}
                                   if(!str_str(L,"cycle")){
                                           if(F==2) C=cons(1,C);
                                           C=cons(-1,C);
                                           F0=F=0;
                                           continue;
                                   }
                                   if(!str_str(L,"and")||!str_str(L,"control"))
                                           F=3;                            /* control, and */
                                   else if(car(L)==59){                    /* ; */
                                           L=cdr(L);
                                           break;
                                   }else if(isalpha(car(L))){
                                           T=[];
                                           while(car(L)!=40 && car(L)!=59){ /* ( ; */
                                                   T=cons(car(L),T);
                                                   if((L=cdr(L))==[]){L=0;break;}
                                           }
                                           T=asciitostr(reverse(T));
                                           if(car(L)==59){ /* ; */
                                                   L=cdr(L);
                                                   break;
                                           }
                                           F0=0;continue;
                                   }else if(F!=1&&F!=2){
                                           L=0;break;
                                   }
                           }
                           if(T){
                                   if(length(C)==1||length(C)==2) S=(!S)?["",T]:[S,T];
                                   else{
                                           L=0;break;
                                   }
                           }
                           S=(!S)? []:[["opt",S]];
                           if(DF) S=S=cons(["cmd",CMD[DF]],S);
                           if(T&&length(C)) R=cons((length(C)==1)?[3,S,C[0],DF]:[3,S,C[1],C[0]],R);
                           else  R=cons([1,S,reverse(C)],R);
                   }else{ /*  \node  */
                           U=0;
                           I=str_str(L,"(");J=str_str(L,"[");
                           if(J>0&&I>J){
                                   K=str_str(L,"]");
                                   U=str_cut(L,J+1,K-1);
                           }
                           V=evalcoord(L);
                           C=V[0];L=V[1];
                           J=str_str(L,"{");K=str_pair(L,J+1,"{","}");
                           S=str_cut(L,J+1,K-1);
                           if(U) S=[U,S];
                           R=cons([2,[],C,[S]],R);
                           for(;K>=0;K--) L=cdr(L);
                           K=str_str(L,";");
                           for(;K>=0;K--) L=cdr(L);
                   };
           }
           if(!L){
                   mycat("Can't understand!");
                   return -1;
           }
           return reverse(R);
   }
   
 def i2hex(N)  def i2hex(N)
 {  {
         Opt=getopt();          Opt=getopt();
Line 10205  def my_tex_form(S)
Line 13017  def my_tex_form(S)
                 }                  }
                 SS = cons(S[I], SS);                  SS = cons(S[I], SS);
         }          }
           SS=str_subst(SS,"\n\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
         SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);          SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
         Subst=getopt(subst);          Subst=getopt(subst);
         Sub0=["{asin}","{acos}","{atan}"];          Sub0=["{asin}","{acos}","{atan}"];
Line 10279  def my_tex_form(S)
Line 13092  def my_tex_form(S)
                                         S=cons(123,S);                                          S=cons(123,S);
                                         if(F==2) SS=cdr(SS);                                          if(F==2) SS=cdr(SS);
                                         else if(F==0) S=cons(car(SS),S);                                          else if(F==0) S=cons(car(SS),S);
                                 }else if(F==2&&P-Q==3){         /* (2)^x -> 2^x*/                                  }else if(F==2&&P-Q==3){         /* (2)^x -> 2^x */
                                         SS=cdr(SS);SS=cdr(SS);                                          SS=cdr(SS);SS=cdr(SS);
                                         S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);                                          S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);
                                         SS=cdr(SS);SS=cdr(SS);                                          SS=cdr(SS);SS=cdr(SS);
Line 10300  def my_tex_form(S)
Line 13113  def my_tex_form(S)
                 SS=reverse(S);                  SS=reverse(S);
                 Top=P;                  Top=P;
         }          }
         S=asciitostr(SS);      for(F=G=0,S=[];SS!=[];SS=cdr(SS)){  /* 22^x -> 2\cdot 2^x */
                   if(F==1&&G!=-1&&car(SS)==123 && length(SS)>1 && isnum(SS[1]))
                           S=append([116,111,100,99,92],S);
                   G=F;
                   if(car(SS)==125||car(SS)==95) F=-1;
                   else F=isnum(car(SS));
                   S=cons(car(SS),S);
           }
           S=asciitostr(reverse(S));
   /*      S=asciitostr(SS); */
         if((K=getopt(ket))==1) S=texket(S);          if((K=getopt(ket))==1) S=texket(S);
         else if(K==2) S=texket(S|all=1);          else if(K==2) S=texket(S|all=1);
         return S;          return S;
Line 10358  def divmattex(S,T)
Line 13180  def divmattex(S,T)
         if(length(L0)>0) L=cons(reverse(L0),L);          if(length(L0)>0) L=cons(reverse(L0),L);
         L=lv2m(reverse(L));     /* get matrix */          L=lv2m(reverse(L));     /* get matrix */
         if(T==0) return L;          if(T==0) return L;
           if(type(T)==1) T=[T];
         Size=size(L);S0=Size[0];          Size=size(L);S0=Size[0];
         if(type(T[0])!=4){          if(type(T[0])!=4){
                 S1=Size[1];                  S1=Size[1];
Line 10456  def str_subst(S, L0, L1)
Line 13279  def str_subst(S, L0, L1)
   
 def dviout0(L)  def dviout0(L)
 {  {
         Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas"];          Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas","TeXPages"];
         if(type(Opt=getopt(opt))==7){          if(type(Opt=getopt(opt))==7){
                 if((F=findin(Opt,Cmd)) < 0) return -1;                  if((F=findin(Opt,Cmd)) < 0) return -1;
                 if(L==-1){                  if(L==-1){
Line 10469  def dviout0(L)
Line 13292  def dviout0(L)
                                 if(F==4) V=XYPrec;                                  if(F==4) V=XYPrec;
                                 else if(F==5) V=XYcm;                                  else if(F==5) V=XYcm;
                                 else if(F==6) V=XYLim;                                  else if(F==6) V=XYLim;
                                 else V=Canvas;                                  else if(F==7) V=Canvas;
                                   else if(F==8) V=TeXPages;
                         }                          }
                         return V;                          return V;
                 }                  }
Line 10487  def dviout0(L)
Line 13311  def dviout0(L)
                         else if(F==4) XYPrec=L;                          else if(F==4) XYPrec=L;
                         else if(F==5) XYcm=L;                          else if(F==5) XYcm=L;
                         else if(F==6) XYLim=L;                          else if(F==6) XYLim=L;
                           else if(F==8) TeXPages=L;
                 }                  }
                 mycat0([Cmd[F],"=",L],1);                  mycat0([Cmd[F],"=",L],1);
                 return 1;                  return 1;
Line 10521  def dviout0(L)
Line 13346  def dviout0(L)
                 mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);                  mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);
                 mycat(["Canvas =", Canvas]);                  mycat(["Canvas =", Canvas]);
                 mycat(["TeXLim =", TeXLim]);                  mycat(["TeXLim =", TeXLim]);
                   mycat(["TeXPages =", TeXPages]);
                 mycat(["TeXEq  =", TeXEq]);                  mycat(["TeXEq  =", TeXEq]);
                 mycat(["AMSTeX =", AMSTeX]);                  mycat(["AMSTeX =", AMSTeX]);
                 mycat(["TikZ   =", TikZ]);                  mycat(["TikZ   =", TikZ]);
Line 10618  def tocsv(L)
Line 13444  def tocsv(L)
                 if(type(LT)==5) LT=vtol(LT);                  if(type(LT)==5) LT=vtol(LT);
                 if(type(LT)<4) LT=[LT];                  if(type(LT)<4) LT=[LT];
                 for(N=0; LT!=[]; LT=cdr(LT),N++){                  for(N=0; LT!=[]; LT=cdr(LT),N++){
                         if(N) str_tb(", ",Tb);                          if(N) str_tb(",",Tb);
                         if((T=car(LT))==Null) continue;                          if((T=car(LT))==Null) continue;
                         if(type(T)==7){                          if(type(T)==7){
                                 K=str_len(T);                                  K=str_len(T);
Line 10708  def readcsv(F)
Line 13534  def readcsv(F)
         return L;          return L;
 }  }
   
   def getline(ID)
   {
           if(isint(Maxlen=getopt(Max))>0) Maxlen=1024;
           if(type(CR=getopt(CR))!=4) CR=[13];
           if(type(LF=getopt(LF))!=4) LF=[10];
           S=[];
           for(I=0; I<1023; I++){
                   C=get_byte(ID);
                   if(C<0) return 0;
                   if(findin(C,CR)>=0) continue;
                   if(findin(C,LF)>=0) break;
                   S=cons(C,S);
           }
           return asciitostr(reverse(S));
   }
   
 def showbyshell(S)  def showbyshell(S)
 {  {
         Id = getbyshell(S);          Id = getbyshell(S);
Line 10734  def getbyshell(S)
Line 13576  def getbyshell(S)
         return open_file(F);          return open_file(F);
 }  }
   
   def isfctr(P)
   {
           if(type(P)>3) return 0;
           if(type(P)==3) return (!isfctr(nm(P))||!isfctr(dn(P)))?0:1;
           V=ptol(P,vars(P)|opt=0);
           for(;V!=[];V=cdr(V)){
                   if(type(car(V))>1||ntype(car(V))>0) return 0;
           }
           return 1;
   }
   
 def show(P)  def show(P)
 {  {
         T=type(P);          T=type(P);
         S=P;          S=P;
         Var=getopt(opt);          Var=getopt(opt);
           if((Raw=getopt(raw))!=1) Raw=0;
         if(Var=="verb"){          if(Var=="verb"){
                 dviout("{\\tt"+verb_tex_form(T)+"}\n\n");                  S="{\\tt"+verb_tex_form(T)+"}\n\n";
                 return;                  if(Raw) return S;
                   dviout(S);return;
         }          }
         if(type(Var)<0) Var=getopt(var);          if(type(Var)<0) Var=getopt(var);
         if(T==6){          if(T==6){
Line 10759  def show(P)
Line 13614  def show(P)
                 if(Var=="pfrac") X=var(P);                  if(Var=="pfrac") X=var(P);
                 else X=getopt(pfrac);                  else X=getopt(pfrac);
                 if(isvar(X)){                  if(isvar(X)){
                                 pfrac(P,X|dviout=1);                          if(Raw) return pfrac(P,X|TeX=1);
                                 return;                          pfrac(P,X|dviout=1);return;
                 }                  }
                 Opt=cons(["dviout",1],getopt());                  Opt=getopt();
                 if(type(Var)==2||type(Var)==4||type(Var)==7) fctrtos(P|option_list=Opt);                  if(type(Var)!=2&&type(Var)!=4&&type(Var)!=7){
                 else{  
                         if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);                          if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);
                         else Opt=cons(["br",1],Opt);                          else Opt=cons(["br",1],Opt);
                         fctrtos(P|option_list=Opt);  
                 }                  }
                 return;                  if(!isfctr(P)){
                           if(Raw) return my_tex_form(P);
                           else{
                                   dviout(P); return;
                           }
                   }
                   if(Raw) return fctrtos(P|option_list=cons(["TeX",3],Opt));
                   fctrtos(P|option_list=cons(["pages",2],cons(["dviout",1],Opt)));return;
         }else if(T==4){          }else if(T==4){
                   F=0;N=length(getopt());
                   if(Raw) N--;
                   if(N==1){
                           if(type(Var=getopt(var))>1){
                                   if(isvar(Var)) Var=[0,Var];
                                   else if(type(Var)==4&&Var[0]!=0) Var=cons(0,Var);
                                   else Var=0;
                           }else if(type(Var=getopt(eqs))!=4) Var=0;
                   }else if(N==0) Var=[];
                   else Var=0;
                   if(type(Var)==4){
                           for(F=0,L=P;L!=[];L=cdr(L)){ /* */
                                   if(type(car(L))==2) F+=nmono(car(L));
                                   else{
                                           F=0;break;
                                   }
                           }
                   }
                   if(F>50){
                           S=texbegin("align*",eqs2tex(P,Var));
                           if(Raw) return S;
                           dviout(S);return;
                   }
                 if(type(Var)==4 || type(Var)==7){                  if(type(Var)==4 || type(Var)==7){
                         S=ltotex(P|option_list=getopt());                          S=ltotex(P|option_list=getopt());
                         if(Var=="text"){                          if(Var=="text"){
                                 dviout(S);                                  if(Raw) return S;
                                 return;                                  dviout(S);return;
                         }                          }
                 }else{                  }else{
                         for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){                          for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
Line 10803  def show(P)
Line 13686  def show(P)
                         if(F==1)        S=ltotex(P|opt="spt");                          if(F==1)        S=ltotex(P|opt="spt");
                         else if(F==2){                          else if(F==2){
                                 M=mtranspose(lv2m(S));                                  M=mtranspose(lv2m(S));
                                 show(M|sp=1);   /* GRS */                                  if(Raw) return show(M|sp=1,raw=1);      /* GRS */
                                 return;                                  show(M|sp=1);return;
                         }else if(F==7)  S=ltotex(P|opt="spts");                          }else if(F==7)  S=ltotex(P|opt="spts");
                         else{                          else{
                                 for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){                                  for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
Line 10836  def show(P)
Line 13719  def show(P)
                         }                          }
                 }                  }
         }else if(T==7){          }else if(T==7){
                 if(Var=="raw" ||                  if(Var=="raw") S=P+"\n\n";
                         (Var !="eq" && str_chr(P,0,"\\")<0 && str_char(P,0,"^")<0 && str_char(P,0,"_")<0                  else if(Var != "eq" &&str_str(P,"\\begin"|end=128)<0){
                         && str_char(P,0,"&")<0)){                          if((TikZ&&str_str(P,"\\draw"|end=128)>=0)||(!TikZ&&str_str(P,"\\ar@"|end=128)>=0))
                                 dviout(P+"\n\n");                                  S=xyproc(P);
                                 return;                  }else if(Var !="eq"){
                           if(str_str(P,"\\begin{align")>=0 || str_str(P,"\\[")>=0
                                   || str_str(P,"\\begin{equation")>=0
                                   || (str_char(P,0,"^")<0 && str_char(P,0,"_")<0 && str_char(P,0,"&")<0))
                                           S=P+"\n\n";
                 }                  }
                   if(P!=S){
                           if(Raw) return S;
                           dviout(S); return;
                   }
         }          }
         dviout(S|eq=5);          if(Raw) return "\\begin{align}\\begin{split}\n &"+S+"\\end{split}\\end{align}";
           else dviout(S|eq=5);
 }  }
   
   
Line 11043  def rtotex(P)
Line 13935  def rtotex(P)
         return (str_len(S) == 1)?S:"{"+S+"}";          return (str_len(S) == 1)?S:"{"+S+"}";
 }  }
   
   def togreek(P,T)
   {
           R0=[a,b,c,d,e,i,k,l,m,n,o,p,r,s,t,u,x,z];
           R1=[alpha,beta,gamma,delta,epsilon,iota,kappa,lambda,
                   mu,nu,omega,pi,rho,sigma,theta,tau,xi,zeta];
           if(T==0||T==[]) T=[a,b,c];
           for(S=[],TR=T;TR!=[];TR=cdr(TR)){
                   if(type(TR[0])!=4){
                           if((I=findin(car(TR),R0))>=0) S=cons([car(TR),R1[I]],S);
                   }else if((I=findin(car(TR)[0],R0))>=0){
                           for(U=car(TR)[1];U!=[];U=cdr(U))
                                   S=cons([makev([R0[I],car(U)]),makev([R1[I],car(U)])],S);
                   }
           }
           if(getopt(raw)==1) return S;
           if(getopt(inv)==1) return mysubst(P,S|inv=1);
           else return mysubst(P,S);
   }
   
 def mtotex(M)  def mtotex(M)
 {  {
         /* extern TexLim;       */          /* extern TexLim;       */
Line 11080  def mtotex(M)
Line 13991  def mtotex(M)
         for(I=0; I<S[0]; I++){          for(I=0; I<S[0]; I++){
                 for(J=0; J<S[1]; J++){                  for(J=0; J<S[1]; J++){
                         if(type(P=M[I][J])<=3){                          if(type(P=M[I][J])<=3){
                                 if(P!=0 || Null == 0 || (Null==2 && I==J)){                                  if(P!=0 || Null == 0 || (Null==2 && I==J)){
                                         SS[I][J]=(type(Var)>1)?fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);                                          if(type(V=getopt(pfrac))==2)
                                         if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)                                                   SS[I][J]=pfrac(P,V|TeX=1);
                                                 SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);                                          else{
                                                   SS[I][J]=(type(Var)>1)?
                                                           fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);
                                                   if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)
                                                   SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);
                                           }
                                 }                                  }
                         }else if(type(P)==6){                          }else if(type(P)==6){
                                 ST= mtotex(P|small=1,len=1);                                  ST= mtotex(P|small=1,len=1);
Line 11273  def frac2n(N)
Line 14189  def frac2n(N)
 #endif  #endif
 }  }
   
   /* Option : opt */
   def ptconvex(L)
   {
           if(!(isint(Opt=getopt(opt)))) Opt=0;
           L0=car(L);X=L0[0];Y=L0[1];
           for(TL=cdr(L);TL!=[];TL=cdr(TL)){       /* find the most left pt L0 */
                   if(X<car(TL)[0]||(X==car(TL)[0]&&Y<car(TL)[1])) continue;
                   L0=car(TL);X=car(L0);
           }
           if(Opt==3) return L0;
   
           R=[];   /* find a polygone through all points */
           X0=L0[0];Y0=L0[1];
           for(TL=L;TL!=[];TL=cdr(TL)){
                   L0=car(TL);
                   X=L0[0]-X0;Y=L0[1]-Y0;S=X^2+Y^2;
                   L0=(!S)? append([-8,0],L0):append([(Y>0?Y^2:-Y^2)/S,S],L0);
                   R=cons(L0,R);
           }
           L=qsort(R);
           if(Opt==2) return L;
   
           for(R=[],TL=L;TL!=[];TL=cdr(TL)){
                   if(Opt==4){
                           L0=car(TL);
                           V=car(L0);
                           L0=append(cdr(cdr(L0)),[V]);
                   }else L0=cdr(cdr(car(TL)));
                   R=cons(L0,R);
           }
           L=reverse(R);
           if(Opt==1) return L;
           R=[cons(V0=-8,L0=car(L))];
           for(TL=cdr(L);TL!=[];TL=cdr(TL)){
                   V=darg(L0,L1=car(TL));
                   if(V<-4) continue;
                   while(V<V0){
                           R=cdr(R);
                           V0=car(car(R));
                           V=darg(cdr(car(R)),L1);
                   }
                   if(V==V0) R=cdr(R);
                   R=cons(cons(V0=V,L0=L1),R);
           }
           for(L=[],TL=R;TL!=[];TL=cdr(TL)) L=cons(cdr(car(TL)),L);
           return L;
   }
   
   def darg(P,Q)
   {
           if(type(car(P))==4){
                   if((V=darg(Q[0],Q[1]))<-1) return -8;
                   if((V-=darg(P[0],P[1]))>2){
                           if((V-=4)>4) return -4;
                   }else if(V<=-2) V+=4;
                   return V;
           }
           X=Q[0]-P[0];Y=Q[1]-P[1];
           if(!(S=X^2+Y^2)) return -8;
           V=Y^2/S;
           if(Y<0) V=-V;
           return X<=0?2-V:V;
   }
   
   def dwinding(P,Q)
   {
           V=V0=V1=darg(P,Q0=car(Q));
           Q=cons(Q0,reverse(Q));
           for(Q=cdr(Q);Q!=[];Q=cdr(Q)){
                   if((V2=darg(P,car(Q)))<-4) return 1/3;
                   V1=V2-V1;
                   if(V1==2||V1==-2) return 1/2;
                   if(V1<-2) V1+=4;
                   else if(V1>2) V1-=4;
                   V+=V1;
                   V1=V2;
           }
           return floor((V0-V+1/2)/4);
   }
   
 def xyproc(F)  def xyproc(F)
 {  {
         if(type(Opt=getopt(opt))!=7) Opt="";          if(type(Opt=getopt(opt))!=7) Opt="";
Line 11350  def xypos(P)
Line 14346  def xypos(P)
   
 def xyput(P)  def xyput(P)
 {  {
           if(type(T=car(P))==4||type(car(P)==5)){
                   P=cdr(P);P=cons(T[1],P);P=cons(T[0],P);
           }
         if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){          if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){
                 if(type(Sc)==1) Sc=[Sc,Sc];                  if(type(Sc)==1) Sc=[Sc,Sc];
                 Sx=Sc[0];Sy=Sc[1];                  Sx=Sc[0];Sy=Sc[1];
Line 11362  def xyput(P)
Line 14361  def xyput(P)
         return "\\"+xypos(P)+";\n";          return "\\"+xypos(P)+";\n";
 }  }
   
   def xylabel(P,S)
   {
           if(type(P[0])==4){
                   if(type(S)==4){
                           if(type(Put=getopt(put))!=7) Put="";
                           if(type(Opt=getopt(opt))!=7) Opt=0;
                           for(R="";P!=[];P=cdr(P),S=cdr(S)){
                                   T=car(S);
                                   if(Opt) T=[Opt,T];
                                   R+=xyput([car(P),Put,T]|option_list=getopt());
                           }
                           return R;
                   }
                   if(type(S)==7){
                           B=getopt(base);
                           if(!isint(B)) B=0;
                           for(SS=[],I=length(P)-1;I>=0;I--) SS=cons(S+rtostr(I+B),SS);
                           return xylabel(P,SS);
                   }
           }
           if(P[0]==0||type(P[0])==1){
                   if(type(S)==7) return xylabel([P],[S]|option_list=getopt());
           }
   }
   
 def xyline(P,Q)  def xyline(P,Q)
 {  {
         if(!TikZ)       return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";          if(!TikZ)       return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";
Line 11824  def rungeKutta(F,N,Lx,Y,IY)
Line 14848  def rungeKutta(F,N,Lx,Y,IY)
         if((Pr=getopt(prec))==1){          if((Pr=getopt(prec))==1){
                 One=eval(exp(0));                  One=eval(exp(0));
         }else{          }else{
                 One=1;Pr=0;                  One=deval(exp(0));Pr=0;
         }          }
         if((FL=getopt(last))!=1) FL=0;          if(!isint(FL=getopt(mul))||!FL) FL=1;
         if(length(Lx)>2){          if(length(Lx)>2){
                 V=car(Lx);Lx=cdr(Lx);                  V=car(Lx);Lx=cdr(Lx);
         }else V=x;          }else V=x;
         if(Pr==0) Lx=[deval(Lx[0]),deval(Lx[1])];          if(Pr==1) Lx=[eval(Lx[0]),eval(Lx[1])];
         else Lx=[eval(Lx[0]),eval(Lx[1])];          else Lx=[deval(Lx[0]),deval(Lx[1])];
         if(type(Y)==4){          if(type(Y)==4){
                 if((Sing=getopt(single))==1||type(F)!=4)                  if((Sing=getopt(single))==1||type(F)!=4)
                         F=append(cdr(Y),[F]);                          F=append(cdr(Y),[F]);
Line 11845  def rungeKutta(F,N,Lx,Y,IY)
Line 14869  def rungeKutta(F,N,Lx,Y,IY)
         }          }
         if(getopt(val)==1) V1=1;          if(getopt(val)==1) V1=1;
         else V1=0;          else V1=0;
         H=(Lx[1]-Lx[0])/N;H2=H/2;          if(FL>0) N*=FL;
           H=(Lx[1]-Lx[0])/N*One;H2=H/2;
         FV=findin(V,vars(F));          FV=findin(V,vars(F));
         K=newvect(4);          K=newvect(4);
         if(L==1){          if(L==1){
                 R=[[T=Lx[0],S=IY]];                  R=[[T=Lx[0],S=IY]];
                 if(!H) return R;                  if(!H) return R;
                 for(;;){                  for(C=0;C<N;C++){
                         for(I=0;I<4;I++){                          for(I=0;I<4;I++){
                                 if(I==0)      W=[[V,T],[Y,S]];                                  if(I==0)      W=[[V,T],[Y,S]];
                                 else if(I==3) W=[[V,T+H],[Y,S+H*K[2]]];                                  else if(I==3) W=[[V,T+H],[Y,S+H*K[2]]];
Line 11860  def rungeKutta(F,N,Lx,Y,IY)
Line 14885  def rungeKutta(F,N,Lx,Y,IY)
                                 K[I]=Pr?myfeval(F,W)*One:myfdeval(F,W);                                  K[I]=Pr?myfeval(F,W)*One:myfdeval(F,W);
                         }                          }
                         S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;                          S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                         if(!FL) R=cons([deval(T),S],R);                          if(FL>0&&!((C+1)%FL)) R=cons([deval(T),S],R);
                         if((T+H-Lx[1])*H>0) break;  
                 }                  }
         }else{          }else{
                 T=Lx[0];                  T=Lx[0];
                 R=[cons(T,V1?[car(IY)]:IY)];                  R=[cons(T,V1?[car(IY)]:IY)];
                 S=ltov(IY);                  S=ltov(IY);
                 if(!H) return R;                  if(!H) return R;
                 for(;;){                  for(C=0;C<N;C++){
                         for(I=0;I<4;I++){                          for(I=0;I<4;I++){
                                 if(I==0)      W=cons([V,T   ],lpair(Y,vtol(S)));                                  if(I==0)      W=cons([V,T   ],lpair(Y,vtol(S)));
                                 else if(I==3) W=cons([V,T+H ],lpair(Y,vtol(S+H*K[2])));                                  else if(I==3) W=cons([V,T+H ],lpair(Y,vtol(S+H*K[2])));
Line 11881  def rungeKutta(F,N,Lx,Y,IY)
Line 14905  def rungeKutta(F,N,Lx,Y,IY)
                         }                          }
                         S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;                          S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                         TS=vtol(S);                          TS=vtol(S);
                           if(FL<0||(C+1)%FL) continue;
                         if(V1) TS=[car(TS)];                          if(V1) TS=[car(TS)];
                         if(!FL) R=cons(cons(deval(T),TS),R);                          R=cons(cons(deval(T),TS),R);
                         if((T+H-Lx[1])*H>0) break;  
                 }                  }
         }          }
         return FL?(V1?S[0]:S):reverse(R);          L=(FL<0)?(V1?S[0]:S):reverse(R);
           return L;
 }  }
   
   def pwTaylor(F,N,Lx,Y,Ly,M)
   {
           /* Pr:bigfloat, V1:last, Sf: single, Tf: autonomous,  */
           if(!isint(FL=getopt(mul))||!FL) FL=1;
           if(getopt(val)==1) V1=1;
           else V1=0;
           if(length(Lx)>2){
                   V=car(Lx);Lx=cdr(Lx);
           }else V=t;
           if(!isvar(T=getopt(var))) V=t;
           if(isint(Pr=getopt(prec))&&Pr>0){
                   One=eval(exp(0));
                   if(Pr>9){
                           setprec(Pr);
                           ctrl("bigfloat",1);
                   }
                   Pr=1;
           }else{
                   One=deval(exp(0));Pr=0;
           }
           if(Pr==1) Lx=[eval(Lx[0]),eval(Lx[1])];
           else Lx=[deval(Lx[0]),deval(Lx[1])];
           Sf=(type(F)!=4)?1:0;
           if(type(Y)==4){
                   if(type(F)!=4)  F=append(cdr(Y),[F]);
           }else Y=[Y];
           if(type(Ly)!=4) Ly=[Ly];
           if(findin(V,vars(F))>=0){
                   if(type(F)!=4) F=[F];
                   Tf=1;F=cons(1,subst(F,V,z_z));Y=cons(z_z,Y);Ly=cons(car(Lx),Ly);
           }else Tf=0;                                                     /* Tf: autonomous */
           ErF=0;
           if(type(Er=getopt(err))==4){
                   if(length(Er)==2) ErF=Er[1];    /* ErF&1: Raw,  ErF&2: relative,  ErF&4: add Sol */
                   Er=car(Er);
           };
           if(!isint(Er)||Er<0) Er=0;      /* Šî€‰ð‚ð•Ô‚· */
           if(FL>0) N*=FL;
           S=vtol(pTaylor(F,Y,M|time=V));
           FM=pmaj(F|var=x);
           LS=length(S);
   
           if(type(Vw=getopt(view))==4){   /* Dislay on Canvas */
                   Glib_math_coordinate=1;
                   glib_window(car(Vw)[0], car(Vw)[2],car(Vw)[1],car(Vw)[3]);
                   if(length(car(Vw))==6) Vr=[car(Vw)[4],car(Vw)[5]];
                   else Vr=0;
                   if(length(Vw)>1){
                           if(type(Cl=Vw[1])==4) Cl=map(os_md.trcolor,Cl);
                           else Cl=trcolor(Cl);
                   }else Cl=0;
                   if(length(Vw)>2){
                           Mt=Vw[2];
                           if(LS==1){
                                   if(type(Mt)>1) Mt=0;
                           }else{
                                   if(type(Mt)!=6||((Ms=size(Mt)[0])!=2&&Ms!=3)) Mt=0;
                                   if(Ms!=3) Vr=0;
                           }
                           if(Tf&&type(Mt)==6) Mt=newbmat(2,2,[[1,0],[0,Mt]]);
                   }else Mt=0;
                   if(!Mt){
                           if(LS>1+Tf){
                                   if(Vr){
                                           Mt=newmat(3,LS);Mt[2+Tf][2+Tf]=1;
                                   }
                                   else Mt=newmat(2,LS);
                                   Mt[Tf][Tf]=Mt[Tf+1][Tf+1]=1;
                           }else Mt=1;
                           if(LS==1+Tf||Sf) glib_putpixel(Lx[0],Mt*Ly[Tf]|color=mcolor(Cl,0));
                           else{
                                   YT=Mt*ltov(Ly);
                                   glib_putpixel(YT[0],YT[1]|color=mcolor(Cl,0));
                           }
                   }
                   if(isint(W=getopt(wait))) sleep(W*100);
           }else Vw=0;
   
           T=Lx[0];
           RE=R=(Tf)?[Ly]:[cons(T,Ly)];
           H=(Lx[1]-Lx[0])/N*One;
   
           Ck=N+1;CB=10;Ckm=2;MM=2;C1=1;
           if(Ck<5) Ck=100;
           if(type(Inf=getopt(Inf))==4&&length(Inf)>1&&Inf[0]>4){  /* explosion */
                   Ck=Inf[0];Ckm=Inf[1];
                   if(length(Inf)>2) MM=Inf[2];
                   if(!isint(MM)||MM<1) MM=2;
                   if(length(Inf)>3) C1=Inf[3];
                   if(type(C1)!=1||C1<0) C1=1;
                   if(length(Inf)>4) CB=Inf[4];
           }else if(isint(Inf)&&Inf>0&&Inf<100){
                   MM=Inf+1;Ck=100;
           }else Inf=0;
           Ckm*=Ck;
   
           SS=subst(S,V,H);N0=N;
           if(Er>0){
                   HE=H/(Er+1);SSE=subst(S,V,HE);LyE=Ly;
           }
           for(C=CC=CF=0;C<N;C++,CC++){
                   if(CC>=Ck){                                     /* check explosion */
                           CC=0;
                           D0=dnorm(Ly|max=1);
                           if(Er&&CF){
                                   DE=dnorm(ladd(LyE,Ly,-1)|max=1);
                                   if(CB*DE>D0) break;
                           }
                           for(Dy=F,TY=Y,TL=Ly;TY!=[];TY=cdr(TY),TL=cdr(TL))
                                   Dy=subst(Dy,car(TY),One*car(TL));
                           D1=dnorm(Dy|max=1);D2=subst(FM,x,2*D0+C1);D3=D1+D2;
                           HH=2*(D0+C1)/Ckm;
                           if(HH<H*D3){
                                   HH/=D3;
                                   while(H>HH) H/=2;
                                   if(H*7/5<HH) H*=7/5;
                                   if(H*6/5<HH) H*=6/5;
                                   SS=subst(S,V,H);
                                   if(Er){
                                           CF++;
                                           HE=H/(Er+1);
                                           SSE=subst(S,V,HE);
                                   }
                                   if(MM>1) N*=MM;
                                   MM=0;
                           }
                           CC=0;
                   }
   
                   T+=H;
                   for(Dy=SS,TY=Y,TL=Ly;TY!=[];TY=cdr(TY),TL=cdr(TL))
                           Dy=subst(Dy,car(TY),One*car(TL));
                   Ly=Dy;
   
                   if(Er>0){               /* estimate error */
                           for(CE=0;CE<=Er;CE++){
                                   for(Dy=SSE,TY=Y,TL=LyE;TY!=[];TY=cdr(TY),TL=cdr(TL))
                                           Dy=subst(Dy,car(TY),One*car(TL));
                                   LyE=Dy;
                           }
                   }
                   if(FL<0||(C+1)%FL) continue;
                   if(Vw){
                           if(LS==1+Tf||Sf) CR=CC/N0;
                           else{
                                   YT=Mt*ltov(Ly);
                                   CR=(!Vr)?CC/N0:(YT[2]-Vr[0])/(Vr[1]-Vr[0]);
                           }
                           if(LS==1+Tf||Sf) glib_putpixel(deval(T),Mt*Ly[Tf]|color=mcolor(Cl,CR));
                           else glib_putpixel(YT[0],YT[1]|color=mcolor(Cl,CR));
                           continue;
                   }
                   TR=(V1)?[car(Ly)]:Ly;
                   if(!Tf) TR=cons((Inf)?eval(T):deval(T),TR);
                   R=cons(TR,R);
                   if(Er){
                           TRE=(V1)?[car(LyE)]:LyE;
                           if(!Tf) TRE=cons((Inf)?eval(T):deval(T),TRE);
                           RE=cons(TRE,RE);
                   }
           }
           if(Vw) return 1;
           L=(FL<0)?((V1)?car(Ly):Ly):reverse(R);
           if(Er){                                                                 /* Estimate error */
                   LE=(FL<0)?((V1)?car(LyE):LyE):reverse(RE);
                   if(FL>0){
                           for(S=L,T=LE,D=[];S!=[];S=cdr(S),T=cdr(T)) D=cons(os_md.ladd(car(S),car(T),-1),D);
                           F=map(os_md.dnorm,reverse(D));
                           if(iand(ErF,2)){                        /* relative error */
                                   G=llget(LE,-1,[0]);
                                   G=map(os_md.dnorm,G);
                                   for(R=[];G!=[];G=cdr(G),F=cdr(F)){
                                           if(car(G)) R=cons(car(F)/car(G),R);
                                           else R=cons(0,R);
                                   }
                                   F=reverse(R);
                           }
                           if(!iand(ErF,1)) F=map(os_md.nlog,F);
                           if(!iand(ErF,8)) F=map(deval,F);
                   }else if(V1){
                           D=ladd(L,LE,-1);F=dnorm(D);
                           if(iand(ErF,2)){
                                   G=dnorm(cdr(L));
                                   if(!G) D/=G;
                                   else D=1;
                           }
                           F=(!iand(ErF,1))?nlog(D):D;
                           if(!iand(ErF,8)) F=deval(F);
                   }else{
                           D=abs(L-LE);
                           if(iand(ErF,2)){
                                   G=abs(L);
                                   if(!G) D/=G;
                                   else D=1;
                           }
                           F=(!iand(ErF,1))?nlog(D):D;
                           if(!iand(ErF,8)) F=deval(F);
                   }
                   return iand(ErF,4)?[L,F,LE]:[L,F];
           }
           return L;
   }
   
 def xy2graph(F0,N,Lx,Ly,Lz,A,B)  def xy2graph(F0,N,Lx,Ly,Lz,A,B)
 {  {
         /* (x,y,z) -> (z sin B + x cos A cos B + y sin A cos B,          /* (x,y,z) -> (z sin B + x cos A cos B + y sin A cos B,
Line 12472  def mytan(Z)
Line 15700  def mytan(Z)
 def mylog(Z)  def mylog(Z)
 {  {
         if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);          if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);
         if((Im=imag(Z))==0) return dlog(Z);          if(imag(Z)==0&&Z>=0) return dlog(Z);
         return dlog(dabs(Z))+@i*myarg(Z);          return dlog(dabs(Z))+@i*myarg(Z);
 }  }
   
   def nlog(X)
   {
           return mylog(X)/dlog(10);
   }
   
   def dlog10(X)
   {
           if(X==0||imag(Z)!=0) return [];
           if(X<0) X=-X;
           Neg=1;
           if(X<1){X=1/X;Neg=-1;}
           C=10^(2000);
           for(V=0;X>10^(2000);X/=C, V+=2000);
           C=10^(200);
           for(;X>10^(200);X/=C, V+=200);
           V+=nlog(X);
           return Neg*V;
   }
   
 def mypow(Z,R)  def mypow(Z,R)
 {  {
         if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);          if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);
Line 12492  def mypow(Z,R)
Line 15739  def mypow(Z,R)
   
 def myarg(Z)  def myarg(Z)
 {  {
         if(type(Z=map(eval,Z))==4){          if(type(Z=map(eval,Z))==4||type(Z)==5){
                 if(length(Z)!=2) return todf(os_md.myarg,[Z]);                  if(length(Z)!=2) return todf(os_md.myarg,[Z]);
                 Re=Z[0];Im=Z[1];                  Re=Z[0];Im=Z[1];
         }else if(type(Z)>1){          }else if(type(Z)>1){
Line 12537  def arg(Z)
Line 15784  def arg(Z)
         if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);          if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);
     return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);      return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);
 }  }
   
   def issquare(X)
   {
           if(X==0) return 1;
           if(type(X)==1&&ntype(X)==0){
                   for(N=nm(X),I=0;I<2;N=dn(X),I++){
                           if(isqrt(N)^2!=N) return 0;
                   }
                   return 1;
           }
   }
   
 def sqrt(Z){  def sqrt(Z)
   {
         if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);          if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);
         R=(type(Z)==4)?Z[1]:Z;          R=(type(Z)==4)?Z[1]:Z;
         if(ntype(R)==0){          if(ntype(R)==0){
                 if(R==0) return 0;                  if(R==0) return 0;
                 if(R>0){                  if(R>0){
                         if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));                          if(issquare(R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));
                 }else{                  }else{
                         R=-R;                          R=-R;
                         if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;                          if(issquare(R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;
                 }                  }
     }      }
         return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);          return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);
Line 13242  def fcont(F,LX)
Line 16501  def fcont(F,LX)
         return reverse(L);          return reverse(L);
 }  }
   
   def xyplot(L,LX,LY)
   {
           Vw=getopt(view);
           if(type(Vw)!=1 && type(Vw)!=7 && Vw!=0) Vw=-1;
           if(!LX){
                   L0=llget(L,1,[0]|flat=1);
                   LX=[lmin(L0),LXm=lmax(L0)];
                   S=SX=LX[1]-LX[0];
                   if(S>0){
                           if(Vw) LX=[LX[0]-S/32,LX[1]+S/32];
                   }else LX=[LX[0]-1,LX[0]+1];
           }
           LX=map(deval,LX);
           if(!LY){
                   L0=llget(L,1,[1]|flat=1);
                   LY=[lmin(L0),LYm=lmax(L0)];
                   S=SY=LY[1]-LY[0];
                   if(S>0){
                           if(Vw) LY=[LY[0]-S/32,LY[1]+S/32];
                   }else LY=[LY[0]-1,LY[0]+1];
           }
           LY=map(deval,LY);
           if(getopt(raw)==1) mycat([LX,LY]);
           if(Vw!=-1){
                   if(Vw!=1){
                           if(type(Vw)==7) Vw=trcolor(Vw);
                           Opt=[["color",Vw]];
                   }else Opt=[];
                   Glib_math_coordinate=1;
                   glib_window(LX[0],LY[0],LX[1],LY[1]);
                   for(; L!=[];L=cdr(L))
                           glib_putpixel(car(L)[0],car(L)[1]|option_list=Opt);
                   if((AX=getopt(ax))==1||AX==2){
                           if(LY[0]<0&&LY[1]>0){
                                   glib_line(LX[0],0,LX[1],0);
                                   if(AX==2&&LXm>0){
                                           E=floor(dlog(LXm)/dlog(10));
                                           V=floor(LXm*10^(-E)+1/128)*10^E;
                                           glib_line(V,0,V,SY/64);
                                           glib_print(V,-SY/128,rtostr(V));
                                   }
                           }
                           if(LX[0]<0&&LX[1]>0){
                                   glib_line(0,LY[0],0,LY[1]);
                                           if(AX==2&&LYm>0){
                                                   E=floor(dlog(LYm)/dlog(10)+1/64);
                                                   V=floor(LYm*10^(-E)+1/128)*10^E;
                                                   glib_line(0,V,SX/64,V);
                                           glib_print(SX/96,V,rtostr(V));
                                   }
   
                           }
                   }
                   return [LX,LY];
           }
           Opt=getopt();Opt0=delopt(Opt,["dviout","proc"]);
           if(type(R=getopt(to))!=4) To=[12,8];
           R=[To[0]/(LX[1]-LX[0]),RY=To[1]/(LY[1]-LY[0])];
           R=[sint(R[0],4|str=0),sint(R[1],4|str=0)];
           S="% ";
           if(type(C=getopt(scale))!=1&&type(C)!=4){
                   Opt0=cons(["scale",R],Opt0);
                   S+="scale="+rtostr(R)+", ";
           }
           S+=rtostr(LX)+", "+rtostr(LY)+"\n";
           for(L0=[],TL=L;TL!=[];TL=cdr(TL)){
                   TTL=map(deval,car(TL));
                   if(TTL[0]<LX[0]||TTL[0]>LX[1]||TTL[1]<LY[0]||TTL[1]>LY[1]){
                           S+=xylines(reverse(L0)|option_list=Opt0);
                           L0=[];
                   }else{
                           L0=cons(TTL,L0);
                   }
           }
           if(length(L0)>1) S+=xylines(reverse(L0)|option_list=Opt0);
           AX=getopt(ax);Opt=delopt(Opt0,"opt");
           if(type(AX)==4) S+="% axis\n"+xygraph([0,0],0,LX,LX,LY|option_list=Opt);
           else if((LX[0]<=0&&LX[1]>=0)||(LY[0]<=0&&LY[1]>=0))
                   S+="% axis\n"+xygraph([0,0],0,LX,LX,LY|option_list=cons(["ax",[0,0]],Opt));
           if(getopt(dviout)!=1) return S;
           xyproc(S|dviout=1);
           return [LX,LY];
   }
   
   def xyaxis(A,X,Y)
   {
           if(isint(Vw=getopt(view))&&Vw!=0){
                   CL=getopt(opt);
                   if(type(CL)==7) CL=trcolor(CL);
                   if(type(CL)!=0) CL=0;
                   if(CL) Opt=[[color,CL]];
                   else Opt=[];
                   Glib_math_coordinate=1;
                   UX=(X[1]-X[0])/50;UY=(Y[1]-Y[0])/50;
                   glib_window(X[0],Y[0],X[1],Y[1]);
                   glib_line(A[0],Y[0],A[0],Y[1]|option_list=Opt);
                   glib_line(X[0],A[1],X[1],A[1]|otpion_list=Opt);
                   if(length(A)>2&&A[2]){
                           I0=-floor((A[0]-X[0])/A[2]);I1=floor((X[1]-A[0])/A[2]);
                           for(I=I0;I<=I1;I++){
                                   IX=A[0]+A[2]*I;
                                   if(iand(Vw,2)) glib_print(IX-UX,A[1]-UY/2,rtostr(IX));
                                   glib_line(IX,A[1],IX,A[1]+UY);
                           }
                   }
                   if(length(A)>3&&A[3]){
                           I0=-floor((A[1]-Y[0])/A[3]);I1=floor((Y[1]-A[1])/A[3]);
                           for(I=I0;I<=I1;I++){
                                   IY=A[1]+A[3]*I;
                                   if(iand(Vw,4)) glib_print(A[0]-UX*2,IY+UY,rtostr(IY));
                                   glib_line(A[0],IY,A[0]+UX,IY);
                           }
                   }
                   return;
           }
           Opt=getopt();
           Opt=cons(["ax",A],Opt);
           return xygraph([0,0],0,[0,1],X,Y|option_list=Opt);
   }
   
 def xygraph(F,N,LT,LX,LY)  def xygraph(F,N,LT,LX,LY)
 {  {
         if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;          if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;
Line 13554  def xygraph(F,N,LT,LX,LY)
Line 16933  def xygraph(F,N,LT,LX,LY)
                         if(length(Ax)>3){                          if(length(Ax)>3){
                                 D=Ax[3];                                  D=Ax[3];
                                 if(type(D)==1 && D>0){                                  if(type(D)==1 && D>0){
                                         I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[0])/D);                                          I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[1])/D);
                                         for(DD=[],I=I0; I<=I1; I++){                                          for(DD=[],I=I0; I<=I1; I++){
                                                 if(length(Ax)<5) DD=cons(I*D,DD);                                                  if(length(Ax)<5) DD=cons(I*D,DD);
                                                 else if(I!=0){                                                  else if(I!=0){
Line 13792  def polroots(L,V)
Line 17171  def polroots(L,V)
         return reverse(SS);          return reverse(SS);
 }  }
   
   def lsub(P)
   {
           if((T=type(P[0]))==4){
                   Q=reverse(P[1]);P=reverse(P[0]);
                   for(R=[];P!=[];P=cdr(P),Q=cdr(Q)) R=cons(car(Q)-car(P),R);
                   return R;
           }else if(T==5){
                   L=length(P[0]);Q=P[1];P=P[0];
                   R=newvect(L);
                   for(V=[],L--;L>=0;L--) R[L]=Q[L]-P[L];
                   return R;
           }
           return P;
   }
   
   def dext(P,Q)
   {
           P=lsub(P);Q=lsub(Q);
           return P[0]*Q[1]-P[1]*Q[0];
   }
   
   def ptinversion(P)
   {
           if(type(P)==4&&type(P[1])==4){
                   for(R=[];P!=[];P=cdr(P))
                           R=cons(ptinversion(car(P)|option_list=getopt()),R);
                   return reverse(R);
           }
           if(type(V=getopt(org))!=0) V=[0,0];
           if(P==[0,0]) return 0;
           if(type(P[0])==4){
                   R=P[1];P=P[0];
           }
           X=P[0]-V[0];Y=P[1]-V[1];N=X^2+Y^2;
           if(type(T=getopt(sc))==1||T==0){
                   S=(T<0)?(-T^2):T^2;
           }else S=-1;
           if(!R){
                   if(!N) return 0;
                   return [X/N+V[0],S*Y/N+V[1]];
           }
           N-=R^2;
           if(!N){
                   if(X+R!=0) X0=X+R;
                   else X0=X-R;
                   S=[];
                   S=cons(ptinversion([X0,Y]|option_list=getopt()),S);
                   if(Y+R!=0) Y0=Y+R;
                   else Y0=Y-R;
                   return cons(ptinversion([X,Y0]|option_list=getopt()),S);
           }
           return [[X/N+V[0],S*Y/N+V[1]],T^2*R/N];
   }
   
 def ptcommon(X,Y)  def ptcommon(X,Y)
 {  {
         if(length(X)!=2 || length(Y)!=2) return 0;          if(length(X)!=2 || length(Y)!=2) return 0;
Line 13817  def ptcommon(X,Y)
Line 17250  def ptcommon(X,Y)
                         }                          }
                         XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];                          XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];
                         Arg=(length(Y)<2)?0:Y[1];                          Arg=(length(Y)<2)?0:Y[1];
                         Arg=deval(Arg);                          Arg=feval(Arg);
                         if(Arg!=0){                          if(Arg!=0){
                                 S=dcos(Arg)*XX-dsin(Arg)*YY;                                  S=dcos(Arg)*XX-dsin(Arg)*YY;
                                 YY=dsin(Arg)*XX+dcos(Arg)*YY;                                  YY=dsin(Arg)*XX+dcos(Arg)*YY;
Line 13834  def ptcommon(X,Y)
Line 17267  def ptcommon(X,Y)
                         T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],                          T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],
                                 Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];                                  Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];
                         R=lsol(T,[x_,y_]);                          R=lsol(T,[x_,y_]);
                         if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){                          if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                                 if(!In || (R[0][1]>=0&&R[0][1]<=1&&R[1][1]>=0&&R[1][1]<=1) )                                          /* unique sol of parameters */
                                         return subst(S,x_,R[0][1],y_,R[1][1]);                                  if(In && (R[0][1]<0||R[0][1]>1||R[1][1]<0||R[1][1]>1) ) return 0;
                                   return subst(S,x_,R[0][1],y_,R[1][1]);
                         }                          }
                         if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;                          if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;  /* no solution */
                         if(!In) return 1;                          F=0;
                         I=(X[0][0]==X[1][0]&&Y[0][0]==Y[1][0]&&X[0][0]==Y[0][0])?1:0;                          if(X[0]==X[1]) F=1;
                         if(X[0][I]<=X[1][I]){                          else if(Y[0]==Y[1]) F=2;
                                 X0=X[0][I];X1=X[1][I];                          if(!In){
                         }else{                                  if(!F) return 1;
                                 X1=X[0][I];X0=X[1][I];                                  else if(F==1) return X[0];
                                   else if(F==2) return Y[0];
                         }                          }
                         return ((Y[0][I]<X0 && Y[1][I]<X0)||(Y[0][I]>X1&&Y[1][I]>X1))?0:1;                          X0=X[0];X1=X[1];
                           if(X0>X1){R=X0;X0=X1;X1=R;}
                           Y0=Y[0];Y1=Y[1];
                           if(Y0>Y1){R=Y0;Y0=Y1;Y1=R;}
                           if(X0<Y0) X0=Y0;
                           if(Y0>Y1) X1=Y1;
                           if(X0>X1) return 0;
                           if(X0<X1) return [X0,X1];
                           return X0;
                 }else if(Y[1]==0){ /* orth */                  }else if(Y[1]==0){ /* orth */
                         T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],                          T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],
                                 Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];                                  Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];
Line 13903  def ptcommon(X,Y)
Line 17346  def ptcommon(X,Y)
         return 0;          return 0;
 }  }
   
   
   def ptcontain(P,L)
   {
           if(type(car(P))==4){
                   if((C=getopt(common))!=1) C=0;
                   if((F0=ptcontain(P[0])&&!C)) return F0;
                   if((F1=ptcontain(P[1])&&!C)) return F1;
                   if(F0&&F1) return P;    /* include */
                   L=cons(L[2],L);         /* outside part exists */
                   for(I=1,R=[];I<4;I++,L=cdr(L)){
                           if(!(F[I]=ptcotain(P,[L[0],L[1]]))){
                                   if(C) continue;
                                   return -1;
                           }
                           if(type(F[I])==4&&length(F[I])==2)      /* infinite points */
                                   return F[I];
                           else R=cons(F[I],R);
                   }
                   if(R==[]) return 0;             /* no intersection */
                   if(F1==1) return [P[0],car(R)];
                   if(F2==1) return [P[1],car(R)];
                   if(length(R)>1 && R[0]==R[1]) R=cdr(R);
                   return R;
           }
           if(dext([L[0],L[1]],[L[0],L[2]])<0) L=[L[0],L[2],L[1]];
           L=cons(L[2],L);
           for(I=F=1;I<4;I++,L=cdr(L)){
                   if((V=dext([L[0],L[1]],[L[0],P])) < 0) return 0;
                   if(!V) F++;
           }
           return F;
   }
   
 def tobezier(L)  def tobezier(L)
 {  {
         if((Div=getopt(div))==1||Div==2){          if((Div=getopt(div))==1||Div==2){
Line 14178  def areabezier(V)
Line 17654  def areabezier(V)
                         else R=cmpf([V[0],V[2]]);                          else R=cmpf([V[0],V[2]]);
                         V=[R,V[1],[0,1]];                          V=[R,V[1],[0,1]];
                 }                  }
                 if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){                  if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){
                           if(Int==3||Int==4){
                                   R=newvect(V1);
                                   Opt=delopt(getopt(),[["int",7-2*Int]]|inv=1);
                                   for(I=0;I<V1;I++) R[I]=areabezier([V[0],2^I,V[2]]|option_list=Opt);
                                   for(I=1;I<V1;I++){
                                           P=4^I;
                                           for(J=V1-1;J>=I;J--) R[J]=(P*R[J]-R[J-1])/(P-1);
                                   }
                                   return R[V1-1];
                           }
                         if(Int==2&&iand(V1,1)) V1++;                          if(Int==2&&iand(V1,1)) V1++;
                         if(!V1) V1=32;                          if(!V1) V1=32;
                         Opt=cons(["raw",1],getopt());                          Opt=cons(["raw",1],getopt());
                         W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);                          VV=eval(V[2][1]-V[2][0]);
                         SS=W[0][1];                          if(Int==-1)
                                   V=[V[0],V[1]-1,[V[2][0]+VV/V[1]/2,V[2][1]-VV/V[1]/2]];
                           W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                           SS=W[0][1];
                         for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){                          for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){
                                 if(iand(I,1)) S1+=car(L)[1];                                  if(iand(I,1)) S1+=car(L)[1];
                                 else S0+=car(L)[1];                                  else S0+=car(L)[1];
                                   if(I==3&&(getopt(Acc)==1||(isint(Prec=getopt(prec))&&Prec>10))){
                                           S0=tobig(S0);S1=tobig(S1);
                                   }
                                 if (I==V1) SS+=car(L)[1];                                  if (I==V1) SS+=car(L)[1];
                         }                          }
                         VV=deval(V[2][1]-V[2][0]);                          if(getopt(Acc)==1) VV=tobig(VV);
                         if(Int==2)                          if(Int==2)
                                 return (2*S0+4*S1-SS)*VV/(3*V1);                                  return (2*S0+4*S1-SS)*VV/(3*V1);
                         else                          else if(Int==-1){
                                   return V1==1? S0:(S0+S1)/V1;
                           }else
                                 return (2*S0+2*S1-SS)*VV/(2*V1);                                  return (2*S0+2*S1-SS)*VV/(2*V1);
                 }                  }
                 Opt=cons(["opt",0],getopt());                  Opt=cons(["opt",0],getopt());
Line 14239  def ptbezier(V,L)
Line 17733  def ptbezier(V,L)
         return [subst(B,t,L[1]),subst(BB,t,L[1])];          return [subst(B,t,L[1]),subst(BB,t,L[1])];
 }  }
   
   /*
   def isroot(P,Q,I)
   {
           if(subst(P,X,X0=I[0])*subst(P,X,I[1])<=0) return 1;
           XM=(I[1]+I[0])/2;W=XM-X0;
           if(W<0) W=-W;
           X=var(P);
           if(!Q) Q=diff(P,X);
           Q=subst(Q,X,X+I2);D=deg(Q,X);
           for(M=0,P=1,I=deg(Q,X);I<=D;I++){
                   V=coef(Q,I,X);
                   M+=(V<0?-V:V)*P;
                   P*=W;
           }
           V=subst(P,X,X0);
           if(V<0) V=-V;
           return (V-M<=0) 2:0;
   }
   */
   
   def sgnstrum(L,V)
   {
           X=var(car(L));
           if(X==0) X=var(L[1]);
           for(F=N=0;L!=[];L=cdr(L)){
                   P=car(L);
                   if(type(V)==7){
                           C=coef(P,D=deg(P,X),X);
                           if(V=="-"&&iand(D,1)) C=-C;
                   }else C=subst(P,X,V);
                   if(!C) continue;
                   if(C*F<0) N++;
                   F=C;
           }
           return N;
   }
   
   def polstrum(P)
   {
           X=vars(P0=P);
           if(!length(X)) return [];
           X=car(X);
           if(isfctr(P)){
                   D=gcd(P,Q=diff(P,X));
                   P=sdiv(P,D);
                   if(getopt(mul)==1&&type(getopt(num))<0)
                           return append(polstrum(D|mul=1),[P]);
           }
           D=deg(P,X);
           P=P/coef(P,deg(P,X),X);
           Q=diff(P,X)/D;
           for(L=[Q,P];D>0;){
                   R=urem(P,Q);
                   if((D=deg(R,X))<0) break;
                   C=coef(R,D,X);
                   if(C>0) C=-C;
                   R/=C;
                   L=cons(R,L);
                   P=Q;Q=R;
           }
           if(type(N=getopt(num))>0){
                   if(getopt(mul)!=1){
                           if(type(N)==1) N=["-","+"];
                           return sgnstrum(L,N[0])-sgnstrum(L,N[1]);
                   }
                   if(!isfctr(P0)) return -1;
                   R=polstrum(P0|mul=1);
                   for(C=0;R!=[];R=cdr(R)) C+=polstrum(car(R)|num=N);
                   return C;
           }
           return reverse(L);
   }
   
   def iceil(X)
   {
           S=(X>0)?1:-1;
           X*=S;
           if(X>1) X=ceil(X);
           else if(X>1/2) X=1;
           else if(X) X=1/floor(1/X);
           return S*X;
   }
   
   def polradiusroot(P)
   {
           X=var(P);D=deg(P,X);
           if(D<1) return -1;
           C=coef(P,D,X);
           P/=-C;
           Int=getopt(int);
           if(getopt(comp)==1){
                   for(ND=0,TD=0;TD<D;TD++) if(coef(P,TD,X)!=0) ND++;
                   for(V=0,TD=0;TD<D;TD++){
                           TV=eval((abs(coef(P,TD,X))*ND)^(1/(D-TD)));
                           if(V<TV) V=TV;
                   }
                   return (Int==1)? iceil(X):X;
           }
           for(N0=N1=0,TD=0;TD<D;TD++){
                   if(!(C=coef(P,TD,X))) continue;
                   if(C>0){
                           N2++;
                           if(!iand(D-TD,1)) N1++;
                   }else if(iand(D-TD,1)) N1++;
           }
           for(V1=V2=0,TD=0;TD<D;TD++){
                   if(!(C=C1=coef(P,TD,X))) continue;
                   if(C>0){
                           TV=eval((C*N2)^(1/(D-TD)));
                           if(V2<TV) V2=TV;
                   }
                   if(iand(D-TD,1)) C=-C;
                   if(C>0){
                           TV=eval((C*N1)^(1/(D-TD)));
                           if(V1<TV) V1=TV;
                   }
           }
           return Int?[-iceil(V1),iceil(V2)]:[-V1,V2];
   }
   
   /* step, num, strum */
   def polrealroots(P)
   {
           if(type(MC=getopt(step))==4){
                   MC1=MC[1];MC=car(MC);
           }else if(isint(MC)&&MC>1&&MC<10001) MC1=MC;
           else MC1=MC=32;
           if(type(I=getopt(in))!=4){
                   I=polradiusroot(P);
                   W=(I[1]-I[0])/1024;
                   I=[I[0]-W,I[1]+W];
           }
           if(type(L=type(getopt(strum)))!=4) L=polstrum(P);
           N0=sgnstrum(L,I[0]);N1=sgnstrum(L,I[1]);
           P=car(L);X=var(P);
           if(N0<=N1) return []; /* [L,I,N0,N1]; */
           LT=[[0,I[0],I[1],N0,N1]];R=[];
           Z=eval(exp(0));
           while(LT!=[]){
                   T=car(LT);LT=cdr(LT);
                   C=T[0];X0=T[1];X1=T[2];N0=T[3];N1=T[4];
                   if(N0<=N1)continue;
                   if(N0==N1+1){
                           V0=subst(P,X,X0);
                           V1=subst(P,X,X1);
                           while(C++<MC1){
                                   V2=subst(P,X,X2=(X0+X1)/2*Z);
                                   if((V0>0&&V2>0)||(V0<0&&V2<0)) X0=X2;
                                   else X1=X2;
                           }
                           R=cons([X0,X1,1],R);
                           continue;
                   }
                   while(++C<MC){
                           N2=sgnstrum(L,X2=(X0+X1)/2*Z);
                           if(N0>N2){
                                   if(N2>N1) LT=cons([C,X2,X1,N2,N1],LT);
                                   X1=X2;
                                   N1=N2;
                                   if(N0==N1+1){
                                           LT=cons([C,X0,X1,N0,N1],LT);
                                           C=MC+1;
                                   }
                           }else{
                                   X0=X2;
                                   N0=N2;
                           }
                   }
                   if(C!=MC+2) R=cons([X0,X1,N0-N1],R);
           }
           if(isint(Nt=getopt(nt)) && Nt>0){
                   if(Nt>256) Nt=256;
                   Q=diff(P,X);
                   for(S=[],TR=R;TR!=[];TR=cdr(TR)){
                           if(car(TR)[2]>1) continue;
                           V0=subst(P,X,car(TR)[0]);
                           V1=subst(P,X,car(TR)[1]);
                           if(abs(V0)<abs(V1))
                                   X0=car(TR)[0];
                           else{
                                   X0=car(TR)[1];V0=V1;
                           }
                           for(Tn=Nt;Tn>0;Tn--){
                                   X1=X0-V0/subst(Q,X,X0);
                                   V1=subst(P,X,X1);
                                   if(abs(V1)>=abs(V0)) break;
                                   X0=X1;V0=V1;
                           }
                           S=cons(X0,S);
                   }
                   for(TR=R;TR!=[];TR=cdr(TR))
                           if(car(TR)[2]>1) S=cons(car(TR),S);
                   return reverse(S);
           }
           return reverse(cons(P,R));
   }
   
   /*
   def ptcombezier0(P,Q)
   {
           PB=subst(tobezier(P|div=1),t,s);
           QB=tobezier(Q|Div=1);
           Z=res(PB[0]-QB[0],PB[1]-QB[1],s);
           D=pmaj(diff(Z,t)|val=t);
   }
   */
   
 def ptcombezier(P,Q,T)  def ptcombezier(P,Q,T)
 {  {
         if(type(T)<2){          if(type(T)<2){
Line 14406  def draw_bezier(ID,IDX,B)
Line 18107  def draw_bezier(ID,IDX,B)
         return 0;          return 0;
 }  }
   
   
   /*
   def redbezier(L)
   {
           V=newvect(4);ST=0;
           for(R=[],I=0,T=L;T=[];T=cdr(T){
                   if(type(car(T))<4){
                           F=0;
                           if(I==3)
                           if(car(T)==0){
                           }else if(car(T)==1){
                           }else if(car(T)==-1){
                                   if(I<3) V[I++]=ST;
                           }
                   }else if(I==3){
                           if(R==[] || car(R)!=1){
                                   R=cons(V[0],R);
                                   if(ST==0) ST=V[0];
                           }
                           for(J=1;J<3;J++) R=cons(V[J],R);
                           while((T=cdr(T))!=[]){
                                   R=cons(car(T),R);
                                   if(type(car(R))<4)
                           }
                   }else{
                           if(ST==0) ST=car(T);
                           V[I++]= car(T);
                   }
           }
   }
   */
   
 def lbezier(L)  def lbezier(L)
 {  {
         if((In=getopt(inv))==1||In==2||In==3){          if((In=getopt(inv))==1||In==2||In==3){
Line 14415  def lbezier(L)
Line 18148  def lbezier(L)
                         else{                          else{
                                 if(R!=[]&&F!=0) R=cons(0,R);                                  if(R!=[]&&F!=0) R=cons(0,R);
                                 R=cons(G=car(LT),R);                                  R=cons(G=car(LT),R);
                                 if(In==3) In==2;                                  if(In==3) In=2;
                         }                          }
                         for(LT=cdr(LT);LT!=[];LT=cdr(LT))                          for(LT=cdr(LT);LT!=[];LT=cdr(LT))
                                 R=cons(car(LT),R);                                  R=cons(car(LT),R);
Line 14434  def lbezier(L)
Line 18167  def lbezier(L)
                         }                          }
                         RT=cons(T,RT);                          RT=cons(T,RT);
                 }else if(T==0){                  }else if(T==0){
                         if(RT==[]) R=cons(reverse(RT),R);                          if(RT!=[]) R=cons(reverse(RT),R);
                         RT=[];F=0;                          RT=[];F=0;
                 }else if(T==1){                  }else if(T==1){
                         if(RT!=[]){                          if(RT!=[]){
Line 14456  def lbezier(L)
Line 18189  def lbezier(L)
   
 def xybezier(L)  def xybezier(L)
 {  {
           if(type(L)==4&&type(car(L))==4&&type(car(L)[0])==4) L=lbezier(L|inv=1);
         if(L==0 || (LS=length(L))==0) return "";          if(L==0 || (LS=length(L))==0) return "";
         Out=str_tb(0,0);          Out=str_tb(0,0);
         if(type(VF=getopt(verb))==4){          if(type(VF=getopt(verb))==4){
Line 14623  def xybox(L)
Line 18357  def xybox(L)
   
 def xyang(S,P,Q,R)  def xyang(S,P,Q,R)
 {  {
         Opt=getopt();          Opt=delopt(getopt(),"ar");
           if(type(S)>2) S=dnorm([S,P]);
         if(type(Prec=getopt(prec))!=1) Prec=0;          if(type(Prec=getopt(prec))!=1) Prec=0;
         if(type(Q)>2){          if(type(Q)>2){
                 if(R==1||R==-1){                                /* ’¼Šp */                  if(isint(S)&&S<0&&S>-8){
                         P1=ptcommon([Q,P],[-S,0]);                          if((S=-S)==6||S==7){
                         S*=R;                                  H=ptcommon([Q,R],[P,0]);
                         P2=ptcommon([P,P1],[S,@pi/2]);                                  if(S==6) return xyang(H,P,0,0|option_list=getopt()); /* ‰~ */
                         P3=ptcommon([P1,P2],[S,@pi/2]);                                  return xylines([P,H]|option_list=getopt()); /* ‚ü */
                         return xylines([P1,P2,P3]|option_list=Opt);  
                 }else if((AR=abs(R))==0||AR==2||AR==3||AR==4){  /* –îˆó */  
                         Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);  
                         if(R<0) Ang+=3.14159;  
                         ANG=[0.7854,0.5236,1.0472];  
                         X=(AR==0)?1.5708:ANG[AR-2];  
                         U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];  
                         V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];      /* –îæ */  
                         V=(X==0)?[U,V]:[U,P,V];  
                         if(getopt(ar)==1) V=append([Q,P,0],V);          /* S–_ */  
                         return xylines(V|option_list=Opt);  
                 }else if(AR>4&&AR<9){  
                         Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);  
                         ANG=[0.7854,0.5236,0.3927,0.2618];  
                         X=ANG[AR-5];  
                         U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];  
                         V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];  
                         W=ptcommon([P,U],[P,Q]|in=-2);  
                         W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];  
                         W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];  
                         L=[U,W1,P,1,W2,V];  
                         if(getopt(ar)==1) L=append([Q,P,0],L);  
                         if(type(Sc=getopt(scale))>0){  
                                 if(type(Sc)==1) Sc=[Sc,Sc];  
                                 L=ptaffine(diagm(2,Sc),L);  
                         }                          }
                         Opt=getopt(opt);                          O=pt5center(P,Q,R);
                         if(type(Opt)>0) OL=[["opt",Opt]];                          if(S==2) H=P;   /* ŠOS */
                         else OL=[];                          else{
                         if(getopt(proc)==1)     return append([2,OL],L);                                  if(S>2) S++; /* “àSC–TS */
                         S=xybezier(L|optilon_list=OL);                                  H=ptcommon([P,Q],[O[S],0]);
                         if(getopt(dviout)!=1) return S;                          }
                         dviout(S);                          return xyang(H,O[S],0,0|option_list=getopt());
                         return 1;  
                 }                  }
                   if(type(Ar=getopt(ar))!=1) Ar=0;
                   if(isint(R)){
                           if(R==1||R==-1){                                /* ’¼Šp */
                                   P1=ptcommon([Q,P],[-S,0]);
                                   S*=R;
                                   P2=ptcommon([P,P1],[S,@pi/2]);
                                   P3=ptcommon([P1,P2],[S,@pi/2]);
                                   return xylines([P1,P2,P3]|option_list=Opt);
                           }else if((AR=abs(R))==0||AR==2||AR==3||AR==4||AR>=10){  /* –îˆó */
                                   Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                                   if(R<0) Ang+=3.14159;
                                   if(AR>10) X=deval(@pi/180*AR);
                                   else{
                                           ANG=[0.7854,0.5236,1.0472];
                                           X=(AR==0)?1.5708:ANG[AR-2];
                                   }
                                   U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                                   V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];      /* –îæ */
                                   L=(X==0)?[U,V]:[U,P,V];
                                   if(X&&iand(Ar,2)){
                                           L=append([V],L);
                                           if((X=ptcommon([P,Q],[U,V]|in=1))!=0) P=X;
                                   }
                                   if(iand(Ar,1))
                                           L=append([Q,P,0],L);            /* S–_ */
                                           return xylines(L|option_list=Opt);
                                   }else if(AR>4&&AR<9){
                                           Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                                   ANG=[0.7854,0.5236,0.3927,0.2618];
                                   X=ANG[AR-5];
                                   U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                                   V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];
                                   W=ptcommon([P,U],[P,Q]|in=-2);
                                   W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];
                                   W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];
                                   L=iand(Ar,2)?[V,U,1,W1,P,1,W2,V]:[U,W1,P,1,W2,V];
                                   if(iand(Ar,1)){
                                           if(iand(Ar,2)) P=ptcommon([P,Q],[U,V]);
                                           L=append([Q,P,0],L);
                                   };
                                   if(type(Sc=getopt(scale))>0){
                                           if(type(Sc)==1) Sc=[Sc,Sc];
                                           L=ptaffine(diagm(2,Sc),L);
                                   }
                                   Opt=delopt(Opt,"proc");
                                   if(getopt(proc)==1)     return append([2,Opt],L);
                                   S=xybezier(L|option_list=Opt);
                                   if(getopt(dviout)!=1) return S;
                                   dviout(xyproc(S));
                                   return 1;
                           }
                   }
         }          }
         if(type(Q)<3){          if(type(Q)<3){
                 X=deval(Q); Y=deval(R);                  X=deval(Q); Y=deval(R);
Line 14794  def xycirc(P,R)
Line 18555  def xycirc(P,R)
     return S+"}};\n";      return S+"}};\n";
 }  }
   
   def xypoch(W,H,R1,R2)
   {
           if(H>R1||2*H>R2){
                   errno(0);
                   return;
           }
           if(type(Ar=getopt(ar))!=1) Ar=TikZ?0.25:2.5;
           T1=dasin(H/R1);S1=R1*dcos(T1);
           T2=dasin(H/R2);S2=R2*dcos(T2);
           T3=dasin(2*H/R2);S3=R2*dcos(T3);
           S=xyline([R1,0],[W-R1,0]);
           S+=xyang(R1,[W,0],-@pi,@pi-T1);
           S+=xyline([S2,H],[W-S1,H]);
           S+=xyang(R2,[0,0],T2,2*@pi-T3);
           S+=xylines([[S3,-2*H],[W-H-R2,-2*H],[W-H-R2,2*H],[W-S3,2*H]]);
           S+=xyang(R2,[W,0],-@pi+T2,@pi-T3);
           S+=xyline([W-T2,-H],[W-T2,-H]);
           S+=xyang(R1,[0,0],0,2*@pi-T1);
           S+=xyline([W-S2,-H],[S1,-H]);
           if(Ar>0){
                   S+=xyang(Ar,[W/2,0],[0,0],8);
                   S+=xyang(Ar,[W/2,-2*H],[0,-2*H],8);
                   S+=xyang(Ar,[W/2-Ar,-H],[W,-H],8);
                   S+=xyang(Ar,[W/2-Ar,H],[W,H],8);
                   S+=xyang(Ar,[W-S3,2*H],[W-H-R2,2*H],8);
           }
           S+=xyput([R1,0,"$\\bullet$"]);
           S+=xyput([0,0,"$\\times$"]);
           S+=xyput([W,0,"$\\times$"]);
           if(TikZ) S=str_subst(S,";\n\\draw","\n");
           return S;
   }
   
   def xycircuit(P,S)
   {
           if(type(Sc=getopt(scale))!=1) Sc=1;
           if(type(Opt0=getopt(opt))!=7) Opt0="";
           if(type(At=getopt(at))!=1) At=(S=="E"||S=="EE")?1:1/2;
           Rev=(getopt(rev)==1)?-1:1;
           if(type(P)==4&&type(car(P))==4&&P[0][0]==P[1][0]) Rev=-Rev;
           W=R=B2=B3=0;Opt=Opt2=Opt3="";
           if(S=="L"||S=="VL"||S=="LT"){
                   G=[1/8*x-2/5*cos(x)+2/5,1/2*sin(x)+1/2];
                   B=xygraph(G,-21,[0,7*@pi],[-1,10],[-2,2]|scale=0.3/1.06466,opt=0);
                   B=append(B,[1,[1,0]]);
                   B=append([[0,0],car(B),1],cdr(B));
                   W=1;Opt="thick";
                   if(S=="VL"){
                           B2=xyang(0.2,[0.5+0.4*Rev,0.45],[0.5-0.435*Rev,-0.3],3|ar=3,opt=0);
                           Opt2="thick,fill";
                   }else if(S=="LT"){
                           B2=[[0.5+0.4*Rev,0.45],[0.5-0.435*Rev,-0.3],0,[0.45+0.4*Rev,0.394],[0.55+0.4*Rev,0.506]];
                           Opt2="thick";
                   }
           }else if(S=="C"||S=="VC"||S=="C+"||S=="C-"||S=="CT"){
                   B=[[0,-0.2],[0,0.2],0,[0.15,-0.2],[0.15,0.2]];
                   W=0.15;Opt="very thick";
                   if(S=="VC"){
                           B2=xyang(0.2,[1/3+0.075,0.3*Rev],[-1/3+0.075,-0.3*Rev],3|ar=3,opt=0);
                           Opt2="thick,fill";
                   }else if(S=="CT"){
                           B2=[[1/3+0.075,0.3*Rev],[-1/3+0.075,-0.3*Rev],0,[1/3+0.125,0.244*Rev],
                                   [1/3+0.025,0.356*Rev]];
                           Opt2="thick";
                   }else if(S=="C+")
                           B2=[[0,0.05],[0.15,-0.05],0,[0,0.15],[0.15,0.05],0,[0,-0.05],[0.15,-0.15],
                           0,[0.29,0.04*Rev],[0.29,0.24*Rev],0,[0.19,0.14*Rev],[0.39,0.14*Rev]];
                   else if(S=="C-")
                           B2=[[0,0.05],[0.15,-0.05],0,[0,0.15],[0.15,0.05],0,[0,-0.05],[0.15,-0.15]];
           }else if(S=="R"||S=="VR"||S=="VR3"||S=="RT"){
                   for(I=0,B=[[0,0]];I<12;I++)
                           if(iand(I,1)) B=cons([I,(-1)^((I+1)/2)],B);
                   B=reverse(cons([12,0],B));
                   B=xylines(B|scale=[1/18,0.15],opt=0);
                   W=2/3;Opt="thick";
                   if(S=="VR"){
                           B2=xyang(0.2,[2/3,0.3*Rev],[0,-0.3*Rev],3|ar=3,opt=0);
                           Opt2="thick,fill";
                   }else if(S=="RT"){
                           B2=[[2/3,0.3*Rev],[0,-0.3*Rev],0,[0.717,0.244*Rev],[0.617,0.357*Rev]];
                           Opt2="thick";
                   }else if(S=="RN3"){
                           B2=xyang(0.2,[1/3,0.2*Rev],[1/3,0.5*Rev],3|ar=3,opt=0);
                           Opt2="thick,fill";
                   }
           }else if(S=="RN"||S=="VRN"||S=="RN3"||S=="NRT"){
                   B=xylines([[0,0.1],[2/3,0.1],[2/3,-0.1],[0,-0.1],[0,0.1]]|opt=0);
                   W=2/3;Opt="thick";
                   if(S=="VRN"){
                           B2=xyang(0.2,[2/3,0.3*Rev],[0,-0.3*Rev],3|ar=3,opt=0);
                           Opt2="thick,fill";
                   }else if(S=="RN3"){
                           B2=xyang(0.2,[1/3,0.2*Rev],[1/3,0.5*Rev],3|ar=3,opt=0);
                           Opt2="thick,fill";
                   }else if(S=="NRT"){
                           B2=[[2/3,0.3*Rev],[0,-0.3*Rev],0,[0.717,0.244*Rev],[0.617,0.357*Rev]];
                           Opt2="thick";
                   }
           }else if(S=="circle"){
                   W=1;
                   B=xyang(0.5,[0.5,0],0,0|opt=0);
           }else if(S=="gap"){
                   W=0.3;
                   B=xyang(0.15,[0.15,0],0,3.1416|opt=0);
           }else if(S=="E"){
                   W=0.1;
                   B=[[0,0.2],[0,-0.2],0,[0,0.05],[0.1,-0.05],0,[0,0.15],[0.1,0.05],0,[0,-0.05],[0.1,-0.15]];
           }else if(S=="EE"){
                   W=0.15;
                   B=[[0,0.2],[0,-0.2],0,[0.075,0.13],[0.075,-0.13],0,[0.15,-0.06],[0.15,0.06]];
           }else if(S=="Cell"){
                   W=0.1;
                   B=[[0,-0.2],[0,0.2]];
                   B2=[[0.1,-0.1],[0.1,0.1]];Opt2="very thick";
           }else if(S=="Cell2"){
                   W=0.3;
                   B=[[0,-0.2],[0,0.2],0,[0.2,-0.2],[0.2,0.2]];
                   B2=[[0.1,-0.1],[0.1,0.1],0,[0.3,-0.1],[0.3,0.1]];Opt2="very thick";
           }else if(S=="Cells"){
                   W=0.6;
                   B=[[0,-0.2],[0,0.2],0,[0.5,-0.2],[0.5,0.2],0,[0.1,0],[0.18,0],0,
                           [0.24,0],[0.34,0],0,[0.40,0],[0.5,0]];
                   B2=[[0.1,-0.1],[0.1,0.1],0,[0.6,-0.1],[0.6,0.1]];Opt2="very thick";
           }else if (S=="Sw"){
                   W=0.5;
                   B=xyang(0.05,[0.05,0],0,0|opt=0);
                   B0=ptaffine(1,B|shift=[0.4,0]);
                   B=ptaffine("union",[B,B0]);
                   B=ptaffine("union",[B,[[0.0908,0.025*Rev],[0.45,0.17*Rev]]]);
           }else if(S=="D"){
                   W=0.3;Opt="thick";
                   B=[[0,0],[0.3,0.173],0,[0.3,0.173],[0.3,-0.173],0,[0.3,-0.173],[0,0],0,
                   [0,0.173],[0,-0.173]];
           }else if(S=="NPN"||S=="PNP"||S=="NPN0"||S=="PNP0"){
                   W=0.6;
                   C=[[0.6,0],[0.37,0.23],[0,0],[0.23,0.23]];
                   if(Rev==-1) C=[C[2],C[3],C[0],C[1]];
                   if(S=="PNP"||S=="PNP0") C=[C[1],C[0],C[2],C[3]];
                   B=[[0,0],[0.23,0.23],0,[0.6,0],[0.37,0.23],0,[0.3,0.23],[0.3,0.6]];
                   B=ptaffine("union",[xyang(0.15,C[0],C[1],18|ar=1,opt=0),B]);
                   if(S=="PNP"||S=="NPN") B=ptaffine("union",[xyang(0.3354,[0.3,0.15],0,0|opt=0),B]);
                   B2=[[0.07,0.23],[0.53,0.23]];
                   Opt2="very thick";
           }else if(S=="JN"||S=="JP"){
                   W=0.6;
                   B=[[0,0],[0.2,0],1,[0.2,0.23],0,[0.6,0],[0.4,0],1,[0.4,0.23],0,[0.3,0.23],[0.3,0.6]];
                   C=[[0.3,0.23],[0.3,0.4854]];
                   if(S=="JP") C=reverse(C);
                   B=ptaffine("union",[B,xyang(0.15,C[0],C[1],18|opt=0)]);
                   B=ptaffine("union",[B,xyang(0.3354,[0.3,0.15],0,0|opt=0)]);
                   B2=[[0.07,0.23],[0.53,0.23]];
                   Opt2="very thick";
           }else if(S=="") R=(Opt0=="")?xyline(P[0],P[1]):xyline(P[0],P[1]|opt=Opt0);
           else if(S=="arrow") R=xyang(0.2*Sc,P[1],P[0],3|ar=1,opt=Opt0);
           else if(type(S)==4&&type(car(S))==7){
                   if(type(car(P))!=4) P=[P];
                   for(R="";P!=[];P=cdr(P)) R+=xyput([car(P)[0],car(P)[1],car(S)]);
           }
           if(W){
                   R="";
                   if(type(P)==4){
                           if(type(car(P))==4){
                                   T=ptcommon([[0,0],[1,0]],P|in=2);
                                   L=dnorm(P);
                                   W*=Sc;
                                   L1=L*At-W/2;L2=L*(1-At)-W/2;
                                   if(L1>0){
                                           P1=[P[0][0]+L1*dcos(T),P[0][1]+L1*dsin(T)];
                                           R+=xyline(P[0],P1);
                                   }
                                   if(L2>0){
                                           P2=[P[1][0]-L2*dcos(T),P[1][1]-L2*dsin(T)];
                                           R+=xyline(P2,P[1]);
                                   }
                                   B=ptaffine(Sc,B|shift=P1,arg=T);
                                   if(B2) B2=ptaffine(Sc,B2|shift=P1,arg=T);
                                   if(B3) B3=ptaffine(Sc,B3|shift=P1,arg=T);
                           }else{
                                   B=ptaffine(Sc,B|shift=P1);
                                   if(B2) B2=ptaffine(Sc,B2|shift=P1);
                                   if(B3) B3=ptaffine(Sc,B3|shift=P1);
                           }
                   }else{
                           B=ptaffine(Sc,B);
                           if(B2) B2=ptaffine(Sc,B2);
                           if(B3) B3=ptaffine(Sc,B3);
                   }
                   if(Opt=="") Opt=Opt0;
                   else if(Opt0!="") Opt=Opt+","+Opt0;
                   R+=(Opt=="")?xybezier(B):xybezier(B|opt=Opt);
                   if(B2){
                           if(Opt2=="") Opt2=Opt0;
                           else if(Opt0!="") Opt2=Opt2+","+Opt0;
                           R+=(Opt2=="")?xybezier(B2):xybezier(B2|opt=Opt2);
                   }
                   if(B3){
                           if(Opt3=="") Opt3=Opt0;
                           else if(Opt0!="") Opt3=Opt3+","+Opt0;
                           R+=(Opt3=="")?xybezier(B3):xybezier(B3|opt=Opt3);
                   }
           }
           return R;
   }
   
   
 def ptaffine(M,L)  def ptaffine(M,L)
 {  {
         if(type(L)!=4&&type(L)!=5){          if(type(L)!=4&&type(L)!=5){
Line 14936  def ptlattice(M,N,X,Y)
Line 18902  def ptlattice(M,N,X,Y)
         for(L=[],I=M-1;I>=0;I--){          for(L=[],I=M-1;I>=0;I--){
                 for(P0=P1=0,J=N-1;J>=0;J--){                  for(P0=P1=0,J=N-1;J>=0;J--){
                         P=Org+I*X+J*Y;                          P=Org+I*X+J*Y;
                         for(C=Cond; C!=[]; C=cdr(C))                          for(C=Cond; C!=[]; C=cdr(C)){
                                 if(subst(car(C),x,P[0],y,P[1])<0) break;                                  TC=car(C);
                                   if(type(TC)<4)
                                           if(subst(TC,x,P[0],y,P[1])<0) break;
                                   else{
                                           for(;TC!=[];TC=cdr(TC))
                                                   if(subst(car(TC),x,P[0],y,P[1])>=0) break;
                                           if(TC==[]) break;
                                   }
                           }
                         if(C!=[]) continue;                          if(C!=[]) continue;
                         if(Line) F[I][J]=1;                          if(Line) F[I][J]=1;
                         else L=cons(vtol(S*P),L);                          else L=cons(vtol(S*P),L);
Line 15010  def ptwindow(L,X,Y)
Line 18984  def ptwindow(L,X,Y)
         return reverse(R);          return reverse(R);
 }  }
   
   def pt5center(P,Q,R)
   {
   /* P=[1,[0,0]];Q=[[0,0],[1,0]];R=[[0,0],[0,1]]; */
           if(length(P)==2&&type(P[0])==4){ /* circle */
                   if(type(Q)==4&&type(Q[1])==4){ /* line */
                           A=myarg(lsub(Q));B=myarg(lsub(R));X0=ptcommon(Q,R);
                           M=mrot(-A);N=mrot(A);X=M*ltov(X0);O=M*ltov(P[0]);
                           if(!(L=B-A)) return 0;
                           Pi=deval(@pi);for(;L<0;L+=Pi);for(;L>Pi;L-=Pi);
                           XX=X[0]+y*deval(cos(L/2))/deval(sin(L/2));
                           XY=X[1]+y;
                           if(getopt(neg)==1){
                                   XX=subst(XX,y,-y);XY=subst(XY,y,-y);
                           }
   /* mycat([[P[0],O],XX,XY]); */
                           V=(XX-O[0])^2+(XY-O[1])^2;
   /* mycat(V-(y+P[0])^2); */
                           S=polroots(V-(y+P[1])^2,y);
                           S=append(polroots(V-(y-P[1])^2,y),S);
                           S=qsort(S);V=ltov([XX,XY]);
   /* mycat([S,V,M,N,M*N]); */
                           for(R0=[],ST=S;ST!=[];ST=cdr(ST)) R0=cons([vtol(N*subst(V,y,car(ST))), car(ST)],R0);
   /*  mycat(R0); */
                           for(R=[],F=1;R0!=[];R0=cdr(R0)){
                                   if(car(R0)[1]>=0) R=cons(car(R0),R);
                                   else{
                                           if(F){
                                                   F=0; R=reverse(R);
                                           }
                                           R=cons(car(R0),R);
                                   }
                           }
   /* mycat(R); */
                           if(!F) R=reverse(R);
                           return R;
                   }
           }
           L=newvect(7);
           L[2]=ptcommon([P,Q],[P,R]|in=-1);
           Q1=ptcommon([P,R],[Q,0]);R1=ptcommon([P,Q],[R,0]);
           L[3]=ptcommon([Q,Q1],[R,R1]);
           P=ltov(P);Q=ltov(Q);R=ltov(R);
       A=dnorm([Q,R]);B=dnorm([P,R]);C=dnorm([P,Q]);
           L[0]=vtol((P+Q+R)/3);
           L[1]=vtol((A*P+B*Q+C*R)/(A+B+C));
           L[4]=vtol((-A*P+B*Q+C*R)/(-A+B+C));
           L[5]=vtol((A*P-B*Q+C*R)/(A-B+C));
           L[6]=vtol((A*P+B*Q-C*R)/(A+B-C));
           if((V=getopt(opt))==0){
                   H1=ptcommon([Q,R],[1,1]|in=1);
                   H2=ptcommon([R,P],[1,1]|in=1);
                   H3=ptcommon([P,Q],[1,1]|in=1);
                   return [L(0),H1,H2,H3];
           }else if(V==1||V==4||V==5||V==6){
                   H1=ptcommon([Q,R],[L[1],0]);
                   H2=ptcommon([R,P],[L[1],0]);
                   H3=ptcommon([P,Q],[L[1],0]);
                   return [[L[1],dnorm(L[1],H1)],H1,H2,H3];
           }else if(V==2){
                   return [L[2],dnorm([L[2],P])];
           }else if(V==3){
                   H1=ptcommon([Q,R],[P,0]);
                   H2=ptcommon([R,P],[Q,0]);
                   H3=ptcommon([P,Q],[R,0]);
                   return [L[3],H1,H2,H3];
           }
           return vtol(L);
   }
   
 def lninbox(L,W)  def lninbox(L,W)
 {  {
         if(L[0]==L[1]) return 0;          if(L[0]==L[1]) return 0;
Line 15080  def ptcopy(L,V)
Line 19123  def ptcopy(L,V)
         }          }
 }  }
   
   def regress(L)
   {
           E=deval(exp(0));
           for(S0=T0=0,S=L;S!=[];S=cdr(S)){
                   S0+=car(S)[0]*E;T0+=car(S)[1]*E;
           }
           K=length(L);S0/=K;T0/=K;
           for(SS=TT=0,S=L;S!=[];S=cdr(S)){
                   SS+=(car(S)[0]-S0)^2*E;TT+=(car(S)[1]-T0)^2*E;
                   ST+=(car(S)[0]-S0)*(car(S)[1]-T0)*E;
           }
           if(!SS||!TT) return [];
           A=ST/SS;
           L=[A,A*S0-T0,ST/dsqrt(SS*TT),S0,dsqrt(SS/K),T0,dsqrt(TT/K)];
           if(isint(N=getopt(sint))){
                   R=reverse(L);
                   for(L=[];R!=[];R=cdr(R)) L=cons(sint(car(R),N|str=0),L);
           }
           return L;
   }
   
 def     average(L)  def     average(L)
 {  {
         L=os_md.m2l(L|flat=1);          if(getopt(opt)=="co"){
         M0=M1=car(L);                  S0=average(L[0]);V0=car(S0);
         for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){                  S1=average(L[1]);V1=car(S1);
                 S+=(V=car(LT));                  L0=os_md.m2l(L[0]|flat=1);
                 SS+=V^2;                  L1=os_md.m2l(L[1]|flat=1);
                 if(V<M0)                M0=V;                  for(S=0;L0!=[];L0=cdr(L0),L1=cdr(L1))
                 else if(V>M1)   M1=V;                          S+=(car(L0)-V0)*(car(L1)-V1);
                   S/=S0[1]*S1[1]*S0[2];
                   S=[S,S0,S1];
           }else{
                   L=os_md.m2l(L|flat=1);
                   M0=M1=car(L);
                   for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){
                           S+=(V=car(LT));
                           SS+=V^2;
                           if(V<M0)                M0=V;
                           else if(V>M1)   M1=V;
                   }
                   SS=dsqrt(SS/I-S^2/I^2);
                   S=[deval(S/I),SS,I,M0,M1];
         }          }
         SS=dsqrt(SS/I-S^2/I^2);  
         S=[deval(S/I),SS,I,M0,M1];  
         if(isint(N=getopt(sint))) S=sint(S,N);          if(isint(N=getopt(sint))) S=sint(S,N);
         return S;          return S;
 }  }
Line 15774  def getbygrs(M, TT)
Line 19849  def getbygrs(M, TT)
                                 if(MT[S] > MT[0]) S = 0;                                  if(MT[S] > MT[0]) S = 0;
                         }                          }
                 }                  }
                 M = reverse(R);                  M = reverse(R);
                 R = getopt(var);                  R = getopt(var);
                 if(type(R)<1){                  if(type(R)<1){
                         for(R = [], I = J-1; I >= 0; I--)                          for(R = [], I = J-1; I >= 0; I--)
                                 R = cons(asciitostr([97+I]), R);                                  R = cons(asciitostr([97+I]), R);
                 }                  }
                 Sft=(Sft>=0)?1:0;                  Sft=(Sft>=0)?1:0;
                 if(General < 0)                  if(General < 0) Sft=-Sft-1;
                         Sft=-Sft-1;                  Con=(M[1][0]==1)?1:0;
                 M = sp2grs(M,R,Sft|mat=Mat);                  M = sp2grs(M,R,Sft|mat=Mat,con=Con);
         }          }
         for(M0=[],MM=M;MM!=[];MM=cdr(MM)){      /* change "?" -> z_z */          for(M0=[],MM=M;MM!=[];MM=cdr(MM)){      /* change "?" -> z_z */
                 for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){                  for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){
Line 16508  def getbygrs(M, TT)
Line 20583  def getbygrs(M, TT)
                                  }                                   }
                         }                          }
                 }else  /* Rigid case */                  }else  /* Rigid case */
                         P = dx^(AL[0][1][0][0][0]);                          P = dx^(AL[0][1][0][0][0]);
  /* additions and middle convolutions */   /* additions and middle convolutions */
                 for(ALT = AL; ALT != []; ALT = cdr(ALT)){                  for(ALT = AL; ALT != []; ALT = cdr(ALT)){
                         AI = car(ALT)[0];                          AI = car(ALT)[0];
                         if(type(AI) != 4) continue;                          if(type(AI) != 4) continue;
                         V = ltov(AI);                          V = ltov(AI);
                         if(V[0] != 0) P = mc(P,x,V[0]);                          if(V[0] != 0) P = mc(P,x,V[0]);
                         for(I = 1; I < NP; I++){                          for(I = 1; I < NP; I++){
                                 if(V[I] != 0)                                  if(V[I] != 0)
                                         P = sftexp(P,x,L[I],-V[I]);                                          P = sftexp(P,x,L[I],-V[I]);
                         }                          }
                 }                  }
                 P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);                  P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);
                 if(TeX >= 0){                  if(TeX >= 0){
                         Val = 1;                          Val = 1;
                         if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)                          if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)
Line 16739  def shiftop(M,S)
Line 20814  def shiftop(M,S)
         return [QQ,P,RS];          return [QQ,P,RS];
 }  }
   
   
   def shiftPfaff(A,B,G,X,M)
   {
           if(type(G)==4){
                   G0=G[1];G1=G[0];
           }
           if(type(G)==6){
                   G=map(red,G);
                   G0=llcm(G);G1=map(red,G0*G);
           }
           if(type(G)==3){
                   G=red(G);G0=dn(G);G1=nm(G);
           }
           if(type(M)==4){
                   M0=M[0];M1=M[1];
           }else{
                   M0=M;M1=0;
           }
           X=vweyl(X);
           D0=mydeg(G0,X[0]);D1=mydeg(G1,X[0]);
           if(M1>=0){
                   D=(D1-M1>D0)?D1-M1:D0;
                   G0=muldo(X[1]^D,G0,X);G1=muldo(X[1]^(D+M1),G1,X);
           }else{
                   D=(D0+M1>D1)?D0+M1:D1;
                   G0=muldo(X[1]^(D-M1),G0,X);G1==muldo(X[1]^D,G1,X);
           }
           G0=map(mc,G0,X,M0);G1=map(mc,G1,X,M0+M1);
           G0=appldo(G0,A,X|Pfaff=1);
           G1=sppldo(G1,B,X|Pfaff=1);
           return rmul(myinv(G0),G1);
   }
   
 def conf1sp(M)  def conf1sp(M)
 {  {
         if(type(M)==7) M=s2sp(M);          if(type(M)==7) M=s2sp(M);
Line 16828  def conf1sp(M)
Line 20936  def conf1sp(M)
         return P;          return P;
 }  }
   
   def s2cspb(L)
   {
           Sub=(getopt(sub));
           if(Sub!=1&&Sub!=2&&Sub!=-1) Sub=0;
           if(type(L)==7){
                   if(Sub>0){
                           I=str_char(L,0,"(");
                           if(I<0) return car(s2sp(L));
                           for(R=[];;){
                                   J=str_char(L,I,"(");
                                   if(J<0) return reverse(R);
                                   K=str_pair(L,J+1,"(",")");
                                   if(K<0) return reverse(R);
                                   R=cons(s2cspb(str_cut(L,J+1,K-1)|sub=1),R);
                                   I=K;
                           }
                   }else{
                           K=str_len(L);
                           for(R=[],I=0;I<K;){
                                   J=str_char(L,I,",");
                                   if(J<0) J=str_len(L)+1;
                                   R=cons(s2cspb(str_cut(L,I,J-1)|sub=1),R);
                                   I=J+1;
                           }
                           L=reverse(R);
                   }
                   if(Sub==-1) return L;
           }
           if(!Sub){
                   for(R=[];L!=[];L=cdr(L)) R=cons(s2cspb(car(L)|sub=1),R);
                   return reverse(R);
           }
           if(type(car(L))<2){
                   if(Sub==1) return L;
                   else for(N=0,TL=L;TL!=[];TL=cdr(TL)) N+=car(TL);
                   return [N,L];
           }
           for(R=[];L!=[];L=cdr(L)) R=cons(s2cspb(car(L)|sub=2),R);
           if(Sub==2){
                   for(N=0,T=R;T!=[];T=cdr(T)) N+=car(T[0]);
                   R=[R,N];
           }
           return reverse(R);
   }
   
   /* ((1)(1)) ((1))   111|21|21  [[ [2,[ [1,[1]],[1,[1]] ]], [1,[[1,[1]]]] ]]  */
   /* (11)(1),111  111|21,111 [[[2,[1,1]],[1,[1]]],[1,1,1]]  */
   def s2csp(S)
   {
           if(type(S)!=7){
                   U="";
                   if(type(N=getopt(n))>0){
                           if(N==-1) S=s2cspb(S);
                           for(D=0,S=reverse(S);S!=[];S=cdr(S),D++){
                                   if(D) U=","+U;
                                   T=str_subst(rtostr(car(S)),","," ");
                                   U=str_cut(T,1,str_len(T)-2)+U;
                           }
                           V=strtoascii(U);
                           for(R=[];V!=[];V=cdr(V)){
                                   if((CC=car(V))==91){    /* [ */
                                           if(length(V)>1 && V[1]==91) V=cdr(V);
                                           for(I=1;(CC=V[I])!=91&&CC!=93;I++);
                                           if(CC==91){
                                                   R=cons(40,R);   /* ( */
                                                   while(I--) V=cdr(V);
                                           }else{
                                                   V=cdr(V);
                                                   while(--I) R=cons(car(V),R);
                                           }
                                   }else if(CC==93){               /* ] */
                                           R=cons(41,R);
                                           if(length(V)>1 && V[1]==93) V=cdr(V);
                                   }else R=cons(CC,R);
                           }
                           return asciitostr(reverse(R));
                   }
                   for(;S!=[];S=cdr(S)){
                           if(U!="") U=U+",";
                           for(D=0,TU="",T=car(S);T!=[];D++){
                                   if(type(car(T))==4){
                                           R=lpair(T,0);
                                           T=R[0];R1=m2l(R[1]|flat=1);
                                   }else R1=[];
                                   if(D) TU="|"+TU;
                                   TU=s2sp([T])+TU;
                                   T=R1;
                           }
                                   U=U+TU;
                   }
                   return U;
           }
           if(type(N=getopt(n))>0){
                   if(N==-1) return s2cspb(S|sub=-1);
                   else{
                           S=s2cspb(S);
                           if(N==1) S=s2csp(S);
                           return S;
                   }
           }
           S=strtoascii(S);
           for(P=TS=[],I=D=0; S!=[]; S=cdr(S)){
                   if((C=car(S))==44){                     /* , */
                           P=cons(D,P);D=0;
                   }else if(C==124){       /* | */
                           D++;C=44;
                   }
                   TS=cons(C,TS);
           }
           S=reverse(TS);
           P=reverse(cons(D,P));
           U=s2sp(asciitostr(S));
   
           for(R=[];P!=[];P=cdr(P),U=cdr(U)){
                   D=car(P);R0=car(U);
                   while(D--){
                           U=cdr(U);
                           for(U0=car(U),R2=[];U0!=[];U0=cdr(U0)){
                                   for(R1=[],N=car(U0);N>0;R0=cdr(R0)){
                                           R1=cons(car(R0),R1);
                                           if(type(car(R0))==4) N-=car(R0)[0];
                                           else N-=car(R0);
                                   }
                                   R2=cons([car(U0),reverse(R1)],R2);
                           }
                           R0=reverse(R2);
                   }
                   R=cons(R0,R);
           }
           return reverse(R);
   }
   
   /*
   def confspt(S)
   {
           if(!isint(F=getopt(sub))) F=0;
           N=length(S);
           P=newmat(N,N);
           for(I=0;I<N;I++){
                   if(S[I][I]) continue;
                   for(J=0;J<N;J++){
                           if(I==J) continue;
                           if(S[I]==S[J]){
                                   P[I][I]++; P[J][J]--;
                           }
                           R=partsp(S[I],S[J]|opt=2);
                           if(R!=[]) P[I][J]=R;
                   }
           }
           for(TT=[];I=N-1;I--){
                   for(R=[],J=0;J<N;J++){
                           if(I==J) continue;
                           if(S[I][J]!=0) R=cons(J,R);
                   }
                   TT=cons(R,TT);
           }
           for(TP=I=0;I<N;I++) if(S[I][I]>=0) TP=cons([I],TP);
           for(F=1;F;){
                   for(T=TP,F=0,S=length(car(TP));T!=[];T=cdr(T)){
                           if(length(T0=car(T))<S) break;
                           for(TT0=TT[car(T0)];TT0!=[];TT0=cdr(TT0)){
                                   TP=cons(cons(car(TT0),T0),TP);
                                   F=1;
                           }
           }
   
   }
   */
   
   
   def partspt(S,T)
   {
           if(length(S)>length(T)) return [];
           if(type(Op=getopt(opt))!=1) Op=0;
       VS=ltov(S);
           L=length(S)-1;
           VT=ltov(qsort(T));
           if(length(S)==length(T)){
                   if((R=S)==T|| (R=qsort(S))==qsort(T)){
                           for(S=[];R!=[];R=cdr(R)) S=cons([car(R),[car(R)]],S);
                           return S;
                   }
                   else return [];
           }else if(getopt(sort)==1){
                   S0=S1=[];
                   for(;S!=[]&&car(S)==car(T);S=cdr(S),T=cdr(T))
                           S0=cons(car(S),S0);
                   if(S!=[]&&car(S)<car(T)) return [];
                   S0=reverse(S0);
                   for(S=reverse(S),T=reverse(T);S!=[],car(S)==car(T);S=cdr(S),T=cdr(T))
                           S1=cons(car(S),S1);
                   if(car(S)!=[]&&car(S)<cat(T)) return [];
                   R=partspt(reverse(S),reverse(T));
                   if(S1!=[]){
                           for(R0=[];R!=[];R=cdr(R))
                                   R0=cons(append(car(R),S1),R0);
                           R=reverse(R0);
                   }
                   if(S0!=[]){
                           for(R0=[];R!=[];R=cdr(R))
                                   R0=cons(append(S0,car(R)),R0);
                           R=reverse(R0);
                   }
           }else{
             for(R=[];;){
                   for(I=J=P=0;I<L;I++){
                           P=VS[I];
                           X=100000;
                           while((P-=(Y=VT[J++]))>0){
                                   if(X<Y) break;
                                   X=Y;
                           }
                           if(X<Y||P<0) break;
                   }
                   if(!P&&X>=Y) R=cons(vtol(VT),R);
                   if(!vnext(VT)) break;
             }
           }
           if(Op){
                   for(W=[];R!=[];R=cdr(R)){
                           for(I=0,S=VS[0],K=U=[],TR=car(R);TR!=[];TR=cdr(TR)){
                                   K=cons(car(TR),K);
                                   if(!(S-=car(K))){
                                           U=cons([VS[I],reverse(K)],U);
                                           K=[];
                                           S=VS[++I];
                                           if(I==L){
                                                   U=cons([S,cdr(TR)],U);
                                                   break;
                                           }
                                   }
                           }
                           W=cons(reverse(U),W);
                   }
                   R=W;
                   if(iand(Op,1)){
                           for(R=[];W!=[];W=cdr(W))
                                   R=cons(reverse(qsort(car(W))),R);
                           R=lsort(R,[],1);
                   }
                   if(Op==3){
                           for(W=[];R!=[];R=cdr(R)){
                                   for(S=[],TR=car(R);TR!=[];TR=cdr(TR))
                                           S=append(S,car(TR)[1]);
                                   W=cons(S,W);
                           }
                           R=reverse(W);
                   }
           }
           return R;
   }
   
   #if 0
   def confspt(S,T)
   {
           R=[];
           LS=length(S);LT=length(T);
           if(LS<LT)  return R;
           if(LS==LT){
                   return(S==T)? return [[S,T]]:R;
           }
           R=[];
           for(ST=S,S0=T0=[],TT=T;ST!=[];ST=cdr(ST),TT=cdr(TT)){
                   if(car(ST)>car(TT)) return R;
                   if(car(ST)==car(TT){
                           S0=cons(car(ST));T0=cons(car(TT));
                           LS--;LT--;continue;
                   }
                   V=car(TT);D=LS-LT;
                   for(P=[ST],DD=D;DD>0;){
                           VD=V-car(car(ST));
                   }
           }
   }
   #endif
   
   def vConv(K,I,J)
   {
           if(type(X=getopt(var))!=7) X="a";
           if(getopt(e)==2) return subst(vConv(K,I+1,J+1),makev([X,1]),0);
           if(J>K){L=J;J=K;K=L;}
           if(K>I||J<1||K+J<I+1) return 0;
           if(K+J==I+1) return 1;
           else
   #if 1
           L=I-K<J-2?I-K+1:J;
           for(S=0,M=0;M<L;M++) S+=(makev([X,K+M])-makev([X,J-M-1]))*vConv(K+M,I,J-M-1|var=X);
           return S;
   #else
           return  vConv(K+1,I,J-1|var=X)+(makev([X,K])-makev([X,J-1]))*vConv(K,I,J-1|var=X);
   #endif
   }
   
   def mcvm(N)
   {
     X=getopt(var);
     if((Z=getopt(z))!=1) Z=0;
     if(type(N)==4){
       if((K=length(N))==1&&isvar(X)) X=[X];
       if(type(X)!=4){
         for(X=[],I=0;I<K;I++) X=cons(asciitostr([97+I]),X);       /* a,b,... */
         X=reverse(X);
       }
           if((E=getopt(e))==1||E==2){
             if(length(N)==4) N=cdr(N);
             if(length(N)==3) return vConv(N[0],N[1],N[2]|var=X,e=E);
           }
           for(M=[],I=S=0;I<K;Z=0,I++){
                   M=cons(mcvm(N[I]|var=X[I],z=Z),M);
                   S+=N[I];
           }
           M=newbmat(K,K,reverse(M));
       NR=N;
           N=S;
     }else{
           if(type(X)==7) X=strtov(X);
           if(!isvar(X)) X=a;
       M=newmat(N,N);
       for(I=0;I<N;I++){
         V=makev([X,I+1]);
         for(J=0;J<=I;J++){
           R=polbyroot([1,J],V|var=X);
           if(Z==1) R*=V;
           M[I][J]=R;
         }
       }
     }
     if((Get=getopt(get))==1){
       for(R=[],I=0;I<N;I++){
         U=newmat(N,N);
         for(J=0;J<N;J++) U[J][J]=M[J][I];
         R=cons(rmul(rmul(myinv(M),U),M),R);
       }
       return reverse(R);
     }else if(Get==2||Get==3||Get==4){
           for(V=[],I=N;I>0;I--) V=cons(makev(["a0",I]),V);
       MI=myinv(M);
           V=ltov(V)*MI;
           for(R=[],I=0;I<N;I++){
         for(J=I+1;J<N;J++){
           K=newmat(N,N);
           K[I][I]=V[J];K[I][J]=-V[J];K[J][J]=V[I];K[J][I]=-V[I];
              R=cons(rmul(rmul(MI,K),M),R);
          }
           }
       R=reverse(R);
           if(Get==2||length(NR)!=2||Z==1) return R;
       for(V1=[],I=NR[0];I>0;I--) V1=cons(os_md.makev([X[0],I]),V1);
       for(V2=[],I=NR[1];I>0;I--) V2=cons(os_md.makev([X[1],I]),V2);
       R=subst(R,car(V1),0,car(V2),0);
       V1=subst(V1,car(V1),0);
       V2=subst(V2,car(V2),0);
       for(V=[],S=V1;S!=[];S=cdr(S)) for(T=V2;T!=[];T=cdr(T)) V=cons(car(T)-car(S),V);
       V=reverse(V);
       Mx=length(V);
       for(A0=[],I=J=NR[0]-1;J>=0;I+=--J) for(K=0;K<NR[1];K++,I++) A0=cons(R[I],A0);
       A0=reverse(A0);
       for(F0=[],T=1,I=Mx-1;I>=0;I--) F0=cons(1/(x-V[I]), F0);
       MV=confexp([F0,V]|sym=3);
       RR=newvect(Mx);
       for(K=0;K<Mx;K++) for(RR[K]=0,I=0;I<Mx;I++) RR[K]=map(red,RR[K]+MV[I][K]*A0[I]);
           for(RR0=RR,VV=append(cdr(V1),cdr(V2));VV!=[];VV=cdr(VV)) RR0=subst(RR0,car(VV),0);
       RR0=vtol(RR0);
       return (Get==3)?[RR,RR0]:RR0;
     }
     return M;
   }
   
   def confexp(S)
   {
           if((Sym=getopt(sym))==1||Sym==2||Sym==3){
                   D=polbyroot(S[1],x);
                   for(R=[],T=S[0];T!=[];T=cdr(T)){
                           M=D*car(T);
                           if(type(M)>3) M=map(red,M);
                           else M=red(M);
                           R=cons(M,R);
                   }
                   R=reverse(R);
                   if(Sym==2) return R;
                   M=length(R);N=length(S[1]);
                   E=newmat(M,N);
                   for(I=0;I<M;I++){
                           for(J=0;J<N;J++) E[I][J]=mycoef(R[I],N-J-1,x);
                   }
                   if(Sym==3){
                           for(R=[],P=1,T=S[1];T!=[];T=cdr(T)) R=cons(P/=(x-car(T)),R);
                           R=confexp([reverse(R),S[1]]|sym=1);
                           return E*myinv(R);
                   }
                   return E;
           }
           if(type(S[0])==4){
                   for(E=[];S!=[];S=cdr(S)) E=cons(confexp(car(S),E));
                   return reverse(E);
           }
           V=x;E=[];
           for(P=0,Q=[],ST=S;ST!=[];ST=cdr(ST)){
                   Q=cons(car(ST)[0],Q);
                   P+=car(ST)[1]/(V-car(ST)[0]);
                   P=red(P);
           }
           P=red(P*polbyroot(Q,V));
           Q=cdr(reverse(Q));
           for(I=(length(W=Q));I>=0;I--){
                   C=mycoef(P,I,V);
                   P-=C*polbyroot(W,V);
                   W=cdr(W);
                   E=cons(red(C),E);
           }
           return reverse(E);
   }
   
 def pgen(L,VV)  def pgen(L,VV)
 {  {
         if(type(L[0])<4) L=[L];          if(type(L[0])<4) L=[L];
Line 16948  def newbmat(M,N,R)
Line 21469  def newbmat(M,N,R)
         S  = newvect(M);          S  = newvect(M);
         T  = newvect(N);          T  = newvect(N);
         IM = length(R);          IM = length(R);
           if(type(car(R))!=4 && M==N && M==IM){
                   for(RR=TR=[],I=0;I<M;I++){
                           for(TR=[R[I]],J=0;J<I;J++) TR=cons(0,TR);
                           RR=cons(TR,RR);
                   }
                   R=reverse(RR);
           }
         for(I = 0; I < IM; I++){          for(I = 0; I < IM; I++){
                 RI = R[I];                  RI = R[I];
                 JM = length(RI);                  JM = length(RI);
Line 17278  def pfrac(F,X)
Line 21806  def pfrac(F,X)
         F = red(F);          F = red(F);
         FN = nm(F);          FN = nm(F);
         FD = dn(F);          FD = dn(F);
         if(mydeg(FD,X) == 0)          TeX=getopt(TeX);Dvi=getopt(dviout);
                 return [[F,1,1]];          if(mydeg(FD,X) == 0){
                   if(TeX==1||Dvi==1){
                           if(TeX!=1) fctrtos(F|var=X,dviout=1);
                           return fctrtos(F|var=X,TeX=1);
                   }
                   return [[F,1,1]];
           }
         R = rpdiv(FN,FD,X);          R = rpdiv(FN,FD,X);
         FN = R[0]/R[1];          FN = R[0]/R[1];
         R0 = R[2]/R[1];          R0 = R[2]/R[1];
Line 17287  def pfrac(F,X)
Line 21821  def pfrac(F,X)
         RT=[];          RT=[];
         if(getopt(root)==2){          if(getopt(root)==2){
                 for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){                  for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){
                         if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && pari(issquare,C=mycoef(P,4,X))){                          if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && issquare(C=mycoef(P,4,X))){
                                 if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);                                  if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);
                                 if(mycoef(P,1,X)==0 && pari(issquare,C0=mycoef(P,0,X))){                                  if(mycoef(P,1,X)==0 && issquare,C0=mycoef(P,0,X)){
                                         C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);                                          C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);
                                         if(C1>0){                                          if(C1>0){
                                                 FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);                                                  FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
Line 17316  def pfrac(F,X)
Line 21850  def pfrac(F,X)
                         Q += P/(FC[I][0]^K);                          Q += P/(FC[I][0]^K);
                         Q = red(Q);                          Q = red(Q);
                 }                  }
         }          }
         L=reverse(L);          L=reverse(L);
         Q = nm(red(red(Q*FD)-FN));          Q = nm(red(red(Q*FD)-FN));
         Q = ptol(Q,X);          Q = ptol(Q,X);
Line 17333  def pfrac(F,X)
Line 21867  def pfrac(F,X)
         for(;RT!=[];RT=cdr(RT)){          for(;RT!=[];RT=cdr(RT)){
                 RTT=car(RT);                  RTT=car(RT);
                 R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);                  R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);
         }          }
         TeX=getopt(TeX);          if(Dvi==1||TeX==1){
         if((Dvi=getopt(dviout))==1||TeX==1){                  V=strtov("0");
                 V=strtov("0");                  for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){
                 for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){                          RT=car(RR);
                         RT=car(RR);  
                         S+=(RT[0]/RT[1]^RT[2])*V^L;                          S+=(RT[0]/RT[1]^RT[2])*V^L;
                 }                  }
                 if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);                  if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);
                 else return fctrtos(S|var=[V,""],TeX=3);                  else return fctrtos(S|var=[V,""],TeX=3,lim=0);
         }          }
         return reverse(R);          return reverse(R);
 }  }
   
 def cfrac(X,N)  def cfrac(X,N)
 {  {
         F=[floor(X)];          if(!ntype(X)&&N==0) N=2*dn(X)+1;
         if(N<0){          if(N<0) Max=N=-N;
                 Max=N=-N;          Ng=(getopt(neg)==1)?1:0;
         }          F=[Ng?ceil(X):floor(X)];
         X-=F[0];          X=Ng?F[0]-X:X-F[0];
         if(Max!=1)          if(Max!=1) M=mat([F[0],1],[1,0]);
                 M=mat([F[0],1],[1,0]);  
         for(;N>0 && X!=0;N--){          for(;N>0 && X!=0;N--){
                 X=1/X;                  X=1/X;
                 F=cons(Y=floor(X),F);                  F=cons(Y=Ng?ceil(X):floor(X),F);
                 X-=Y;                  X=Ng?Y-X:X-Y;
                 if(Max){                  if(Max){
                         M0=M[0][0];M1=M[1][0];                          M0=M[0][0];M1=M[1][0];
                         M=M*mat([Y,1],[1,0]);                          M=M*mat([Y,1],[1,0]);
Line 17504  def sqrt2rat(X)
Line 22036  def sqrt2rat(X)
   
 def cfrac2n(X)  def cfrac2n(X)
 {  {
           if(((Q=getopt(q))==1||Q==-1)&&isall(os_md.isint,X)){    /* q-def */
                   F=car(X);
                   R=[red((1-q^F)/(1-q))];X=cdr(X);
                   for(SQ=1/q;X!=[];SQ=1/SQ,X=cdr(X)){
                           G=car(X);
                           V=(Q==1)?[(1/SQ)^F,(1-SQ^G)/(1-SQ)]:[-q^(F-1),(1-q^G)/(1-q)];
                           R=cons(red(V),R);
                           F=G;
                   }
                   return cfrac2n(reverse(R)|ex=1);
           }
           if((Ex=getopt(ex))!=1) Ex=0;
   /*
           if(!isint(Fn=getopt(dn))) Dn=0;
           else{
                   RD=[];V=0;
           }
   */
           if(isvar(car(X))&&length(X)==4&&isint(X[1])){           /* [x,n,g(x),f(x)] */
                   A=newmat(2,2);B=mgen(2,"diag",[1],0);
                   for(I=1;I<=X[1];I++){
                           A[1][1]=0;A[0][1]=1;
                           A[1][0]=Ex?myfeval(X[2],[X[0],I]):subst(X[2],X[0],I);
                           A[0][0]=Ex?myfeval(X[3],[X[0],I]):subst(X[3],X[0],I);
                           if(vars(A)!=[]) A=red(A);
                           B=B*A;
                           if(vars(B)!=[]) B=red(B);
                   }
                   if(getopt(var)==1) return [B[1][0],B[0][0]];
                   B=B[1][0]/B[0][0];
                   if(vars(B)!=[]) B=red(B);
                   return B;
           }
           if(Ex||(type(car(X))==4&&length(car(X))==2)){
                   if(type(car(X))!=4){
                           N=car(X);X=cdr(X);
                   }
                   if(getopt(reg)==1){                     /* normal */
                           for(R=[N], F=1;X!=[];X=cdr(X)) {
                                   if(type(car(X))==4){
                                           F=car(X)[0]/F;
                                           R=cons(car(X)[1]/F,R);
                                   }else{
                                           F=1/F;
                                           R=cons(car(X)/F,R);
                                   }
                           }
                           return reverse(R);
                   }
                   A=newmat(2,2);B=mgen(2,"diag",[1],0);
                   for(I=0,TX=X;TX!=[];TX=cdr(TX),I++){
                           A[1][1]=0;A[0][1]=1;
                           if(type(car(TX))!=4){
                                    A[1][0]=1;A[0][0]=car(TX);
                           }else{
                                   A[1][0]=car(TX)[0];A[0][0]=car(TX)[1];
                           }
                           if(vars(A)!=[]) A=red(A);
                           B=B*A;
                           if(vars(B)!=[]) B=red(B);
                   }
                   if(getopt(var)==1) return [N,B[1][0],B[0][0]];
                   B=N+B[1][0]/B[0][0];
                   if(vars(B)!=[]) B=red(B);
                   return B;
           }
         if(type(L=getopt(loop))==1&&L>0)          if(type(L=getopt(loop))==1&&L>0)
                 C=x;                  C=x;
         else{          else{
                 C=0;L=0;                  C=0;L=0;
         }          }
         if(L>1){          Sg=getopt(neg)==1?-1:1;
           if(L>1){                        /* circulate */
                 for(Y=[];L>1;L--){                  for(Y=[];L>1;L--){
                         Y=cons(car(X),Y);                          Y=cons(car(X),Y);
                         X=cdr(X);                          X=cdr(X);
Line 17517  def cfrac2n(X)
Line 22116  def cfrac2n(X)
                 if(X!=[]){                  if(X!=[]){
                         P=cfrac2n(X|loop=1);                          P=cfrac2n(X|loop=1);
                         for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))                          for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))
                                 V=sqrt2rat(car(Y)+1/V);                                  V=sqrt2rat(car(Y)+Sg/V);
                         return V;                          return V;
                 }else{                  }else{
                         C=0;X=reverse(Y);                          C=0;X=reverse(Y);
                 }                  }
         }          }
         for(V=C,X=reverse(X);X!=[];X=cdr(X)){          for(V=C,X=reverse(X);X!=[];X=cdr(X)){
                 if(V!=0) V=1/V;                  if(V!=0) V=Sg/V;
                 V+=car(X);                  V+=car(X);
         }          }
         if(C!=0){          if(C!=0){
                 V=red(V);P=dn(V)*x-nm(V);                  V=red(V);P=dn(V)*x-nm(V);
                 S=getroot(P,x|cpx=2);                  S=getroot(P,x|cpx=2);
                 T=map(eval,S);                  T=map(eval,S);
                 V=(T[0]>0)?S[0]:S[1];                  V=T[0]>0?S[0]:S[1];
         }          }
         return V;          return V;
 }  }
Line 17701  def sp2grs(M,A,L)
Line 22300  def sp2grs(M,A,L)
                 if(type(A) == 4)                  if(type(A) == 4)
                         AA = rtostr(A[I]);                          AA = rtostr(A[I]);
                 else                  else
                         AA = rtostr(A)+rtostr(I);                          AA = rtostr(A)+rtostr(I);
                   Con=getopt(con);
                 for(J = LM = length(MI)-1; J >= 0; J--){                  for(J = LM = length(MI)-1; J >= 0; J--){
                         V = MI[J];                          V = MI[J];
                         if(type(V) > 3)                          if(type(V) > 3)
Line 17711  def sp2grs(M,A,L)
Line 22311  def sp2grs(M,A,L)
                         else{                          else{
                                 if(LM == 1)                                  if(LM == 1)
                                         MN = cons([V, (J==0)?0:makev([AA])], MN);                                          MN = cons([V, (J==0)?0:makev([AA])], MN);
                                 else if(I == 1 && Mat == 0)                                  else if(I == 1 && Con==1 && Mat == 0)
                                         MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);                                          MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);
                                 else                                  else
                                         MN = cons([V, (J==0)?0:makev([AA,J])], MN);                                          MN = cons([V, (J==0)?0:makev([AA,J])], MN);
Line 18941  def bernoulli(N)
Line 23541  def bernoulli(N)
 }  }
   
 /* linfrac01([x,y]) */  /* linfrac01([x,y]) */
 /* linfrac01(newvect(10,[0,1,2,3,4,5,6,7,8,9]) */  /* (x_0,x_1,x_2,x_3,...,x_{q+3})=(x,0,1,y_1,...,y_q,\infty)
 /* 0:x=0, 1:x=y, 2:x=1, 3:y=0, 4:y=1, 5:x=\infty, 6:y=\infty, 7:x=y=0, 8:x=y=1, 9:x=y=\infty  
          10:y_2=0, 11:y_2=x, 12:y_2=y, 13: y_2=1,   14: y_2=\infty  
          15:y_3=0, 16:y_3=x, 17:y_3=y, 18: y_3=y_2, 19: y_3=1, 20:y_3=\infty  
          X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],  
          X[3],X[1],X[12],X[4],X[6]  
   
         T=0   (x_2,x_1,x_3,x_4,...)          T=0   (x_2,x_1,x_3,x_4,...)
         T=-j  (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)          T=-j  (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)
         T=1   (1-x_1,1-x_2,1-x_3,1-x_4,...)          T=1   (1-x_1,1-x_2,1-x_3,1-x_4,...)
         T=2   (1/x_1,1/x_2,1/x_3,1/x_4,...)          T=2   (1/x_1,1/x_2,1/x_3,1/x_4,...)
         T=3   (x_1,x_1/x_2,x_1/x_3,x_1/x_4,...)          T=3   (1/x_1,x_2/x_1,x_3/x_1,x_4/x_1,...)
       ...
 */  */
   
 def lft01(X,T)  def lft01(X,T)
 {  {
         MX=getopt();          S=0;
         if(type(X)==4){          if(type(X)==4){
                   if(type(car(X))==4){
                           S=X[1];X=car(X);
                   }
                 K=length(X);                  K=length(X);
                 if(K>=1) D=1;                  if(K>=1) D=1;
         }          }
         if(type(X)==5){          if(D==0) return 0;
                 K=length(X);          if(type(T)==4&&type(car(T))==4&&length(T)==2){
                 for(J=5, F=K-10; F>0; F-=J++);                  U=newvect(K+3);
                 if(F==0) D=2;                  for(I=0;I<K+3;I++) U[I]=I;
         }                  for(S0=T[0],S1=T[1];S1!=[];S0=cdr(S0),S1=cdr(S1)){
         if(D==0) return 0;                          for(J=0,TU=car(S0);;J++){
         if(T==0){  /* x <-> y */                                  if(TU=="infty") T0=K+2;
                 if(D==1){                                  else if(TU==0) T0=1;
                         R=cdr(X); R=cdr(R);                                  else if(TU==1) T0=2;
                         R=cons(X[0],R);                                  else {
                         return cons(X[1],R);                                          if((I=findin(TU,X))<0) return 0;
                                           if(I==0) T0=0;
                                           else T0=I+2;
                                   }
                                   if(J){
                                           U[T1]=T0;
                                           break;
                                   }
                                   T1=T0;
                                   TU=car(S1);
                           }
                   }
                   T=vtol(U);
                   for(I=0;I<K+3;I++) if(findin(I,U)<0) return 0;
           }
           if(type(T)==4&&(length(T)==K+3||length(T)==2)){
                   for(U=[],I=K+2;I>=0;I--) U=cons(I,U);
                   if(length(T)==2) T=mperm(U,[T],0);
                   L=sexps(T);
                   for(R=[X,S];L!=[];L=cdr(L)){
                           if(!(I=car(L))) I=4;
                           /* else if(I==1) I=1; */
                           else if(I==2) I=5;
                           else if(I==K+1) I=6;
                           else if(I>2) I=2-I;
                           R=lft01(R,I);
                 }                  }
                 R=newvect(K,[X[3],X[1],X[4],X[0],X[2],X[6],X[5]]);  
                 for(I=7;I<K;I++) R[I]=X[I];  
                 for(I=11,J=5; I<K; I+=J++){  
                         R[I]=X[I+1]; R[I+1]=X[I];  
                 }  
                 return R;                  return R;
         }          }
         if(T==1){          if(!S) S=getopt(tr);
                 if(D==1){          if(type(S)==4&&length(S)==K+3){
                         for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);                  D=2;
                         return reverse(R);          }else if(S==1) for(S=[],I=K+2;I>=0;I--) S=cons(I,S);
           else S=0;
           if(T<=0){  /* y_i <-> y_{i+1}, y_0=x=x_0, y_i=x_{i+2} */
                   R=mperm(X,[[-T,1-T]],0);
                   if(S){
                           if(!T) S=mperm(S,[[0,3]],0);
                           else   S=mperm(S,[[2-T,3-T]],0); /* : J J=3,...,K; */
                           R=[R,S];
                 }                  }
                 R=newvect(K,[X[2],X[1],X[0],X[4],X[3],X[5],X[6],X[8],X[7],X[9]]);  
                 for(I=11;I<K;I++) R[I]=X[I];  
                 for(I=10, J=5; I<K; I+=J++){  
                         R[I]=X[I+J-2]; R[I+J-2]=X[I];  
                 }  
                 return R;                  return R;
         }          }else if(T==1){ /* (x_1=0, x_2=1) : 1 */
         if(T==2){                  for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);
                 if(D==1){                  if(S) S=mperm(S,[[1,2]],0);
                         for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);          }else if(T==2){ /* (x_1=0, x_{K+2}=infty) */
                         return reverse(R);                  for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);
                 }                  if(S) S=mperm(S,[[1,K+2]],0);
                 R=newvect(K,[X[5],X[1],X[2],X[6],X[4],X[0],X[3],X[9],X[8],X[7]]);          }else if(T==3){ /* (x_0=x, x_2=1) */
                 for(I=11;I<K;I++) R[I]=X[I];                  T=car(X);
                 for(I=10,J=5; I<K; I+=J++){                  for(R=[red(1/T)],X=cdr(X); X!=[]; X=cdr(X)) R=cons(red(car(X)/T),R);
                         R[I]=X[I+J-1]; R[I+J-1]=X[I];                  if(S) S=mperm(S,[[0,2]],0);
                 }          }else if(T==4){ /* (x_0=x,x_1=0) : 0 */
                 return R;                  T=car(X);
         }                  for(R=[red(T/(T-1))],X=cdr(X); X!=[]; X=cdr(X)) R=cons(red((T-car(X))/(T-1)),R);
         if(T==3){                  if(S) S=mperm(S,[[0,1]],0);
                 if(D==1){          }else if(T==5){ /* (x_2=1,x_3=y) : 2 */
                         T=car(X);                  T=X[1];
                         for(R=[T],X=cdr(X); X!=[]; X=cdr(X))                  for(R=[1/T,red(X[0]/T)],X=cdr(cdr(X));X!=[]; X=cdr(X)) R=cons(red(car(X)/T),R);
                                 R=cons(red(T/car(X)),R);                  if(S) S=mperm(S,[[2,3]],0);
                         return reverse(R);          }else if(T==6){ /* (x_{K+1}=y_{K-1}, x_{K+2}=infty) : K+1 */
                 }                  T=X[K-1];
                 R=newvect(K,[X[7],X[4],X[2],X[6],X[1],X[9],X[3],X[0],X[8],X[5]]);                  for(R=[];length(X)>1;X=cdr(X)) R=cons(red(car(X)*(1-T)/(car(X)-T)),R);
                 for(I=10,J=5; I<K; I+=J++){                  R=cons(1-T,R);
                         R[I]=X[I+J-1]; R[I+1]=X[I+J-2]; R[I+J-2]=X[I+1]; R[I+J-1]=X[I];                  if(S) S=mperm(S,[[K+1,K+2]],0);
                 }          }else if(T==7){ /* x_2=1 <-> x_{K+2}=infty */
                 return R;                  for(R=[];X!=[];X=cdr(X)) R=cons(red(car(X)/(car(X)-1)),R);
         }                  if(S) S=mperm(S,[[2,K+2]],0);
         if(T==-1){          }else if(T==8) { /* x_0=x <-> x_{K+2}=infty */
                 if(D==1){                  T=car(X);
                         return append([X[1],X[2],X[0]],cdr(cdr(cdr(X))));                  for(R=[1-car(X)], X=cdr(X); X!=[]; X=cdr(X)) R=cons(red((T-1)*car(X)/(T-car(X))),R);
                 }                  if(S) S=mperm(S,[[0,K+2]],0);
                 R=newvect(K,[X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],          }else return 0;
                          X[3],X[1],X[12],X[4],X[6]]);          R=reverse(R);
                 for(I=11;I<K;I++) R[I]=X[I];          return S?[R,S]:R;
                 for(I=17,J=5; I<K; I+=J++){  
                         R[I]=X[I+1]; R[I+1]=X[I];  
                 }  
                 return R;  
         }  
         if(T<0){  
                 if(D==1){  
                         for(R=[],I=0; X!=[]; X=cdr(X),I--){  
                                 if(I==T){  
                                         R=cons(X[1],R);  
                                         R=cons(X[0],R);  
                                         X=cdr(X);  
                                 }  
                                 else R=cons(car(X),R);  
                         }  
                         return reverse(R);  
                 }  
                 T=3-T;  
                 R=newvect(K);  
                 for(I=0;I<K;I++) R[I]=X[I];  
                 for(I=10,J=5;J<T;I+=J++);  
                 for(II=0; II<J-2; II++){  
                         R[I]=X[I+J]; R[I+J]=R[I];  
                 }  
                 for( ; II<J; II++){  
                         R[I]=X[I+J+1]; R[I+J+1]=X[I];  
                 }  
                 return R;  
         }  
         return 0;  
 }  }
   
 def linfrac01(X)  def linfrac01(X)
 {  {
         if(type(X)==4) K=length(X)-2;          if(type(X)==4){
         else if(type(X)==5){                  K=length(X)-2;
                 L=length(X);                  if(type(car(X))==4){
                 for(K=0,I=10,J=5; I<L; K++,I+=J++);                          for(U=[],I=K+4;I>=0;I--) U=cons(I,U);
                 if(I!=L) return 0;                          X=[car(X),U];
                   }else U=0;
         }          }
         if(K>3 && getopt(over)!=1) return(-1);          if(K>3 && getopt(over)!=1) return(-1);
         II=(K==-1)?3:4;          II=(K==-1)?3:4;
Line 19078  def linfrac01(X)
Line 23669  def linfrac01(X)
                         }                          }
                 }                  }
         }          }
         return L;          return reverse(L);
 }  }
   
   
Line 19498  def distpoint(L)
Line 24089  def distpoint(L)
   
 def keyin(S)  def keyin(S)
 {  {
         print(S,2);          mycat0(S,0);
         purge_stdin();          purge_stdin();
         S=get_line();          S=get_line();
         L=length(S=strtoascii(S));          L=length(S=strtoascii(S));

Legend:
Removed from v.1.23  
changed lines
  Added in v.1.96

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>