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

Annotation of OpenXM/src/asir-contrib/packages/src/os_muldif.rr, Revision 1.40

1.40    ! takayama    1: /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.39 2018/10/17 01:37:10 takayama Exp $ */
1.6       takayama    2: /* The latest version will be at ftp://akagi.ms.u-tokyo.ac.jp/pub/math/muldif
                      3:  scp os_muldif.[dp]* ${USER}@lemon.math.kobe-u.ac.jp:/home/web/OpenXM/Current/doc/other-docs
                      4: */
                      5: #define USEMODULE 1
                      6: /* #undef USEMODULE */
                      7:
                      8: /*             os_muldif.rr (Library for Risa/Asir)
1.35      takayama    9:  *          Toshio Oshima (Nov. 2007 - Sep. 2018)
1.6       takayama   10:  *
                     11:  *   For polynomials and differential operators with coefficients
                     12:  *   in rational funtions (See os_muldif.pdf)
                     13:  *
                     14:  *   "Tab = 4 column" is best
                     15:  */
                     16:
                     17: ord([zz,dz,dy,dx])$
                     18:
                     19: #ifdef USEMODULE
                     20: module os_md;
                     21: static Muldif.rr$
                     22: static TeXEq$
                     23: static TeXLim$
                     24: static DIROUT$
1.16      takayama   25: static DIROUTD$
1.6       takayama   26: static DVIOUTL$
                     27: static DVIOUTA$
                     28: static DVIOUTB$
                     29: static DVIOUTH$
                     30: static DVIOUTF$
                     31: static LCOPT$
                     32: static COLOPT$
                     33: static LPOPT$
                     34: static LFOPT$
                     35: static ErMsg$
                     36: static FLIST$
                     37: static IsYes$
                     38: static XYPrec$
                     39: static XYcm$
                     40: static TikZ$
                     41: static XYLim$
                     42: static Canvas$
                     43: static ID_PLOT$
                     44: static Rand$
                     45: static LQS$
                     46: localf spType2$
                     47: localf erno$
                     48: localf chkfun$
                     49: localf makev$
                     50: localf shortv$
                     51: localf makenewv$
                     52: localf vweyl$
                     53: localf mycat$
                     54: localf mycat0$
1.9       takayama   55: localf fcat$
1.6       takayama   56: localf findin$
                     57: localf countin$
                     58: localf mycoef$
                     59: localf mydiff$
                     60: localf myediff$
                     61: localf m2l$
                     62: localf m2ll$
                     63: localf mydeg$
                     64: localf pfctr$
                     65: localf mymindeg$
                     66: localf m1div$
                     67: localf mulsubst$
                     68: localf cmpsimple$
                     69: localf simplify$
                     70: localf monotos$
                     71: localf minustos$
                     72: localf monototex$
                     73: localf vnext$
                     74: localf ldict$
                     75: localf ndict$
                     76: localf nextsub$
                     77: localf nextpart$
                     78: localf transpart$
                     79: localf trpos$
                     80: localf sprod$
                     81: localf sinv$
                     82: localf slen$
                     83: localf sord$
                     84: localf vprod$
                     85: localf dvangle$
                     86: localf dvprod$
                     87: localf dnorm$
                     88: localf mulseries$
                     89: localf pluspower$
                     90: localf vtozv$
                     91: localf dupmat$
                     92: localf matrtop$
                     93: localf mytrace$
                     94: localf mydet$
                     95: localf mperm$
                     96: localf mtranspose$
                     97: localf mtoupper$
                     98: localf mydet2$
                     99: localf myrank$
                    100: localf meigen$
                    101: localf transm$
                    102: localf vgen$
                    103: localf mmc$
                    104: localf lpgcd$
                    105: localf mdivisor$
                    106: localf mdsimplify$
                    107: localf m2mc$
                    108: localf easierpol$
                    109: localf paracmpl$
                    110: localf mykernel$
                    111: localf myimage$
                    112: localf mymod$
                    113: localf mmod$
                    114: localf ladd$
                    115: localf lchange$
                    116: localf llsize$
                    117: localf llbase$
                    118: localf lsort$
1.22      takayama  119: localf lpair$
1.6       takayama  120: localf lmax$
                    121: localf lmin$
                    122: localf lgcd$
                    123: localf llcm$
                    124: localf ldev$
                    125: localf lsol$
                    126: localf lnsol$
                    127: localf l2p$
                    128: localf m2v$
                    129: localf lv2m$
                    130: localf m2lv$
                    131: localf s2m$
                    132: localf c2m$
                    133: localf m2diag$
                    134: localf myinv$
                    135: localf madjust$
                    136: localf mpower$
                    137: localf mrot$
                    138: localf texlen$
                    139: localf isdif$
                    140: localf fctrtos$
                    141: localf texlim$
                    142: localf fmult$
                    143: localf radd$
                    144: localf getel$
                    145: localf ptol$
                    146: localf rmul$
                    147: localf mtransbys$
                    148: localf drawopt$
                    149: localf execdraw$
                    150: localf execproc$
                    151: localf myswap$
                    152: localf mysubst$
                    153: localf evals$
                    154: localf myval$
                    155: localf myeval$
                    156: localf mydeval$
                    157: localf myfeval$
                    158: localf myf2eval$
                    159: localf myf3eval$
                    160: localf myfdeval$
                    161: localf myf2deval$
                    162: localf myf3deval$
                    163: localf myexp$
                    164: localf mycos$
                    165: localf mysin$
                    166: localf mytan$
                    167: localf myarg$
                    168: localf myasin$
                    169: localf myacos$
                    170: localf myatan$
                    171: localf mylog$
                    172: localf mypow$
1.13      takayama  173: localf scale$
1.6       takayama  174: localf arg$
                    175: localf sqrt$
                    176: localf gamma$
                    177: localf lngamma$
                    178: localf digamma$
                    179: localf dilog$
                    180: localf zeta$
                    181: localf eta$
                    182: localf jell$
                    183: localf frac$
                    184: localf erfc$
1.20      takayama  185: localf orthpoly$
                    186: localf schurpoly$
1.6       takayama  187: localf fouriers$
                    188: localf todf$
                    189: localf f2df$
                    190: localf df2big$
                    191: localf compdf$
                    192: localf fzero$
                    193: localf fmmx$
                    194: localf flim$
                    195: localf fcont$
                    196: localf fresidue$
                    197: localf mmulbys$
                    198: localf appldo$
                    199: localf appledo$
                    200: localf muldo$
                    201: localf jacobian$
                    202: localf hessian$
                    203: localf wronskian$
                    204: localf adj$
                    205: localf laplace1$
                    206: localf laplace$
                    207: localf mce$
                    208: localf mc$
                    209: localf rede$
                    210: localf ad$
                    211: localf add$
                    212: localf vadd$
                    213: localf addl$
                    214: localf cotr$
                    215: localf rcotr$
                    216: localf muledo$
                    217: localf mulpdo$
                    218: localf transpdosub$
                    219: localf transpdo$
                    220: localf translpdo$
                    221: localf rpdiv$
                    222: localf mygcd$
                    223: localf mylcm$
                    224: localf sftpexp$
                    225: localf applpdo$
                    226: localf tranlpdo$
                    227: localf divdo$
                    228: localf qdo$
                    229: localf sqrtdo$
                    230: localf ghg$
                    231: localf ev4s$
                    232: localf b2e$
                    233: localf sftpow$
                    234: localf sftpowext$
                    235: localf polinsft$
                    236: localf pol2sft$
                    237: localf polroots$
                    238: localf fctri$
                    239: localf binom$
                    240: localf expower$
                    241: localf seriesHG$
                    242: localf seriesMc$
                    243: localf seriesTaylor$
1.27      takayama  244: localf mulpolyMod$
1.26      takayama  245: localf taylorODE$
1.6       takayama  246: localf evalred$
                    247: localf toeul$
                    248: localf fromeul$
                    249: localf sftexp$
                    250: localf fractrans$
                    251: localf soldif$
                    252: localf chkexp$
                    253: localf sqrtrat$
                    254: localf getroot$
                    255: localf expat$
                    256: localf polbyroot$
                    257: localf polbyvalue$
                    258: localf pcoef$
                    259: localf prehombf$
                    260: localf prehombfold$
                    261: localf sub3e$
                    262: localf fuchs3e$
                    263: localf okubo3e$
                    264: localf eosub$
                    265: localf even4e$
                    266: localf odd5e$
                    267: localf extra6e$
                    268: localf rigid211$
                    269: localf solpokuboe$
                    270: localf stoe$
                    271: localf dform$
                    272: localf polinvsym$
                    273: localf polinsym$
                    274: localf tohomog$
                    275: localf substblock$
                    276: localf okuboetos$
                    277: localf heun$
                    278: localf fspt$
                    279: localf abs$
1.20      takayama  280: localf sgn$
1.6       takayama  281: localf calc$
                    282: localf isint$
                    283: localf israt$
                    284: localf iscrat$
                    285: localf isalpha$
                    286: localf isnum$
                    287: localf isalphanum$
1.8       takayama  288: localf isdecimal$
1.6       takayama  289: localf isvar$
                    290: localf isyes$
                    291: localf isall$
                    292: localf iscoef$
                    293: localf iscombox$
                    294: localf sproot$
                    295: localf spgen$
                    296: localf chkspt$
                    297: localf cterm$
                    298: localf terms$
                    299: localf polcut$
                    300: localf redgrs$
                    301: localf cutgrs$
                    302: localf mcgrs$
                    303: localf mc2grs$
                    304: localf mcmgrs$
1.38      takayama  305: localf spslm$
1.6       takayama  306: localf anal2sp$
                    307: localf delopt$
                    308: localf str_char$
                    309: localf str_pair$
                    310: localf str_cut$
                    311: localf str_str$
                    312: localf str_subst$
                    313: localf str_times$
                    314: localf str_tb$
                    315: localf strip$
                    316: localf i2hex$
                    317: localf sjis2jis$
                    318: localf jis2sjis$
                    319: localf s2os$
                    320: localf l2os$
                    321: localf r2os$
                    322: localf s2euc$
                    323: localf s2sjis$
                    324: localf r2ma$
                    325: localf evalma$
                    326: localf ssubgrs$
                    327: localf verb_tex_form$
                    328: localf tex_cuteq$
                    329: localf my_tex_form$
                    330: localf texket$
                    331: localf smallmattex$
                    332: localf divmattex$
                    333: localf dviout0$
                    334: localf myhelp$
                    335: localf isMs$
                    336: localf showbyshell$
                    337: localf readcsv$
                    338: localf tocsv$
                    339: localf getbyshell$
                    340: localf show$
                    341: localf dviout$
                    342: localf rtotex$
                    343: localf mtotex$
                    344: localf ltotex$
                    345: localf texbegin$
                    346: localf texcr$
                    347: localf texsp$
                    348: localf getbygrs$
                    349: localf mcop$
                    350: localf shiftop$
                    351: localf conf1sp$
1.34      takayama  352: localf confexp$
1.36      takayama  353: localf confspt$
1.38      takayama  354: localf partspt$
1.6       takayama  355: localf pgen$
                    356: localf diagm$
                    357: localf mgen$
                    358: localf madj$
                    359: localf newbmat$
                    360: localf unim$
                    361: localf pfrac$
                    362: localf cfrac$
                    363: localf cfrac2n$
                    364: localf sqrt2rat$
                    365: localf s2sp$
                    366: localf sp2grs$
                    367: localf fimag$
                    368: localf trig2exp$
                    369: localf intpoly$
                    370: localf integrate$
1.22      takayama  371: localf rungeKutta$
1.6       takayama  372: localf simplog$
                    373: localf fshorter$
                    374: localf isshortneg$
                    375: localf intrat$
                    376: localf powsum$
                    377: localf bernoulli$
                    378: localf lft01$
                    379: localf linfrac01$
                    380: localf nthmodp$
                    381: localf issquaremodp$
                    382: localf rootmodp$
                    383: localf rabin$
                    384: localf primroot$
                    385: localf varargs$
                    386: localf ptype$
                    387: localf pfargs$
                    388: localf average$
1.23      takayama  389: localf tobig$
1.6       takayama  390: localf sint$
                    391: localf frac2n$
                    392: localf xyproc$
                    393: localf xypos$
                    394: localf xyput$
                    395: localf xybox$
                    396: localf xyline$
                    397: localf xylines$
                    398: localf xycirc$
                    399: localf xybezier$
                    400: localf lbezier$
                    401: localf draw_bezier$
                    402: localf tobezier$
                    403: localf velbezier$
                    404: localf ptbezier$
                    405: localf cutf$
                    406: localf fsum$
                    407: localf fint$
                    408: localf periodicf$
                    409: localf cmpf$
                    410: localf areabezier$
                    411: localf saveproc$
                    412: localf xygraph$
                    413: localf xy2graph$
1.22      takayama  414: localf addIL$
1.19      takayama  415: localf xy2curve$
1.18      takayama  416: localf xygrid$
1.6       takayama  417: localf xyarrow$
                    418: localf xyarrows$
                    419: localf xyang$
                    420: localf xyoval$
1.33      takayama  421: localf xypoch$
1.6       takayama  422: localf ptcommon$
                    423: localf ptcopy$
                    424: localf ptaffine$
                    425: localf ptlattice$
                    426: localf ptpolygon$
                    427: localf ptwindow$
                    428: localf ptbbox$
                    429: localf lninbox$
                    430: localf ptcombezier$
                    431: localf ptcombz$
                    432: localf lchange$
                    433: localf init$
                    434: localf powprimroot$
                    435: localf distpoint$
                    436: localf ntable$
                    437: localf keyin$
                    438: localf mqsub$
                    439: localf msort$
                    440: #else
                    441: extern Muldif.rr$
                    442: extern TeXEq$
                    443: extern TeXLim$
                    444: extern DIROUT$
1.16      takayama  445: extern DIROUTD$
1.6       takayama  446: extern DVIOUTL$
                    447: extern DVIOUTA$
                    448: extern DVIOUTB$
                    449: extern DVIOUTH$
                    450: extern DVIOUTF$
                    451: static LCOPT$
                    452: static COLOPT$
                    453: static LPOPT$
                    454: static LFOPT$
                    455: extern TikZ$
                    456: extern ErMsg$
                    457: extern FLIST$
                    458: extern IsYes$
                    459: extern XYPrec$
                    460: extern XYcm$
                    461: extern TikZ$
                    462: extern XYLim$
                    463: extern Canvas$
                    464: extern ID_PLOT$
                    465: extern Rand$
                    466: extern LQS$
                    467: #endif
                    468: static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$
1.16      takayama  469: static S_FDot$
1.6       takayama  470: extern AMSTeX$
1.38      takayama  471: Muldif.rr="00181008"$
1.6       takayama  472: AMSTeX=1$
                    473: TeXEq=5$
                    474: TeXLim=80$
                    475: TikZ=0$
                    476: XYcm=0$
                    477: XYPrec=3$
                    478: XYLim=4$
                    479: Rand=0$
                    480: DIROUT="%HOME%\\tex"$
                    481: DVIOUTL="%ASIRROOT%\\bin\\risatex0.bat"$
                    482: DVIOUTA="%ASIRROOT%\\bin\\risatex.bat"$
                    483: DVIOUTB="%ASIRROOT%\\bin\\risatex1%TikZ%.bat"$
                    484: DVIOUTH="start dviout -2 -hyper=0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #%LABEL%"$
                    485: DVIOUTF=0$
                    486: LCOPT=["red","green","blue","yellow","cyan","magenta","black","white","gray"]$
                    487: COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$
                    488: LPOPT=["above","below","left","right"]$
                    489: LFOPT=["very thin","thin","dotted","dashed"]$
                    490: Canvas=[400,400]$
                    491: LQS=[[1,0]]$
                    492:
                    493: ErMsg = newvect(3,[
                    494:  "irregal argument", /* 0 */
                    495:  "too big size",     /* 1 */
                    496:  "irregal option"    /* 2 */
                    497: ])$
                    498: FLIST=0$
                    499: IsYes=[]$
                    500: ID_PLOT=-1$
                    501:
                    502: def erno(N)
                    503: {
                    504:        /* extern ErMsg; */
                    505:        print(ErMsg[N]);
                    506: }
                    507:
                    508: def chkfun(Fu, Fi)
                    509: {
                    510:        /* extern FLIST; */
                    511:        /* extern Muldif.rr; */
                    512:
                    513:        if(type(Fu) <= 1){
                    514:                if(Fu==1)
                    515:                        mycat(["Loaded os_muldif Ver.", Muldif.rr, "(Toshio Oshima)"]);
                    516:                else
                    517:                        mycat(["Risa/Asir Ver.", version()]);
                    518:                return 1;
                    519:        }
                    520:        if(type(FLIST) < 4)
                    521:                FLIST = flist();
                    522:        if(type(Fu) == 4){
                    523:                for(; Fu != [] ;Fu = cdr(Fu))
                    524:                        if(chkfun(car(Fu),Fi) == 0) return 0;
                    525:                return 1;
                    526:        }
                    527:        if(findin(Fu, FLIST) >= 0)
                    528:                return 1;
                    529:        FLIST = flist();
                    530:        if(findin(Fu, FLIST) >= 0)
                    531:                return 1;
                    532:        if(type(Fi)==7){
                    533:                mycat0(["load(\"", Fi,"\") -> try again!\n"],1);
                    534:                load(Fi);
                    535:        }
                    536:        return 0;
                    537: /*
                    538:        if(type(Fi) == 7)
                    539:                Fi = [Fi];
                    540:        for( ; Fi != []; Fi = cdr(Fi))
                    541:                load(car(Fi));
                    542:        FLIST = flist();
                    543:        return (findin(Fu,FLIST)>=0)?1:0;
                    544: */
                    545: }
                    546:
                    547: def makev(L)
                    548: {
                    549:        S = "";
                    550:        Num=getopt(num);
                    551:        while(length(L) > 0){
                    552:                VL = car(L); L = cdr(L);
                    553:                if(type(VL) == 7)
                    554:                        S = S+VL;
                    555:                else if(type(VL) == 2 || VL < 10)
                    556:                        S = S+rtostr(VL);
                    557:                else if(VL<46 && Num!=1)
                    558:                        S = S+asciitostr([VL+87]);
                    559:                else
                    560:                        S = S+rtostr(VL);
                    561:        }
                    562:        return strtov(S);
                    563: }
                    564:
                    565: def makenewv(L)
                    566: {
                    567:        if((V=getopt(var))<2) V="z_";
                    568:        else if(isvar(V)) V=rtostr(V);
                    569:        if(type(N=getopt(num))!=1) N=0;
1.21      takayama  570:        Var=varargs(L|all=2);
1.6       takayama  571:        for(XX=[],I=J=0;;I++){
                    572:                X=strtov(V+rtostr(I));
                    573:                if(findin(X,Var)<0){
                    574:                        XX=cons(X,XX);
                    575:                        if(++J>N) return X;
                    576:                        else if(J==N)  return reverse(XX);
                    577:                }
                    578:        }
                    579: }
                    580:
                    581: def shortv(P,L)
                    582: {
                    583:        V=vars(P);
                    584:        if(type(T=getopt(top))==2) T=strtoascii(rtostr(T))[0]-87;
                    585:        else T=10;
                    586:        for(;L!=[];L=cdr(L)){
                    587:                for(J=0;J<36;J++){
                    588:                        if(findin(X=makev([car(L),J]|num=1),V)>=0){
                    589:                                while(findin(Y=makev([T]),V)>=0) T++;
                    590:                                if(T>35) return P;
                    591:                                P=subst(P,X,Y);
                    592:                                T++;
                    593:                        }else if(J>0) break;
                    594:                }
                    595:        }
                    596:        return P;
                    597: }
                    598:
                    599: def vweyl(L)
                    600: {
                    601:        if(type(L) == 4){
                    602:                if(length(L) == 2)
                    603:                        return L;
                    604:                else
                    605:                        return [L[0],makev(["d",L[0]])];
                    606:        }
                    607:        /* else if(type(L)<2) return L; */
                    608:        return [L,makev(["d", L])];
                    609: }
                    610:
                    611: def mycat(L)
                    612: {
                    613:        if(type(L) != 4){
                    614:                print(L);
                    615:                return;
                    616:        }
                    617:        Opt = getopt(delim);
                    618:        Del = (type(Opt) >= 0)?Opt:" ";
                    619:        Opt = getopt(cr);
                    620:        CR = (type(Opt) >= 0)?0:1;
                    621:        while(L != []){
                    622:                if(Do==1)
                    623:                        print(Del,0);
                    624:                print(car(L),0);
                    625:                L=cdr(L);
                    626:                Do = 1;
                    627:        }
                    628:        if(CR) print("");
                    629: }
                    630:
1.9       takayama  631: def fcat(S,X)
                    632: {
                    633:        if(type(S)!=7){
1.18      takayama  634:                if(type(DIROUTD)!=7){
                    635:                        DIROUTD=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],
                    636:                                [getenv("HOME"),get_rootdir(),"/"])+"/";
                    637:                        if(isMs()) DIROUTD=str_subst(DIROUTD,"/","\\"|sjis=1);
                    638:                }
                    639:                if(S==-1) return;
1.16      takayama  640:                T="fcat";
                    641:                if(S>=2&&S<=9) T+=rtostr(S);
                    642:                T=DIROUTD+T+".txt";
                    643:                if(S==-1) return T;
                    644:                if(S!=0&&access(T)) remove_file(T);
                    645:                S=T;
1.9       takayama  646:        }
1.19      takayama  647:        R=output(S);
1.9       takayama  648:        print(X);
                    649:        output();
1.16      takayama  650:        if(getopt(exe)==1) shell("\""+S+"\"");
1.19      takayama  651:        return R;
1.9       takayama  652: }
                    653:
1.6       takayama  654: def mycat0(L,T)
                    655: {
                    656:        Opt = getopt(delim);
                    657:        Del = (type(Opt) >= 0)?Opt:"";
1.20      takayama  658:        if(type(L)!=4) L=[L];
1.6       takayama  659:        while(L != []){
                    660:                if(Do==1)
                    661:                        print(Del,0);
                    662:                print(car(L),0);
                    663:                L=cdr(L);
                    664:                Do = 1;
                    665:        }
                    666:        if(T) print("");
                    667: }
                    668:
                    669: def findin(M,L)
                    670: {
                    671:        if(type(L)==4){
                    672:                for(I = 0; L != []; L = cdr(L), I++)
                    673:                        if(car(L) == M) return I;
                    674:        }else if(type(L)==5){
                    675:                K=length(L);
                    676:                for(I = 0; I < K; I++)
                    677:                        if(L[I] == M) return I;
                    678:        }else return -2;
                    679:        return -1;
                    680: }
                    681:
                    682: def countin(S,M,L)
                    683: {
1.10      takayama  684:        Step=getopt(step);
                    685:        if(type(Step)==1){
                    686:                N=(Step>0)?Step:-Step;
1.7       takayama  687:                if(type(L)==5) L=vtol(L);
                    688:                L=qsort(L);
                    689:                while(car(L)<S&&L!=[]) L=cdr(L);
                    690:                S+=M;
1.10      takayama  691:                for(R=[],C=I=0;L!=[];){
                    692:                        if(car(L)<S||(Step>0&&car(L)==S)){
1.7       takayama  693:                                C++;
                    694:                                L=cdr(L);
                    695:                        }else{
                    696:                                R=cons(C,R);C=0;S+=M;
1.10      takayama  697:                                if(N>1&&++I>=N) break;
1.7       takayama  698:                        }
                    699:                }
                    700:                if(C>0) R=cons(C,R);
1.10      takayama  701:                if(N>1&&(N-=length(R))>0) while(N-->0) R=cons(0,R);
1.7       takayama  702:                return reverse(R);
                    703:        }
1.6       takayama  704:        if(type(L)==4){
                    705:                for(N=0; L!=[]; L=cdr(L))
                    706:                        if(car(L)>=S && car(L)<=M) N++;
                    707:        }else if(type(L)==5){
                    708:                K=length(L);
                    709:                for(I = 0; I < K; I++)
                    710:                        if(L[I]>=S && L[I]<=M) N++;
                    711:        }else return -2;
                    712:        return N;
                    713: }
                    714:
                    715: def mycoef(P,N,X)
                    716: {
                    717:        if(type(P)<3 && type(N)<3)
                    718:                return coef(P,N,X);
                    719:        if(type(P) >= 4)
                    720: #ifdef USEMODULE
                    721:                return map(os_md.mycoef,P,N,X);
                    722: #else
                    723:                return map(mycoef,P,N,X);
                    724: #endif
                    725:        if(type(N)==4){
                    726:                for(;N!=[];N=cdr(N),X=cdr(X))
                    727:                        P=mycoef(P,car(N),car(X));
                    728:                return P;
                    729:        }
                    730:        if(deg(dn(P), X) > 0){
                    731:                P = red(P);
                    732:                if(deg(dn(P), X) > 0)
                    733:                        return 0;
                    734:        }
                    735:        return red(coef(nm(P),N,X)/dn(P));
                    736: }
                    737:
                    738: def mydiff(P,X)
                    739: {
                    740:        if(X == 0)
                    741:                return 0;
                    742:        if(type(P)<3 && type(X)<3)
                    743:                return diff(P,X);
                    744:        if(type(P) >= 4)
                    745: #ifdef USEMODULE
                    746:                return map(os_md.mydiff,P,X);
                    747: #else
                    748:                return map(mydiff,P,X);
                    749: #endif
                    750:        if(type(X)==4){
                    751:                for(;X!=[];X=cdr(X)) P=mydiff(P,car(X));
                    752:                return P;
                    753:        }
1.19      takayama  754:        if(ptype(dn(P),X)<2)
1.6       takayama  755:                return red(diff(nm(P),X)/dn(P));
                    756:        return red(diff(P,X));
                    757: }
                    758:
                    759: def myediff(P,X)
                    760: {
                    761:        if(X == 0)
                    762:                return 0;
                    763:        if(type(P) < 3)
                    764:                 return ediff(P,X);
                    765:        if(type(P) >= 4)
                    766: #ifdef USEMODULE
                    767:                return map(os_md.myediff,P,X);
                    768: #else
                    769:                return map(myediff,P,X);
                    770: #endif
                    771:        if(deg(dn(P),X) == 0)
                    772:                return red(ediff(nm(P),X)/dn(P));
                    773:        return red(X*diff(P,X));
                    774: }
                    775:
                    776: def m2l(M)
                    777: {
                    778:        if(type(M) < 4)
                    779:                return [M];
                    780:        if(type(M) == 4){
                    781:                if(type(car(M))==4 && getopt(flat)==1){
                    782:                        for(MM = []; M!=[]; M=cdr(M))
                    783:                                MM = append(MM,car(M));
                    784:                        return MM;
                    785:                }
                    786:                return M;
                    787:        }
                    788:        if(type(M) == 5)
                    789:                return vtol(M);
                    790:        S = size(M);
                    791:        for(MM = [], I = S[0]-1; I >= 0; I--)
                    792:                MM = append(vtol(M[I]), MM);
                    793:        return MM;
                    794: }
                    795:
                    796: def mydeg(P,X)
                    797: {
                    798:        if(type(P) < 3)
                    799:                return deg(P,X);
                    800:        II = -1;
                    801:        Opt = getopt(opt);
                    802:        if(type(P) >= 4){
                    803:                S=(type(P) == 6)?size(P)[0]:0;
                    804:                P = m2l(P);
                    805:                for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
                    806:                        if( (DT = mydeg(car(P),X)) == -2)
                    807:                                return -2;
                    808:                        if(DT > Deg){
                    809:                                Deg = DT;
                    810:                                II = I;
                    811:                        }
                    812:                }
                    813:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    814:        }
                    815:        P = red(P);
                    816:        if(deg(dn(P),X) == 0)
                    817:                return deg(nm(P),X);
                    818:        return -2;
                    819: }
                    820:
                    821: def pfctr(P,X)
                    822: {
                    823:        P=red(P);
                    824:        if((T=ptype(P,X))>3) return [];
                    825:        if(T==3){
                    826:                G=pfctr(dn(P),X);
                    827:                F=pfctr(nm(P),X);
                    828:                R=[[car(F)[0]/car(G)[0],1]];
                    829:                for(F=cdr(F);F!=[];F=cdr(F)) R=cons(car(F),R);
                    830:                for(G=cdr(G);G!=[];G=cdr(G)) R=cons([car(G)[0],-car(G)[1]],R);
                    831:                return reverse(R);
                    832:        }
                    833:        F=fctr(nm(P));
                    834:        for(R=[],C=1/dn(P);F!=[];F=cdr(F))
                    835:                if(mydeg(car(F)[0],X)>0) R=cons(car(F),R);
                    836:        else C*=car(F)[0]^car(F)[1];
                    837:        return cons([C,1],reverse(R));
                    838: }
                    839:
                    840: def mymindeg(P,X)
                    841: {
                    842:        if(type(P) < 3)
                    843:                return mindeg(P,X);
                    844:        II = -1;T=60;
                    845:        Opt = getopt(opt);
                    846:        if(type(P) >= 4){
                    847:                S=(type(P) == 6)?size(P)[0]:0;
                    848:                P = m2l(P);
                    849:                for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
                    850:                        if(car(P) == 0)
                    851:                                continue;
                    852:                        if( (DT = mydeg(car(P),X)) == -2)
                    853:                                return -2;
                    854:                        if(DT < Deg || Deg == -3){
                    855:                                if(DT==0){
                    856:                                        if(type(car(P))>=T) continue;
                    857:                                        T=type(car(P));
                    858:                                }
                    859:                                Deg = DT;
                    860:                                II = I;
                    861:                        }
                    862:                }
                    863:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    864:        }
                    865:        P = red(P);
                    866:        if(deg(dn(P),X) == 0)
                    867:                return mindeg(nm(P),X);
                    868:        return -2;
                    869: }
                    870:
                    871: def m1div(M,N,L)
                    872: {
                    873:        L = (type(L) <= 3)?[0,L]:vweyl[L];
                    874:        DX = L[1]; X = L[0];
                    875:        if(mydeg(N,DX) != 0)
                    876:                return 0;
                    877:        DD = mydeg(M,DX);
                    878:        MM = M;
                    879:        while( (Deg=mydeg(MM,DX)) > 0){
                    880:                MC = mycoef(MM,Deg,DX)*DX^(Deg-1);
                    881:                MS = radd(MC, MS);
                    882:                MM = radd(MM, muldo(MC,radd(-DX,N),L));
                    883:  }
                    884:  return [MM, MS];
                    885: }
                    886:
                    887:
                    888: def mulsubst(F,L)
                    889: {
                    890:        N = length(L);
                    891:        if(N == 0)
                    892:                return F;
                    893:        if(type(L[0])!=4)       L=[L];
                    894:        if(getopt(inv)==1){
                    895:                for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);
                    896:                L=reverse(R);
                    897:        }
                    898:        if(length(L)==1)        return mysubst(F,L);
                    899:        L1 = newvect(N);
                    900:        for(J = 0; J < N ; J++)
                    901:                L1[J] = uc();
                    902:        L2 = newvect(N);
                    903:        for(J = 0; J < N; J++){
                    904:                S = L[J][1];
                    905:                for(I = 0; I < N; I++)
                    906:                        S = mysubst(S,[L[I][0],L1[I]]);
                    907:                L2[J] = S;
                    908:        }
                    909:        for(J = 0; J < N; J++)
                    910:                F = mysubst(F, [L[J][0],L2[J]]);
                    911:        for(J = 0; J < N; J++)
                    912:                F = mysubst(F, [L1[J],L[J][0]]);
                    913:        return F;
                    914: }
                    915:
                    916: def cmpsimple(P,Q)
                    917: {
                    918:        T = getopt(comp);
                    919:        if(P == Q)
                    920:                return 0;
                    921:        D = 0;
                    922:        if(type(T) < 0)
                    923:                T = 7;
                    924:        if(iand(T,1))
                    925:                D = length(vars(P)) - length(vars(Q));
                    926:        if(!D && iand(T,2))
                    927:                D = nmono(P) - nmono(Q);
                    928:        if(!D && iand(T,4))
                    929:                D = str_len(rtostr(P)) - str_len(rtostr(Q));
                    930:        if(!D){
                    931:                 if(P > Q) D++;
                    932:                 else D--;
                    933:        }
                    934:        return D;
                    935: }
                    936:
                    937: def simplify(P,L,T)
                    938: {
                    939:        if(type(P) > 3)
                    940: #ifdef USEMODULE
                    941:                return map(os_md.simplify,P,L,T);
                    942: #else
                    943:                return map(simplify,P,L,T);
                    944: #endif
                    945:        if(type(L[0]) == 4){
                    946:                if(length(L[0]) > 1)
                    947: #if USEMODULE
                    948:                        return fmult(os_md.simplify,P,L,[T]);
                    949: #else
                    950:                        return fmult(simplify,P,L,[T]);
                    951: #endif
                    952:                L = L[0];
                    953:        }
                    954:        if(type(Var=getopt(var)) == 4 && Var!=[]){
                    955:                if(type(P) == 3)
                    956:                        return simplify(nm(P),P,L,T|var=Var)/simplify(dn(P),P,L,T|var=Var);
                    957:                V = car(Var);
                    958:                if((I = mydeg(P,V)) > 0){
                    959:                        Var = cdr(Var);
                    960:                        for(Q=0; I>=0 ; I--)
                    961:                                Q += simplify(mycoef(P,I,V), L, T|var=Var)*V^I;
                    962:                        return Q;
                    963:                }
                    964:        }
                    965:        if(length(L) == 1){
                    966:                L = car(L);
                    967:                for(V = vars(L); V != []; V = cdr(V)){
                    968:                        VT = car(V);
                    969:                        if(deg(L,VT) != 1) continue;
                    970:                        P = simplify(P, [VT, -red(coef(L,0,VT)/coef(L,1,VT))], T);
                    971:                }
                    972:                return P;
                    973:        }
                    974:        Q = mysubst(P,[L[0],L[1]]);
                    975:        return (cmpsimple(P,Q|comp=T) <= 0)?P:Q;
                    976: }
                    977:
                    978: def monotos(P)
                    979: {
                    980:        if(nmono(P) <= 1)
                    981:                return rtostr(P);
                    982:        return "("+rtostr(P)+")";
                    983: }
                    984:
                    985:
                    986: def monototex(P)
                    987: {
                    988:        Q=my_tex_form(P);
                    989:        if(nmono(P)<2 && (getopt(minus)!=1 || str_str(Q,"-"|top=0,end=0)<0))
                    990:                return Q;
                    991:        return "("+Q+")";
                    992: }
                    993:
                    994: def minustos(S)
                    995: {
                    996:        if(str_str(S,"-"|top=0,end=0)<0) return S;
                    997:        return "("+S+")";
                    998: }
                    999:
                   1000: def vnext(V)
                   1001: {
                   1002:        S = length(V);
                   1003:        for(I = S-1; I > 0; I--){
                   1004:                if(V[I-1] < V[I]){
                   1005:                        V0 = V[I-1];
                   1006:                        for(J = I+1; J < S; J++)
                   1007:                                if(V0 >= V[J]) break;
                   1008:                        V[I-1] = V[--J];
                   1009:                        V[J] = V0;
                   1010:                        for(J = S-1; I < J; I++, J--){
                   1011:                                V0 = V[I];
                   1012:                                V[I] = V[J];
                   1013:                                V[J] = V0;
                   1014:                        }
                   1015:                        return 1;
                   1016:                }
                   1017:        }
                   1018:        return 0;
                   1019: }
                   1020:
                   1021: def ldict(N, M)
                   1022: {
                   1023:        Opt = getopt(opt);
                   1024:        R = S = [];
                   1025:        for(I = 2; N > 0; I++){
                   1026:                R = cons(irem(N,I), R);
                   1027:                N = idiv(N,I);
                   1028:        }
                   1029:        L = LL = length(R);
                   1030:        T=newvect(LL+1);
                   1031:        while(L-- > 0){
                   1032:                V = car(R); R = cdr(R);
                   1033:                for(I = J = 0; J <= V ; I++){
                   1034:                        if(T[I] == 0)
                   1035:                                J++;
                   1036:                }
                   1037:                T[I-1] = 1;
                   1038:                S = cons(LL-I+1, S);
                   1039:        }
                   1040:        for(I = 0; I <= LL; I++){
                   1041:                if(T[I] == 0){
                   1042:                        S = cons(LL-I, S);
                   1043:                        break;
                   1044:                }
                   1045:        }
                   1046:        if(M == 0)
                   1047:                return S;
                   1048:        if(M <= LL){
                   1049:                print("too small size");
                   1050:                return 0;
                   1051:        }
                   1052:        T = [];
                   1053:        for(I = --M; I > LL; I--)
                   1054:                T = cons(I,T);
                   1055:        S = append(S,T);
                   1056:        if(Opt == 2 || Opt == 3)
                   1057:                S = reverse(S);
                   1058:        if(Opt != 1 && Opt != 3)
                   1059:                return S;
                   1060:        for(T = []; S != []; S = cdr(S))
                   1061:                T = cons(M-car(S),T);
                   1062:        return T;
                   1063: }
                   1064:
                   1065: def ndict(L)
                   1066: {
                   1067:        Opt = getopt(opt);
                   1068:        R = [];
                   1069:        if(Opt != 1 && Opt != 2)
                   1070:                L = reverse(L);
                   1071:        T = (Opt == 1 || Opt == 3)?1:0;
                   1072:        for( ; L != []; L = cdr(L)){
                   1073:                for(I = 0, V = car(L), LT = cdr(L); LT != []; LT = cdr(LT))
                   1074:                        if(T == 0){
                   1075:                                if(V < car(LT)) I++;
                   1076:                        }else if (V > car(LT)) I++;
                   1077:                R = cons(I, R);
                   1078:        }
                   1079:        R = reverse(R);
                   1080:        for(V = 0, I = length(R); I > 0; R = cdr(R), I--)
                   1081:                V = V*I + car(R);
                   1082:        return V;
                   1083: }
                   1084:
                   1085: def nextsub(L,N)
                   1086: {
                   1087:        if(type(L) == 1){
                   1088:                for(LL = [], I = L-1; I >= 0; I--)
                   1089:                        LL = cons(I,LL);
                   1090:                return LL;
                   1091:        }
                   1092:        M = length(L = ltov(L));
                   1093:        K = N-M;
                   1094:        for(I = M-1; I >= 0; I--)
                   1095:                if(L[I] < I+K) break;
                   1096:        if(I < 0)
                   1097:                return 0;
                   1098:        for(J = L[I]+1; I < M; I++, J++)
                   1099:                L[I] = J;
                   1100:        return vtol(L);
                   1101: }
                   1102:
                   1103: def nextpart(L)
                   1104: {
                   1105:        if(car(L) <= 1)
                   1106:                return 0;
                   1107:        for(I = 0, L = reverse(L); car(L) == 1; L=cdr(L))
                   1108:                I++;
                   1109:        I += (K = car(L));
                   1110:        R = irem(I,--K);
                   1111:        R = (R==0)?[]:[R];
                   1112:        for(J = idiv(I,K); J > 0; J--)
                   1113:                R = cons(K,R);
                   1114:        L = cdr(L);
                   1115:        while(L!=[]){
                   1116:                R = cons(car(L), R);
                   1117:                L = cdr(L);
                   1118:        }
                   1119:        return R;
                   1120: }
                   1121:
                   1122: def transpart(L)
                   1123: {
                   1124:        L = reverse(L);
                   1125:        for(I=1, R=[]; L!= []; I++){
                   1126:                R = cons(length(L), R);
                   1127:                while(L != [] && car(L) <= I)
                   1128:                        L = cdr(L);
                   1129:        }
                   1130:        return reverse(R);
                   1131: }
                   1132:
                   1133: def trpos(A,B,N)
                   1134: {
                   1135:        S = newvect(N);
                   1136:        for(I = 0; I < N; I++)
                   1137:                S[I]=(I==A)?B:((I==B)?A:I);
                   1138:        return S;
                   1139: }
                   1140:
                   1141: def sprod(S,T)
                   1142: {
                   1143:        L = length(S);
                   1144:        V = newvect(L);
                   1145:        while(--L >= 0)
                   1146:                V[L] = S[T[L]];
                   1147:        return V;
                   1148: }
                   1149:
                   1150: def sinv(S)
                   1151: {
                   1152:        L = length(S);
                   1153:        V = newvect(L);
                   1154:        while(--L >= 0)
                   1155:                V[S[L]] = L;
                   1156:        return V;
                   1157: }
                   1158:
                   1159: def slen(S)
                   1160: {
                   1161:        L = length(S);
                   1162:        for(V = 0, J = 2; J < L; i++){
                   1163:                for(I = 0; I < J; I++)
                   1164:                        if(S[I] > S[J]) V++;
                   1165:        }
                   1166:        return V;
                   1167: }
                   1168:
                   1169: def sord(W,V)
                   1170: {
                   1171:        L = length(W);
                   1172:        W0 = nevect(L);
                   1173:        V0 = newvect(L);
                   1174:        for(I = F = C = 0; I < L; I++){
                   1175:                C = 0;
                   1176:                if( (W1 = W[I]) > (V1 = V[I]) ){
                   1177:                        if(F < 0) C = 1;
                   1178:                        else if(F==0) F = 1;
                   1179:                }else if(W1 < V1){
                   1180:                        if(F > 0) C = 1;
                   1181:                        else if(F==0) F = -1;
                   1182:                }
                   1183:                for(J = I;--J >= 0 && W0[J] > W1; ) W0[J+1] = W0[J];
                   1184:                W0[J+1] = W1;
                   1185:                for(J = I;--J >= 0 && V0[J] > V1; ) V0[J+1] = V0[J];
                   1186:                V0[J+1] = V1;
                   1187:                if(C){
                   1188:                        for(J = I; J >= 0; J--){
                   1189:                                if((W1=W0[J]) == (V1=V0[J])) continue;
                   1190:                                if(W1 > V1){
                   1191:                                        if(F < 0) return 2;
                   1192:                                }
                   1193:                                else if(F > 0) return 2;
                   1194:                        }
                   1195:                }
                   1196:        }
                   1197:        return F;
                   1198: }
                   1199:
                   1200: def vprod(V1,V2)
                   1201: {
                   1202:        for(R = 0, I = length(V1)-1; I >= 0; I--)
                   1203:                R = radd(R, rmul(V1[I], V2[I]));
                   1204:        return R;
                   1205: }
                   1206:
                   1207: def dnorm(V)
                   1208: {
                   1209:        if(type(V)<2) return dabs(V);
                   1210:        R=0;
                   1211:        if(type(V)!=4)
                   1212:                for (I = length(V)-1; I >= 0; I--) R+= V[I]^2;
                   1213:        else{
                   1214:                if(type(V[0])>3){
                   1215:                        V=ltov(V[0])-ltov(V[1]);
                   1216:                        return dnorm(V);
                   1217:                }
                   1218:                for(;V!=[]; V=cdr(V))   R+=car(V)^2;
                   1219:        }
                   1220:        return dsqrt(R);
                   1221: }
                   1222:
                   1223: def dvprod(V1,V2)
                   1224: {
                   1225:        if(type(V1)<2) return V1*V2;
                   1226:        R=0;
                   1227:        if(type(V1)!=4)
                   1228:                for(I = length(V1)-1; I >= 0; I--)
                   1229:                        R += V1[I]*V2[I];
                   1230:        else{
                   1231:                for(; V1!=[]; V1=cdr(V1),V2=cdr(V2))
                   1232:                        R+=car(V1)*car(V2);
                   1233:        }
                   1234:        return R;
                   1235: }
                   1236:
                   1237: def dvangle(V1,V2)
                   1238: {
                   1239:        if(V2==0 && type(V1)==4 && length(V1)==3 &&
                   1240:          (type(V1[0])==4 || type(V1[0])==5 || type(V1[1])==4 || type(V1[1])==5 ||
                   1241:           type(V1[2])==4 || type(V1[2])==5) ){
                   1242:                if(V1[0]==0 || V1[1]==0 || V1[2]==0) return 1;
                   1243:                PV2=V1[1];
                   1244:                if(type(PV2)==4){
                   1245:                        PV2=ltov(PV2);
                   1246:                        return dvangle(PV2-ltov(V1[0]),ltov(V1[2])-PV2);
                   1247:                }else
                   1248:                        return dvangle(PV2-V1[0],V1[2]-PV2);
                   1249:        }
                   1250:        if((L1=dnorm(V1))==0 || (L2=dnorm(V2))==0) return 1;
                   1251:        return dvprod(V1,V2)/(L1*L2);
                   1252: }
                   1253:
                   1254: def mulseries(V1,V2)
                   1255: {
                   1256:        L = length(V1);
                   1257:        if(size(V2) < L)
                   1258:                L = size(V2);
                   1259:        VV = newvect(L);
                   1260:        for(J = 0; J < L; J++){
                   1261:                for(K = R = 0; K <= J; K++)
                   1262:                        R = radd(R,rmul(V1[K],V2[J-K]));
                   1263:                VV[J] = R;
                   1264:        }
                   1265:        return VV;
                   1266: }
                   1267:
1.13      takayama 1268: def scale(L)
                   1269: {
1.23      takayama 1270:        T=F=0;LS=1;
1.18      takayama 1271:        Pr=getopt(prec);
1.23      takayama 1272:        Inv=getopt(inv);
                   1273:        Log10=dlog(10);
                   1274:        if(type(L)==7){
                   1275:                V=findin(L,["CI","DI","CIF","CIF'","DIF","DIF'","SI","TI1","TI2","STI"]);
                   1276:                if(V>=0){
                   1277:                        L=["C","D","CF","CF'","DF","DF'","S","T1","T2","ST"];
                   1278:                        Inv=1;L=L[V];
                   1279:                }
                   1280:                V=findin(L,["C","A","K","CF","CF'","S","T1","T2","ST","LL0","LL1","LL2","LL3","LL00",
                   1281:                        "LL01","LL02","LL03"])+1;
                   1282:                if(V==0) V=findin(L,["D","B","K","DF","DF'"])+1;
                   1283:                if(V>0) L=V;
                   1284:        }
                   1285:        if(type(OL=L)!=4){
1.15      takayama 1286:                if(L==2){
1.23      takayama 1287:                        L=(Pr==0)?
1.18      takayama 1288:                          [[[1,2,1/20],[2,5,1/10],[5,10,1/5], [10,20,1/2],[20,50,1],[50,100,2]],
1.15      takayama 1289:                   [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5]],
1.18      takayama 1290:                   [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10]]]:
                   1291:                           [[[1,2,1/50],[2,5,1/20],[5,10,1/10], [10,20,1/5],[20,50,1/2],[50,100,1]],
                   1292:                                [[1,5,1/10],[5,10,1/2], [10,20,1],[50,100,5]],
                   1293:                                [[1,5,1/2],[5,10,1], [10,50,5],[50,100,10]]];
1.23      takayama 1294:                        LS=2;M2=[[1,10,1],[10,100,10]];
1.15      takayama 1295:                }else if(L==3){
1.23      takayama 1296:                        L=(Pr==0)?
1.18      takayama 1297:                          [[[1,2,1/20],[2,5,1/10],[5,10,1/5], [10,20,1/2],[20,50,1],[50,100,2],
                   1298:                   [100,200,5],[200,500,10],[500,1000,20]],
1.15      takayama 1299:                        [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5], [100,200,10],[200,500,50]],
1.18      takayama 1300:                        [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10], [100,200,50],[200,1000,100]]]:
                   1301:                          [[[1,2,1/50],[2,5,1/20],[5,10,1/10],[10,20,1/5],[20,50,1/2],[50,100,1],
                   1302:                              [100,200,2],[200,500,5],[500,1000,10]],
                   1303:                                [[1,5,1/10],[5,10,1/2], [10,50,1],[50,100,5], [100,500,10],[500,1000,50]],
1.23      takayama 1304:                                [[1,5,1/2],[5,10,1],[10,50,5],[50,100,10], [100,500,50],[500,1000,100]]];
                   1305:                        LS=3;M2=[[1,5,1],[10,50,10],[100,500,100],[500,1000,500]];
                   1306:                }else if(L>9&&L<18){
1.26      takayama 1307:                        if(L<18){       /* LL0 - LL3, LL00 - LL03 */
1.23      takayama 1308:                                if(L==10){
                   1309:                                        L=[ [[1.001,1.002,0.00001],[1.002,1.005,0.00002],[1.005,1.0105,0.00005]],
                   1310:                                                [[1.001,1.002,0.00005],[1.002,1.005,0.0001], [1.005,1.0105,0.0001]],
                   1311:                                                [[1.001,1.002,0.0001],[1.002,1.005,0.0005], [1.005,1.0105,0.0005]]];
                   1312:                                        M2=[1.001,1.0015,1.002,1.003,1.004,1.005,1.006,1.007,1.008,1.009,1.01];
                   1313:                                }
                   1314:                                if(L==11){
                   1315:                                        L=[ [[1.01,1.02,0.0001],[1.02,1.05,0.0002],[1.05,1.105,0.0005]],
                   1316:                                                [[1.01,1.02,0.0005],[1.02,1.05,0.001], [1.05,1.105,0.001]],
                   1317:                                                [[1.01,1.02,0.001],[1.02,1.05,0.005], [1.05,1.105,0.005]]];
                   1318:                                        M2=[1.01,1.015,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10];
                   1319:                                }else if(L==12){
                   1320:                                        L=[ [[1.105,1.2,0.001],[1.2,1.4,0.002],[1.4,1.8,0.005],[1.8,2.5,0.01],
                   1321:                                              [2.5,2.72,0.02]],
                   1322:                                                [[1.105,1.2,0.005],[1.2,1.4,0.01],[1.4,1.8,0.01],[1.8,2.5,0.05],
                   1323:                                              [2.5,2.72,0.1]],
                   1324:                                                [[1.105,1.2,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],
                   1325:                                              [2.5,2.72,0.1]]];
1.26      takayama 1326:                                        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];
1.23      takayama 1327:                                }else if(L==13){
                   1328:                                        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],
                   1329:                                                 [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],
                   1330:                                                 [1000,2000,100],[2000,5000,200],[5000,10000,500],[10000,22000,1000]],
                   1331:                                                [[2.7,4,0.1],[4,6,0.1],[6,10,0.5],[10,15,1],[15,30,1],[30,50,5],
                   1332:                                                 [50,100,10],[100,200,10],[200,400,50],[400,500,100],[500,1000,100],
                   1333:                                                 [1000,2000,500],[2000,5000,1000],[5000,10000,1000],[10000,22000,5000]],
                   1334:                                                [[3,4,0.5],[4,6,0.5],[6,10,1],[10,15,5],[15,30,5],[30,50,10],
                   1335:                                                 [50,100,50],[100,200,50],[200,400,100],[400,500,100],[500,1000,500],
                   1336:                                                 [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];
                   1337:                                        M2=[3,4,5,6,7,8,9,10,15,20,30,40,50,100,200,500,1000,2000,5000,10000,20000];
                   1338:                                }else if(L==14){
1.26      takayama 1339:                                        L=[ [[0.998,0.999,0.00001],[0.995,0.998,0.00002],[0.99,0.995,0.00005]],
                   1340:                                                [[0.998,0.999,0.00005],[0.995,0.998,0.0001],[0.99,0.995,0.0001]],
                   1341:                                                [[0.998,0.999,0.0001],[0.995,0.998,0.0005],[0.99,0.995,0.0005]]];
1.23      takayama 1342:                                        M2=[0.999,0.9985,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.991,0.99];
                   1343:                                }else if(L==15){
1.26      takayama 1344:                                        L=[ [[0.98,0.9901,0.0001],[0.95,0.98,0.0002],[0.905,0.95,0.0005]],
                   1345:                                                [[0.98,0.99,0.0005],[0.95,0.98,0.001], [0.905,0.95,0.001]],
1.23      takayama 1346:                                                [[0.98,0.99,0.001],[0.95,0.98,0.005], [0.91,0.95,0.005]]];
                   1347:                                        M2=[0.99,0.985,0.98,0.97,0.96,0.95,0.94,0.93,0.92,0.91];
                   1348:                                }else if(L==16){
1.26      takayama 1349:                                        L=[ [[0.8,0.906,0.001],[0.6,0.8,0.002],[0.37,0.6,0.005]],
                   1350:                                                [[0.8,0.906,0.005],[0.6,0.8,0.01],[0.37,0.6,0.01]],
                   1351:                                                [[0.8,0.9,0.01],[0.6,0.8,0.05],[0.4,0.6,0.05]]];
                   1352:                                        M2=[0.9,0.85,0.8,0.75,0.7,0.65,0.6,0.55,0.5,0.45,0.4];
1.23      takayama 1353:                                }else{
1.26      takayama 1354:                                        L=[ [[0.05,0.37,0.002],[0.02,0.05,0.001],[0.01,0.02,0.0005],
                   1355:                                                 [0.005,0.01,0.0002],[0.001,0.005,0.0001],
                   1356:                                                 [0.0005,0.001,0.00002],[0.0001,0.0005,0.00001],[0.00005,0.0001,0.000002]],
                   1357:                                                [[0.05,0.37,0.01],[0.02,0.05,0.002],[0.01,0.02,0.001],
                   1358:                                                 [0.005,0.01,0.001],[0.001,0.005,0.0002],
                   1359:                                                 [0.0005,0.001,0.0001],[0.0001,0.0005,0.00002],[0.00005,0.0001,0.00001]],
                   1360:                                                [[0.05,0.37,0.05],[0.02,0.05,0.01],[0.01,0.02,0.005],
                   1361:                                                 [0.005,0.01,0.005],[0.002,0.005,0.001],
                   1362:                                                 [0.0005,0.001,0.0005],[0.0001,0.0005,0.0001],[0.00005,0.0001,0.00005]]];
                   1363:                                        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];
1.23      takayama 1364:                                }
                   1365:                        }
1.15      takayama 1366:                }else{
1.23      takayama 1367:                        if(L==6){       /* S */
                   1368:                                L=[ [[6-3/12,15,1/12],[15,30,1/6],[30,50,1/3],[50,70,1/2],[70,80,1],[80,90,5]],
                   1369:                                        [[6-1/6,15,1/6],[15,30,1/2],[30,70,1],[70,80,5],[80,90,10]],
                   1370:                                        [[6,15,1/2],[15,30,1],[30,70,5],[70,90,10]] ];
                   1371:                                M2=[6,7,8,9,10,15,20,30,40,50,60,70,90];
                   1372:                        }else if(L==7){ /* T1 */
                   1373:                                F=log(tan(x*3.1416/180))/Log10+1;
                   1374:                                L=[ [[6-1/3,15,1/12],[15,45,1/6]],
                   1375:                                        [[6-1/3,15,1/6],[15,45,1/2]],
                   1376:                                        [[6,45,1]] ];
                   1377:                                M2=[6,7,8,9,10,15,20,30,40,45];
                   1378:                        }else if(L==8){ /* T2 */
                   1379:                                L=[ [[45,75,1/6],[75,84+1/6,1/12]],
                   1380:                                        [[45,75,1],[75,84+1/6,1/6]],
                   1381:                                        [[45,84,1]] ];
                   1382:                                M2=[45,50,60,70,75,80,81,82,83,84];
                   1383:                        }else if(L==9){ /* ST */
                   1384:                                L=[ [[35/60,1,1/120],[1,2,1/60],[2,5+9/12,1/30]],
                   1385:                                        [[35/60,1,1/60],[1,2,1/6],[2,5+9/12,1/6]],
                   1386:                                        [[40/60,1,1/6],[1,2,1/2],[2,5+9/12,1]] ];
                   1387:                                M2=[1,2,3,4,5];
                   1388:                        }else{
                   1389:                                M2=(L==4||L==5)?[[1,2,1/2],[2,9,1]]:[[1,2,1/2],[2,10,1]];
                   1390:                                L=(Pr==0)?
                   1391:                                [ [[1,2,1/50],[2,5,1/20],[5,10,1/10]],
                   1392:                                  [[1,5,1/10],[5,10,1/2]],
                   1393:                                  [[1,5,1/2],[5,10,1]] ]:
                   1394:                                [[[1,2,1/100],[2,5,1/50],[5,10,1/20]],
                   1395:                              [[1,2,1/20],[2,10,1/10]],
                   1396:                              [[1,2,1/10],[2,10,1/2]] ];
                   1397:                        }
1.15      takayama 1398:                }
                   1399:        }else if(type(L[0])!=4){
                   1400:                L=[L];
                   1401:                if(length(L)!=3||L[0]+L[2]>L[1]) T=L;
1.13      takayama 1402:        }
1.15      takayama 1403:        if(T==0){
                   1404:                if(type(L[0][0])!=4) L=[L];
                   1405:                for(R=[];L!=[];L=cdr(L)){
                   1406:                        for(RR=[],LT=car(L);LT!=[];LT=cdr(LT))
                   1407:                                for(I=car(LT)[0];I<=car(LT)[1];I+=car(LT)[2]) RR=cons(I,RR);
                   1408:                RR=lsort(RR,[],1);
                   1409:                        R=cons(RR,R);
                   1410:                }
                   1411:                R=reverse(R);
                   1412:                for(T=[];R!=[];R=cdr(R)){
                   1413:                        if(length(R)>1) T=cons(lsort(R[0],R[1],"setminus"),T);
                   1414:                        else T=cons(R[0],T);
                   1415:                }
1.13      takayama 1416:        }
                   1417:        V0=dlog(10);
                   1418:        S0=S1=1;D0=D1=0;
                   1419:        SC=getopt(scale);
                   1420:        if(type(SC)==4){
                   1421:                S0=SC[0];S1=SC[1];
1.18      takayama 1422:        }else if(type(SC)==1){
                   1423:                S0=SC;S1=0;
1.13      takayama 1424:        }else return T;
                   1425:        if(type(D=getopt(shift))==4){
                   1426:                D0=D[0];D1=D[1];
1.31      takayama 1427:        }else if(type(D)<2&&type(D)>=0){
1.23      takayama 1428:                D0=0;D1=D;
1.31      takayama 1429:        };
1.23      takayama 1430:        if(Inv==1){
                   1431:                D0+=S0;S0=-S0;
1.13      takayama 1432:        }
1.23      takayama 1433:        if(type(TF=getopt(f))>1) F=TF;
                   1434:        if(F) F=f2df(F);
                   1435:        if(type(I=getopt(ol))==1&&OL>3) OL=I;
1.18      takayama 1436:        for(M=M0=[],I=length(T);T!=[];T=cdr(T),I--){
1.13      takayama 1437:                for(S=car(T);S!=[];S=cdr(S)){
1.23      takayama 1438:                        VS=car(S);
                   1439:                        if(F) V=myfdeval(F,car(S));
                   1440:                        else if(OL==4) V=frac(dlog(VS)/Log10+0.5);
                   1441:                        else if(OL==5) V=frac(dlog(VS*3.1416)/Log10);
                   1442:                        else if(OL>5&&OL<10){
                   1443:                                VS=VS*3.1416/180;
                   1444:                                if(OL==6) V=dlog(dsin(VS))/Log10+1;
                   1445:                                else if(OL==9) V=dlog(VS)/Log10+2;
                   1446:                                else V=dlog(dtan(VS))/Log10+8-OL;
                   1447:                        }
                   1448:                        else if(OL>9&&OL<14) V=dlog(dlog(VS))/Log10+13-OL;
                   1449:                        else if(OL>13&&OL<18) V=dlog(-dlog(VS))/Log10+17-OL;
                   1450:                        else V=dlog(VS)/Log10/LS;
                   1451:                        V*=S0;
1.13      takayama 1452:                        if(S1!=0){
                   1453:                                M=cons([V+D0,D1],M);
1.23      takayama 1454:                                M=cons([V+D0,((length(SC)>2)?SC[I]:(I*S1))+D1],M);
1.13      takayama 1455:                                M=cons(0,M);
1.18      takayama 1456:                        }else M0=cons(V+D0,M0);
1.13      takayama 1457:                }
1.18      takayama 1458:                if(S1==0) M=cons(reverse(M0),M);
1.13      takayama 1459:        }
                   1460:        if(S1!=0) M=cdr(M);
1.18      takayama 1461:        if(S1==0||getopt(TeX)!=1) return M;
1.13      takayama 1462:        M=reverse(M);
1.23      takayama 1463:        if(type(U=getopt(line))==4){
                   1464:                if(Inv==1) U=[U[0]+S0,U[1]+S0];
1.18      takayama 1465:                M=cons([U[0]+D0,D1],cons([U[1]+D0,D1],cons(0,M)));
1.23      takayama 1466:        }
                   1467:        if((VT=getopt(vert))==1){
                   1468:                for(N=[];M!=[];M=cdr(M)){
                   1469:                        if(type(TM=car(M))==4) N=cons([TM[1],TM[0]],N);
                   1470:                        else N=cons(TM,N);
                   1471:                }
                   1472:                M=reverse(N);
                   1473:        }
1.18      takayama 1474:        if(type(Col=getopt(col))<1) S=xylines(M);
                   1475:        else S=xylines(M|opt=Col);
                   1476:        if(type(Mes=getopt(mes))==4){
1.23      takayama 1477:                if(length(Mes)==1&&type(M2)==4) Mes=cons(car(Mes),M2);
1.18      takayama 1478:                S3=car(Mes);
                   1479:                if(type(S3)==4){
                   1480:                        Col=S3[1];
                   1481:                        S3=car(S3);
                   1482:                }else Col=0;
                   1483:                V=car(scale(cdr(Mes)));
1.23      takayama 1484:                if(!F) Mes=scale(cdr(Mes)|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
1.18      takayama 1485:                else Mes=scale(cdr(Mes)|f=F,scale=[S0,0],shift=[D0,D1]);
                   1486:                for(M=car(Mes);M!=[];M=cdr(M),V=cdr(V)){
1.23      takayama 1487:                        TV=deval(car(V));
                   1488:                        if(Col!=0) TV=[Col,TV];
                   1489:                        S+=(VT==1)?xyput([S3+D1,car(M),TV]):xyput([car(M),S3+D1,TV]);
                   1490:                }
                   1491:        }
                   1492:        if(type(Mes=getopt(mes2))==4){
                   1493:                if(type(car(Mes))!=4) Mes=[Mes];
                   1494:                for(;Mes!=[];Mes=cdr(Mes)){
                   1495:                        TM=car(Mes);
                   1496:                        if(!F) V=scale([car(TM)]|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
                   1497:                        else V=scale([car(TM)]|f=F,scale=[S0,0],shift=[D0,D1]);
                   1498:                        V=car(car(V));
                   1499:                        TM=cdr(TM);
                   1500:                        if(type(Col=car(TM))==4){
                   1501:                                C0=Col[0];C1=Col[1];
                   1502:                                if(length(Col)==3){
                   1503:                                        S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]|opt=Col[2])
                   1504:                                                :xyline([V,D1+C0],[V,D1+C1]|opt=Col[2]);
                   1505:                                }else S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]):xyline([V,D1+C0],[V,D1+C1]);
                   1506:                        }
                   1507:                        if(type(TM[1]<2)){
                   1508:                                TM=cdr(TM);
                   1509:                                S3=car(TM);
                   1510:                        }
                   1511:                        S+=(VT==1)?xyput([S3+D1,V,TM[1]]):xyput([V,S3+D1,TM[1]]);
1.13      takayama 1512:                }
                   1513:        }
1.18      takayama 1514:        return S;
1.13      takayama 1515: }
                   1516:
1.6       takayama 1517: def pluspower(P,V,N,M)
                   1518: {
                   1519:        RR = 1;
                   1520:        for(K = R = 1; K < M-1; I++){
                   1521:                R = R*(N-K+1)*P/K;
                   1522:                RR = radd(RR,R);
                   1523:        }
                   1524:        VV = newvect(M);
                   1525:        for(K = 0; K < M-1; K++)
                   1526:                VV[K] = red(mycoef(RR,K,V));
                   1527: }
                   1528:
                   1529: def vtozv(V)
                   1530: {
                   1531:        if(type(V)<4) V=newvect(1,[V]);
                   1532:        S = length(V);
                   1533:        VV = newvect(S);
                   1534:        Lcm = 1;
                   1535:        for(K = 0; K < S; K++){
                   1536:                VV[K] = red(V[K]);
                   1537:                Lcm = lcm(Lcm,dn(VV[K]));
                   1538:                C = ptozp(nm(VV[K])|factor=0);
                   1539:                if(K == 0){
                   1540:                        Dn  = dn(C[1]);
                   1541:                        Nm  = nm(C[1]);
                   1542:                        PNm = nm(C[0]);
                   1543:                }else{
                   1544:                        Dn  = ilcm(Dn,dn(C[1]));
                   1545:                        Nm  = igcd(Nm,nm(C[1]));
                   1546:                        PNm = gcd(PNm,nm(C[0]));
                   1547:                }
                   1548:        }
                   1549:        if(!(M=Nm*PNm)) return [VV,0];
                   1550:        Mul = (Lcm*Dn)/M;
                   1551:        for(K = 0; K < S; K++)
                   1552:                VV[K] = rmul(VV[K],Mul);
                   1553:        return [VV,Mul];
                   1554: }
                   1555:
                   1556: def dupmat(M)
                   1557: {
                   1558:        if(type(M) == 6){
                   1559:                Size = size(M);
                   1560:                MM = newmat(Size[0],Size[1]);
                   1561:                for(I = 0; I < Size[0]; I++){
                   1562:                        for(J = 0; J < Size[1]; J++)
                   1563:                                MM[I][J] = M[I][J];
                   1564:                }
                   1565:                return MM;
                   1566:        }
                   1567:        if(type(M) == 5)
                   1568:                return ltov(vtol(M));
                   1569:        return M;
                   1570: }
                   1571:
                   1572: def matrtop(M)
                   1573: {
                   1574:        S = size(M);
                   1575:        MM = dupmat(M);
                   1576:        Lcm = newvect(S[0]);
                   1577:        for(J = 0; J < S[0]; J++){
                   1578:                U = vtozv(M[J]);
                   1579:                for(K = -1, I = 0; I < S[1]; I++)
                   1580:                        MM[J][I] = U[0][I];
                   1581:                Lcm[J] = U[1];
                   1582:        }
                   1583:        return [MM,Lcm];
                   1584: }
                   1585:
                   1586: def mytrace(M)
                   1587: {
                   1588:        S=size(M);
                   1589:        if(S[0]!=S[1]) return 0;
                   1590:        for(I=V=0; I<S[0]; I++){
                   1591:                V+=M[I][I];
                   1592:        }
                   1593:        return V;
                   1594: }
                   1595:
                   1596: def mydet(M)
                   1597: {
                   1598:        MM = matrtop(M);
                   1599:        if(type(MM[0]) == 6){
                   1600:                S = size(M);
                   1601:                for(Dn = 1, I = 0; I < S[0]; I++)
                   1602:                        Dn *= MM[1][I];
                   1603:                return (!Dn)?0:red(det(MM[0])/Dn);
                   1604:        }
                   1605: }
                   1606:
                   1607: def mperm(M,P,Q)
                   1608: {
                   1609:        if(type(M) == 6){
                   1610:                S = size(M);
                   1611:                if(type(P) <= 1)
                   1612:                        P=(P==1)?Q:trpos(0,0,S[0]);
                   1613:                if(type(P) > 3 && type(P[0]) >= 4)
                   1614:                        P = trpos(P[0][0],P[0][1],S[0]);
                   1615:                else if(type(P) == 4){
                   1616:                        if(length(P)==2 && type(P[1])==4){
                   1617:                                P0=P[0];P1=car(P[1]);P=newvect(P1);
                   1618:                                for(I=0;I<P1;I++) P[I]=P0+I;
                   1619:                        }else P = ltov(P);
                   1620:                }
                   1621:                if(type(Q) <= 1)
                   1622:                        Q=(Q==1)?P:trpos(0,0,S[1]);
                   1623:                if(type(Q) > 3 && type(Q[0]) >= 4)
                   1624:                        Q = trpos(Q[0][0],Q[0][1],S[1]);
                   1625:                if(type(Q) == 4){
                   1626:                        if(length(Q)==2 && type(Q[1])==4){
                   1627:                                P0=Q[0];P1=car(Q[1]);Q=newvect(P1);
                   1628:                                for(I=0;I<P1;I++) Q[I]=P0+I;
                   1629:                        }else Q = ltov(Q);
                   1630:                }
                   1631:                MM = newmat(S0=length(P),S1=length(Q));
                   1632:                for(I = 0; I < S0; I++){
                   1633:                        MMI = MM[I]; MPI = M[P[I]];
                   1634:                        for(J = 0; J < S1; J++)
                   1635:                                MMI[J] = MPI[Q[J]];
                   1636:                }
                   1637:                return MM;
                   1638:        }
                   1639:        if((type(M) == 5 || type(M) == 4) && type(P) >= 4){
                   1640:                if(length(P) == 1 && type(car(P)) == 4)
                   1641:                        P = trpos(car(P)[0],car(P)[1],length(M));
                   1642:                MM = newvect(S = length(P));
                   1643:                for(I = 0; I < S; I++)
                   1644:                        MM[I] = M[P[I]];
                   1645:                if(type(M) == 4)
                   1646:                        MM = vtol(MM);
                   1647:                return MM;
                   1648:        }
                   1649:        return M;
                   1650: }
                   1651:
                   1652: def mtranspose(M)
                   1653: {
                   1654:        if(type(M)==4){
                   1655:                MV=ltov(M);
                   1656:                II=length(MV);
                   1657:                for(I=L=0; I<II; I++){
                   1658:                        if(type(MV[I])!=4)      return M;
                   1659:                        MV[I]=ltov(MV[I]);
                   1660:                }
                   1661:                for(R=[],J=0; ;J++){
                   1662:                        for(T=[],I=F=0; I<II; I++){
                   1663:                                if(length(MV[I])>J){
                   1664:                                        F=1;
                   1665:                                        T=cons(MV[I][J],T);
                   1666:                                }
                   1667:                        }
                   1668:                        if(F==0)        return reverse(R);
                   1669:                        if(F==1)        R=cons(reverse(T),R);
                   1670:                }
                   1671:        }
                   1672:        if(type(M) != 6)
                   1673:                return M;
                   1674:        S = size(M);
                   1675:        MM = newmat(S[1],S[0]);
                   1676:        for(I = 0; I < S[0]; I++){
                   1677:                for(J = 0; J < S[1]; J++)
                   1678:                        MM[J][I] = M[I][J];
                   1679:        }
                   1680:        return MM;
                   1681: }
                   1682:
                   1683: def mtoupper(MM, F)
                   1684: {
                   1685:        TeXs=["\\ -=\\ ","\\ +=\\ "];
                   1686:        Lins=[" -= line"," += line"];
                   1687:        Assume=["If","Assume"];
                   1688:        if(type(St = getopt(step))!=1) St=0;
                   1689:        Opt = getopt(opt);
                   1690:        if(type(Opt)!=1) Opt=0;
1.40    ! takayama 1691:        if(type(Main=getopt(main))!=1) Main=0;
1.6       takayama 1692:        TeX=getopt(dviout);
                   1693:        if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;
                   1694:        Line="\\text{line}";
                   1695:        if(type(TeX)!=1 || !St) TeX=0;
                   1696:        Size = size(MM);
                   1697:        if(F==-1){
                   1698:                M = newmat(Size[0], Size[1]+1);
                   1699:                for(I = 0; I < Size[0]; I++){
                   1700:                        for(J = 0; J < Size[1]; J++)
                   1701:                                M[I][J] = MM[I][J];
                   1702:                        M[I][Size[1]] = zz^I;
                   1703:                }
                   1704:                Size = size(M);
                   1705:                F = 1;
                   1706:        }else if(F<0){
                   1707:                F=Size[0];
                   1708:                M = newbmat(1,2,[[MM,mgen(F,0,[1],0)]]);
                   1709:                Size=[Size[0],F+Size[1]];
                   1710:        }else
                   1711:                M = dupmat(MM);
                   1712:        if(St){
                   1713:                if(TeX) Lout=[[dupmat(M)]];
                   1714:                else mycat0([M,"\n\n"],0);
                   1715:        }
                   1716:        Top="";
                   1717:        if(Opt>3){
                   1718:                for(I=Opt; I>4; I--)
                   1719:                        Top+=(TeX)?"\\ ":" ";
                   1720:        }
                   1721:        PC=IF=1;
1.40    ! takayama 1722:        if(Opt>3){
        !          1723:                for(P=[1],K=0;K<Size[1]-F;K++){
        !          1724:                        for(J=0;J<Size[0];J++)
        !          1725:                                if(type(dn(M[J][K]))==2) P=cons(dn(M[J][K]),P);
        !          1726:                }
        !          1727:                PC=llcm(P|poly=1);
        !          1728:        }
1.6       takayama 1729:        for(K = JJ = 0; K < Size[1] - F; K++){
                   1730:                for(J = JJ; J < Size[0]; J++){
                   1731:                        if(M[J][K] != 0){               /* search simpler element */
                   1732:                                if(Opt>2 && (Mul=M[J][K])!=1){
                   1733:                                        for(FF=0,JT=J; JT<Size[0]; JT++){
                   1734:                                                if((Val=M[JT][K])==1){  /* 1 */
                   1735:                                                        Mul=1;J=JT; break;
                   1736:                                                }
                   1737:                                                if(Val==0 || type(Val)>type(Mul)) continue;
                   1738:                                                if(type(Val)<type(Mul) || (Val==-1 && Mul!=-1)){
                   1739:                                                        Mul=Val; J=JT;          /* smaller type */
                   1740:                                                }
                   1741:                                                else if(Opt>3){
                   1742:                                                        if(isint(Val)==1){      /* integer elememt */
                   1743:                                                                if(isint(Mul)!=1){
                   1744:                                                                        Mul=Val; J=JT;  /* integer */
                   1745:                                                                }
                   1746:                                                                if(FF<3||(FF==3&&Val>0)){
                   1747:                                                                        for(JK=K+1;;){
                   1748:                                                                                if(JK>=Size[1]-F){
                   1749:                                                                                        J=JT;
                   1750:                                                                                        FF=((Mul=Val)>0)?4:3;
                   1751:                                                                                        break;  /* divisible int => 4: pos_int 3: neg_int */
                   1752:                                                                                }
                   1753:                                                                                if(isint(M[JT][JK++]/Val)!=1) break;
                   1754:                                                                        }
                   1755:                                                                }
                   1756:                                                        }else if(!FF){
                   1757:                                                                for(JK=K+1; JK<Size[1]-F; JK++){
                   1758:                                                                        if(isint(M[JT][JK]/Val)!=1) break;
                   1759:                                                                        J=JT; FF=1;             /* divisible => 1: non integer */
                   1760:                                                                }
                   1761:                                                        }
                   1762:                                                }
                   1763:                                        }
                   1764:                                        if(FF==0 && Opt>3 && Mul!=1 && Mul!=-1){        /* FF > 0 => divisible */
                   1765:                                                for(FF=0,J0=J; J0<Size[0]-1 && FF!=9; J0++){
                   1766:                                                        VV0=M[J0][K];
                   1767:                                                        if(VV0==0 || isint(VV0)==0) continue;
                   1768:                                                        for(J1=J0+1;J1<Size[0] && FF!=9; J1++){
                   1769:                                                                VV1=M[J1][K];
                   1770:                                                                if(VV1==0 || isint(VV1)==0) continue;
                   1771:                                                                for(C=FT=0,V0=VV0,V1=VV1; C<2 && FF!=10; C++,V1=V0,V0=VV1){
                   1772:                                                                        for(CC=0,RC=ceil(V0/V1);CC<2;CC++,RC--){
                   1773:                                                                                if((CD=V0-RC*V1)==0 && (RC==1 || RC==-1)){
                   1774:                                                                                        FT=1; FF=10;            /* 10: vanish by +- */
                   1775:                                                                                }else if(CD==1){
                   1776:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1777:                                                                                        if((RC==1 || RC==-1) && FF<8+FV){
                   1778:                                                                                                FT=1; FF=8+FV;  /* 8/9: 1 by +- */
                   1779:                                                                                        }else if(FF<6+VF){
                   1780:                                                                                                FT=1; FF=6+FV;  /* 6/7: 1 by times */
                   1781:                                                                                        }
                   1782:                                                                                }else if(CD==-1){
                   1783:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1784:                                                                                        if((RC==1 || RC==-1) && FF<4+FV){
                   1785:                                                                                                FT=1; FF=4+FV;  /* 4/5: 1 by +- */
                   1786:                                                                                        }else if(FF<2+VF){
                   1787:                                                                                                FT=1; FF=2+FV;  /* 2/3: 1 by times */
                   1788:                                                                                        }
                   1789:                                                                                }
                   1790:                                                                                if(FT==1){
                   1791:                                                                                        FT=0; KRC=RC;
                   1792:                                                                                        if(C==0){
                   1793:                                                                                                KJ0=J0; KJ1=J1;
                   1794:                                                                                        }else{
                   1795:                                                                                                KJ0=J1; KJ1=J0;
                   1796:                                                                                        }
                   1797:                                                                                }
                   1798:                                                                        }
                   1799:                                                                }
                   1800:                                                        }
                   1801:                                                }
                   1802:                                                if(FF>0){
                   1803:                                                        for(I=K;I<Size[1];I++)
                   1804:                                                                M[KJ0][I]=radd(M[KJ0][I],rmul(M[KJ1][I],-KRC));
                   1805:                                                        if(KRC<0){
                   1806:                                                                KRC=-KRC;Sgn=1;
                   1807:                                                        }else
                   1808:                                                                Sgn=0;
1.40    ! takayama 1809:                                                        if(St&&!Main){
1.6       takayama 1810:                                                                if(TeX){
                   1811:                                                                        if(KRC==1)
                   1812:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1813:                                                                                        Line,KJ1+1,"}",dupmat(M)],Lout);
                   1814:                                                                        else
                   1815:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1816:                                                                                        Line,KJ1+1,"\\times\\left(",KRC,"\\right)}",
                   1817:                                                                                        dupmat(M)],Lout);
                   1818:
                   1819:                                                                }else{
                   1820:                                                                        if(KRC==1)
                   1821:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1,"\n",M,"\n"]);                                                                          else
                   1822:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1," * (",KRC,")\n",M,"\n"]);
                   1823:                                                                }
                   1824:                                                        }
                   1825:                                                        Mul=M[KJ0][K]; J=KJ0;
                   1826:                                                        if(FF==10){
                   1827:                                                                J--; continue;
                   1828:                                                        }
                   1829:                                                }
                   1830:                                        }
                   1831:                                }
                   1832:                        /* a parameter Var */
                   1833:                                Var=0;
1.40    ! takayama 1834: /* mycat(["start",J,K]); */
1.6       takayama 1835:                                if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){
                   1836:                                        J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));
                   1837:                                        for(I=JJ;I<Size[0]; I++){
                   1838:                                                if((MIK=M[I][K])==0) continue;
                   1839:                                                if((T=vars(MIK=nm(MIK)))==[]){  /* 1/poly */
                   1840:                                                        J=I;Var=[]; break;
                   1841:                                                }
                   1842:                                                if(length(T)>1) continue;
                   1843:                                                if(mydeg(MIK,T[0])<Jv){
1.39      takayama 1844:                                                        J0=I;Jv=mydeg(MIK,T[0]);Var=T;  /* search minimal degree */
1.6       takayama 1845:                                                }
                   1846:                                        }
                   1847:                                        if(length(Var)==1){
                   1848:                                                Var=car(Var);
                   1849:                                                Q=nm(M[J0][K]);
1.40    ! takayama 1850: /* mycat(["min",Q,M[J0][K],"J0=",J0,"J=",J,"JJ=",JJ,K,M]); */
        !          1851: J=J0;
1.6       takayama 1852:                                                for(I=JJ; I<Size[0]; I++){
                   1853:                                                        if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;
                   1854:                                                        T=rpdiv(nm(M[I][K]),Q,Var);
                   1855:                                                        if(T[0]!=0 && (vars(T)==[] || vars(T)==[Var])) break;   /* dec. deg */
                   1856:                                                }
                   1857:                                        }
                   1858:                                }
                   1859:                                if(type(Var)==2){ /* 1 variable */
                   1860:                                        if(I==Size[0]){
                   1861:                                                for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){
1.40    ! takayama 1862: /* mycat(["root",Q,QR,PC]); */
1.6       takayama 1863:                                                        if(deg(T=QR[0][1],Var)>0){
                   1864:                                                                QF=1;Q0*=T; continue;
                   1865:                                                        }
                   1866:                                                        if(subst(PC,Var,T)==0) continue;
                   1867:                                                        Q0*=(Var-(T=QR[0][1]));
                   1868:                                                        if(type(T)<2){
                   1869:                                                                M0=subst(M,Var,T);
                   1870:                                                                if(TeX){
                   1871:                                                                        Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   1872:                                                                                Var,"=",T,","] ,Lout);
1.40    ! takayama 1873:                                                                        Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),Lout);
1.6       takayama 1874:                                                                }else{
                   1875:                                                                        mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);
1.40    ! takayama 1876:                                                                        mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 1877:                                                                }
                   1878:                                                        }
                   1879:                                                }
                   1880:                                                if(Q0!=1){
                   1881:                                                        if(TeX)
                   1882:                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[QF]+" }",
                   1883:                                                                        Q0/=fctr(Q0)[0][0],"\\ne0,"],Lout);
                   1884:                                                        else
                   1885:                                                                mycat([str_times(" ",St-1)+Assume[QF],Q0,"!=0,"]);
                   1886:                                                        PC*=Q0;
                   1887:                                                }
                   1888:                                                IF=0;St++;
                   1889:                                        }else{
                   1890:                                                KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));
                   1891:                                                for(II=K;II<Size[1];II++)
                   1892:                                                        M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));
1.40    ! takayama 1893:                                                if(!Main){
        !          1894:                                                        if(TeX)
        !          1895:                                                                Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,
        !          1896:                                                                        J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);
        !          1897:                                                        else
        !          1898:                                                                mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);
        !          1899:                                                }
1.6       takayama 1900:                                                J=JJ-1;
                   1901:                                                continue;
                   1902:                                        }
                   1903:                                }
                   1904:                                if(J != JJ){
                   1905:                                        for(I = K; I < Size[1]; I++){
                   1906:                                                Temp = M[JJ][I];
                   1907:                                                M[JJ][I] = M[J][I];
                   1908:                                                M[J][I] = (Opt>=2)?Temp:-Temp;
                   1909:                                        }
                   1910:                                        if(St){
                   1911:                                                if(TeX)
                   1912:                                                        Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,"\\ \\leftrightarrow\\ ",
                   1913:                                                                Line,J+1,"}",dupmat(M)],Lout);
                   1914:                                                else
                   1915:                                                        mycat0([Top+"line",JJ+1," <-> line",J+1,"\n",M,"\n\n"],0);
                   1916:                                        }
                   1917:                                }
                   1918:                                /* Assume PC != 0 */
                   1919:                                if(Opt>1){
                   1920:                                        Mul = M[JJ][K];
                   1921:                                        if(Opt > 5 && St && IF && (Var=vars(MIK=nm(Mul)))!=[]){
                   1922:                                                TF=fctr(MIK);
                   1923:                                                for(FF=0,Q0=1,TP=cdr(TF);TP!=[];TP=cdr(TP)){
                   1924:                                                        if(type(dn(red(PC/(TP0=car(car(TP))))))<2) continue; /* divisible */
                   1925:                                                        Q0*=TP0;
                   1926:                                                        for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   1927:                                                                if(mydeg(TP0,X=car(Var))==1 && type(dn(red(PC/mycoef(TP0,1,X))))<2){
                   1928:                                                                        /* TP0=A*X+B with non-vanishing A */
                   1929:                                                                        T=red(-mycoef(TP0,0,X)/mycoef(TP0,1,X));
                   1930:                                                                        M0=mysubst(M,[X,T]);
                   1931:                                                                        if(TeX){
                   1932:                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   1933:                                                                                        X,"=",T,","] ,Lout);
1.40    ! takayama 1934:                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
1.6       takayama 1935:                                                                                        Lout);
                   1936:                                                                        }else{
                   1937:                                                                                mycat([str_times(" ",St-1)+"If",X,"=",T,","]);
1.40    ! takayama 1938:                                                                                mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 1939:                                                                        }
                   1940:                                                                        break;
                   1941:                                                                }
                   1942:                                                        }
                   1943:                                                        if(Var==[] && Opt>6){
                   1944:                                                                for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   1945:                                                                        if(mydeg(TP0,X=car(Var))==1){
                   1946:                                                                                /* TP0=A*X+B, A is a poly of X0 with rational funct */
                   1947:                                                                                T=nm(mycoef(TP0,1,X));
                   1948:                                                                                for(Var0=vars(T);Var0!=[]; Var0=cdr(Var0)){
                   1949:                                                                                        X0=car(Var0);
                   1950:                                                                                        if(type(dn(red(PC/type(mycoef(T,mydeg(T,X0),X0)))))>1) continue;
                   1951:                                                                                        TR=getroot(T,X0|mult=1);
                   1952:                                                                                        if(findin(X0,vars(TR))<0) break;
                   1953:                                                                                }
                   1954:                                                                                if(Var0==[]) continue;
                   1955:                                                                                for(;TR!=[0];TR=cdr(TR)){
                   1956:                                                                                        if(TR==[]){
                   1957:                                                                                                TR=[0,0];
                   1958:                                                                                                T0=-mycoef(TP0,0,X)/mycoef(TP0,1,X);
                   1959:                                                                                                X0=X;
                   1960:                                                                                        }else T0=car(TR)[1];
                   1961:                                                                                        M0=mysubst(M,[X0,T0]);
                   1962:                                                                                        if(TeX){
                   1963:                                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   1964:                                                                                                        X0,"=",T0,","] ,Lout);
1.40    ! takayama 1965:                                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab,main=Main),
1.6       takayama 1966:                                                                                                        Lout);
                   1967:                                                                                        }else{
                   1968:                                                                                                mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);
1.40    ! takayama 1969:                                                                                                mtoupper(M0,F|step=St+1,opt=Opt,main=Main);
1.6       takayama 1970:                                                                                        }
                   1971:                                                                                }
                   1972:
                   1973:                                                                        }
                   1974:                                                                        break;
                   1975:                                                                }
                   1976:                                                        }
                   1977:                                                        if(Var==[]){
                   1978:                                                                FF=1;
                   1979:                                                        }
                   1980:                                                }
                   1981:                                                if(Q0!=1){
                   1982:                                                        if(FF) FF=1;
                   1983:                                                        if(TeX) Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[FF]+" }",Q0/=fctr(Q0)[0][0],"\\ne0,"],
                   1984:                                                                Lout);
                   1985:                                                        else mycat([str_times(" ",St-1)+Assume[FF],Q0,"!=0,"]);
                   1986:                                                        PC*=Q0;St++;
                   1987:                                                }
                   1988:                                        }
                   1989:                                        IF=M[JJ][K]=1;
                   1990:                                        if(Mul!=1){
                   1991:                                                for(L=K+1; L<Size[1]; L++)
                   1992:                                                        M[JJ][L]=red(M[JJ][L]/Mul);
                   1993:                                                if(St){
                   1994:                                                        if(TeX)
                   1995:                                                                Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,
                   1996:                                                                        "\\ \\times=\\ \\left(",red(1/Mul),"\\right)}",
                   1997:                                                                        dupmat(M)],Lout);
                   1998:                                                        else
                   1999:                                                                mycat0([Top+"line",JJ+1, " *= (",red(1/Mul), ")\n",M,"\n\n"],0);
                   2000:                                                }
                   2001:                                        }
                   2002:
                   2003:                                }
                   2004:                                for(J = (Opt>0)?0:(JJ+1); J < Size[0]; J++){
                   2005:                                        if(J == JJ)
                   2006:                                                continue;
                   2007:                                        Mul = -M[J][K];
                   2008:                                        if(Mul!=0){
                   2009:                                                if(Opt!=2)      Mul=rmul(Mul,1/M[JJ][K]);
                   2010:                                                for(I = K+1; I < Size[1]; I++)
                   2011:                                                        M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));
                   2012:                                                M[J][K] = 0;
1.40    ! takayama 2013:                                                if(St&&!Main){
1.6       takayama 2014:                                                        if(Mul<0){
                   2015:                                                                Mul=-Mul;Sgn=0;
                   2016:                                                        }else   Sgn=1;
                   2017:                                                        if(TeX){
                   2018:                                                                if(Mul==1)
                   2019:                                                                        Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2020:                                                                                "}",dupmat(M)],Lout);
                   2021:                                                                else Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2022:                                                                                "\\times\\left(",Mul,"\\right)}",dupmat(M)],Lout);
                   2023:                                                        }else{
                   2024:                                                                if(Mul==1)
                   2025:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1,"\n",M,"\n\n"],0);
                   2026:                                                                else
                   2027:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1," * (",Mul,")\n",M,"\n\n"],0);
                   2028:                                                        }
                   2029:                                                }
                   2030:                                        }
                   2031:                                }
                   2032:                                JJ++;
                   2033:                        }
                   2034:                }
                   2035:        }
                   2036:        if(TeX){
                   2037:                if(TeX==-2) return Lout;
                   2038:                Lout=reverse(Lout);
                   2039:                Br="\\allowdisplaybreaks";
                   2040:                Cr="\\\\\n &";
                   2041:                if(getopt(pages)==1) Cr=Br+Cr;
                   2042:                if(type(S=getopt(cr))==7) Cr=S;
                   2043:                if(type(Lim=getopt(lim))==1){
                   2044:                        if(Lim>0){
                   2045:                                if(Lim<30) Lim=TeXLim;
                   2046:                                Lim*=2;
                   2047:                        }
                   2048:                }else Lim=0;
                   2049:                Out = ltotex(Lout|opt=["cr","spts0"],str=1,cr=Cr,lim=Lim);
                   2050:                if(TeX<0) return Out;
                   2051:                dviout(Out|eq=(str_str(Cr,Br)>=0)?6:5,keep=(TeX==1)?0:1);
                   2052:        }
                   2053:        return M;
                   2054: }
                   2055:
                   2056: def mydet2(M)
                   2057: {
                   2058:        S = size(M);
                   2059:        Det = 1;
                   2060:        MM = mtoupper(M,0);
                   2061:        for(I = 0; I < S[0]; I++)
                   2062:                Det = rmul(Det,MM[I][I]);
                   2063:        return Det;
                   2064: }
                   2065:
                   2066: def myrank(MM)
                   2067: {
                   2068:        S = size(MM);
                   2069:        M = dupmat(MM);
                   2070:        M = mtoupper(M,0);
                   2071:        C = 0;
                   2072:        for(I = K = 0; I < S[0]; I++){
                   2073:                for(J = K; J < S[1]; J++){
                   2074:                        if(M[I][J] != 0){
                   2075:                         C++; K++;
                   2076:                         break;
                   2077:                        }
                   2078:                }
                   2079:        }
                   2080:        return C;
                   2081: }
                   2082:
                   2083: def meigen(M)
                   2084: {
                   2085:        F = getopt(mult);
                   2086:        if(type(M)==4 || type(M)==5){
                   2087:                II=length(M);
                   2088:                for(R=[],I=II-1; I>=0; I--){
                   2089:                        if(F==1)
                   2090:                                R=cons(meigen(M[I]|mult=1),R);
                   2091:                        else
                   2092:                                R=cons(meigen(M[I]),R);
                   2093:                }
                   2094:                return R;
                   2095:        }
                   2096:        S = size(M)[0];
                   2097:        P = mydet2(mgen(S,0,[zz],0)-M);
                   2098:        return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);
                   2099: }
                   2100:
                   2101: def transm(M)
                   2102: {
                   2103:        if(type(M)!=6) M=s2m(M);
                   2104:        if(type(M)!=6){
                   2105:                errno(0);
                   2106:                return 0;
                   2107:        }
                   2108:        L=[M];TeX="";
                   2109:        Line=["\\text{line}","\\text{col}"];
                   2110:        if((DVI=getopt(dviout)) !=1) DVI=0;
                   2111:        else dviout(M);
                   2112:        for(;;){
                   2113:                print(L0=dupmat(car(L)));
                   2114:                Sz=size(L0);
                   2115:                S=keyin("? ");
                   2116:                N=0;
                   2117:                if(str_len(S)<=1){
                   2118:                        if(S=="q") return L;
                   2119:                        if(S=="t"){
                   2120:                                N=mtranspose(L0);
                   2121:                                TeX=["\\text{transpose}"];
                   2122:                        }
                   2123:                        else if(S=="f"){
                   2124:                                if(length(L)>1){
                   2125:                                        if(LF!=0) TeX="";
                   2126:                                        L=cdr(L);LF=L0;
                   2127:                                        if(DVI){
                   2128:                                                dviout0(-1);
                   2129:                                                dviout(" ");
                   2130:                                        }
                   2131:                                }
                   2132:                        }else if(S=="g"){
                   2133:                                if(LF!=0) N=LF;
                   2134:                        }else if(S=="0"){
                   2135:                                N=M;L=[];TeX=[];
                   2136:                        }else if(S=="a"||S=="A"){
                   2137:                                if(DVI&&S=="A") mtoupper(L0,0|step=1,opt=10,dviout=1);
                   2138:                                else mtoupper(L0,0|step=1,opt=10);
                   2139:                        }else{
                   2140:                                mycat0([
                   2141:        "2,5    : line2 <-> line5",
                   2142:        "2,5,-2 ; line2 += (-2)*line5",
                   2143:        "2,2,-2 : line2 *= -2",
                   2144:        "2,5,0  : line2 += (?)*line5 for reduction",
                   2145:        "r,2,5  : raw2 <-> raw5 (r,2,5,-2  etc.)",
                   2146:        "s,x,2  : subst(*,x,2)",
                   2147:        "t      : transpose",
                   2148:        "0      : first matrix",
                   2149:        "f      : previous matrix",
                   2150:        "g      : next matrix (only after f)",
                   2151:        "A      : auto (a : without TeX)",
                   2152:        "q      : quit"
                   2153:                                ],1|delim="\n");
                   2154:                        }
                   2155:                }else{
                   2156:                        FR=0;
                   2157:                        S=evals(S|del=",");
                   2158:                        if(S[0]==r){
                   2159:                                FR=1; S=cdr(S);
                   2160:                        }
                   2161:                        if((LL=length(S))>=2){
                   2162:                                S0=S[0]-1;S1=S[1]-1;
                   2163:                                if(S[0]==s){
                   2164:                                        if(length(S)==3) N=subst(L0,S[1],S[2]);
                   2165:                                        if(DVI) TeX=[S[1],"\\mapsto",S[2]];
                   2166:                                }else if(FR==0){
                   2167:                                        if(S0<0 || S0>=Sz[0] || S1<0 || S1>=Sz[0]) continue;
                   2168:                                        if(LL==2){
                   2169:                                                N=rowx(L0,S0,S1);
                   2170:                                                if(DVI) TeX=[Line[0],S[0],"\\ \\leftrightarrow\\ ",Line[0],S[1]];
                   2171:                                        }else{
                   2172:                                                S2=S[2];
                   2173:                                                if(S0==S1){
                   2174:                                                        N=rowm(L0,S0,S2);
                   2175:                                                        if(DVI) TeX=[Line[0],S[0],"\\ \\times=\\ ",S2];
                   2176:                                                }else{
                   2177:                                                        if(S2==0){
                   2178:                                                                for(J=0;J<Sz[1] && L0[S1][J]==0;J++);
                   2179:                                                                if(J<Sz[1]) S2=-L0[S0][J]/L0[S1][J];
                   2180:                                                        }
                   2181:                                                        if(S2!=0){
                   2182:                                                                N=rowa(L0,S0,S1,S2);
                   2183:                                                                if(DVI) TeX=[Line[0],S[0],"\\ +=\\ ",Line[0],
                   2184:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2185:                                                        }
                   2186:                                                }
                   2187:                                        }
                   2188:                                }else{
                   2189:                                        if(S0<0 || S0>=Sz[1] || S1<0 && S1>=Sz[1]) continue;
                   2190:                                        if(LL==2){
                   2191:                                                N=colx(L0,S0,S1);
                   2192:                                                if(DVI) TeX=[Line[1],S[0],"\\ \\leftrightarrow\\ ",Line[1],S[1]];
                   2193:                                        }else{
                   2194:                                                S2=S[2];
                   2195:                                                if(S0==S1){
                   2196:                                                        N=colm(L0,S0,S2);
                   2197:                                                        if(DVI) TeX=[Line[1],S[0],"\\ \\times=\\ ",S[2]];
                   2198:                                                }else{
                   2199:                                                        if(S2!=0){
                   2200:                                                                for(J=0; I1<Sz[0] && L0[I1][J]==0; J++);
                   2201:                                                                if(J<Sz[0]) S2=-L0[J][S0]/L0[J][S1];
                   2202:                                                        }if(S2!=0){
                   2203:                                                                N=cola(L0,S0,S1,S2);
                   2204:                                                                if(DVI) TeX=[Line[1],S[0],"\\ +=\\ ",Line[1],
                   2205:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2206:                                                        }
                   2207:                                                }
                   2208:                                        }
                   2209:                                }
                   2210:                        }
                   2211:                }
                   2212:                if(N!=0){
                   2213:                        LF=0;L=cons(N,L);
                   2214:                        if(DVI) dviout("\\xrightarrow{"+ltotex(TeX|opt="spts0",str=1)+"}"+mtotex(N)|eq=8);
                   2215:                }
                   2216:        }
                   2217: }
                   2218:
                   2219: def vgen(V,W,S)
                   2220: {
                   2221:        IM=length(V);
                   2222:        I=(getopt(opt)==0)?IM:0;
                   2223:        for(SS=0; I<IM && (SS==0 || V[I]<=W[I]); I++)
                   2224:                SS += W[I];
                   2225:        if(I<IM){
                   2226:                W[I]++;
                   2227:                SS--;
                   2228:        }else
                   2229:                SS=S;
                   2230:        for(J=0;J<I;J++){
                   2231:                 W[J] = (SS<=V[J])?SS:V[J];
                   2232:                 SS -= W[J];
                   2233:        }
                   2234:        if(SS>0)
                   2235:                return -1;
                   2236:        return(I==IM)?0:I;
                   2237: }
                   2238:
                   2239: def mmc(M,X)
                   2240: {
                   2241:        Mt=getopt(mult);
                   2242:        if(type(M)==7) M=os_md.s2sp(M);
                   2243:        if(type(M)!=4||type(M[0])!=6) return 0;
                   2244:        if(type(M[0])!=6){                      /* spectre type -> GRS */
                   2245:                G=s2sp(M|std=1);
                   2246:                L=length(G);
                   2247:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   2248:                V=cons(makev([L+9]),V);
                   2249:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   2250:                if(getopt(short)!=0){
                   2251:                        V=append(cdr(V),[V[0]]);
                   2252:                        G=shortv(G,V);
                   2253:                }
                   2254:                R=chkspt(G|mat=1);
                   2255:                if(Mt!=1) Mt=0;
                   2256:                if(R[2]!=2 || R[3]!=0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   2257:                MZ=newmat(1,1);
                   2258:                SS=length(G);
                   2259:                if(Mt==1) SS=SS*(SS-1)/2;
                   2260:                for(M=[],I=0;I<SS;I++) M=cons(MZ,M);
                   2261:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   2262:                        RT=car(RR)[0];
                   2263:                        if(type(RT)==4){
                   2264:                                if(RT[0]!=0) M=mmc(M,[RT[0]]|simplify=Simp);
                   2265:                                M=mmc(M,[cdr(RT)]);
                   2266:                        }
                   2267:                }
                   2268: /*             for(R=cdr(R);R!=[];R=cdr(R)) M=mmc(M,[car(R)[0]]|mult=Mt); */
                   2269:        }
                   2270:        if(X==0) return M;
                   2271:        L=length(M);
                   2272:        if((L>=6 && Mt!=0)||(L==3&&Mt==1)){
                   2273:                for(SS=2,I=3; I<L; I+=(++SS));
                   2274:                if(I!=L) return -1;
                   2275:                Mt=1;
                   2276:        }else{
                   2277:                SS=L;Mt=0;
                   2278:        }
                   2279:        if(length(X)==SS+1){
                   2280:                if(car(X)!=0&&(M=mmc(M,[car(X)]|mult=Mt))==0) return M;
                   2281:                return mmc(M,cdr(X)|mult=Mt);
                   2282:        }
                   2283:        for(I=X;I!=[];I=cdr(I)) if(I[0]!=0) break;
                   2284:        if(I==[]) return M;
                   2285:        Simp=getopt(simplify);
                   2286:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   2287:        N=newvect(L);
                   2288:        for(I=0;I<L;I++) N[I]=dupmat(M[I]);
                   2289:        S=size(N[0])[0];
                   2290:        if(type(X)==4&&length(X)>SS){   /* addition */
                   2291:                for(I=0;I<SS;I++,X=cdr(X)) if(X[I] != 0) N[I] = radd(N[I],car(X));
                   2292:        }
                   2293:        if(length(X)!=1) return 0;
                   2294:        X=X[0];
                   2295:        MZ = newmat(S,S);
                   2296:        MM = newvect(L);
                   2297:        for(M1=J=0; J<SS; J++){
                   2298:                for(R=[],I=SS-1; I>=0; I--){
                   2299:                        if(I==J){
                   2300:                                for(RR=[],K=SS-1; K>=0; K--)
                   2301:                                        RR=cons((K==I)?N[K]+diagm(S,[X]):N[K],RR);
                   2302:                                R=cons(RR,R);
                   2303:                        }else R=cons([MZ],R);
                   2304:                }
                   2305:                MM[J]=newbmat(SS,SS,R);
                   2306:                if(J==0) M1=MM[0];
                   2307:                else M1=radd(M1,MM[J]);
                   2308:        }
                   2309:        /* middle convolution */
                   2310:        for(P=0,Q=1;J<L;J++){   /* A_{P,Q} */
                   2311:                for(R=[],I=SS-1; I>=0; I--){
                   2312:                        for(RR=[],K=SS-1;K>=0;K--){
                   2313:                                MT=MZ;
                   2314:                                if(I==K){
                   2315:                                        MT=N[J];
                   2316:                                        if(I==P) MT-=N[Q];
                   2317:                                        else if(I==Q) MT-=N[P];
                   2318:                                }else if(I==P && K==Q) MT=N[Q];
                   2319:                                 else if(I==Q && K==P) MT=N[P];
                   2320:                                RR=cons(MT,RR);
                   2321:                        }
                   2322:                        R=cons(RR,R);
                   2323:                }
                   2324:                MM[J]=newbmat(SS,SS,R);
                   2325:                if(++Q==SS){
                   2326:                        P++;Q=P+1;
                   2327:                }
                   2328:        }
                   2329:        for(R=[],I=SS-1; I>=0; I--){
                   2330:                for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);
                   2331:                R=cons(RR,R);
                   2332:        }
                   2333:        M0 = newbmat(SS,SS,R);
                   2334:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   2335:        if(length(KE) == 0) return MM;
                   2336:        KK = mtoupper(lv2m(KE),0);
                   2337:        for(I=0;I<L;I++) MM[I] = mmod(MM[I],KK);
                   2338:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   2339:        return MM;
                   2340: }
                   2341:
                   2342: def lpgcd(L)
                   2343: {
                   2344:        for(F=[]; L!=[]; L=cdr(L)){
                   2345:                if((P=car(L))==0) continue;
                   2346:                        if(F==[]){
                   2347:                                F=fctr(P);
                   2348:                                S=length(F);
                   2349:                                S--;
                   2350:                                V=newvect(S);
                   2351:                                M=newvect(S);
                   2352:                                for(I=0; I<S; I++){
                   2353:                                        M[I] = F[I+1][1];
                   2354:                                        V[I] = F[I+1][0];
                   2355:                                }
                   2356:                                N=nm(ptozp(P|factor=1)[1]);
                   2357:                                continue;
                   2358:                 }
                   2359:                 N=igcd(ptozp(P|factor=1)[1],N);
                   2360:                 for(I=0; I<S; I++){
                   2361:                         for(Q=P,CT=0; CT<M[I]; CT++)
                   2362:                                 if((Q=tdiv(Q,V[I])) == 0) break;
                   2363:                         if(CT<M[I]) M[I]=CT;
                   2364:                 }
                   2365:        }
                   2366:        if(F==[]) return 0;
                   2367:        for(Q=N,I=0;I<S; I++){
                   2368:                while(M[I]>0){
                   2369:                        Q *= V[I];
                   2370:                        M[I]--;
                   2371:                }
                   2372:        }
                   2373:        return Q;
                   2374: }
                   2375:
                   2376: def mdivisor(M,X)
                   2377: {
                   2378:        S=size(M=dupmat(M));
                   2379:        XX=(type(X)==4||X==0)?X:[0,X];
                   2380:        S0=S[0]; S1=S[1];
                   2381:        if((Tr=getopt(trans))==1||Tr==2){
                   2382:                Tr0=1;
                   2383:                GR=mgen(S0,0,1,0); GC=mgen(S1,0,1,0);
                   2384:        }else Tr=Tr0=0;
                   2385:         /* 0,a,b       : (a,b)->(1,1)
                   2386:                1               : (1,1) invertible
                   2387:                2,i,M   : line 0,i by M
                   2388:                3,j,M   : col  0,j by M
                   2389:                4,j             : col  1 += col j
                   2390:                5,j,T   : line j by T
                   2391:                6,j,T   : col  1 += col j by T (non-com)
                   2392:                7,j             : line 2<->j  (non-com)
                   2393:         */
                   2394:        if(type(V=getopt(dviout))==1){
                   2395:                if(type(XX)==4 && type(XX[0])>1) Var=[XX[1],"\\partial"];
                   2396:                else    Var=0;
                   2397:                Tr=(abs(V)==3)?0:1;
                   2398:                MM=dupmat(M);
                   2399:                II=((S[0]>S[1])?S[1]:S[0])+1;
                   2400:                if(abs(V)>1){
                   2401:                        Is1=Js1=S[0]+S[1];
                   2402:                        Is=Js=[0,[Is1]];
                   2403:                }else{
                   2404:                        Is=[0,[Is1=S[0]]];Js=[0,[Js1=S[1]]];
                   2405:                }
                   2406:                VV=V;
                   2407:                V=newvect(II);
                   2408:                for(I=0;I<II;I++) V[I]=[];
                   2409:                N=newbmat(2,2,[[M,mgen(S[0],0,[1],0)],[mgen(S[1],0,[1],0)]]);
                   2410:                mdivisor(M,X|step=1,dviout=V);
                   2411:                L=S[0]+S[1];
                   2412:                if(Tr){
                   2413:                        NN=mperm(N,Is1,Js1);
                   2414:                        for(K=S[0];K<Is1;K++){
                   2415:                                for(L=S[1];L<Js1;L++)
                   2416:                                        NN[K][L]=" ";
                   2417:                        }
                   2418:                        Out=[[mperm(NN,Is,Js)]];
                   2419:                }
                   2420:                for(I=1;I<II;I++){
                   2421:                        I0=I-1;
                   2422:                        if(V[I]==[]) continue;
                   2423:                        for(T=reverse(V[I]);T!=[];T=cdr(T)){
                   2424:                                St=[];
                   2425:                                C=car(R=car(T));
                   2426:                                if(C==0){
                   2427:                                        N=mperm(N,(R[1]==0)?0:[[R[1]+I0,I0]],(R[2]==0)?0:[[R[2]+I0,I0]]);
                   2428:
                   2429:                                        if(Tr){
                   2430:                                                if(R[2]!=0) St=append(["C",I,"\\leftrightarrow C",R[2]+I],St);
                   2431:                                                if(R[1]!=0){
                   2432:                                                        if(R[2]!=0) St=cons(",\\ ",St);
                   2433:                                                        St=append(["L",I,"\\leftrightarrow L",R[1]+I],St);
                   2434:                                                }
                   2435:                                                Out=cons(St,Out);
                   2436:                                        }
                   2437:                                }else if(C==1){
                   2438:                                        P=1/N[I0][I0];N[I0][I0]=1;
                   2439:                                        if(P!=1){
                   2440:                                                for(J=I;J<L;J++)
                   2441:                                                        N[I0][J]=muldo(P,N[I0][J],XX);
                   2442:
                   2443:                                                if(Tr){
                   2444:                                                        St=append(["L",I,"\\leftarrow(",P,")","\\times L",I],St);
                   2445:                                                        Out=cons(St,Out);
                   2446:                                                        NN=mperm(N,Is1,Js1);
                   2447:                                                        for(K=S[0];K<Is1;K++){
                   2448:                                                                for(L=S[1];L<Js1;L++)
                   2449:                                                                        NN[K][L]=" ";
                   2450:                                                        }
                   2451:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2452:                                                }
                   2453:                                        }
                   2454:                                        for(F=0,J=I;J<S[0];J++){
                   2455:                                                if((P=N[J][I0])==0) continue;
                   2456:                                                F++;
                   2457:                                                N[J][I0]=0;
                   2458:                                                for(K=I;K<L;K++)
                   2459:                                                        N[J][K]=red(N[J][K]-muldo(P,N[I0][K],XX));
                   2460:
                   2461:                                        }
                   2462:                                        if(F){
                   2463:                                                if(Tr){
                   2464:                                                        Out=cons(["Li\\ -\\!=\\ \\circ\\times L",I,"\\quad(i>",I,")"],Out);
                   2465:                                                        NN=mperm(N,Is1,Js1);
                   2466:                                                        for(K=S[0];K<Is1;K++){
                   2467:                                                                for(L=S[1];L<Js1;L++)
                   2468:                                                                        NN[K][L]=" ";
                   2469:                                                        }
                   2470:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2471:                                                }
                   2472:                                        }
                   2473:                                        for(F=0,J=I;J<S[1];J++){
                   2474:                                                if((P=N[I0][J])==0) continue;
                   2475:                                                F++;
                   2476:                                                N[I0][J]=0;
                   2477:                                                for(K=I;K<L;K++)
                   2478:                                                        N[K][J]=red(N[K][J]-muldo(N[K][I0],P,XX));
                   2479:                                        }
                   2480:                                        if(F&&Tr) Out=cons(["Cj\\ -\\!=\\ C",I,"\\times\\circ\\quad(j>",I,")"],Out);
                   2481:                                        else continue;
                   2482:                                }else if(C==2){
                   2483:                                        C=mat(N[I0],N[R[1]+I0]);C=muldo(R[2],C,XX);
                   2484:                                        for(J=0;J<L;J++){
                   2485:                                                N[I0][J]=C[0][J];N[R[1]+I0][J]=C[1][J];
                   2486:                                        }
                   2487:                                        if(Tr) Out=cons([dupmat(R[2]),"\\begin{pmatrix}L",I,"\\\\L",R[1]+I,
                   2488:                                                "\\end{pmatrix}"],Out);
                   2489:                                }else if(C==3){
                   2490:                                        C=newmat(L,2);
                   2491:                                        for(J=0;J<L;J++){
                   2492:                                                C[J][0]=N[J][I0];C[J][1]=N[J][R[1]+I0];
                   2493:                                        }
                   2494:                                        C=muldo(C,R[2],XX);
                   2495:                                        for(J=0;J<L;J++){
                   2496:                                                N[J][I0]=C[J][0];N[J][R[1]+I0]=C[J][1];
                   2497:                                        }
                   2498:                                        if(Tr) Out=cons(["\\begin{pmatrix}C",I,"&C",R[1]+I,"\\end{pmatrix}",
                   2499:                                                dupmat(R[2])],Out);
                   2500:                                }else if(C==4){
                   2501:                                        for(J=0;J<L;J++)
                   2502:                                                N[J][I0]=red(N[J][I0]+N[J][R[1]+I0]);
                   2503:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",R[1]+I],Out);
                   2504:                                }else if(C==5){
                   2505:                                        for(J=0;J<L;J++)
                   2506:                                                N[I0+R[1]][J]=red(R[2]*N[I0+R[1]][J]);
                   2507:                                        if(Tr) Out=cons(["L",I+R[1],"\\leftarrow(", R[2],")\\times L",I+R[1]],
                   2508:                                                Out);
                   2509:                                }else if(C==6){
                   2510:                                        for(J=0;J<L;J++)
                   2511:                                                N[J][I0]=N[J][I0]+muldo(N[J][I0+R[1]],R[2],XX);
                   2512:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",I+R[1],"\\times(", R[2],")"],
                   2513:                                                Out);
                   2514:                                }else if(C==7){
                   2515:                                        mycat(["line",I+1,"\\leftrightarrow",R[1]+I]);
                   2516:                                        for(J=0;J<L;J++){
                   2517:                                                C=N[I][J];N[I][J]=N[R[1]+I0][J];N[R[1]+I0][J]=C;
                   2518:                                        }
                   2519:                                        if(Tr) Out=cons(["L",I+1,"\\leftrightarrow L",R[1]+I],Out);
                   2520:                                }
                   2521:                                if(Tr){
                   2522:                                        NN=mperm(N,Is,Js);
                   2523:                                        for(K=S[0];K<Is1;K++){
                   2524:                                                for(L=S[1];L<Js1;L++)
                   2525:                                                        NN[K][L]=" ";
                   2526:                                        }
                   2527:                                        Out=cons(["\\to",NN],Out);
                   2528:                                }
                   2529:                        }
                   2530:                }
                   2531:                if(!Tr){
                   2532:                        NN=mperm(N,Is,Js);
                   2533:                        Out=[];
                   2534:                }
                   2535:                if(S[0]+S[1]==Is1){
                   2536:                        N1=mperm(NN,[0,[S[0]]],[S[1],[S[0]]]);
                   2537:                        N2=mperm(NN,[S[0],[S[1]]],[0,[S[1]]]);
                   2538:                        N3=mperm(NN,[0,[S[0]]],[0,[S[1]]]);
                   2539:                        R1=mdivisor(N1,X|trans=1)[1];
                   2540:                        R2=mdivisor(N2,X|trans=1)[1];
                   2541:                        if(Tr){
                   2542:                                Out=cons(["\\text{As a result,}"],Out);
                   2543:                                Out=cons([N3,"=",N1,MM,N2],Out);
                   2544:                                if(S[0]==S[1] && N3==mgen(S[0],0,1,0)){
                   2545:                                        Out=cons(["=",muldo(N2,N1,XX),MM,"."],Out);
                   2546:                                }else{
                   2547:                                        Out=cons([N1,"^{-1}=",R1,","],Out);
                   2548:                                        Out=cons([N2,"^{-1}=",R2,"."],Out);
                   2549:                                }
                   2550:                        }else{
                   2551:                                Out=cons([N3,"=P",MM,"Q,"],Out);
                   2552:                                Out=cons(["P=",N1,"=",R1,"^{-1},"],Out);
                   2553:                                Out=cons(["Q=",N2,"=",R2,"^{-1}."],Out);
                   2554:                        }
                   2555:                }
                   2556:                Out = ltotex(reverse(Out)|opt=["cr","spts0"],str=1,cr=15,var=Var);
                   2557:                if(S[0]+S[1]==Is1)
                   2558:                        Out=str_subst(Out,"\\texttt{ }","");
                   2559:                if(VV>0){
                   2560:                        dviout(Out|eq=6);
                   2561:                        return NN;
                   2562:                }
                   2563:                return Out;
                   2564:        }else if(type(V)!=5) V=0;
                   2565:
                   2566:        if(type(St=getopt(step))!=1) St=0;
                   2567:        for(FF=": start";;){
                   2568:                if(St && V==0){
                   2569:                        if(Tr){
                   2570:                                mycat0([St,FF,"\n"],0);
                   2571:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2572:                        }
                   2573:                        else    mycat0([St,FF,"\n",M,"\n"],0);
                   2574:                }
                   2575:                if(X==0||X==[0,0]){ /* search minimal non-zero element */
                   2576:                        for(K=F=I=0; I<S0; I++){
                   2577:                                for(J=0; J<S1; J++){
                   2578:                                        if((P=abs(M[I][J]))!=0 && (K>P || K==0)){
                   2579:                                                K=P; R=[I,J];
                   2580:                                        }
                   2581:                                }
                   2582:                        }
                   2583:                        R=cons(K-1,[R]);
                   2584:                }
                   2585:                else R=mymindeg(M,XX[1]|opt=1);
                   2586:                if(R[0]<0){             /*zero matrix */
                   2587:                        if(Tr) return [[],mgen(S0,0,1,0),mgen(S1,0,1,0)];
                   2588:                        return [];
                   2589:                }
                   2590:                R0=R[1][0];R1=R[1][1];
                   2591:                if(R0!=0){
                   2592:                        M=rowx(M,0,R0);
                   2593:                        if(Tr) GR=rowx(GR,0,R0);
                   2594:                }
                   2595:                if(R1!=0){
                   2596:                        M=colx(M,0,R1);
                   2597:                        if(Tr) GC=colx(GC,0,R1);
                   2598:                }
                   2599:                if(St>0 && (R0!=0 || R1!=0))
                   2600:                        if(type(V)==5) V[St]=cons([0,R0,R1],V[St]);
                   2601:                        else if(Tr){
                   2602:                                mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n"],0);
                   2603:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2604:                        }else mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n",M,"\n"],0);
                   2605:                if(R[0]==0){            /* (1,1) : invertible */
                   2606:                        if(type(V)==5) V[St]=cons([1],V[St]);
                   2607:                        P=M[0][0]; M[0][0]=1;
                   2608:                        for(J=0;J<S1;J++){      /* (1,1) -> 1 */
                   2609:                                if(J>0) M[0][J]= red(M[0][J]/P);
                   2610:                                if(Tr) GR[0][J]=red(GR[0][J]/P);
                   2611:                        }
                   2612:                        if(S0>1 && S1>1) N=newmat(S0-1,S1-1);
                   2613:                        else N=0;
                   2614:                        for(I=1;I<S0;I++){
                   2615:                                P=M[I][0]; M[I][0]=0;
                   2616:                                for(J=1;J<S1;J++)
                   2617:                                        N[I-1][J-1]=M[I][J]=red(M[I][J] - muldo(P,M[0][J],XX));
                   2618:                                if(Tr){
                   2619:                                        for(J=0;J<S0;J++)
                   2620:                                                GR[I][J] = red(GR[I][J] -muldo(P,GR[0][J],XX));
                   2621:                                }
                   2622:                        }
                   2623:                        if(Tr){
                   2624:                                for(J=1;J<S1; J++){
                   2625:                                        for(I=0;I<S1;I++) GC[I][J]=red(GC[I][J]-muldo(GC[I][0],M[0][J],XX));
                   2626:                                        M[0][J]=0;
                   2627:                                }
                   2628:                        }
                   2629:                        if(St>0 && V==0){
                   2630:                                if(Tr){
                   2631:                                        mycat0([St,": unit\n"],0);
                   2632:                                        mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2633:                                }
                   2634:                                else mycat0([St,": unit\n",M,"\n"],0);
                   2635:                        }
                   2636:                        if(N==0){
                   2637:                                if(!Tr) return [1];
                   2638:                                if(Tr==2){
                   2639:                                        GR0=mdivisor(GR,X|trans=1)[1];
                   2640:                                        GC0=mdivisor(GC,X|trans=1)[1];
                   2641:                                        return [[1],GR,GC,GR0,GC0];
                   2642:                                }
                   2643:                                return [[1],GR,GC];
                   2644:                        }
                   2645:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2646:                        if(!Tr) return cons(1,R);
                   2647:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2648:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2649:                        if(S0==S1 && countin(1,1,R[0])==S0-1){
                   2650:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2651:                        }
                   2652:                        if(Tr==2){
                   2653:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2654:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2655:                                return [cons(1,R[0]),GR,GC,GR0,GC0];
                   2656:                        }
                   2657:                        return [cons(1,R[0]),GR,GC];
                   2658:                }
                   2659:                for(I=1;I<S0;I++){
                   2660:                        if(M[I][0]!=0){
                   2661: /* Error! when mygcd(A,B,0) with A<=0 or B<=0 */
                   2662:                                R=mygcd(M[I][0],M[0][0],XX);    /* R[0]=R[1]*M[I][0]+R[2]*M[0][0] */
                   2663:                                M[0][0]=R[0]; M[I][0]=0;        /*    0=R[3]*M[I][0]+R[4]*M[0][0] */
                   2664:                                for(J=1;J<S1;J++){
                   2665:                                        T=red(muldo(R[1],M[I][J],XX)+muldo(R[2],M[0][J],XX));
                   2666:                                        M[I][J]=red(muldo(R[3],M[I][J],XX)+muldo(R[4],M[0][J],XX));
                   2667:                                        M[0][J]=T;
                   2668:                                }
                   2669:                                if(Tr){
                   2670:                                        for(J=0;J<S0;J++){
                   2671:                                                T=red(muldo(R[1],GR[I][J],XX)+muldo(R[2],GR[0][J],XX));
                   2672:                                                GR[I][J]=red(muldo(R[3],GR[I][J],XX)+muldo(R[4],GR[0][J],XX));
                   2673:                                                GR[0][J]=T;
                   2674:                                        }
                   2675:                                }
                   2676:                                if(St && V==0){
                   2677:                                        mycat([" [",R[2],R[1],"]*"]);
                   2678:                                        mycat([" [",R[4],R[3],"]"]);
                   2679:                                }
                   2680:                                if(type(V)==5) V[St]=cons([2,I,mat([R[2],R[1]],[R[4],R[3]])],V[St]);
                   2681:                                FF=": line 1 & "+rtostr(I+1); I=S0;
                   2682:                        }
                   2683:                }
                   2684:                if(I>S0) continue;
                   2685:                for(J=1;J<S1;J++){
                   2686:                        if(M[0][J]!=0){
                   2687:                                R=mygcd(M[0][J],M[0][0],XX|rev=1); /* R[0]=M[0][J]*R[1]+M[0][0]*R[2] */
                   2688:                                M[0][0]=R[0]; M[0][J]=0;                 /*    0=M[0][J]*R[3]+M[0][0]*R[4] */
                   2689:                                for(I=1;I<S0;I++){
                   2690:                                        T=red(muldo(M[I][J],R[1],XX)+muldo(M[I][0],R[2],XX));
                   2691:                                        M[I][J]=red(muldo(M[I][J],R[3],XX)+muldo(M[I][0],R[4],XX));
                   2692:                                        M[I][0]=T;
                   2693:                                }
                   2694:                                if(Tr){
                   2695:                                        for(I=0;I<S1;I++){
                   2696:                                                T=red(muldo(GC[I][J],R[1],XX)+muldo(GC[I][0],R[2],XX));
                   2697:                                                GC[I][J]=red(muldo(GC[I][J],R[3],XX)+muldo(GC[I][0],R[4],XX));
                   2698:                                                GC[I][0]=T;
                   2699:                                        }
                   2700:                                }
                   2701:                                if(type(V)==5) V[St]=cons([3,J,mat([R[2],R[4]],[R[1],R[3]])],V[St]);
                   2702:                                FF=": column 1 & "+rtostr(J+1);J=S1;
                   2703:                                if(St && V==0){
                   2704:                                        mycat([" *[",R[2],R[4],"]"]);
                   2705:                                        mycat(["  [",R[1],R[3],"]"]);
                   2706:                                }
                   2707:                        }
                   2708:                }
                   2709:                if(J>S1) continue;
                   2710:                if(S0==1 || S1==1){
                   2711:                        P=M[0][0];
                   2712:                        if(X==0){
                   2713:                                if(P<0){
                   2714:                                        P=-P;
                   2715:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2716:                                        if(type(V)==5) V[St]=cons([5,0,-1],V[St]);
                   2717:                                }
                   2718:                        }else{
                   2719:                                P=nm(P);
                   2720:                                if((R=fctr(P)[0][0])!=1){
                   2721:                                        P/=R;
                   2722:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]/=R;
                   2723:                                        if(type(V)==5) V[St]=cons([5,0,1/R],V[St]);
                   2724:                                }
                   2725:                        }
                   2726:                        if(!Tr) return [P];
                   2727:                        if(Tr==2){
                   2728:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2729:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2730:                                return [[P],GR,GC,GR0,GC0];
                   2731:                        }
                   2732:                        return [[P],GR,GC];
                   2733:                }
                   2734:                if(XX==0 || (type(XX)==4 && XX[0]==0)){                 /* commutative case */
                   2735:                        P=M[0][0];
                   2736:                        for(I=1; I<S0; I++){
                   2737:                                for(J=1; J<S1; J++)
                   2738:                                        if(divdo(M[I][J],P,XX)[1]!=0) break;
                   2739:                                if(J<S1){
                   2740:                                        if(type(V)==5) V[St]=cons([4,J],V[St]);
                   2741:                                        FF=": column 1 += col"+rtostr(J+1);
                   2742:                                        for(I=1;I<S0;I++) M[I][0]=M[I][J];
                   2743:                                        if(Tr) for(I=0;I<S1;I++) GC[I][0]=red(GC[I][0]+GC[I][J]);
                   2744:                                        break;
                   2745:                                }
                   2746:                        }
                   2747:                        if(J<S1) continue;
                   2748:                        N=newmat(S0-1,S1-1);
                   2749:                        for(I=1;I<S0;I++)
                   2750:                                for(J=1;J<S1;J++) N[I-1][J-1]=red(M[I][J]/P);
                   2751:                        if(X==0){
                   2752:                                if(P<0) P=-P;
                   2753:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2754:                        }else{
                   2755:                                P=M[0][0];
                   2756:                                P=nm(P);
                   2757:                                P/=fctr(P)[0][0];
                   2758:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]/=fctr(P)[0][0];
                   2759:                        }
                   2760:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2761:                        RT=(Tr)?R[0]:R;
                   2762:                        for(RR=[],L=reverse(RT);L!=[];L=cdr(L))
                   2763:                                RR=cons(red(P*car(L)),RR);
                   2764:                        RR=cons(P,RR);
                   2765:                        if(!Tr) return RR;
                   2766:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2767:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2768:                        if(S0==S1 && countin(1,1,RR)==S0){
                   2769:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2770:                        }
                   2771:                        if(Tr==2){
                   2772:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2773:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2774:                                return [RR,GR,GC,GR0,GC0];
                   2775:                        }
                   2776:                        return [RR,GR,GC];
                   2777:                }  /* End of commutative case */
                   2778:                for(I=1; I<S0; I++){
                   2779:                        for(J=1; J<S1; J++){
                   2780:                                if(M[I][J] != 0){
                   2781:                                        for(T=1;I<S0;T*=XX[0]){
                   2782:                                                R=divdo(muldo(M[I][J],T,XX),M[0][0],XX);
                   2783:                                                if(R[1]!=0){
                   2784:                                                        if(type(V)==5) V[St]=cons([6,J,T],V[St]);
                   2785:                                                        FF=": column 1 += col"+rtostr((J+1)*T);
                   2786:                                                        if(I>1){
                   2787:                                                                M=rowx(M,1,I);
                   2788:                                                                if(Tr) GR=rowx(GR,1,I);
                   2789:                                                                if(type(V)==5) V[St]=cons([7,I],V[St]);
                   2790:                                                                FF+=", line 2<->"+rtostr(I+1);
                   2791:                                                        }
                   2792:                                                        for(I=1;I<S0;I++)   M[I][0]=muldo(M[I][J],T,XX);
                   2793:                                                        if(Tr)
                   2794:                                                                for(I=1;I<S1;I++) GC[I][0]=red(GC[I][0]+muldo(GC[I][J],T,XX));
                   2795:                                                        I=S0+1; J=S1;
                   2796:                                                        break;
                   2797:                                                }
                   2798:                                        }
                   2799:                                }
                   2800:                        }
                   2801:                        if(I>S0) break;
                   2802:                }
                   2803:                if(I==S0) return [];  /* zero matrix : never happen */
                   2804:        }
                   2805: }
                   2806:
                   2807: def mdsimplify(L)
                   2808: {
                   2809:        T=getopt(type);
                   2810:        SS=0;
                   2811:        if(type(L)==6){
                   2812:                L=[L]; SS=1;
                   2813:        }
                   2814:        if(type(L)==5){
                   2815:                SS=2;
                   2816:                L = vtol(L);
                   2817:        }
                   2818:        M=car(L);
                   2819:        S=size(M)[0];
                   2820: #if 0
                   2821:        MN=newmat(S,S);
                   2822:        MD=newmat(S,S);
                   2823:        for(I=0;I<S;I++){
                   2824:                for(J=0;J<S;J++){
                   2825:                        TN=0;TD=1;
                   2826:                        for(PL=L;PL!=[];PL=cdr(PL)){
                   2827:                                TM=red(car(PL)[I][J]);
                   2828:                                TN=lgcd([TN,nm(TM)]|pol=1);
                   2829:                                TD=llcm([TD,dn(TM)]|pol=1);
                   2830:                        }
                   2831:                        MN[I][J]=TM;
                   2832:                        MD[I][J]=TN;
                   2833:                }
                   2834:        }
                   2835:        for(I=0;I<S;I++){
                   2836:                for(J=0;J<S;J++){
                   2837:                        if(I==J||type(TD[I][J])<2||type(TN[J][I])<2) continue;
                   2838:                        for(FC=cdr(fctr(TD[I][J]));FC!=[];){
                   2839:                                TFC=car(FC);
                   2840:                                if(type(red(TN[J][I]/TFC[0]))>2) continue;
                   2841:                        }
                   2842:                }
                   2843:        }
                   2844: #endif
                   2845:        DD=newvect(S);
                   2846:        for(I=0; I<S; I++){
                   2847:                LN=RN=[];
                   2848:                LD=RD=1;
                   2849:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   2850:                        M = car(LL);
                   2851:                        for(J=0; J<S; J++){
                   2852:                                if(J==I) continue;
                   2853:                                if((MM=M[I][J]) != 0){
                   2854:                                        LN = cons(nm(MM),LN);
                   2855:                                        if(type(MM)==3 && tdiv(LD,P=dn(MM))==0)
                   2856:                                                LD=tdiv(LD*P,gcd(LD,P));
                   2857:                                }
                   2858:                                if((MM=M[J][I]) != 0){
                   2859:                                        RN = cons(nm(MM),RN);
                   2860:                                        if(type(MM)==3 && tdiv(RD,P=dn(MM))==0)
                   2861:                                                RD=tdiv(RD*P,gcd(RD,P));
                   2862:                                }
                   2863:                        }
                   2864:                }
                   2865:                if(T==1 || T==3) LQ=RD;
                   2866:                else{
                   2867:                        P=lpgcd(LN);
                   2868:                        LQ=gcd(P,RD);
                   2869:                        if(P!=0) LQ *= nm(fctr(P)[0][0]);
                   2870:                }
                   2871:                if(T==1 || T==2) RQ=LD;
                   2872:                else{
                   2873:                        P=lpgcd(RN);
                   2874:                        RQ=gcd(P,LD);
                   2875:                        if(P!=0) RQ *= nm(fctr(P)[0][0]);
                   2876:                }
                   2877:                if((P=gcdz(LQ,RQ))!=1){
                   2878:                        LQ = red(LQ/P); RQ=red(RQ/P);
                   2879:                }
                   2880:                DD[I]=red(LQ/RQ);
                   2881:                if(LQ!=1 || RQ!=1){
                   2882:                        for(LA=[],LL=L; LL!=[]; LL=cdr(LL)){
                   2883:                                M = car(LL);
                   2884:                                for(J=0; J<S; J++){
                   2885:                                        if(I!=J){
                   2886:                                                if(LQ!=1){
                   2887:                                                        M[I][J] = red(M[I][J]/LQ);
                   2888:                                                        M[J][I] = red(M[J][I]*LQ);
                   2889:                                                }
                   2890:                                                if(RQ!=1){
                   2891:                                                        M[J][I] = red(M[J][I]/RQ);
                   2892:                                                        M[I][J] = red(M[I][J]*RQ);
                   2893:                                                }
                   2894:                                        }
                   2895:                                }
                   2896:                        }
                   2897:                }
                   2898:        }
                   2899:        if(SS==2) L=ltov(L);
                   2900:        if(SS==1) L=L[0];
                   2901:        if(getopt(show)==1) L=[L,DD];
                   2902:        return L;
                   2903: }
                   2904:
                   2905: def m2mc(M,X)
                   2906: {
                   2907:        if(type(M)<2){
                   2908:        mycat([
                   2909: "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
                   2910: " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
                   2911: " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
                   2912: " s : TeX, dviout, GRSC\n",
                   2913: " option : swap, small, simplify, operator, int\n",
                   2914: " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
                   2915: ]);
                   2916:                return 0;
                   2917:        }
                   2918:        if(type(M)==7) M=s2sp(M);
                   2919:        if(type(X)==7) X=[X];
                   2920:        Simp=getopt(simplify);
                   2921:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   2922:        Small=(getopt(small)==1)?1:0;
                   2923:        if(type(M[0])==4){
                   2924:                if(type(M[0][0])==1){ /* spectral type */
                   2925:                        XX=getopt(dep);
                   2926:                        if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
                   2927:                        M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
                   2928:                        if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
                   2929:                        if(getopt(int)!=0){
                   2930:                                T=M[XX[0]-1][XX[1]-1][1];
                   2931:                                for(V=vars(T);V!=[];V=cdr(V)){
                   2932:                                        F=coef(T,1,car(V));
                   2933:                                        if(type(F)==1 && dn(F)>1)
                   2934:                                         M = subst(M,car(V),dn(F)*car(V));
                   2935:                                }
                   2936:                        }
                   2937:                        V=vars(M);
                   2938:                        if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
                   2939:                                M=subst(M,d1,d);
                   2940:                }
                   2941:                RC=chkspt(M|mat=1);
                   2942:                if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
                   2943:                        erno(0);return 0;
                   2944:                }
                   2945:                R=getbygrs(M,1|mat=1);
                   2946:                if(getopt(anal)==1) return R;   /* called by mc2grs() */
                   2947:                Z=newmat(1,1,[[0]]);
                   2948:                N=[Z,Z,Z,Z,Z];
                   2949:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   2950:                        RT=car(RR)[0];
                   2951:                        if(type(RT)==4){
                   2952:                                if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
                   2953:                                N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
                   2954:                        }
                   2955:                }
                   2956:                if(type(X)==4 && type(X[0])==7)
                   2957:                        return m2mc(N,X|keep=Keep,small=Small);
                   2958:                return N;
                   2959:        }
                   2960:        if(type(X)==4 && type(X[0])==7){
                   2961:                Keep=(getopt(keep)==1)?1:0;
                   2962:                if(X[0]=="All"){
                   2963:                        dviout("Riemann scheme"|keep=1);
                   2964:                        m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
                   2965:                        dviout("Spectral types : "|keep=1);
                   2966:                        m2mc(M,["sp","dviout"]|keep=1);
                   2967:                        dviout("\\\\\nBy the decompositions"|keep=1);
                   2968:                        R=m2mc(M,["pairs","dviout"]|keep=1);
                   2969:                        for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
                   2970:                                for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
                   2971:                                if(S==0) R0=cons(I,R0);
                   2972:                                else if(S<0) R1=cons(I,R1);
                   2973:                        }
                   2974:                        S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
                   2975:                                +"\\ \\emptyset=\\mathbb Z\\cap$";
                   2976:                        dviout(S|keep=1);
                   2977:                        m2mc(M,["irreducible","dviout"]|keep=1);
                   2978:                        if(R0!=[])
                   2979:                                dviout(ltotex(reverse(R0))|eq=0,keep=1,
                   2980:                                 title="The following conditions may not be necessary for the irreducibility.");
                   2981:                        if(R1!=[])
                   2982:                                dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
                   2983:                        if(getopt(operator)!=0){
                   2984:                                dviout("The equation in a Pfaff form is"|keep=1);
                   2985:                                m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
                   2986:                        }
                   2987:                        else if(Keep!=1) dviout(" ");
                   2988:                        return M;
                   2989:                }
                   2990:                Show=0;
                   2991:                if(length(X)>1){
                   2992:                        if(X[1]=="dviout") Show=2;
                   2993:                        if(X[1]=="TeX") Show=1;
                   2994:                }
                   2995:                if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"){
                   2996:                        Y=radd(-M[0],-M[1]-M[2]);
                   2997:                        if(X[0]!="GRSC"){
                   2998:                                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);
                   2999:                                if(X[0]=="sp"){
                   3000:                                        L=chkspt(L|opt="sp");
                   3001:                                        V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
                   3002:                                        if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
                   3003:                                        return [V,W];
                   3004:                                }
                   3005:                                S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
                   3006:                        }else{
                   3007:                                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]),
                   3008:                                        radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                   3009:                                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";
                   3010:                        }
                   3011:                        T=ltotex(L|opt="GRS",pre=S,small=Small);
                   3012:                        if(Show==2) dviout(T|eq=0,keep=Keep);
                   3013:                        if(Show==1) L=T;
                   3014:                        return L;
                   3015:                }
                   3016:                if(X[0]=="Pfaff"){
                   3017:                        S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
                   3018:                        if(Show==2) dviout(S|eq=0,keep=Keep);
                   3019:                        return S;
                   3020:                }
                   3021:                if(X[0]=="irreducible"){
                   3022:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3023:                        S=getbygrs(L,10|mat=1);
                   3024:                        if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
                   3025:                        return S;
                   3026:                }
                   3027:                if(X[0]=="pairs"||X[0]=="pair"){
                   3028:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3029:                        S=chkspt(L|opt=0);
                   3030:                        V=(Show==2)?1:0;
                   3031:                        S=sproot(L,X[0]|dviout=V,keep=Keep);
                   3032:                        return S;
                   3033:                }
                   3034:                if(X[0]=="swap"){
                   3035:                        Swap=getopt(swap);
                   3036:                        if(type(Swap)<1 || Swap==1)
                   3037:                                return newvect(5,[M[3],M[1],M[4],M[0],M[2]]);
                   3038:                        if(Swap==2)
                   3039:                                return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
                   3040:                        if(type(Swap)==4 && length(Swap)==3){
                   3041:                                MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
                   3042:                                if(Swap[0]==1){
                   3043:                                        MX0=M[2];MY0=M[4];
                   3044:                                }
                   3045:                                else if(Swap[0]==2){
                   3046:                                        MX0=MX;MY0=MY;
                   3047:                                }else{
                   3048:                                        MX0=M[0];MY0=M[3];
                   3049:                                }
                   3050:                                if(Swap[1]==1){
                   3051:                                        MX1=M[2];MY1=M[4];
                   3052:                                }
                   3053:                                else if(Swap[1]==2){
                   3054:                                        MX1=MX;MY1=MY;
                   3055:                                }else{
                   3056:                                        MX1=M[0];MY1=M[3];
                   3057:                                }
                   3058:                                return newvect(5,MX0,M[1],MX1,MY0,MY1);
                   3059:                        }
                   3060:                }
                   3061:                return 0;
                   3062:        }
                   3063:        if(getopt(swap)==1)
                   3064:                 return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
                   3065:        N=newvect(5);
                   3066:        for(I=0;I<5;I++)
                   3067:                N[I]=M[I];
                   3068:        S=size(N[0])[0];
                   3069:        if(type(X)==4){
                   3070:                 for(I=0;I<3;I++){
                   3071:                         if(X[I] != 0)
                   3072:                                        N[I] = radd(N[I],X[I]);
                   3073:                 }
                   3074:                 if(length(X)==3) return N;
                   3075:                 X=X[3];
                   3076:        }
                   3077:        MZ = newmat(S,S);
                   3078:        ME = mgen(S,0,[X],0);
                   3079:        MM = newvect(5);
                   3080:        MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);
                   3081:        MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);
                   3082:        MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);
                   3083:        MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);
                   3084:        MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);
                   3085:        M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
                   3086:        M1 = radd(MM[0],MM[1]+MM[2]);
                   3087:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   3088:        if(length(KE) == 0) return MM;
                   3089:        KK = mtoupper(lv2m(KE),0);
                   3090:        for(I=0;I<5;I++)
                   3091:                MM[I] = mmod(MM[I],KK);
                   3092:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   3093:        return MM;
                   3094: }
                   3095:
                   3096: def easierpol(P,X)
                   3097: {
                   3098:        if(type(X) == 4){
                   3099:                for( Y = [] ; X != []; X = cdr(X) )
                   3100:                        Y = cons([0,car(X)], Y);
                   3101:        }else
                   3102:                Y = [0,X];
                   3103:        return rede(P,Y);
                   3104: }
                   3105:
                   3106: def l2p(L,V)
                   3107: {
                   3108:        if(type(L)==4){
                   3109:                for(S=I=0;L!=[];L=cdr(L),I++)
                   3110:                        S+=car(L)*V^I;
                   3111:                return S;
                   3112:        }else if(type(L)==5){
                   3113:                for(S=0,I=size(L)-1;I>=0;I--)
                   3114:                        S+=L[I]*V^I;
                   3115:                return S;
                   3116:        }else{
                   3117:                if(type(D=getopt(size))==1) D--;
                   3118:                else D=mydeg(L,V);
                   3119:                for(S=[];D>=0;D--)
                   3120:                        S=cons(mycoef(L,D,V),S);
                   3121:                return S;
                   3122:        }
                   3123: }
                   3124:
                   3125: def paracmpl(L,V)
                   3126: {
                   3127:        if(type(L)==4) L=ltov(L);
                   3128:        S=length(L);
                   3129:        Lim=getopt(lim);Low=getopt(low);
                   3130:        if((F=type(L[0]))>3){
                   3131:                SV=length(L[0]);
                   3132:                V0=makenewv(L);
                   3133:                for(LL=[];S>0;S--)
                   3134:                        LL=cons(l2p(L[S-1],V0),LL);
                   3135:                G=paracmpl(LL,V|option_list=getopt());
                   3136:                H=(Lim==1)?G:G[0];
                   3137:                for(HH=[];H!=[];H=cdr(H)){
                   3138:                        HT=l2p(car(H),V0|size=SV);
                   3139:                        if(F==5) HT=ltov(HT);
                   3140:                        HH=cons(HT,HH);
                   3141:                }
                   3142:                H=reverse(HH);
                   3143:                return (Lim==1)?H:[H,G[1]];
                   3144:        }
                   3145:        H=newvect(S);D=newvect(S);
                   3146:        for(Dn=1,I=0;I<S;I++){
                   3147:                P=dn(L[I]=red(L[I]));
                   3148:                Dn=red(Dn*P/gcd(Dn,P));
                   3149:        }
                   3150:        if(Dn!=1){
                   3151:                for(I=0;I<S;I++) L[I]=red(Dn*L[I]);
                   3152:        }
                   3153:        G=diagm(S,[1]);
                   3154:        if(type(V)<4) V=[V];
                   3155:        VV=lsort(vars(L),V,1);
                   3156:        V=car(V);
                   3157:        for(I=0;I<S;I++){
                   3158:                P=L[I];
                   3159:                for(J=0,C=P;J<I;J++){
                   3160:                        if(D[J]!=[]){
                   3161:                                C=mycoef(C,DT,VV);
                   3162:                                P-=C*H[J];
                   3163:                                G=cola(G,I,J,-C);
                   3164:                        }
                   3165:                }
                   3166:                if(P==0){
                   3167:                        D[I]=[];continue;
                   3168:                }
                   3169:                P0=nm(red(P));
                   3170:                K=mymindeg(P0,V);
                   3171:                C=mycoef(P0,K,V);
                   3172:                if(K>0){
                   3173:                        P=red(P/V^K);
                   3174:                        G=colm(G,I,1/V^K);
                   3175:                }
                   3176:                for(DT=[],VT=VV;VT!=[];VT=cdr(VT)){
                   3177:                        K=(Low==1)?mymindeg(C,car(VT)):mydeg(C,car(VT));
                   3178:                        C=mycoef(C,K,car(VT));
                   3179:                        DT=cons(K,DT);
                   3180:                }
                   3181:                D[I]=DT=reverse(DT);
                   3182:                for(C=P,VT=VV;VT!=[];VT=cdr(VT),DT=cdr(DT))
                   3183:                        C=mycoef(C,car(DT),car(VT));
                   3184:                H[I]=P=red(P/C);
                   3185:                G=colm(G,I,1/C);
                   3186:        }
                   3187:        if(Dn!=1){
                   3188:                for(I=0;I<S;I++){
                   3189:                        TH=red(H[I]/Dn);
                   3190:                        F=fctr(dn(TH));F=cdr(F);
                   3191:                        if(Lim!=1||subst(Dn,V,0)==0){
                   3192:                                for(;F!=[];F=cdr(F)){
                   3193:                                        if(lsort(vars(car(F)[0]),VV,2)==[]){
                   3194:                                                C=car(F)[0]^car(F)[1];
                   3195:                                                TH=red(TH*C);
                   3196:                                                G=colm(G,I,C);
                   3197:                                        }
                   3198:                                }
                   3199:                        }
                   3200:                        H[I]=TH;
                   3201:                }
                   3202:        }
                   3203:        H=vtol(H);
                   3204:        if(Lim==1){
                   3205:                H=subst(H,V,0);
                   3206:                return map(red,H);
                   3207:        }
                   3208:        return [H,map(red,G)];
                   3209: }
                   3210:
                   3211: def mykernel(M)
                   3212: {
                   3213:        if(getopt(opt) == 1)
                   3214:                M = mtranspose(M);
                   3215:        S = size(M);
                   3216:        R = [];
                   3217:        MM = mtoupper(M,-1);
                   3218:        for(I = S[0]-1; I >= 0; I--){
                   3219:                for(J = S[1]-1; J >= 0; J--){
                   3220:                        if(MM[I][J] != 0)
                   3221:                                return R;
                   3222:                }
                   3223:                P = easierpol(MM[I][S[1]],zz);
                   3224:                RR = newvect(S[0]);
                   3225:                for(J = 0; J < S[0]; J++)
                   3226:                        RR[J] = mycoef(P,J,zz);
                   3227:                R = cons(RR,R);
                   3228:        }
                   3229:        return R;
                   3230: }
                   3231:
                   3232: def myimage(M)
                   3233: {
                   3234:        if(getopt(opt) == 1)
                   3235:                M = mtranspose(M);
                   3236:        S = size(M);
                   3237:        V = [];
                   3238:        M0 = newvect(S[1]);
                   3239:        M = mtoupper(M,0|opt=1);
                   3240:        for(I = S[0]-1; I >= 0; I--)
                   3241:                if(M0 != M[I])
                   3242:                        V = cons(vtozv(M[I])[0], V);
                   3243:        return V;
                   3244: }
                   3245:
                   3246: def mymod(V,L)
                   3247: {
                   3248:        Opt = getopt(opt);
                   3249:        S = length(V);
                   3250:        VP = newvect(S);
                   3251:        if(type(L)==6)
                   3252:                L=m2lv(L);
                   3253:        CT = length(L);
                   3254:        for(LT = L; LT != []; LT = cdr(LT)){
                   3255:                for(VT = car(LT), I = 0; I < S; I++)
                   3256:                        if(VT[I] != 0) break;
                   3257:                if(I >= S){
                   3258:                        CT--;
                   3259:                        continue;
                   3260:                }
                   3261:                VP[I] = 1;
                   3262:                MI = -red(V[I]/VT[I]);
                   3263:                if(MI != 0)
                   3264:                        V = radd(V,rmul(MI,VT));
                   3265:        }
                   3266:        if(Opt==1){
                   3267:                for(I = 0; I < S; I++)
                   3268:                        if(V[I] != 0)
                   3269:                                return 1;
                   3270:                return 0;
                   3271:        }
                   3272:        if(Opt==2){
                   3273:                W=newvect(S-CT);
                   3274:                for(CC = I = 0; I < S; I++){
                   3275:                        if(VP[I]==0) W[CC++] =V[I];
                   3276:                }
                   3277:                return W;
                   3278:        }
                   3279:        return V;
                   3280: }
                   3281:
                   3282: def mmod(M,L)
                   3283: {
                   3284:        S=size(M)[1];
                   3285:        MM=mtranspose(M);
                   3286:        VP = newvect(S);
                   3287:        if(type(L)==6)
                   3288:                L=m2lv(L);
                   3289:        for(CT = 0, LT = L; LT != []; LT = cdr(LT)){
                   3290:                for(VT = car(LT), I = 0; I < S; I++){
                   3291:                        if(VT[I] != 0){
                   3292:                                VP[I] = 1;
                   3293:                                break;
                   3294:                        }
                   3295:                }
                   3296:        }
                   3297:        if(getopt(opt)==1)
                   3298:                NE=1;
                   3299:        for(D=I=0; I<S; I++){
                   3300:                if(NE != 1 && VP[I] == 1) continue;
                   3301:                T = mymod(MM[I],L|opt=2);
                   3302:                if(D==0){
                   3303:                        K=length(T);
                   3304:                        MN=newmat((NE==1)?S:K,K);
                   3305:                }
                   3306:                for(J=0;J<K;J++)
                   3307:                        MN[J][D]=T[J];
                   3308:                D++;
                   3309:        }
                   3310:        return MN;
                   3311: }
                   3312:
                   3313: def llsize(V)
                   3314: {
                   3315:        for(I=J=0;V!=[];V=cdr(V),I++)
                   3316:                if(length(car(V))>J) J=length(car(V));
                   3317:        return [I,J];
                   3318: }
                   3319:
                   3320: def llbase(VV,L)
                   3321: {
                   3322:        S = length(VV);
                   3323:        V = dupmat(VV);
                   3324:        if(type(V) == 4)
                   3325:                V = ltov(V);
                   3326:        T = length(L);
                   3327:        for(I = 0; I < S; I++)
                   3328:                V[I] = nm(red(V[I]));
                   3329:        LV = 0;
                   3330:        for(J = 0; J < T; J++){
                   3331:                X = var(L[J]); N = deg(L[J],X);
                   3332:                for(I = LV; I < S; I++){
                   3333:                        if((C2=coef(V[I],N,X)) != 0){
                   3334:                                if(I > LV){
                   3335:                                        Temp = V[I];
                   3336:                                        V[I] = V[LV];
                   3337:                                        V[LV] = Temp;
                   3338:                                }
                   3339:                                for(I = 0; I < S; I++){
                   3340:                                        if(I == LV || (C1 = coef(V[I],N,X)) == 0)
                   3341:                                                continue;
                   3342:                                        Gcd = gcd(C1,C2);
                   3343:                                        V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);
                   3344:                                }
                   3345:                                LV++;
                   3346:                        }
                   3347:                }
                   3348:        }
                   3349:        return V;
                   3350: }
                   3351:
                   3352: def lsort(L1,L2,T)
                   3353: {
1.10      takayama 3354:        C1=getopt(c1);C2=getopt(c2);
1.8       takayama 3355:        if(type(T)==4){
                   3356:                K=T;
1.10      takayama 3357:                if(length(T)>0){
                   3358:                        T=K[0];
                   3359:                        K=cdr(K);
1.12      takayama 3360:                }else T=0;
1.8       takayama 3361:        }else K=0;
1.10      takayama 3362:        if(type(TT=T)==7)
                   3363:                T = findin(T,["cup","setminus","cap","reduce","sum","subst"]);
                   3364:        if(type(L2)==7&&T<0)
                   3365:                T=findin(TT,["put","get","sub"]);
                   3366:        if(K){           /* [[..],..] */
                   3367:                if(K!=[]) KN=K[0];
                   3368:                if(L2==[]||L2=="sort"){ /* sort or deduce duplication */
                   3369:                        if((T!=0&&T!=3)||length(K)!=1) return L1;
1.8       takayama 3370:                        if(KN<0){
                   3371:                                KN=-KN-1;
                   3372:                                F=-1;
                   3373:                        }else F=1;
                   3374:                        L1=msort(L1,[F,0,KN]);
1.10      takayama 3375:                        if(T==3){
1.8       takayama 3376:                                R=[car(L1)];L1=cdr(L1);
                   3377:                                for(;L1!=[];L1=cdr(L1)){
                   3378:                                        if(car(L1)[KN]!=car(R)[KN]) R=cons(car(L1),R);
                   3379:                                }
                   3380:                                L1=reverse(R);
                   3381:                        }
                   3382:                        return L1;
1.10      takayama 3383:                }else if((L2==0||L2=="col")&&type(C1)==4){
1.8       takayama 3384:                        if(T==0||T==1){ /* extract or delete columns */
                   3385:                                for(R=[];L1!=[];L1=cdr(L1)){
1.10      takayama 3386:                                        if(T==1&&C1==[0]){      /* delete top column */
1.8       takayama 3387:                                                R=cons(cdr(car(L1)),R);
                   3388:                                                continue;
                   3389:                                        }
1.10      takayama 3390:                                        LT=car(L1);RT=[];
1.8       takayama 3391:                                        if(T==0){
1.10      takayama 3392:                                                for(CT=C1;CT!=[];CT=cdr(CT)) RT=cons(LT[car(CT)],RT);
1.8       takayama 3393:                                        }else{
1.10      takayama 3394:                                                for(I=0;LT!=[];I++,LT=cdr(LT))
1.8       takayama 3395:                                                        if(findin(I,C1)<0) RT=cons(car(LT),RT);
                   3396:                                                RT=reverse(RT);
                   3397:                                        }
                   3398:                                        R=cons(RT,R);
                   3399:                                }
                   3400:                                return reverse(R);
                   3401:                        }
1.10      takayama 3402:                }else if(type(L2)==1||type(L2)==7){
                   3403:                        if(L2==1||L2=="num"){
                   3404:                                if(T==4) T=3;
                   3405:                                I=(length(K)<2)?(-1):K[1];
                   3406:                                if(T==0||T==1||T==2||T==3){
                   3407:                                        S=F=CT=0;R=[];
                   3408:                                        if(K==[] || type((S=K[0]))==1 || S==0){
                   3409:                                                if(T==0||T==1||T==2){
                   3410:                                                        for(J;L1!=[];L1=cdr(L1),J++){
                   3411:                                                                if(T==0) R=cons(cons(J+S,car(L1)),R);
                   3412:                                                                else if(T==1){
                   3413:                                                                        for( ;C1!=[]; C1=cdr(C1))
                   3414:                                                                                R=cons(L1[car(C1)],R);
                   3415:                                                                }else{
                   3416:                                                                        if(findin(J,C1)<0) R=cons(car(L1),R);
                   3417:                                                                }
                   3418:                                                        }
                   3419:                                                        return reverse(R);
                   3420:                                                }else if(T==3) return length(L1);
                   3421:                                        }else{
                   3422:                                                if(type(S)==2&&vtype(S)>2) F=1;
                   3423:                                                else if(type(S)==4) F=2;
                   3424:                                                else if(S=="+") F=3;
                   3425:                                                else return L1;
                   3426:                                        }
                   3427:                                        for(R=[];L1!=[];L1=cdr(L1)){
                   3428:                                                L1T=car(L1);
                   3429:                                                if(F==1) V=call(S,(I<0)?L1T:L1T[I]);
                   3430:                                                else if(F==2) V=calc((I<0)?L1T:L1T[I],S);
                   3431:                                                else if(F==3){
                   3432:                                                        for(C=C1,V=0;C!=[];C=cdr(C))
                   3433:                                                                if(type(X=L1T[car(C)])==1) V+=X;
                   3434:                                                }
                   3435:                                                if(T==0) R=cons(cons(V,L1T),R);
                   3436:                                                else if(T==1){
                   3437:                                                        if(V) R=cons(L1T,R);
                   3438:                                                }else if(T==2){
                   3439:                                                        if(!V) R=cons(L1T,R);
                   3440:                                                }else if(T==3){
                   3441:                                                        if(F==3) CT+=V;
                   3442:                                                        else if(V) CT++;
                   3443:                                                }
                   3444:                                        }
                   3445:                                        return (T==3)?CT:reverse(R);
                   3446:                                }else if(TT=="col"){
                   3447:                                        J=(length(K)>0)?car(K):0;
                   3448:                                        I=length(car(L1))+J;
                   3449:                                        for(V=[];I>J;)
                   3450:                                                V=cons(--I,V);
                   3451:                                        return cons(V,L1);
                   3452:                                }
                   3453:                        }else if(L2=="transpose") return mtranspose(L1);
1.12      takayama 3454:                        else if(L2=="subst"||L2=="adjust"){
                   3455:                                Null=(!K)?"":car(K);
1.17      takayama 3456:                                if(L2=="adjust") C1=[];
1.12      takayama 3457:                                R=lv2m(L1|null="");
1.10      takayama 3458:                                for(;C1!=[];C1=cdr(C1)) R[car(C1)[0]][car(C1)[1]]=car(C1)[2];
                   3459:                                return m2ll(R);
                   3460:                        }
                   3461:                        return L1;
                   3462:                }else{           /* [[..],..], [[..],..] */
                   3463:                        if(type(L2[0])<4){
                   3464:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3465:                                L2=reverse(R);
                   3466:                        }
                   3467:                        if(TT=="sum")  T=3;
                   3468:                        if(TT=="over") T=4;
                   3469:                        if(findin(T,[0,1,2,3,4,5])<0) return L1;
                   3470:                        if(T==4||T==5){
                   3471:                                if(type(C1)<2) C1=[C1];
                   3472:                                if(type(C2)<2) C2=[C2];
                   3473:                        }
1.8       takayama 3474:                        if(type(car(L2))!=4){
                   3475:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3476:                                R=reverse(R);
                   3477:                                if(length(K)==1) K=[K[0],0];
                   3478:                                C2=0;
                   3479:                        }
1.10      takayama 3480:                        L1=lsort(L1,"num",["put",0]);           /* insert number */
                   3481:                        K0=(length(K)>0)?K[0]+1:1;
                   3482:                        K1=(length(K)>1)?K1=K[1]:0;
                   3483:                        L1=lsort(L1,"sort",[0,K0]);
                   3484:                        if(T<4&&type(C2)==4&&length(L2[0])>1){
                   3485:                                L2=lsort(L2,"col",["put"]|c1=cons(K1,C2)); /* add key and extract columns */
                   3486:                                C2=0;K1=0;
                   3487:                        }
                   3488:                        L2=lsort(L2,"sort",[0,K1]);
                   3489:                        for(R0=[],S=S1=length(L1[0]);S>0;S--) R0=cons("",R0);
                   3490:                        for(R1=[],S=length(L2[0]);S>0;S--) R1=cons("",R1);
                   3491:                        if(!K1&&T!=3) R1=cdr(R1);
                   3492:                        for(R=[];L1!=[];L1=cdr(L1)){
                   3493:                                while(L2!=[]&&car(L1)[K0]>car(L2)[K1]){
                   3494:                                        if(T==3) R=cons(append(R0,car(L2)),R);
                   3495:                                        L2=cdr(L2);
                   3496:                                }
                   3497:                                if(L2==[]||car(L1)[K0]<car(L2)[K1]){
                   3498:                                        if(T!=2) R=cons((T==1||T>3||R1==[])?car(L1):append(car(L1),R1),R);
                   3499:                                }else if(T==0||T==2||T==3){
                   3500:                                        if(R0==[]) R=append(car(L1),R);
                   3501:                                        else R=cons(append(car(L1),(!K1&&T!=3)?cdr(car(L2)):car(L2)),R);
                   3502:                                        L2=cdr(L2);
                   3503:                                }else if(T==4||T==5){
                   3504:                                        V1=ltov(car(L1));V2=ltov(car(L2));
                   3505:                                        for(D1=C1,D2=C2;D1!=[];D1=cdr(D1),D2=cdr(D2))
                   3506:                                                if((I=V2[car(D2)])!=""||T==4) V1[car(D1)+1]=I;
                   3507:                                        R=cons(vtol(V1),R);
                   3508:                                }
                   3509:                        }
                   3510:                        if(T==3){
                   3511:                                while(L2!=[]){
                   3512:                                        R=cons(append(R0,car(L2)),R);
                   3513:                                        L2=cdr(L2);
                   3514:                                }
                   3515:                        }
                   3516:                        R=lsort(R,"sort",["put",0]);    /* original order */
                   3517:                        D=(((T==0||T==2)&&!K1)||T==3)?[0]:[0,S1+K1];
                   3518:                        R=lsort(R,0,[1]|c1=D); /* delete */
                   3519:                        if(type(C1)!=4||T==1||T==4||T==5) return R;
                   3520:                        C=[];S0=size(L1[0]);
                   3521:                        for(;C1!=[];C1=cdr(C1)) C=cons(car(C1),C);
                   3522:                        for(I=0;I<S0-S1;I++) C=cons(I+S1,C);
1.8       takayama 3523:                        C=reverse(C);
1.10      takayama 3524:                        return lsort(R,"col",[1]|c1=C);
1.8       takayama 3525:                }
                   3526:        }
1.10      takayama 3527:        if(L2 == []){           /* [...] */
                   3528:                if(T==8||TT=="count") return [length(L1),length(lsort(L1,[],1))];
                   3529:                if(T==7||TT=="cut"){
                   3530:                        K=length(L1);
                   3531:                        if(C1<0) C1=K+C1;
                   3532:                        for(R=[],I=0;I<C1&&L1!=[];I++,L1=cdr(L1))
                   3533:                                R=cons(car(L1),R);
                   3534:                        for(S=[];L1!=[];L1=cdr(L1))
                   3535:                                S=cons(car(L1),S);
                   3536:                        return [reverse(R),reverse(S)];
                   3537:                }
                   3538:                if(T==2) return L2;
                   3539:                if(T==3) return [L1,L2];
1.6       takayama 3540:                L1 = ltov(L1); qsort(L1);
                   3541:                if(T != 1)
                   3542:                        return vtol(L1);
                   3543:                L3 = [];
                   3544:                for(I = length(L1)-1; I >= 0; I--){
                   3545:                        if(I > 0 && L1[I] == L1[I-1])
                   3546:                                continue;
                   3547:                        L3 = cons(L1[I], L3);
                   3548:                }
                   3549:                return L3;
                   3550:        }
1.10      takayama 3551:        if(T==8||TT=="count"){
                   3552:                K=length(lsort(L1,L2,3)[0]);
                   3553:                R=[length(L2),length(L1)];
                   3554:                L1 = lsort(L1,[],1);
                   3555:                L2 = lsort(L2,[],1);
                   3556:                R=append([length(L2),length(L1)],R);
                   3557:                R=cons(length(lsort(L1,L2,2)),R);
                   3558:                return reverse(cons(K,R));
                   3559:        }
1.12      takayama 3560:        if((T==9||TT=="cons")&&type(car(L1))==4){
                   3561:                if(type(L2)!=4) L2=[L2];
                   3562:                for(R=[];L1!=[];L1=cdr(L1)){
                   3563:                        R=cons(cons(car(L2),car(L1)),R);
                   3564:                        if(length(L2)>1) L2=cdr(L2);
                   3565:                }
                   3566:                return reverse(R);
                   3567:        }
1.13      takayama 3568:        if(T==10||TT=="cmp"){
                   3569:                if(length(L1)!=length(L2)){
                   3570:                        mycat("Different length!");
                   3571:                        return 1;
                   3572:                }
                   3573:                R=[];
                   3574:                if(type(car(L1))==4){
                   3575:                        for(U=[],I=0;L1!=[];I++,L1=cdr(L1),L2=cdr(L2)){
                   3576:                                if(length(S=car(L1))!=length(T=car(L2))){
                   3577:                                        mycat(["Different size : line ",I]);
                   3578:                                        return 0;
                   3579:                                }
                   3580:                                for(J=0;S!=[];S=cdr(S),T=cdr(T),J++)
                   3581:                                        if(car(S)!=car(T)) U=cons([[I,J],car(S),car(T)],U);
                   3582:                        }
                   3583:                        if(U!=[]) R=cons(reverse(U),R);
                   3584:                }else{
                   3585:                        for(I=0;L1!=[];L1=cdr(L1),L2=cdr(L2),I++)
                   3586:                                if(car(L1)!=car(L2)) R=cons([I,car(L1),car(L2)],R);
                   3587:                }
                   3588:                return reverse(R);
                   3589:        }
                   3590:        if(T==11||TT=="append"){
                   3591:                if(type(car(L1))!=4) return append(L1,L2);
                   3592:                for(R=[];L1!=[];L1=cdr(L1),L2=cdr(L2))
                   3593:                        R=cons(append(car(L1),car(L2)),R);
                   3594:                return reverse(R);
                   3595:        }
1.6       takayama 3596:        if(T == 1 || T == 2){
                   3597:                L1 = lsort(L1,[],1);
                   3598:                L2 = lsort(L2,[],1);
                   3599:                L3 = [];
                   3600:                if(T == 1){
                   3601:                        while(L1 != []){
                   3602:                                if(L2 == [] || car(L1) < car(L2)){
                   3603:                                 L3 = cons(car(L1), L3);
                   3604:                                 L1 = cdr(L1);
                   3605:                                        continue;
                   3606:                                }
                   3607:                                if(car(L1) > car(L2)){
                   3608:                                        L2 = cdr(L2);
                   3609:                                        continue;
                   3610:                                }
                   3611:                                L1 = cdr(L1); L2 = cdr(L2);
                   3612:                        }
                   3613:                        return reverse(L3);
                   3614:                }
                   3615:                if(T==2){
                   3616:                        while(L1 != [] && L2 != []){
                   3617:                                if(car(L1) != car(L2)){
                   3618:                                        if(car(L1) <= car(L2))
                   3619:                                                         L1 = cdr(L1);
                   3620:                                        else L2 = cdr(L2);
                   3621:                                        continue;
                   3622:                                }
                   3623:                                while(car(L1) == car(L2))
                   3624:                                        L1 = cdr(L1);
                   3625:                                L3 = cons(car(L2), L3);
                   3626:                        }
                   3627:                        return reverse(L3);
                   3628:                }
                   3629:        }
                   3630:        if(T==3){
                   3631:                L1 = qsort(L1); L2 = qsort(L2);
                   3632:                L3 = L4 = [];
                   3633:                while(L1 != [] && L2 != []){
                   3634:                        if(car(L1) == car(L2)){
                   3635:                                L1 = cdr(L1); L2 = cdr(L2);
                   3636:                        }else if(car(L1) < car(L2)){
                   3637:                                L3 = cons(car(L1),L3);
                   3638:                                L1 = cdr(L1);
                   3639:                        }else{
                   3640:                                L4 = cons(car(L2), L4);
                   3641:                                L2 = cdr(L2);
                   3642:                        }
                   3643:                }
                   3644:                L4 = append(reverse(L4),L2);
                   3645:                L3 = append(reverse(L3),L1);
                   3646:                return [L3,L4];
                   3647:        }
                   3648:        L1 = append(L1,L2);
                   3649:        return lsort(L1,[],1);
                   3650: }
                   3651:
                   3652: def mqsub(X,Y)
                   3653: {
                   3654:        for(L=LQS;L!=[];L=cdr(L)){
                   3655:                F=(T=car(L))[0];M=(T=cdr(T))[0];
                   3656:                X0=X;Y0=Y;
                   3657:                for(T=cdr(T);T!=[];T=cdr(T)){
                   3658:                        X0=X0[car(T)];Y0=Y0[car(T)];
                   3659:                }
                   3660:                if(type(M)==1){
                   3661:                        if(M==3){
                   3662:                                X0=type(X0);Y0=type(Y0);
                   3663:                        }else if(M==4&&type(X0)<2&&type(Y0)<2){
                   3664:                                X0=abs(X0);Y0=abs(Y0);
                   3665:                        }else if(M==5){
                   3666:                                X0=str_len(rtostr(X0));Y0=str_len(rtostr(Y0));
                   3667:                        }else if(type(X0)==type(Y0)&&type(X0)>3&&type(X0)<7){
                   3668:                                if(M==1){
                   3669:                                        X0=length(X0);Y0=length(Y0);
                   3670:                                }else if(M==2){
                   3671:                                        LX=length(X0);LY=length(Y0);
                   3672:                                        L0=(LX<LY)?LX:LY;
                   3673:                                        for(I=0;;I++){
                   3674:                                                if(I==L0){
                   3675:                                                        X0=LX;Y0=LY;break;
                   3676:                                                }
                   3677:                                                if(X0[I]==Y0[I]) continue;
                   3678:                                                X0=X0[I];Y0=Y0[I];break;
                   3679:                                        }
                   3680:                                }
                   3681:                        }
                   3682:                }else if(type(M)==2){
                   3683:                        X0=(*M)(X0,Y0);Y0=0;
                   3684:                }else if(type(M)==4&&length(M)==1){
                   3685:                        X0=(*car(M))(X0);Y0=(*car(M))(Y0);
                   3686:                }
                   3687:                if(X0==Y0) continue;
                   3688:                return (X0<Y0)?-F:F;
                   3689:        }
                   3690:        return 0;
                   3691: }
                   3692:
                   3693: def msort(L,S)
                   3694: {
                   3695:        if(type(S)!=4) return qsort(L);
                   3696:        if(type(S[0])!=4) S=[S];
                   3697:        LQS=S;
                   3698:        return qsort(L,os_md.mqsub);
                   3699: }
                   3700:
1.22      takayama 3701: def lpair(A,B)
                   3702: {
                   3703:        if(B==0){
                   3704:                for(S=T=[];A!=[];A=cdr(A)){
                   3705:                        S=cons(car(A)[0],S);T=cons(car(A)[1],T);
                   3706:                }
                   3707:                return [reverse(S),reverse(T)];
                   3708:        }else{
                   3709:                for(R=[];A!=[];A=cdr(A),B=cdr(B))
                   3710:                        R=cons([car(A),car(B)],R);
                   3711:                return reverse(R);
                   3712:        }
                   3713: }
                   3714:
1.6       takayama 3715: def lmax(L)
                   3716: {
                   3717:        if(type(L)==4){
                   3718:                V=car(L);
                   3719:                while((L=cdr(L))!=[])
                   3720:                        if(V < car(L)) V=car(L);
                   3721:                return V;
                   3722:        }else if(type(L)==5||type(L)==6)
                   3723:                return lmax(m2l(L));
                   3724:        return [];
                   3725: }
                   3726:
                   3727: def lmin(L)
                   3728: {
                   3729:        if(type(L)==4){
                   3730:                V=car(L);
                   3731:                while((L=cdr(L))!=[])
                   3732:                        if(V > car(L)) V=car(L);
                   3733:                return V;
                   3734:        }else if(type(L)==5||type(L)==6)
                   3735:                return lmin(m2l(L));
                   3736:        return [];
                   3737: }
                   3738:
                   3739: def lgcd(L)
                   3740: {
                   3741:        if(type(L)==4){
                   3742:                F=getopt(poly);
                   3743:                V=car(L);
                   3744:                while((L=cdr(L))!=[]&&V!=1){
                   3745:                        if(V!=0)
                   3746:                                V=(F==1)?gcd(V,car(L)):igcd(V,car(L));
                   3747:                }
                   3748:                return V;
                   3749:        }else if(type(L)==5||type(L)==6)
                   3750:                return lgcd(m2l(L)|option_list=getopt());
                   3751:        return [];
                   3752: }
                   3753:
                   3754: def llcm(L)
                   3755: {
                   3756:        if(type(L)==4){
                   3757:                F=getopt(poly);
                   3758:                V=car(L);
                   3759:                while((L=cdr(L))!=[]){
                   3760:                        if(V!=0){
                   3761:                                if((V0=car(L))!=0)
                   3762:                                        V=(F==1)?red(V*V0/gcd(V,V0)):ilcm(V,V0);
                   3763:                        }
                   3764:                        else V=car(L);
                   3765:                }
                   3766:                if(F!=1&&V<0) V=-V;
                   3767:                return V;
                   3768:        }
                   3769:        else if(type(L)==5||type(L)==6)
                   3770:                return llcm(m2l(L)|option_list=getopt());
                   3771:        return [];
                   3772: }
                   3773:
                   3774: def ldev(L,S)
                   3775: {
                   3776:        M=abs(lmax(L));N=abs(lmin(L));
                   3777:        if(M<N) M=N;
                   3778:        for(C=0,LT=L;;C++){
                   3779:                LT=ladd(LT,S,1);
                   3780:                MT=abs(lmax(LT));NT=abs(lmin(LT));
                   3781:                if(MT<NT) MT=NT;
                   3782:                if(MT>=M) break;
                   3783:                M=MT;
                   3784:        }
                   3785:        if(!C){
                   3786:                for(C=0,LT=L;;C--){
                   3787:                        LT=ladd(LT,S,-1);
                   3788:                        MT=abs(lmax(LT));NT=abs(lmin(LT));
                   3789:                        if(MT<NT) MT=NT;
                   3790:                        if(MT>=M) break;
                   3791:                        M=MT;
                   3792:                }
                   3793:        }
                   3794:        return [C,ladd(L,S,C)];
                   3795: }
                   3796:
                   3797: def lchange(L,P,V)
                   3798: {
                   3799:        if(getopt(flat)==1&&type(P)==4){
                   3800:                for(L=ltov(L);P!=[];P=cdr(P),V=cdr(V))
                   3801:                        L[car(P)]=car(V);
                   3802:                return vtol(L);
                   3803:        }
                   3804:        if(type(P)==4){
                   3805:                IP=car(P); P=cdr(P);
                   3806:        }else{
                   3807:                IP=P; P=[];
                   3808:        }
                   3809:        for(I=0, LL=[], LT=L; LT!=[]; I++,LT=cdr(LT)){
                   3810:                if(I==IP){
                   3811:                        LL=cons((P==[])?V:lchange(car(LT),P,V),LL);
                   3812:                }else
                   3813:                        LL=cons(car(LT),LL);
                   3814:        }
                   3815:        return reverse(LL);
                   3816: }
                   3817:
                   3818: def lsol(VV,L)
                   3819: {
                   3820:        if(type(VV)<4 && type(L)==2)
                   3821:                return red(L-VV/mycoef(VV,1,L));
                   3822:        S = length(VV);
                   3823:        T = length(L);
                   3824:        V = llbase(VV,L);
                   3825:        for(J = K = 0; J < T; J++){
                   3826:                X = var(L[J]); N = deg(L[J],X);
                   3827:                for(I = K; I < S; I++){
                   3828:                        if((C=mycoef(V[I], N, X)) != 0){
                   3829:                                V[I] = [L[J],red(X^N-V[I]/C)];
                   3830:                                K++;
                   3831:                                break;
                   3832:                        }
                   3833:                }
                   3834:        }
                   3835:        return V;
                   3836: }
                   3837:
                   3838: def lnsol(VV,L)
                   3839: {
                   3840:        LL=lsort(vars(VV),L,1);
                   3841:        VV=ptol(VV,LL|opt=0);
                   3842:        return lsol(VV,L);
                   3843: }
                   3844:
                   3845:
                   3846: def ladd(X,Y,M)
                   3847: {
1.22      takayama 3848:        if(type(Y)==4) Y=ltov(Y);
1.6       takayama 3849:        if(type(X)==4) X=ltov(X);
                   3850:        return vtol(X+M*Y);
                   3851: }
                   3852:
                   3853: def mrot(X)
                   3854: {
1.22      takayama 3855:        if(type(X)==4){
                   3856:                if(getopt(deg)==1)
                   3857:                        X=[deval(@pi*X[0]/180),deval(@pi*X[1]/180),deval(@pi*X[2]/180)];
                   3858:                if(getopt(conj)==1)
                   3859:                        return mrot([-X[2],-X[1],0])*mrot([X[0],X[1],X[2]]);
                   3860:                if(X[1]==0){
                   3861:                        X=[X[0]+X[2],0,0];
                   3862:                        if(X[0]==0) return diagm(3,[1]);
                   3863:                }
                   3864:                if(X[0]!=0){
                   3865:                        M=mat([dcos(X[0]),-dsin(X[0]),0],[dsin(X[0]),dcos(X[0]),0],[0,0,1]);
                   3866:                        if(X[1]==0) return M;
                   3867:                }
                   3868:                N=mat([dcos(X[1]),0,-dsin(X[1])],[0,1,0],[dsin(X[1]),0,dcos(X[1])]);
                   3869:                if(X[0]!=0) N=M*N;
                   3870:                if(X[2]==0) return N;
                   3871:                return N*mrot([X[2],0,0]);
                   3872:        }
1.6       takayama 3873:        if(getopt(deg)==1) X=@pi*X/180;
                   3874:        X=deval(X);
1.22      takayama 3875:        return mat([dcos(X),-dsin(X)],[dsin(X),dcos(X)]);
1.6       takayama 3876: }
                   3877:
                   3878: def m2v(M)
                   3879: {
                   3880:        S = size(M);
                   3881:        V = newvect(S[0]*S[1]);
                   3882:        for(I = C = 0; I < S[0]; I++){
                   3883:                MI = M[I];
                   3884:                for(J = 0; J < S[1]; J++)
                   3885:                        V[C++] = MI[J];
                   3886:        }
                   3887:        return V;
                   3888: }
                   3889:
                   3890: def lv2m(L)
                   3891: {
                   3892:        if(type(L)==5) L=vtol(L);
                   3893:        II=length(L);
                   3894:        for(J=1,T=L; T!=[]; T=cdr(T))
                   3895:                if(length(car(T))>JJ) JJ=length(car(T));
                   3896:        M = newmat(II,JJ);
                   3897:        N = getopt(null);
                   3898:        if(type(N)<0)   N=0;
                   3899:        for(I=0; I<II; I++){
                   3900:                V=car(L); L=cdr(L);
                   3901:                for(J=length(V);--J>=0;)
                   3902:                        M[I][J] = V[J];
                   3903:                if(N!=0){
                   3904:                        for(J=length(V); J<JJ; J++)
                   3905:                                M[I][J]=N;
                   3906:                }
                   3907:        }
                   3908:        return M;
                   3909: }
                   3910:
                   3911: def m2lv(M)
                   3912: {
                   3913:        I=size(M)[0];
                   3914:        for(N=[],I=size(M)[0];I-->0;)
                   3915:                N=cons(M[I],N);
                   3916:        return N;
                   3917: }
                   3918:
                   3919: def s2m(S)
                   3920: {
                   3921:        if(type(S)==6) return S;
                   3922:        if(type(S)==7){
                   3923:                if(str_chr(S,0,"[")!=0) S=s2sp(S);
                   3924:                else if(str_chr(S,0,",")>=0) return eval_str(S);
                   3925:                else{
                   3926:                        for(L=LL=[],I=0; ; ){
                   3927:                                II=str_chr(S,I+2,"]");
                   3928:                                if(II<0) return 0;
                   3929:                                J=str_chr(S,I+2," ");
                   3930:                                while(str_chr(S,J+1," ")==J+1) J++;
                   3931:                                if(J>II-2 || J<0) J=II;
                   3932:                 V=eval_str(sub_str(S,I+1,J-1));
                   3933:                                L=cons(V,L);
                   3934:                                I=J;
                   3935:                                if(J==II){
                   3936:                                        LL=cons(ltov(reverse(L)),LL);
                   3937:                                        L=[];
                   3938:                                        if((I=str_chr(S,II+1,"["))<0)
                   3939:                                                return lv2m(reverse(LL));
                   3940:                                }
                   3941:                        }
                   3942:                }
                   3943:        }
                   3944:        if(type(S)==5) S=vtol(S);
                   3945:        if(type(S[0])==5) return lv2m(S);
                   3946:        I=length(S);
                   3947:        for(J=1,T=S; T!=[]; T=cdr(T))
                   3948:                if(length(car(T))>J) J=length(car(T));
                   3949:        return newmat(I,J,S);
                   3950: }
                   3951:
                   3952: def c2m(L,V)
                   3953: {
                   3954:        if(type(Pow=getopt(pow))!=1){
                   3955:                if(isvar(V)==1){
                   3956:                        for(Pow=0,LT=L;LT!=[];LT=cdr(LT)){
                   3957:                                if(mydeg(car(LT),V)>JJ) Pow=mydeg(car(LT),V);
                   3958:                        }
                   3959:                        JJ=Pow+1;
                   3960:                }else{
                   3961:                        Pow=-1;
                   3962:                        JJ=length(V);
                   3963:                }
                   3964:        }else JJ=Pow+1;
                   3965:        M=newmat(length(L),JJ);
                   3966:        for(I=0;L!=[];L=cdr(L),I++){
                   3967:                for(J=0;J<JJ;J++){
                   3968:                        LT=car(L);
                   3969:                        M[I][J]=(Pow>=0)?mycoef(LT,J,V):mycoef(LT,1,V[J]);
                   3970:                }
                   3971:        }
                   3972:        return M;
                   3973: }
                   3974:
                   3975: #if 0
                   3976: def m2diag(M,N)
                   3977: {
                   3978:        S = size(M);
                   3979:        MM = mtoupper(M,N);
                   3980:        for(I = S[0]-1; I >= 0; I--){
                   3981:                for(J = 0; I < S[1]-N; I++){
                   3982:                        if(MM[I][J] != 0){
                   3983:                                P = MM[I][J];
                   3984:                                for(K = 0; K < I; K++){
                   3985:                                        Q = -rmul(MM[K][J],1/P);
                   3986:                                        MM[K][J] = 0;
                   3987:                                        if(Q != 0){
                   3988:                                                for(L = J+1; L < S[1]; L++){
                   3989:                                                        if(MM[I][L] != 0)
                   3990:                                                                MM[K][L] = radd(MM[K][L], rmul(MM[I][L],Q));
                   3991:                                                }
                   3992:                                        }
                   3993:                                }
                   3994:                        }
                   3995:                }
                   3996:        }
                   3997:        return MM;
                   3998: }
                   3999: #endif
                   4000:
                   4001: def myinv(M)
                   4002: {
                   4003:        S = size(M);
                   4004:        if((T=S[0]) != S[1])
                   4005:                return 0;
                   4006:        MM = mtoupper(M,-T|opt=2);
                   4007:        if(MM[T-1][T-1] != 1) return 0;
                   4008:        return mperm(MM,0,[T,[T]]);
                   4009: }
                   4010:
                   4011: def madj(G,M)
                   4012: {
                   4013:        H=myinv(G);
                   4014:        if(type(M)==6)
                   4015:                return rmul(rmul(G,M),H);
                   4016:        if(type(M)==4||type(M)==5){
                   4017:                L=length(M);
                   4018:                N=newvect(L);
                   4019:                for(I=0;I<L;I++){
                   4020:                        N[I]=rmul(rmul(G,M[I]),H);
                   4021:                }
                   4022:                if(type(N)==4) N=vtol(N);
                   4023:                return N;
                   4024:        }
                   4025:        return -1;
                   4026: }
                   4027:
                   4028: def mpower(M,N)
                   4029: {
                   4030:        if(type(M)<=3) return (red(M))^N;
                   4031:        S = size(M);
                   4032:        if(S[0] != S[1])
                   4033:                return 0;
                   4034:        if(N == 0) return mgen(S[0],0,[1],0);
                   4035:        if(N < 0)
                   4036:                return(mpower(myinv(M), -N));
                   4037:        R = dupmat(M);
                   4038:        V=1;
                   4039:        for(V=1;;){
                   4040:                if(iand(N,1)){
                   4041:                        V=map(red,R*V);
                   4042:                        N--;
                   4043:                }
                   4044:                if((N/=2)==0) break;
                   4045:                R=map(red,R*R);
                   4046:        }
                   4047:        return V;
                   4048: }
                   4049:
                   4050: def texlen(S)
                   4051: {
                   4052:        if(type(S)!=7) return 0;
                   4053:        LF=I=J=0;
                   4054:        LM=str_len(S);
                   4055:        while((I=str_str(S,"\\frac{"|top=J))>=0){
                   4056:                if(I>J) LF+=texlen(str_cut(S,J,I-1));
                   4057:                I+=6;
                   4058:                for(F=L=0,J=I;F<2 && J<LM-1;F++){
                   4059:                        for(C=1;C>0 && J<LM;){
                   4060:                                if((K0=str_char(S,J,"}"))<0) K0=LM;
                   4061:                                if((K1=str_char(S,J,"{"))<0) K1=LM;
                   4062:                                if(K0<0 && K1<0){
                   4063:                                        J = str_len(S)-1;
                   4064:                                        break;
                   4065:                                }
                   4066:                                if(K0<K1){
                   4067:                                        J=K0+1; C--;
                   4068:                                }else{
                   4069:                                        J=K1+1; C++;
                   4070:                                }
                   4071:                        }
                   4072:                        T=str_cut(S,I,J-1);
                   4073:                        if(F==0){
                   4074:                                I=J=K1+1;C=1;
                   4075:                        }else J=K0+1;
                   4076:                        if(type(T)==7 && (LL=texlen(T))>L) L=LL;
                   4077:                }
                   4078:                LF+=L;
                   4079:        }
                   4080:        if(J>0) S=str_cut(S,J,str_len(S)-1);
                   4081:        if(S==0) return LF;
                   4082:        S=ltov(strtoascii(S));
                   4083:        L=LL=length(S);
                   4084:        for(I=F=0; I<L; I++){
                   4085:                if(S[I]==92) F=1;
                   4086:                else if(F==1){
                   4087:                        if((S[I]>96     && S[I]<123)||(S[I]>64 && S[I]<91))     LL--;
                   4088:                        else F=0;
                   4089:                }
                   4090:                if(S[I]<=32||S[I]==123||S[I]==125||S[I]==94||S[I]==38) LL--;    /* {}^& */
                   4091:                else if(S[I]==95){
                   4092:                        LL--;
                   4093:                        if(I+2<L && S[I+2]==94) LL--;   /* x_2^3 */
                   4094:                        else if(I+6<L && S[I+1]==123 && S[I+4]==125){   /* x_{11}^2 */
                   4095:                                 if(S[I+5]==94 || (S[I+5]==125 && S[I+6]==94)) LL--     ;       /* x_{11}}^2 */
                   4096:                        }
                   4097:                }
                   4098:        }
                   4099:        return LL+LF;
                   4100: }
                   4101:
                   4102: def isdif(P)
                   4103: {
                   4104:        if(type(P)<1 || type(P)>3) return 0;
                   4105:        for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4106:                V0=rtostr(car(R));
                   4107:                if(V0>"d" && V0<"e"){
                   4108:                        V=sub_str(V0,1,str_len(V0)-1);
                   4109:                        if(V>="a" && V<"{")     Var=cons([strtov(V),strtov(V0)],Var);
                   4110:                }
                   4111:        }
                   4112:        if(Var==[]) return 0;
                   4113:        for(V=Var; V!=[]; V=cdr(V))
                   4114:                if(ptype(P,car(V)[1])==3) return 0;
                   4115:        return  Var;
                   4116: }
                   4117:
                   4118: def texsp(P)
                   4119: {
                   4120:        Q=strtoascii(P);
                   4121:        if((J=str_char(Q,0,92))<0 || (C=Q[L=str_len(P)-1])==32||C==41||C==125)
                   4122:                return P;
                   4123:        for(;;){
                   4124:                if((I=str_char(Q,J+1,92))<0) break;
                   4125:                J=I;
                   4126:        };
                   4127:        for(I=J+1;I<L&&isalpha(Q[I]);I++);
                   4128:        return(I==L)?P+" ":P;
                   4129: }
                   4130:
                   4131: def fctrtos(P)
                   4132: {
                   4133:        /* extern TeXLim; */
                   4134:
                   4135:        if(!chkfun("write_to_tb", "names.rr"))
                   4136:                return 0;
                   4137:
                   4138:        TeX = getopt(TeX);
                   4139:        if(TeX != 1 && TeX != 2 && TeX != 3)
                   4140:                TeX = 0;
                   4141:        if((Dvi=getopt(dviout)==1) && TeX<2)    TeX=3;
                   4142:        if(TeX>0){
                   4143:                Lim=getopt(lim);
                   4144:                if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;
                   4145:                else if(type(Lim)!=1) Lim=0;
                   4146:                CR=(TeX==2)?"\\\\\n":"\\\\\n&";
                   4147:                if(TeX==1 || Lim==0)    CR="";
                   4148:                else if((Pages=getopt(pages))==1)       CR="\\allowdisplaybreaks"+CR;
                   4149:                if(!chkfun("print_tex_form", "names.rr"))
                   4150:                        return 0;
                   4151:                Small=getopt(small);
                   4152:        }
                   4153:        Dif=getopt(dif);
                   4154:        Var=getopt(var);
                   4155:        if(Lim>0 && type(Var)<2 && TeX!=1)      Var=[strtov("0"),""];
                   4156:        Dif=0;
                   4157:        if(Var=="dif"){
                   4158:                Dif=DV=1;
                   4159:        }else if (Var=="dif0") Dif=1;
                   4160:        else if(Var=="dif1")  Dif=2;
                   4161:        else if(Var=="dif2")  Dif=3;
                   4162:        if(Dif>0){
                   4163:                for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4164:                        V=rtostr(car(R));
                   4165:                        if(V>"d" && V<"e"){
                   4166:                                V=sub_str(V,1,str_len(V)-1);
                   4167:                                if(V>="a" && V<"{"){
                   4168:                                        if(TeX>0){
                   4169:                                                V=my_tex_form(strtov(V));
                   4170:                                                if(Dif>=1){
                   4171:                                                        if(Dif==1){
                   4172:                                                                if(str_len(V)==1) V="\\partial_"+V;
                   4173:                                                                else    V="\\partial_{"+V+"}";
                   4174:                                                        }
                   4175:                                                        Var=cons([car(R),V],Var);
                   4176:                                                }
                   4177:                                                else Var=cons([car(R)],Var);
                   4178:                                        }else Var=cons([car(R)],Var);
                   4179:                                }
                   4180:                        }
                   4181:                }
                   4182:                if(TeX>0){
                   4183:                        if(length(Var)==1){
                   4184:                                if(DV==1 && str_len(Var[0][1])==10) Var=[[Var[0][0],"\\partial"]];
                   4185:                        }else if(DV==1){
                   4186:                                for(V=Var;V!=[];V=cdr(V)){
                   4187:                                        VV=rtostr(car(V)[0]);
                   4188:                                        if(VV<"dx0" || VV>= "dx:" || str_len(VV)>4) break;
                   4189:                                }
                   4190:                                if(V==[]){
                   4191:                                        for(VT=[],V=Var;V!=[];V=cdr(V)){
                   4192:                                                VV=str_cut(rtostr(car(V)[0]),2,3);
                   4193:                                                if(str_len(VV)==1)      VT=cons([car(V)[0],"\\partial_"+VV],VT);
                   4194:                                                else    VT=cons([car(V)[0],"\\partial_{"+VV+"}"],VT);
                   4195:                                        }
                   4196:                                        Var=reverse(VT);
                   4197:                                }
                   4198:                        }else
                   4199:                                if(Dif==2 && length(Var)>1) Dif=3;
                   4200:                }
                   4201:                if(Dif>0)       Dif--;
                   4202:        }
                   4203:        if(type(Var)>1 && Var!=[]){     /* as a polynomial of Var */
                   4204:                Add=getopt(add);
                   4205:                if(type(Add)>0){
                   4206:                        if(type(Add)!=7){
                   4207:                                Add=my_tex_form(Add);
                   4208:                                if(str_char(Add,0,"-")>=0 || str_char(Add,0,"+")>=0) Add="("+Add+")";
                   4209:                        }
                   4210:                        if(str_char(Add,0,"(")!=0) Add = " "+Add;
                   4211:                }else Add=0;
                   4212:                if(type(Var)!=4) Var=[Var];
                   4213:                if(length(Var)==2 && type(Var[1]) == 7)
                   4214:                        Var = [Var];
                   4215:                for(VV=VD=[]; Var!=[];Var=cdr(Var)){
                   4216:                        VT=(type(car(Var))==4)?car(Var):[car(Var)];
                   4217:                        VT0=var(car(VT));
                   4218:                        VV=cons(VT0,VV);
                   4219:                        if(length(VT)==1){
                   4220:                                VD=cons((TeX>=1)?my_tex_form(VT0):rtostr(VT0),VD);
                   4221:                        }else   VD=cons(VT[1],VD);
                   4222:                }
                   4223:                VV=reverse(VV);VD=reverse(VD);
                   4224:                Rev=(getopt(rev)==1)?1:0;
                   4225:                Dic=(getopt(dic)==1)?1:0;
                   4226:                TT=terms(P,VV|rev=Rev,dic=Dic);
                   4227:                if(TeX==0){
                   4228:                        Pre="("; Post=")";
                   4229:                }else{
                   4230:                        Pre="{"; Post="}";
                   4231:                }
                   4232:                Out = string_to_tb("");
                   4233:                for(L=C=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){
                   4234:                        for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){
                   4235:                                PC=mycoef(PC,D=car(T),VV[I]);
                   4236:                                if(PC==0) continue;
                   4237:                                PT="";
                   4238:                                if(D!=0 && VD[I]!=""){
                   4239:                                        if(TeX==0 && PW!="") PW+="*";
                   4240:                                        if(D>1){
                   4241:                                                if(D>9) PT="^"+Pre+rtostr(D)+Post;
                   4242:                                                else    PT="^"+rtostr(D);
                   4243:                                        }
                   4244:                                        if(Dif>0)       PW+=(Dif==1)?"d":"\\partial ";
                   4245:                                        PW+=VD[I]+PT;
                   4246:                                }
                   4247:                        }
                   4248:                        D=car(Tm)[0];
                   4249:                        if(Dif>0 && D>0){
                   4250:                                Op=(Dif==1)?"\\frac{d":"\\frac{\\partial";
                   4251:                                if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));
                   4252:                                PW=Op+Add+"}{"+PW+"}";
                   4253:                        }else if(Add!=0) PW=PW+Add;
                   4254:                        if(TeX>=1){
                   4255:                                if(type(PC)==1 && ntype(PC)==0 && PC<0)
                   4256:                                        OC="-"+my_tex_form(-PC);
                   4257:                                else OC=fctrtos(PC|TeX=1,br=1);
                   4258:                        }else   OC=fctrtos(PC|br=1);
                   4259:                        if(PW!=""){
                   4260:                                if(OC == "1")        OC = "";
                   4261:                                else if(OC == "-1")  OC = "-";
                   4262:                        }
                   4263:                        if(TeX==0 && D!=0 && OC!="" && OC!="-") PW= "*"+PW;
                   4264:                        if((TOC=type(OC)) == 4){        /* rational coef. */
                   4265:                                if(Lim>0 && (texlen(OC[0])>Lim || texlen(OC[0])>Lim)){
                   4266:                                        OC = (Small==1)?"("+OC[0]+")/("+OC[1]+")"
                   4267:                                                        :"\\Bigl("+OC[0]+"\\Bigr)\\Bigm/\\Bigl("+OC[1]+"\\Bigr)";
                   4268:                                        TOC = 7;
                   4269:                                }else{
                   4270:                                        if(str_char(OC[0],0,"-")==0){
                   4271:                                                OC = fctrtos(-PC|TeX=1,br=1);
                   4272:                                                OC = "-\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4273:                                        }
                   4274:                                        else
                   4275:                                                OC = "\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4276:                                }
                   4277:                        }
                   4278:                        if(Lim>0){
                   4279:                                LL=texlen(OC)+texlen(PW);
                   4280:                                if(LL+L>=Lim){
                   4281:                                        if(L>0) str_tb(CR,Out);
                   4282:                                        if(LL>Lim){
                   4283:                                                if(TOC==7)      OC=texlim(OC,Lim|cut=CR);
                   4284:                                                PW+=CR; L=0;
                   4285:                                        }else L=LL;
                   4286:                                }else L+=LL;
                   4287:                        }else if(length(Tm)!=1) PW += CR;       /* not final term */
                   4288:                        if(TeX) OC=texsp(OC);
                   4289:                        if(str_chr(OC,0,"-") == 0 || C==0)      str_tb([OC,PW], Out);
                   4290:                        else{
                   4291:                                str_tb(["+",OC,PW],Out);
                   4292:                                if(LL<=Lim) L++;
                   4293:                        }
                   4294:                }
                   4295:                S=str_tb(0,Out);
                   4296:                if(S=="") S="0";
                   4297:        }else{          /* Var is not specified */
                   4298:                if((TP=type(P)) == 3){  /* rational function */
                   4299:                        P = red(P); Nm=nm(P); Dn=dn(P);
                   4300:                        Q=dn(ptozp(Nm|factor=1)[1]);
                   4301:                        if(Q>1){
                   4302:                                Nm*=Q;Dn*=Q;
                   4303:                        }
                   4304:                        if(TeX>0){
                   4305:                                return (TeX==2)?
                   4306:                                "\\frac\{"+fctrtos(Nm|TeX=1)+"\}\{"+fctrtos(Dn|TeX=1)+"\}"
                   4307:                                :[fctrtos(Nm|TeX=1),fctrtos(Dn|TeX=1)];
                   4308:                        }
                   4309:                        else{
                   4310:                                S=fctrtos(Nm);
                   4311:                                if(nmono(Nm)>1) S="("+S+")";
                   4312:                                return S+"/("+fctrtos(Dn)+")";
                   4313:                        }
                   4314:                }
                   4315:                if(imag(P)==0) P = fctr(P);             /* usual polynomial */
                   4316:                else P=[[P,1]];
                   4317:                S = str_tb(0,0);
                   4318:                for(J = N = 0; J < length(P); J++){
                   4319:                        if(type(P[J][0]) <= 1){
                   4320:                                if(P[J][0] == -1){
                   4321:                                        write_to_tb("-",S);
                   4322:                                        if(length(P) == 1)
                   4323:                                                str_tb("1", S);
                   4324:                                }else if(P[J][0] != 1){
                   4325:                                        str_tb((TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]), S);
                   4326:                                        N++;
                   4327:                                }else if(length(P) == 1)
                   4328:                                        str_tb("1", S);
                   4329:                                else if(getopt(br)!=1 && length(P) == 2 && P[1][1] == 1){
                   4330:                                        str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);
                   4331:                                        J++;
                   4332:                                }
                   4333:                                continue;
                   4334:                        }
                   4335:                        if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)
                   4336:                                write_to_tb("*", S);
                   4337:                        SS=(TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]);
                   4338:                        N++;
                   4339:                        if(P[J][1] != 1){               /* (log(x))^2 */
                   4340:                                if(nmono(P[J][0])>1||
                   4341:                                        (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";
                   4342:                                write_to_tb(SS,S);
                   4343:                                str_tb(["^", (TeX>1)?rtotex(P[J][1]):monotos(P[J][1])],S);
                   4344:                        }else{
                   4345:                                if(nmono(P[J][0])>1) SS="("+SS+")";
                   4346:                                write_to_tb(SS,S);
                   4347:                        }
                   4348:                }
                   4349:                S = str_tb(0,S);
                   4350:                if((Lim>0 || TP!=2) && CR!="")  S=texlim(S,Lim|cut=CR);
                   4351:        }
                   4352:        if(TeX>0){
                   4353:                if(Small==1)    S=str_subst(S,"\\frac{","\\tfrac{");
                   4354:                if(Dvi==1){
                   4355:                        dviout(strip(S,"(",")")|eq=(Pages==1)?6:0); S=1;
                   4356:                }
                   4357:        }
                   4358:        return S;
                   4359: }
                   4360:
                   4361: def strip(S,S0,S1)
                   4362: {
                   4363:        SS=strtoascii(S);
                   4364:        if(length(SS)>1){
                   4365:                if(SS[0]==40&&SS[length(SS)-1]==41&&str_pair(SS,1,S0,S1)==length(SS)-1)
                   4366:                        S=str_cut(SS,1,length(SS)-2);
                   4367:        }
                   4368:        return S;
                   4369: }
                   4370:
                   4371: def texlim(S,Lim)
                   4372: {
                   4373:        /* extern TeXLim;       */
                   4374:        if(S==1 && Lim>10){
                   4375:                TeXLim=Lim;
                   4376:                mycat(["Set TeXLim =",Lim]);
                   4377:                return 1;
                   4378:        }
                   4379:        if(type(Out=getopt(cut))!=7)    Out="\\\\\n&";
                   4380:        if(type(Del=getopt(del))!=7)    Del=Out;
                   4381:        if(Lim<30)      Lim=TeXLim;
                   4382:        S=ltov(strtoascii(S));
                   4383:        for(L=[0],I=F=0;F==0; ){
                   4384:                II=str_str(S,Del|top=I)+2;
                   4385:                if(II<2){
                   4386:                        F++;II=/* str_len(S) */ length(S)-1;
                   4387:                }
                   4388:                for(J=JJ=I+1;;JJ=K+1){
                   4389:                        K=str_char(S,JJ,43);    /* + */
                   4390:                        if((K1=str_char(S,JJ,45))>2 && K1<K){   /* - */
                   4391:                                if(S[K1-1]!=123 && S[K1-1]!=40) K=K1;   /* {, ( */
                   4392:                        }
                   4393:                        if((K1=str_char(S,JJ,40))>0 && K1-JJ>6 && K1<K && S[K1-1]!=43 && S[K1-1]!=45){  /* ( */
                   4394:                                T=str_char(S,K1-6,"\\");  /* \Big*(, \big*( */
                   4395:                                if((T==K1-6 || T==K1-5)
                   4396:                                  && (str_str(S,"big"|top=T+1,end=T+1)>0 || str_str(S,"Big"|top=T+1,end=T+1)>0))
                   4397:                                        K=T;
                   4398:                                else if(K1>0 && K1<K) K=K1;
                   4399:                        }
                   4400:                        if(K<0 || K>II) break;
                   4401:                        if(K-J>Lim && texlen(str_cut(S,J,K-1))>=Lim){
                   4402:                                J=K+1; L=cons(JJ-1,L); SL=0;
                   4403:                        }
                   4404:                }
                   4405:                I=II;
                   4406:        }
                   4407:        SS=str_tb(0,0);
                   4408:        L=cons(length(S),L);
                   4409:        L=reverse(L);
                   4410:        for(I=0; L!=[]; I=J,L=cdr(L)){
                   4411:                str_tb((I==0)?"":Out,SS);
                   4412:                J=car(L);
                   4413:                str_tb(str_cut(S,I,J-1),SS);
                   4414:        }
                   4415:        return str_tb(0,SS);
                   4416: }
                   4417:
                   4418: def fmult(FN,M,L,N)
                   4419: {
                   4420:        Opt=getopt();
                   4421:        for(I = 0; I < length(M); I++)
                   4422:                M = call(FN, cons(M,cons(L[I],N))|option_list=Opt);
                   4423:        return M;
                   4424: }
                   4425:
                   4426: def radd(P,Q)
                   4427: {
                   4428:        if(type(P) <= 3 || type(Q) <= 3){
                   4429:                if(type(P) >= 5)
                   4430:                         return radd(Q,P);
                   4431:                if(type(Q) >= 5){
                   4432:                        R = dupmat(Q);
                   4433:                        if(P == 0)
                   4434:                                return R;
                   4435:                        if(type(Q) == 6){
                   4436:                                S = size(Q);
                   4437:                                if(S[0] != S[1])
                   4438:                                        return 0;
                   4439:                                for(I = 0; I < S[0]; I++)
                   4440:                                        R[I][I]  = radd(R[I][I], P);
                   4441:                        }else{
                   4442:                                for(I = length(R)-1; I >= 0; I--)
                   4443:                                        R[I] = radd(R[I],P);
                   4444:                        }
                   4445:                        return R;
                   4446:                }
                   4447:                /* P=red(P);Q=red(Q); */
                   4448:                if((P1=dn(P)) == (Q1=dn(Q))){
                   4449:                        if(P1==1) return P+Q;
                   4450:                        return red((nm(P)+nm(Q))/P1);
                   4451:                }
                   4452:                R=gcd(P1,Q1);S=tdiv(P1,R);
                   4453:                return red((nm(P)*tdiv(Q1,R)+nm(Q)*S)/(S*Q1));
                   4454:        }
                   4455:        if(type(P) == 5){
                   4456:                S = length(P);
                   4457:                R = newvect(S);
                   4458:                for(I = 0; I < S; I++)
                   4459:                        R[I] = radd(P[I],Q[I]);
                   4460:                return R;
                   4461:        }
                   4462:        if(type(P) == 6){
                   4463:                S = size(P);
                   4464:                R = newmat(S[0],S[1]);
                   4465:                for(I = 0; I < S[0]; I++){
                   4466:                        for(J = 0; J < S[1]; J++)
                   4467:                                R[I][J] = radd(P[I][J],Q[I][J]);
                   4468:                }
                   4469:                return R;
                   4470:        }
                   4471:        erno(0);
                   4472: }
                   4473:
                   4474: def getel(M,I)
                   4475: {
                   4476:        if(type(M) >= 4 && type(M) <= 6 && type(I) <= 1)
                   4477:                return M[I];
                   4478:        if(type(M) == 6 && type(I) == 5)
                   4479:                return M[I][J];
                   4480:        return M;
                   4481: }
                   4482:
                   4483: def ptol(P,X)
                   4484: {
                   4485:        F=(getopt(opt)==0)?0:1;
                   4486:        if(type(P) <= 3)
                   4487:                P = [P];
                   4488:        if(type(X) == 4){
                   4489:                for( ; X != []; X = cdr(X))
                   4490:                        P=ptol(P,car(X)|opt=F);
                   4491:                return P;
                   4492:        }
                   4493:        P = reverse(P);
                   4494:        for(R=[]; P != []; P = cdr(P)){
                   4495:                Q = car(P);
                   4496:                for(I = mydeg(Q,X); I >= 0; I--){
                   4497:                        S=mycoef(Q,I,X);
                   4498:                        if(F==1 || S!=0) R = cons(S,R);
                   4499:                }
                   4500:        }
                   4501:        return R;
                   4502: }
                   4503:
                   4504: def rmul(P,Q)
                   4505: {
                   4506:        if(type(P) <= 3 && type(Q) <= 3){
                   4507:                P=red(P);Q=red(Q);
                   4508:                P1=dn(P);P2=nm(P);Q1=dn(Q);Q2=nm(Q);
                   4509:                if(P1==1 && Q1==1)
                   4510:                        return P*Q;
                   4511:                if((R=gcd(P1,Q2)) != 1){
                   4512:                        P1=tdiv(P1,R);Q2=tdiv(Q2,R);
                   4513:                }
                   4514:                if((R=gcd(Q1,P2)) != 1){
                   4515:                        Q1=tdiv(Q1,R);P2=tdiv(P2,R);
                   4516:                }
                   4517:                return P2*Q2/(P1*Q1);
                   4518:        }
                   4519: #ifdef USEMODULE
                   4520:        return mmulbys(os_md.rmul,P,Q,[]);
                   4521: #else
                   4522:        return mmulbys(rmul,P,Q,[]);
                   4523: #endif
                   4524: }
                   4525:
                   4526: def mtransbys(FN,F,LL)
                   4527: {
                   4528:        Opt=getopt();
                   4529:        if(type(F) == 4){
                   4530:                F = ltov(F);
                   4531:                S = length(F);
                   4532:                R = newvect(S);
                   4533:                for(I = 0; I < S; I++)
                   4534:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   4535:                return vtol(R);
                   4536:        }
                   4537:        if(type(F) == 5){
                   4538:                S = length(F);
                   4539:                R = newvect(S);
                   4540:                for(I = 0; I < S; I++)
                   4541:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   4542:                return R;
                   4543:        }
                   4544:        if(type(F) == 6){
                   4545:                S = size(F);
                   4546:                R = newmat(S[0],S[1]);
                   4547:                for(I = 0; I < S[0]; I++){
                   4548:                        for(J = 0; J < S[1]; J++)
                   4549:                        R[I][J] = mtransbys(FN,F[I][J],LL|option_list=Opt);
                   4550:                }
                   4551:                return R;
                   4552:        }
                   4553:        if(type(F) == 7) return F;
                   4554:        return call(FN, cons(F,LL)|option_list=Opt);
                   4555: }
                   4556:
                   4557: def drawopt(S,T)
                   4558: {
                   4559:        if(type(S)!=7) return -1;
                   4560:        if(T==0||T==1){
                   4561:                for(I=0,R=LCOPT;I<7;I++,R=cdr(R))
                   4562:                        if(str_str(S,car(R))>=0) return(T==0)?COLOPT[I]:car(R);
                   4563:                return -1;
                   4564:        }
                   4565:        if(T==2){
                   4566:                V0=V1=0;
                   4567:                for(I=0,R=LPOPT;R!=[];I++,R=cdr(R)){
                   4568:                        if(str_str(S,car(R))>=0){
                   4569:                                if(I==0) V1++;
                   4570:                                else if(I==1) V1--;
                   4571:                                else if(I==2) V0--;
                   4572:                                else V0++;
                   4573:                        }
                   4574:                }
                   4575:                if(V0==0&&V1==0) return -1;
                   4576:                return [V0,V1];
                   4577:        }
                   4578:        if(T==3){
                   4579:                V=0;
                   4580:                for(I=1,R=LFOPT;R!=[];R=cdr(R),I*=2){
                   4581:                        if(str_str(S,car(R))>=0) V+=I;
                   4582:                }
                   4583:                return (V==0)?-1:V;
                   4584:        }
                   4585:        return -1;
                   4586: }
                   4587:
                   4588: def execdraw(L,P)
                   4589: {
                   4590:        if((Proc=getopt(proc))!=1) Proc=0;
                   4591:        if(type(P)<2) P=[P];
                   4592:        if(L!=[]&&type(L[0])!=4) L=[L];
                   4593:                /* special command */
                   4594:        if(P[0]<0){
                   4595:                if(length(P)==1&&(P[0]==-1||P[0]==-2||P[0]==-3)){       /* Bounding Box */
                   4596:                        W=WS=N=LS=0;
                   4597:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   4598:                                T=car(LL);
                   4599:                                if(P[0]!=-3 && T[0]==0){
                   4600:                                        if(length(T)>3) S="  by "+rtostr(T[3])+" cm";
                   4601:                                        else S="";
                   4602:                                        if(P[0]==-1){
                   4603:                                                mycat(["Windows : ",T[1][0],"< x <",T[1][1],", ",
                   4604:                                                        T[2][0],"< y <",T[2][1],S]);
                   4605:                                                if(length(T)>4 && type(T[4])==4) mycat(["ext :",T[4]]);
                   4606:                                                if(length(T)>5) mycat(["shift :",T[5]]);
                   4607:                                        }
                   4608:                                        return cdr(T);
                   4609:                                }
                   4610:                                if(type(T[0])==1){
                   4611:                                        if(T[0]==1){
                   4612:                                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4613:                                                        D=car(TT);
                   4614:                                                        if(type(D[0][0])==4){
                   4615:                                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4616:                                                                        if(N++==0) W=ptbbox(car(DT));
                   4617:                                                                        else W=ptbbox(car(DT)|box=W);
                   4618:                                                                }
                   4619:                                                        }else{
                   4620:                                                                if(N++==0) W=ptbbox(D);
                   4621:                                                                else W=ptbbox(D|box=W);
                   4622:                                                        }
                   4623:                                                }
                   4624:                                        }else if(T[0]==2){
                   4625:                                                V=T[2];
                   4626:                                                if(type(V[0])>1||type(V[1])>1) continue;  /* not supported */
                   4627:                                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   4628:                                                        Sc=car(Sc)[1];
                   4629:                                                        if(type(Sc)==1) V=[Sc*V[0],Sc*V[1]];
                   4630:                                                        else V=[Sc[0]*V[0],Sc[1]*V[1]];
                   4631:                                                }
                   4632:                                                if(LS==0) WS=ptbbox([V]);
                   4633:                                                else WS=ptbbox([V]|box=WS);
                   4634:                                                if(length(T)>4) S=T[4];
                   4635:                                                else if(type(S=T[3])==4){
                   4636:                                                        S=S[0];
                   4637:                                                        if(type(S)==4) S=S[length(S)-1];
                   4638:                                                        S=rtostr(S);
                   4639:                                                }
                   4640:                                                if(str_len(S)>LS) LS=str_len(S);
                   4641:                                        }else if(T[0]==3||T[0]==4){
                   4642:                                                if(N++==0) W=ptbbox(cdr(cdr(T)));
                   4643:                                                else W=ptbbox(cdr(cdr(T))|box=W);
                   4644:                                        }
                   4645:                                }
                   4646:                        }
                   4647:                        if(W!=0&&WS!=0) W=ptbbox([W,WS]|box=1);
                   4648:                        return (P[0]==-3)?[W,LS,WS]:W;
                   4649:                }else if(length(P)>1&&P[0]==-1){        /* set Bounding Box */
                   4650:                        P=cons(0,cdr(P));
                   4651:                        Ex=Sft=[0,0];
                   4652:                        if(type(X=getopt(ext))==4) Ex=X;
                   4653:                        if(type(X=getopt(shift))==4) Sft=X;
                   4654:                        if(Ex!=Sft||Ex!=[0,0]){
                   4655:                                if(Sft==[0,0]) Sft=[Ex];
                   4656:                                else Sft=[Ex,Sft];
                   4657:                                if(length(P)==3) Sft=cons(1,Sft);
                   4658:                                if(length(P)==3||length(P)==4) P=append(P,Sft);
                   4659:                        }
                   4660:                        return cons(P,delopt(L,0));
                   4661:                }
                   4662:                if(P[0]==-4){
                   4663:                        for(N=0,LT=L;LT!=[];LT=cdr(LT)){        /* count coord. */
                   4664:                                T=car(LT);
                   4665:                                if(T[0]==1){
                   4666:                                        for(T=cdr(cdr(T));T!=[];T=cdr(T)){
                   4667:                                                if(type((S=car(T))[0][0])==4) N+=length(S);
                   4668:                                                else for(;S!=[];S=cdr(S)) if(type(car(S))==4) N++;
                   4669:                                        }
                   4670:                                }else if(T[0]==2) N++;
                   4671:                                else if(T[0]==3||T[0]==4) N+=2;
                   4672:                        }
                   4673:                        return N;
                   4674:                }
                   4675:                if(P[0]==-5){                                           /* functions */
                   4676:                        for(N=0,R=[],LT=L;LT!=[];LT=cdr(LT)){
                   4677:                                T=car(LT);
                   4678:                                if(T[0]==0) N=ior(N,1);
                   4679:                                else if(type(T[0])==1){
                   4680:                                        if(T[0]>0) N=ior(N,2^T[0]);
                   4681:                                }
                   4682:                                else if(Type(T[0])==2){
                   4683:                                        if(findin(T[0],R)<0) R=cons(T[0],R);
                   4684:                                }
                   4685:                        }
                   4686:                        for(I=5;I>=0;I--) if(iand(N,2^I)) R=cons(I,R);
                   4687:                        return R;
                   4688:                }
                   4689:                return 0;
                   4690:        }
                   4691:
                   4692:        if(length(P)>1){
                   4693:                if(type(P[1])==6||(type(P[1])<2&&P[1]>0)) M=P[1];
                   4694:                else if(type(P[1])==4&&length(P[1])==2) M=diagm(2,P[1]);
                   4695:        }
                   4696:        if(length(P)>2&&type(P[2])==4){
                   4697:                Org=[["shift",P[2]]];
                   4698:                if(M==0) M=1;
                   4699:        }else Org=[];
                   4700:        if(P[0]==0||(type(P[0])==4&&P[0][0]==0)){               /* Risa/Asir */
                   4701:                PP=car(P);PPP=0;
                   4702:                if(type(PP)!=4) PP=[PP];
                   4703:                if(length(PP)<3){
                   4704:                        if(length(PP)==1 || type(PP[1])==4){
                   4705:                                if(ID_PLOT<0) ID_PLOT=ox_launch_nox(0,"ox_plot");
                   4706:                                Id=ID_PLOT;
                   4707:                                if(length(PP)==1&&type(Canvas)==4&&length(Canvas)==2)
                   4708:                                        PP=cons(PP[0],[Canvas]);
                   4709:                                if(length(PP)>1){
                   4710:                                        PPP=PP[1][0];
                   4711:                                        PPQ=(length(PP[1])==2)?PP[1][1]:PPP;
                   4712:                                        open_canvas(Id,[PPP,PPQ]);
                   4713:                                }else open_canvas(Id);
                   4714:                                Ind=ox_pop_cmo(Id);
                   4715:                        }else{
                   4716:                                Ind=PP[1];
                   4717:                                if(getopt(cl)==1) clear_canvas(Id,Ind);
                   4718:                        }
                   4719:                }else{
                   4720:                        Id=PP[1];Ind=PP[2];
                   4721:                        if(length(PP)>3 && type(PP[3])==1) PPP=PP[3];
                   4722:                        if(length(PP)>4 && type(PP[4])==1) PPQ=PP[4];
                   4723:                        if(getopt(cl)==1) clear_canvas(Id,Ind);
                   4724:                }
                   4725:                if(L==[]) return (PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   4726:                Ex0=Ex0;Sft=[0,0];
                   4727:                if(length(P)>1&&P[1]==0&&length(P)<4){
                   4728:                        R=execdraw(L,-3);
                   4729:                        Ex0=Ex1=Ex2=10;
                   4730:                        if((U=R[1])>0){         /* string */
                   4731:                                if(U>20) U=16;                                  /* adj 16,8,2,7,15 */
                   4732:                                if(R[0][0][0]>R[2][0][0]-(R[0][0][1]-R[0][0][0])/256) Ex0+=8*U; /* adj 256 */
                   4733:                                else Ex0+=2*U;
                   4734:                                if(R[0][0][1]<R[2][0][1]+(R[0][0][1]-R[0][0][0])/256) Ex1+=7*U;
                   4735:                                else Ex1+=2*U;
                   4736:                                if(R[0][1][1]<R[2][1][1]+(R[0][1][1]-R[0][1][0])/256) Ex2+=15;
                   4737:                        }
                   4738:                        R=[R[0][0],R[0][1],0,[Ex0,Ex1],[0,-Ex2]];
                   4739:                        if(length(P)>2 && P[2]==1)
                   4740:                                mycat0(["Box:",[R[0],R[1]], ",  ext=",R[3],",  shift=",R[4]],1);
                   4741:                }else R=execdraw((length(P)>3)?P[3]:L,-2);      /* Windows */
                   4742:                XW=R[0];YW=R[1];
                   4743:                if(length(R)>3){
                   4744:                        if(R[3]!=0 && R[3]!=[0,0]) Ex=R[3];
                   4745:                        if(length(R)>4) Sft=R[4];
                   4746:                }
                   4747:                if(type(X=getopt(ext))==4)
                   4748:                        Ex=(Ex0)?[X[0]+Ex[0],X[1]+Ex[1]]:X;
                   4749:                if(type(M)<2){
                   4750:                        if(length(P)>1&&type(P[1])==1) M=P[1];
                   4751:                        else if((length(P)==1||P[1]==0||P[1]==1)&& PPP>0) M=PPP;
                   4752:                        if(M<2) M=400;
                   4753:                        if(Ex!=0 && type(Ex)==4){
                   4754:                                M-=Ex[0]+Ex[1];
                   4755:                        }
                   4756:                        M=(M/(XW[1]-XW[0]))*diagm(2,[1,-1]);
                   4757:                }
                   4758:                if(type(X=getopt(shift))==4) Sft=(Ex0)?[Sft[0]+X[0],Sft[1]+X[1]]:X;
                   4759:                if(type(Sft)==4) Sft=[Sft[0],-Sft[1]];
                   4760:                if(Ex!=0) Sft=[Sft[0]+Ex[0],Sft[1]];
                   4761:                Org=[["shift",ptaffine(M,[-XW[0],-YW[1]]|shift=Sft)]];
                   4762:                for(CT=0;CT<2;CT++){
                   4763:                  for(LT=L;LT!=[];LT=cdr(LT)){
                   4764:                        T=car(LT);
                   4765:                        if(!CT && T[0]!=2) continue;
                   4766:                        if(CT && T[0]==2) continue;
                   4767:                        if(T[0]==1){
                   4768:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4769:                                        D=car(TT);
                   4770:                                        if(type(D[0][0])==4){
                   4771:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4772:                                                        V=car(DT);
                   4773:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   4774:                                                        draw_bezier(Id,Ind,V|option_list=T[1]);
                   4775:                                                }
                   4776:                                        }else{
                   4777:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   4778:                                                draw_bezier(Id,Ind,D|option_list=T[1]);
                   4779:                                        }
                   4780:                                }
                   4781:                        }else if(T[0]==2){      /* put */
                   4782:                                if(length(T)<4) continue;
                   4783:                                V=T[2];
                   4784:                                if(type(VLB)==4&&V[0]=="_") V=VLB;
                   4785:                                else if(type(V[0])>1||type(V[1])>1) continue;   /* not supported */
                   4786:                                if(length(T)>3&&type(T[3])==4&&length(T[3])>1&&T[3][1]==1) VLB=V;
                   4787:                                F++;MM=M;
                   4788:                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   4789:                                        if(!MM) MM=1;
                   4790:                                        Sc=car(Sc)[1];
                   4791:                                        if(type(Sc)==1) MM=MM*Sc;
                   4792:                                        else if(type(Sc)==6) MM=MM*diagm(2,Sc);
                   4793:                                }
                   4794:                                if(MM) V=ptaffine(MM,V|option_list=Org);
                   4795:                                if(type(S=S0=T[3])==4) S=S0[0];
                   4796:                                if(length(T)>4) S=T[4];                                         /* subst. string */
                   4797:                                if(type(S0)==4&&type(S0[0])==4){
                   4798:                                        if((Col=drawopt(S0[0][0],0))<0) Col=0;  /* attrib. */
                   4799:                                        if(type(S)!=7) S=rtostr(S0[0][1]);
                   4800:                                        S=str_subst(S,[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   4801:                                        if(type(Pos=drawopt(S0[0][0],2))==4)
                   4802:                                                V=[V[0]+4*str_len(S)*Pos[0],V[1]-10*Pos[1]]; /* adjustable */
                   4803:                                }else S=str_subst(rtostr(S),[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   4804:                                V=[V[0]-str_len(S)*4,V[1]-8];   /* adjustable */
                   4805:                                draw_string(Id,Ind,V,S,Col);
                   4806:                        }else if(T[0]==3){      /* arrow */
                   4807:                                F++;
                   4808:                                T1=T[2];T2=T[3];
                   4809:                                if(M){
                   4810:                                        T1=ptaffine(M,T1|option_list=Org);
                   4811:                                        T2=ptaffine(M,T2|option_list=Org);
                   4812:                                }
                   4813:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T[1]);
                   4814:                        }else if(T[0]==4){      /* line */
                   4815:                                F++;
                   4816:                                T1=T[2];T2=T[3];
                   4817:                                if(M){
                   4818:                                        T1=ptaffine(M,T1|option_list=Org);
                   4819:                                        T2=ptaffine(M,T2|option_list=Org);
                   4820:                                }
                   4821:                                V=delopt(T1=T[1],"opt"|inv=1);
                   4822:                                if(V!=[]&&str_str(V[1],".")>=0)
                   4823:                                        T1=cons(["opt",cons("dotted,",V[1])],delopt(T1,"opt"));
                   4824:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T1);
                   4825:                        }else if(T[0]==5){      /* TeX */
                   4826:                                mycat(rtostr(T[2]));
                   4827:                                if(F){
                   4828:                                        S=str_tb(0,Out);
                   4829:                                        Out=str_tb(0,0);
                   4830:                                        F=0;
                   4831:                                        if(S!=""){
                   4832:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   4833:                                                else LOut=cons(xyproc(S),LOut);
                   4834:                                        }
                   4835:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   4836:                                        else{
                   4837:                                                LOut=cons(T[2],Out);
                   4838:                                        }
                   4839:                                }
                   4840:                        }else if(Proc==1&&type(T[0])==2){
                   4841:                                if(length(T)<3) call(T[0],T[1]);
                   4842:                                else call(T[0],T[1]|option_list=T[2]);
                   4843:                        }
                   4844:                }
                   4845:          }
                   4846:          S=(PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   4847:          if(Ex==0&&Sft!=[0,0]) Ex=[0,0];
                   4848:          return (Ex!=0&&length(P)>2&&P[2]==-1)?
                   4849:                [S,0,0,[0,R[0],R[1],0,Ex,[Sft[0]-Ex[0],-Sft[1]]]]:S;
                   4850:        }
                   4851:        if(P[0]==1||P[0]==2){   /* TeX */
                   4852:                Out=str_tb(0,0);LOut=[];F=0;
                   4853:                if(getopt(cl)==1) dviout0(0);
                   4854:                for(;L!=[];L=cdr(L)){
                   4855:                        T=car(L);Opt=T[1];
                   4856:                        if(type(T[0])>=2) continue;
                   4857:                        if(T[0]==0){
                   4858:                                XW=T[1];YW=T[2];
                   4859:                                if(length(P)>1&&type(P[1])==1&&P[1]<0)
                   4860:                                        M=-P[1]/(XW[0]-XW[1]);
                   4861:                        }else if(T[0]==1){
                   4862:                                F++;
                   4863:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4864:                                        D=car(TT);
                   4865:                                        if(type(D[0][0])==4){
                   4866:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4867:                                                        V=car(DT);
                   4868:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   4869:                                                        str_tb(xybezier(V|option_list=Opt),Out);
                   4870:                                                }
                   4871:                                        }else{
                   4872:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   4873:                                                str_tb(xybezier(D|option_list=Opt),Out);
                   4874:                                        }
                   4875:                                }
                   4876:                        }else if(T[0]==2){
                   4877:                                F++;V=T[2];
                   4878:                                Opt=delopt(Opt,"scale"|inv=1);
                   4879:                                MM=M;
                   4880:                                if(Opt!=[]){
                   4881:                                        Opt=car(Opt)[1];
                   4882:                                        if(type(Opt)==1) Opt=[Opt,Opt];
                   4883:                                        if(Opt!=[1,1]){
                   4884:                                                if(!MM) MM=1;
                   4885:                                                MM=MM*diagm(2,[Opt[0],Opt[1]]);
                   4886:                                        }
                   4887:                                }
                   4888:                                if(MM) V=ptaffine(MM,V|option_list=Org);
                   4889:                                if(length(T)>3) V=append(V,T[3]);
                   4890:                                str_tb(xyput(V),Out);
                   4891:                        }else if(T[0]==3){
                   4892:                                F++;
                   4893:                                T1=T[2];T2=T[3];
                   4894:                                if(M){
                   4895:                                        T1=ptaffine(M,T1|option_list=Org);
                   4896:                                        T2=ptaffine(M,T2|option_list=Org);
                   4897:                                }
                   4898:                                str_tb(xyarrow(T1,T2|option_list=Opt),Out);
                   4899:                        }else if(T[0]==4){
                   4900:                                F++;
                   4901:                                T1=T[2];T2=T[3];
                   4902:                                if(M){
                   4903:                                        T1=ptaffine(M,T1|option_list=Org);
                   4904:                                        T2=ptaffine(M,T2|option_list=Org);
                   4905:                                }
                   4906:                                str_tb(xyline(T1,T2|option_list=Opt),Out);
                   4907:                        }else if(T[0]==5){
                   4908:                                if(F){
                   4909:                                        S=str_tb(0,Out);
                   4910:                                        Out=str_tb(0,0);
                   4911:                                        F=0;
                   4912:                                        if(S!=""){
                   4913:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   4914:                                                else LOut=cons(xyproc(S),LOut);
                   4915:                                        }
                   4916:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   4917:                                        else LOut=cons(T[2],Out);
                   4918:                                }
                   4919:                        }else if(T[0]==-2)
                   4920:                                str_tb(["%",T[1],"\n"],Out);
                   4921:                        else if(Proc==1&&type(T[0])==2){
                   4922:                                if(length(T)<3) call(T[0],T[1]);
                   4923:                                else call(T[0],T[1]|option_list=T[2]);
                   4924:                        }
                   4925:                }
                   4926:                S=str_tb(0,Out);
                   4927:                if(P[0]==1){
                   4928:                        if(F) LOut=cons(xyproc(S),LOut);
                   4929:                        Out=str_tb(0,0);
                   4930:                        for(L=reverse(LOut);L!=[];L=cdr(L))
                   4931:                                str_tb(car(L),Out);
                   4932:                        return str_tb(0,Out);
                   4933:                }
                   4934:                if(F) dviout(xyproc(S));
                   4935:                else dviout(" ");
                   4936:        }
                   4937: }
                   4938:
                   4939: def execproc(L)
                   4940: {
                   4941:        if(type(N=getopt(var))!=1&&N!=0) N=2;
                   4942:        for(R=[];L!=[];L=cdr(L)){
                   4943:                P=car(L);
                   4944:                if(type(P[0])==2&&vtype(P[0])==3){
                   4945:                        if((VS=vars(cdr(P)))!=[]){
                   4946:                                for(I=0;I<N;I++){
                   4947:                                        V=makev(["v",I+1]);
                   4948:                                        if(findin(V,VS)>=0) P=mysubst(P,[V,R[I]]);
                   4949:                                }
                   4950:                        }
                   4951:                        if(length(P)<3) R=cons(call(P[0],P[1]),R);
                   4952:                        else R=cons(call(P[0],P[1]|option_list=P[2]),R);
                   4953:                }
                   4954:        }
                   4955:        return (getopt(all)==1)?R:car(R);
                   4956: }
                   4957:
                   4958: def myswap(P,L)
                   4959: {
                   4960:        X=makenewv(P);
                   4961:        for(L=reverse(L);length(L)>1;L=cdr(L))
                   4962:                P=subst(P,L[0],X,L[1],L[0],X,L[1]);
                   4963:        return P;
                   4964: }
                   4965:
                   4966: def mysubst(P,L)
                   4967: {
                   4968:        if(P==0) return 0;
1.29      takayama 4969:        if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
1.6       takayama 4970:        Inv=getopt(inv);
                   4971:        if(type(L[0]) == 4){
                   4972:                while((L0 = car(L))!=[]){
                   4973:                        P = mysubst(P,(Inv==1)?[L0[1],L0[0]]:L0);
                   4974:                        L = cdr(L);
                   4975:                }
                   4976:                return P;
                   4977:        }
                   4978:        if(Inv==1) L=[L[1],L[0]];
                   4979:        if(type(P) > 3){
                   4980:                if(type(P)==7) return P;
                   4981:                if(type(P)>7)
                   4982:                        return subst(P,L[0],L[1]);
                   4983: #ifdef USEMODULE
                   4984:                return mtransbys(os_md.mysubst,P,[L]);
                   4985: #else
                   4986:                return mtransbys(mysubst,P,[L]);
                   4987: #endif
                   4988:        }
                   4989:        P = red(P);
                   4990:        if(type(P) == 3){
                   4991:                A=mysubst(nm(P),L);B=mysubst(dn(P),L);
                   4992:                return red(nm(A)/nm(B))*red(dn(B)/dn(A));
                   4993:        }
                   4994:        L1=(type(L[1])==3)?red(L[1]):L[1];X=L[0];
                   4995:        if(ptype(L1,X)==3){
                   4996:                LN=nm(L1);LD=dn(L1);
                   4997:                Deg=mydeg(P,X);
                   4998:                if(Deg <= 0) return P;
                   4999:                V = newvect(Deg+1);
                   5000:                for(V[I=Deg]=1;I >= 1;I--)
                   5001:                 V[I-1]=V[I]*LD;
                   5002:                for(R = 0, I = Deg; I >= 0; I--)
                   5003:                        R = R*LN + mycoef(P,I,X)*V[I];
                   5004:                return red(R/V[0]);
                   5005:        }
                   5006:        return subst(P,X,L1);
                   5007: }
                   5008:
                   5009: def mmulbys(FN,P,F,L)
                   5010: {
                   5011:        Opt=getopt();
                   5012:        if(type(F) <= 3){
                   5013:                if(type(P) <= 3)
                   5014:                        return call(FN, cons(P,cons(F,L))|option_list=Opt);
                   5015:                if(type(P) == 5){
                   5016:                        S = length(P);
                   5017:                        R = newvect(S);
                   5018:                        for(I = 0; I < S; I++)
                   5019:                                R[I] = call(FN, cons(P[I],cons(F,L))|option_list=Opt);
                   5020:                        return R;
                   5021:                }else if(type(P) == 6){
                   5022:                        S = size(P);
                   5023:                        R = newmat(S[0],S[1]);
                   5024:                        for(I = 0; I < S[0]; I++){
                   5025:                                for(J = 0; J < S[1]; J++)
                   5026:                                        R[I][J] = call(FN, cons(P[I][J],cons(F,L))|option_list=Opt);
                   5027:                        }
                   5028:                        return R;
                   5029:                }
                   5030:        }
                   5031:        if(type(F) == 5){
                   5032:                S = length(F);
                   5033:                if(type(P) <= 3){
                   5034:                        R = newvect(S);
                   5035:                        for(I = 0; I < S; I++)
                   5036:                                R[I] = call(FN, cons(P,cons(F[I],L))|option_list=Opt);
                   5037:                        return R;
                   5038:                }
                   5039:                if(type(P) == 5){
                   5040:                        for(J=R=0; J<S; J++)
                   5041:                                R = radd(R, call(FN, cons(P[J],cons(F[J],L)))|option_list=Opt);
                   5042:                        return R;
                   5043:                }
                   5044:                T = size(P);
                   5045:                R = newvect(T[0]);
                   5046:                for(I = 0; I < T[0]; I++){
                   5047:                        for(J = 0; J < S; J++)
                   5048:                                R[I] = radd(R[I], call(FN, cons(P[I][J],cons(F[J],L))|option_list=Opt));
                   5049:                }
                   5050:                return R;
                   5051:        }
                   5052:        if(type(F) == 6){
                   5053:                S = size(F);
                   5054:                if(type(P) <= 3){
                   5055:                        R = newmat(S[0],S[1]);
                   5056:                        for(I = 0; I < S[0]; I++){
                   5057:                                for(J = 0; J < S[1]; J++)
                   5058:                                        R[I][J] = call(FN, cons(P,cons(F[I][J],L))|option_list=Opt);
                   5059:                        }
                   5060:                        return R;
                   5061:                }
                   5062:                if(type(P) == 5){
                   5063:                        R = newvect(S[1]);
                   5064:                        for(J = 0; J < S[1]; J++){
                   5065:                                for(K = U = 0; K < S[0]; K++)
                   5066:                                        U = radd(U, call(FN, cons(P[K],cons(F[K][J],L))|option_list=Opt));
                   5067:                                R[J] = U;
                   5068:                        }
                   5069:                        return R;
                   5070:                }
                   5071:                T = size(P);
                   5072:                R = newmat(T[0],S[1]);
                   5073:                for(I = 0; I < T[0]; I++){
                   5074:                        for(J = 0; J < S[1]; J++){
                   5075:                                for(K = U = 0; K < S[0]; K++)
                   5076:                                        U = radd(U, call(FN, cons(P[I][K],cons(F[K][J],L)|option_list=Opt)));
                   5077:                                R[I][J] = U;
                   5078:                        }
                   5079:                }
                   5080:                return R;
                   5081:        }
                   5082:        erno(0);
                   5083:        return 0;
                   5084: }
                   5085:
                   5086: def appldo(P,F,L)
                   5087: {
                   5088:        if(type(F) <= 3){
                   5089:                if(type(L) == 4 && type(L[0]) == 4)
                   5090:                        return applpdo(P,F,L);
                   5091:                L = vweyl(L);
                   5092:                X = L[0]; DX = L[1];
                   5093:                J = mydeg(P,DX);
                   5094:                for(I = R = 0; I <= J; I++){
                   5095:                        if(I > 0)
                   5096:                                F = mydiff(F,X);
                   5097:                        R = radd(R,mycoef(P,I,DX)*F);
                   5098:                }
                   5099:                return R;
                   5100:        }
                   5101: #ifdef USEMODULE
                   5102:        return mmulbys(os_md.appldo,P,F,[L]);
                   5103: #else
                   5104:        return mmulbys(appldo,P,F,[L]);
                   5105: #endif
                   5106: }
                   5107:
                   5108: def appledo(P,F,L)
                   5109: {
                   5110:        if(type(F) <= 3){
                   5111:                L = vweyl(L);
                   5112:                X = L[0]; DX = L[1];
                   5113:                J = mydeg(P,DX);
                   5114:                for(I = R = 0; I <= J; I++){
                   5115:                        if(I > 0)
                   5116:                                F = myediff(F,X);
                   5117:                        R = radd(R,mycoef(P,I,DX)*F);
                   5118:                }
                   5119:                return R;
                   5120:        }
                   5121: #ifdef USEMODULE
                   5122:        mmulbys(os_md.appledo,P,F,[L]);
                   5123: #else
                   5124:        mmulbys(appledo,P,F,[L]);
                   5125: #endif
                   5126: }
                   5127:
                   5128: def muldo(P,Q,L)
                   5129: {
                   5130:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5131:        if(type(Q) <= 3){
                   5132:                if(type(L) == 4 && type(L[0]) == 4)
                   5133:                        return mulpdo(P,Q,L|lim=Lim);   /* several variables */
                   5134:                R = rmul(P,Q);
                   5135:                L = vweyl(L);
                   5136:                X = L[0]; DX = L[1];
                   5137:                if(X != 0){
                   5138:                        for(I = F = 1; ; I++){
                   5139:                                P = mydiff(P,DX);
                   5140:                                if(I>Lim){
                   5141:                                        mycat(["Over", Lim,"derivations!"]);
                   5142:                                        break;
                   5143:                                }
                   5144:                                if(P == 0)
                   5145:                                        break;
                   5146:                                Q = mydiff(Q,X);
                   5147:                                if(Q == 0)
                   5148:                                        break;
                   5149:                                F *= I;
                   5150:                                R = radd(R,P*Q/F);
                   5151:                        }
                   5152:                }
                   5153:                return R;
                   5154:        }
                   5155: #ifdef USEMODULE
                   5156:        return mmulbys(os_md.muldo,P,Q,[L]);
                   5157: #else
                   5158:        return mmulbys(muldo,P,Q,[L]);
                   5159: #endif
                   5160: }
                   5161:
                   5162: def jacobian(F,X)
                   5163: {
                   5164:        F=ltov(F);X=ltov(X);
1.30      takayama 5165:        N=length(F);L=length(X);
                   5166:        M=newmat(N,L);
1.6       takayama 5167:        for(I=0;I<N;I++)
1.30      takayama 5168:                for(J=0;J<L;J++) M[I][J]=red(diff(F[I],X[J]));
                   5169:        if(N!=L||getopt(mat)==1) return M;
1.6       takayama 5170:        return mydet(M);
                   5171: }
                   5172:
                   5173: def hessian(F,X)
                   5174: {
                   5175:        X=ltov(X);
                   5176:        N=length(X);
                   5177:        M=newmat(N,N);
                   5178:        for(I=0;I<N;I++){
                   5179:                G=red(diff(F,X[I]));
                   5180:                for(J=0;J<N;J++) M[I][J]=red(diff(G,X[J]));
                   5181:        }
                   5182:        if(getopt(mat)==1) return M;
                   5183:        return mydet(M);
                   5184: }
                   5185:
                   5186: def wronskian(F,X)
                   5187: {
                   5188:        N=length(F);
                   5189:        M=newmat(N,N);
                   5190:        for(I=0;F!=[];F=cdr(F),I++){
                   5191:                M[I][0]=car(F);
                   5192:                for(J=1;J<N;J++) M[I][J]=red(diff(M[I][J-1],X));
                   5193:        }
                   5194:        if(getopt(mat)==1) return M;
                   5195:        return mydet(M);
                   5196: }
                   5197:
                   5198: def adj(P,L)
                   5199: {
                   5200:        if(type(P) == 4)
                   5201: #ifdef USEMODULE
                   5202:                return map(os_md.adj,mtranspose(P),L);
                   5203: #else
                   5204:                return map(adj,mtranspose(P),L);
                   5205: #endif
                   5206:        if(type(L) == 4 && type(L[0]) == 4)
                   5207: #ifdef USEMODULE
                   5208:                return fmult(os_md.adj,P,L,[]);
                   5209: #else
                   5210:                return fmult(adj,P,L,[]);
                   5211: #endif
                   5212:        L = vweyl(L);
                   5213:        X = L[0]; DX = L[1];
                   5214:        P = R = subst(P, DX, -DX);
                   5215:        for(I = 1; (R = mydiff(mydiff(R, X), DX)/I) != 0 && I < 100; I++)
                   5216:                P = radd(P,R);
                   5217:        return P;
                   5218: }
                   5219:
                   5220: def laplace1(P,L)
                   5221: {
                   5222:        if(type(L) == 4 && type(L[0]) == 4)
                   5223: #ifdef USEMODULE
                   5224:                return fmult(os_md.laplace,P,L,[]);
                   5225: #else
                   5226:                return fmult(laplace,P,L,[]);
                   5227: #endif
                   5228:        L = vweyl(L);
                   5229:        X = L[0]; DX = L[1];
                   5230:        P = adj(P, L);
                   5231:        return subst(P,X,o_1,DX,X,o_1,DX);
                   5232: }
                   5233:
                   5234: def laplace(P,L)
                   5235: {
                   5236:        if(type(L) == 4 && type(L[0]) == 4)
                   5237: #ifdef USEMODULE
                   5238:                return fmult(os_md.laplace1,P,L,[]);
                   5239: #else
                   5240:                return fmult(laplace1,P,L,[]);
                   5241: #endif
                   5242:        L = vweyl(L);
                   5243:        X = L[0]; DX = L[1];
                   5244:        P = adj(P, L);
                   5245:        return subst(P,X,o_1,DX,-X,o_1,-DX);
                   5246: }
                   5247:
                   5248: def mce(P,L,V,R)
                   5249: {
                   5250:        L = vweyl(L);
                   5251:        X = L[0]; DX = L[1];
                   5252:        P = sftexp(laplace1(P,L),L,V,R);
                   5253:        return laplace(P,L);
                   5254: }
                   5255:
                   5256: def mc(P,L,R)
                   5257: {
                   5258:        return mce(P,L,0,R);
                   5259: }
                   5260:
                   5261: def rede(P,L)
                   5262: {
                   5263:        Q = ltov(fctr(nm(red(P))));
                   5264:        P = 1;
                   5265:        if(type(L) < 4)
                   5266:                L = [L];
                   5267:        if(type(L[0]) < 4)
                   5268:                L = [L];
                   5269:        for( ; L != []; L = cdr(L)){
                   5270:                DX = vweyl(car(L))[1];
                   5271:                for(I = 1; I < length(Q); I++){
                   5272:                        if(mydeg(Q[I][0],DX) > 0){
                   5273:                                P *= (Q[I][0])^(Q[I][1]);
                   5274:                                Q[I]=[1,0];
                   5275:                        }
                   5276:                }
                   5277:        }
                   5278:        return P;
                   5279: }
                   5280:
                   5281: def ad(P,L,R)
                   5282: {
                   5283:        L = vweyl(L);
                   5284:        DX = L[1];
                   5285:        K = mydeg(P,DX);
                   5286:        S = mycoef(P,0,DX);
                   5287:        Q = 1;
                   5288:        for(I=1; I <= K;I++){
                   5289:                Q = muldo(Q,DX-R,L);
                   5290:                S = radd(S,mycoef(P,I,DX)*Q);
                   5291:        }
                   5292:        return S;
                   5293: }
                   5294:
                   5295: def add(P,L,R)
                   5296: {
                   5297:        return rede(ad(P,L,R),L);
                   5298: }
                   5299:
                   5300:
                   5301: def vadd(P,L,R)
                   5302: {
                   5303:        L = vweyl(L);
                   5304:        if(type(R) != 4)
                   5305:                return 0;
                   5306:        N = length(R);
                   5307:        DN = 1; Ad = PW = 0;
                   5308:        for( ; R != []; R = cdr(R), PW++){
                   5309:                DN *= (T=1-car(R)[0]*L[0]);
                   5310:                Ad = Ad*T-car(R)[1]*x^PW;
                   5311:        }
                   5312:        Ad /= DN;
                   5313:        return add(P,L,Ad);
                   5314: }
                   5315:
                   5316: def addl(P,L,R)
                   5317: {
                   5318:        return laplace1(add(laplace(P,L),L,R),L);
                   5319: }
                   5320:
                   5321: def cotr(P,L,R)
                   5322: {
                   5323:        L = vweyl(L);
                   5324:        X = L[0]; DX = L[1];
                   5325:        T = 1/mydiff(P,DX);
                   5326:        K = mydeg(P,DX);
                   5327:        S = mysubst(mycoef(P,0,DX), [X, R]);
                   5328:        Q = 1;
                   5329:        for(I = 1; I <= K; I++){
                   5330:                Q = muldo(Q, K*DX, L);
                   5331:                S = radd(S,mysubst(mycoef(P,I,DX), [X, R])*Q);
                   5332:        }
                   5333: }
                   5334:
                   5335: def rcotr(P,L,R)
                   5336: {
                   5337:        return rede(cotr(P,L,R), L);
                   5338: }
                   5339:
                   5340: def muledo(P,Q,L)
                   5341: {
                   5342:        if(type(Q)>3)
                   5343: #ifdef USEMODULE
                   5344:                return mmulbys(os_md.muledo,P,Q,[L]);
                   5345: #else
                   5346:                return mmulbys(muledo,P,Q,[L]);
                   5347: #endif
                   5348:        R = P*Q;
                   5349:        L = vweyl(L);
                   5350:        X = L[0]; DX = L[1];
                   5351:        for(I = F = 1; I < 100; I++){
                   5352:                P = mydiff(P,DX);
                   5353:                if(P == 0)
                   5354:                        break;
                   5355:                Q = myediff(Q,X);
                   5356:                if(Q == 0)
                   5357:                        break;
                   5358:                F = rmul(F,I);
                   5359:                R = radd(R,P*Q/F);
                   5360:        }
                   5361:        return R;
                   5362: }
                   5363:
                   5364:
                   5365: #if 1
                   5366: def mulpdo(P,Q,L)
                   5367: {
                   5368:        if(type(Q)>3)
                   5369: #ifdef USEMODULE
                   5370:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5371: #else
                   5372:                return mmulbys(mulpdo,P,Q,[L]);
                   5373: #endif
                   5374:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5375:        M = vweyl(car(L)); X= M[0]; DX = M[1];
                   5376:        L = cdr(L);
                   5377:        R = 0;
                   5378:        for(I = 0; Q != 0 && I <= Lim; I++){
                   5379:                if(I>Lim){
                   5380:                        mycat(["Over", Lim,"derivations!"]);
                   5381:                        break;
                   5382:                }
                   5383:                if(I > 0)
                   5384:                        P /= I;
                   5385:                if(length(L)==0)
                   5386:                        R = radd(R,P*Q);
                   5387:                else
                   5388:                        R = radd(R,mulpdo(P,Q,L));
                   5389:                if(X==0) break;
                   5390:                P = mydiff(P,DX);
                   5391:                if(P == 0)
                   5392:                        break;
                   5393:                Q = mydiff(Q,X);
                   5394:        }
                   5395:        if(I>Lim)       mycat(["Over", Lim,"derivations!"]);
                   5396:        return R;
                   5397: }
                   5398:
                   5399: #else
                   5400: def mulpdo(P,Q,L);
                   5401: {
                   5402:        if(type(Q)>3)
                   5403: #ifdef USEMODULE
                   5404:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5405: #else
                   5406:                return mmulbys(mulpdo,P,Q,[L]);
                   5407: #endif
                   5408:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5409:        N  = length(L);
                   5410:        VO = newvect(2*N);
                   5411:        VN = newvect(2*N);
                   5412:        for(I = J = 0; I < N; J += 2, I++){
                   5413:                M = vweyl(L[I]);
                   5414:                P = subst(P, VO[J]=M[0], VN[J]=strtov("o_"+rtostr(V[J])),
                   5415:                        VO[J+1]=M[1], VN[J+1] = strtov("o_"+rtostr(V[J+1])));
                   5416:        }
                   5417:        for(PQ = P*Q, I = 0; I < 2*N; I += 2){
                   5418:                for(R = PQ, J = 1; J < Lim; J++){
                   5419:                        R = mydiff(R, VN[I+1])/J;
                   5420:                        if(R == 0)
                   5421:                                break;
                   5422:                        R = mydiff(R, VO[I]);
                   5423:                        if(R == 0)
                   5424:                                break;
                   5425:                        PQ = radd(PQ,R);
                   5426:                }
                   5427:                if(I==Lim)      mycat(["Over", Lim,"derivations!"]);
                   5428:                PQ = red(subst(PQ,VN[I],VO[I],VN[I+1],VO[I+1]));
                   5429:        }
                   5430: }
                   5431: #endif
                   5432:
                   5433: def transpdosub(P,LL,K)
                   5434: {
                   5435:        Len = length(K)-1;
                   5436:        if(Len < 0 || P == 0)
                   5437:                return P;
                   5438:        KK=K[Len];
                   5439:        if(type(KK)==4){
                   5440:                KK0=KK[0]; KK1=KK[1];
                   5441:        }else{
                   5442:                L = vweyl(LL[Len]);
                   5443:                KK0=L[1]; KK1=K[Len];
                   5444:        }
                   5445:        Deg = mydeg(P,KK0);
                   5446:        K1 = reverse(cdr(reverse(K)));
                   5447:        R = transpdosub(mycoef(P,0,KK0),LL,K1);
                   5448:        for(I = M = 1; I <= Deg ; I++){
                   5449:                M = mulpdo(M,KK1,LL);
                   5450:                S = mycoef(P,I,KK0);
                   5451:                if(Len > 0)
                   5452:                        S = transpdosub(S,LL,K1);
                   5453:                R = radd(R,mulpdo(S,M,LL));
                   5454:        }
                   5455:        return R;
                   5456: }
                   5457:
                   5458: def transpdo(P,LL,K)
                   5459: {
                   5460:        if(type(K[0]) < 4)
                   5461:                K = [K];
                   5462:        Len = length(K)-1;
                   5463:        K1=K2=[];
                   5464:        if(type(LL)!=4) LL=[LL];
                   5465:        if(type(LL[0])!=4) LL=[LL];
                   5466:        if(getopt(ex)==1){
                   5467:                for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){
                   5468:                        L = vweyl(LL[J]);
                   5469:                        K1=cons([L[0],car(KT)[0]],K1);
                   5470:                        K2=cons([L[1],car(KT)[1]],K2);
                   5471:                }
                   5472:                K2=append(K1,K2);
                   5473:        }else{
                   5474:                for(J = length(K)-1; J >= 0; J--){
                   5475:                        L = vweyl(LL[J]);
                   5476:                        if(L[0] != K[J][0])
                   5477:                                K1 = cons([L[0],K[J][0]],K1);
                   5478:                        K2 = cons(K[J][1],K2);
                   5479:                }
                   5480:                P = mulsubst(P, K1);
                   5481:        }
                   5482:        return transpdosub(P,LL,K2);
                   5483: }
                   5484:
                   5485: def translpdo(P,LL,M)
                   5486: {
                   5487:        S=length(LL);
                   5488:        L0=newvect(S);L1=newvect(S);
                   5489:        K=newvect(S);
                   5490:        for(J=0;J<S;J++){
                   5491:                L = vweyl(LL[J]);
                   5492:                L0[J]=L[0];
                   5493:                L1[J]=L[1];
                   5494:        }
                   5495:        K=rmul(M,L0);
                   5496:        for(T=[],J=0;J<S;J++)
                   5497:                T=cons([L0[J],K[J]],T);
                   5498:        P=mulsubst(P,T);
                   5499:        K=rmul(myinv(M),L1);
                   5500:        for(T=[],J=0;J<S;J++)
                   5501:                T=cons([L1[J],K[J]],T);
                   5502:        return mulsubst(P,T);
                   5503: }
                   5504:
                   5505: /*
                   5506:                return [R, M, S] : R = M*P - S*Q
                   5507:                deg(R,X) < deg(Q,X)
                   5508: */
                   5509: def rpdiv(P,Q,X)
                   5510: {
                   5511:        if(P == 0)
                   5512:                return [0,1,0];
                   5513:        DQ = mydeg(Q,X);
                   5514:        CO = mycoef(Q,DQ,X);
                   5515:        S  = 0;
                   5516:        while((DP = mydeg(P,X)) >= DQ){
                   5517:                R = mycoef(P,DP,X)/CO;
                   5518:                S = radd(S,R*X^(DP-DQ));
                   5519:                P = radd(P, -R*Q*X^(DP-DQ));
                   5520:        }
                   5521:        Lcm = lcm(dn(S),dn(P));
                   5522:        Gcd = gcd(nm(S),nm(P));
                   5523:        return [red(P*Lcm/Gcd), red(Lcm/Gcd),red(S*Lcm/Gcd)];
                   5524: }
                   5525:
                   5526: def texbegin(T,S)
                   5527: {
                   5528:        if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";
                   5529:        else Opt="\n";
                   5530:        return "\\begin{"+T+"}"+Opt+S+"%\n\\end{"+T+"}\n";
                   5531: }
                   5532:
                   5533: def mygcd(P,Q,L)
                   5534: {
                   5535:        if((Dvi=getopt(dviout))==3 || Dvi==-3){ /* dviout=3 */
                   5536:                if((Rev=getopt(rev))!=1) Rev=0;
                   5537:                R=mygcd(P,Q,L|rev=Rev);
                   5538:                if(type(L)<2) Var=0;
                   5539:                else if(type(L)==2){
                   5540:                        Val=L;L=[0,L];
                   5541:                }else if(type(L)==4){
                   5542:                        L=vweyl(L);
                   5543:                        Var=[[L[1],"\\partial"]];
                   5544:                }
                   5545:                S=mat([P],[Q]);T=mat([R[0]],[0]);
                   5546:                M=mat([R[1],R[2]],[R[3],R[4]]);
                   5547:                if(type(Val)==4)
                   5548:                        N=mdivisor(M,L|trans=1)[1];
                   5549:                else N=myinv(M);
                   5550:                Tb=str_tb(mtotex(S|var=Var),0);
                   5551:                str_tb("&="+mtotex(N|var=Var)+mtotex(T|var=Var)+",\\\\\n",Tb);
                   5552:                str_tb(mtotex(T|var=Var),Tb);
                   5553:                str_tb("&="+mtotex(M|var=Var)+mtotex(S|var=Var)+".",Tb);
                   5554:                Out=str_tb(0,Tb);
                   5555:                if(Dvi<0) return Out;
                   5556:                dviout(Out|eq="align*");
                   5557:                return 1;
                   5558:        }
                   5559:        if((type(Dvi)==1||Dvi==0) && getopt(rev)!=1)    V=[[P,Q]];
                   5560:        else V=0;
                   5561:        if(L==0){       /* integer case */
                   5562:                if(type(P) > 1 || type(Q) > 1 || Q==0  /* P <= 0 || Q <= 0 */
                   5563:                        || dn(P) > 1 || dn(Q) > 1)
                   5564:                        return 0;
                   5565:                        CPP = CQQ = 1; CQP = CPQ = 0;
                   5566:                        P1 = P; Q1 = Q;
                   5567:                /* P1 = CPP*P + CPQ*Q
                   5568:                   Q1 = CQP*P + CQQ*Q */
                   5569:                while(Q1 != 0){
                   5570:                        Div1 = idiv(P1,Q1); Div2 = irem(P1,Q1);
                   5571:                        if(type(V)==4) V=cons([Div1,Div2],V);
                   5572:                        P1 = Q1 ; Q1 = Div2;
                   5573:                        TP = CQP; TQ = CQQ;
                   5574:                        CQP = CPP-Div1*CQP;
                   5575:                        CQQ = CPQ-Div1*CQQ;
                   5576:                        CPP = TP; CPQ = TQ;
                   5577:                }
                   5578:                if(V!=0){
                   5579:                        V=reverse(V);
                   5580:                        if((DVI=abs(Dvi))==0) return V;
                   5581:                        PT=P;QT=Q;
                   5582:                        if(DVI==1 || DVI==2){
                   5583:                                Tb=str_tb(0,0);
                   5584:                                for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   5585:                                        T=car(V);
                   5586:                                        if(C++) str_tb(texcr(11),Tb);
                   5587:                                        if(DVI==1){
                   5588:                                                Qs=rtostr(QT);
                   5589:                                                if(QT<0) Qs="("+Qs+")";
                   5590:                                                if(T[1]>0) Qs=Qs+"+";
                   5591:                                                if(T[1]!=0) Qs=Qs+rtostr(T[1]);
                   5592:                                                str_tb(rtostr(PT)+"&="
                   5593:                                                        +rtostr(T[0])+"\\times"+Qs,Tb);
                   5594:                                        }else{
                   5595:                                                N=mat([T[0],1],[1,0]);
                   5596:                                                if(C==1){
                   5597:                                                        str_tb(S0=mtotex(mat([PT],[QT])),Tb);
                   5598:                                                        M=N;
                   5599:                                                }
                   5600:                                                str_tb("&=",Tb);
                   5601:                                                if(C>1) str_tb(mtotex(M),Tb);
                   5602:                                                str_tb(mtotex(N),Tb);
                   5603:                                                str_tb(S=mtotex(mat([QT],[T[1]])),Tb);
                   5604:                                                if(C>1){
                   5605:                                                        str_tb("=",Tb);
                   5606:                                                        str_tb(mtotex(M=M*N),Tb);
                   5607:                                                        str_tb(S,Tb);
                   5608:                                                }
                   5609:                                        }
                   5610:                                        PT=QT;QT=T[1];
                   5611:                                }
                   5612:                                if(DVI==2){
                   5613:                                        str_tb(texcr(43)+S+"&=",Tb);
                   5614:                                        str_tb(mtotex(myinv(M)),Tb);
                   5615:                                        str_tb(S0,Tb);
                   5616:                                }
                   5617:                                Out=str_tb(0,Tb);
                   5618:                                if(Dvi>0){
                   5619:                                        dviout(Out|eq="align*");
                   5620:                                        return 1;
                   5621:                                }
                   5622:                                return Out;
                   5623:                        }
                   5624:                }
                   5625:                if(P1<0) return [-P1,-CPP,-CPQ,CQP,CQQ];
                   5626:                return [P1, CPP, CPQ, CQP, CQQ];
                   5627:        }
                   5628:        if(type(L) == 2)        /* polynomical case */
                   5629:                L = [0,L];
                   5630:        if(getopt(rev)==1 && L[0]!=0){
                   5631:                R=mygcd(adj(P,L),adj(Q,L),L);
                   5632:                return [adj(R[0],L),adj(R[1],L),adj(R[2],L),adj(R[3],L),adj(R[4],L)];
                   5633:        }
                   5634:        if(type(P) == 3)
                   5635:                P = red(P);
                   5636:        if(type(Q) == 3)
                   5637:                Q = red(Q);
                   5638:        CP=newvect(2,[1/dn(P),0]); CQ=newvect(2,[0,1/dn(Q)]);
                   5639:        P=PT=nm(P); Q =QT=nm(Q);
                   5640:        L = vweyl(L);
                   5641:        while(Q != 0){
                   5642:                R = divdo(P,Q,L);
                   5643:                if(type(V)==4) V=cons(R,V);
                   5644: /* R[1] = R[2]*P - R[0]*Q
                   5645:                = R[2]*(CP[0]*P0+CP[1]*Q0) - R[0]*(CQ[0]*P0+CQ[1]*Q0) */
                   5646: /*
                   5647:   P(n)     |0        1 |  P(n-1)
                   5648:          = |           |
                   5649:   R[1]     |R[2]  -R[0]|  P(n)
                   5650:   P(n+1) = R[1], P(n) = P, P(n-1) = Q
                   5651: */
                   5652:                P = Q;
                   5653:                Q = R[1];
                   5654:                {
                   5655:                        CT = dupmat(CQ);
                   5656:                        CQ = [R[2]*CP[0]-muldo(R[0],CQ[0],L),
                   5657:                                        R[2]*CP[1]-muldo(R[0],CQ[1],L)];
                   5658:                        CP = CT;
                   5659:                }
                   5660:        }
                   5661:        if(V!=0){
                   5662:                V=reverse(V);
                   5663:                if((DVI=abs(Dvi))==0) return V;
                   5664:                if(type(L[0])<1) Var=L[1];
                   5665:                else Var=[L[1],"\\partial"];
                   5666:                if(DVI==1 || DVI==2){
                   5667:                        Tb=str_tb(0,0);
                   5668:                        PT=car(V)[0];QT=car(V)[1];
                   5669:                        for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   5670:                                T=car(V);
                   5671:                                if(C++) str_tb(texcr(11),Tb);
                   5672:                                if(DVI==1){
                   5673:                                        if(T[2]!=1){
                   5674:                                                str_tb(monototex(T[2]),Tb);
                   5675:                                                str_tb("(",Tb);
                   5676:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   5677:                                                str_tb(")&=",Tb);
                   5678:                                        }else{
                   5679:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   5680:                                                str_tb("&=",Tb);
                   5681:                                        }
                   5682:                                        str_tb("(",Tb);
                   5683:                                        str_tb(fctrtos(T[0]|var=Var,TeX=2),Tb);
                   5684:                                        str_tb(")(",Tb);
                   5685:                                        str_tb(fctrtos(QT|var=Var,TeX=2),Tb);
                   5686:                                        if(T[1]!=0){
                   5687:                                                str_tb(")+(",Tb);
                   5688:                                                str_tb(fctrtos(T[1]|var=Var,TeX=2),Tb);
                   5689:                                        }
                   5690:                                        str_tb(")",Tb);
                   5691:                                }else{
                   5692:                                        N=mat([red(T[0]/T[2]),1],[1,0]);
                   5693:                                        if(C==1){
                   5694:                                                str_tb(S0=mtotex(mat([PT],[QT])|var=Var),Tb);
                   5695:                                                M=N;
                   5696:                                        }
                   5697:                                        str_tb("&=",Tb);
                   5698:                                        if(C>1) str_tb(mtotex(M),Tb);
                   5699:                                        str_tb(mtotex(N|var=Var),Tb);
                   5700:                                        str_tb(S=mtotex(mat([QT],[T[1]])|var=Var),Tb);
                   5701:                                        if(C>1){
                   5702:                                                str_tb("=",Tb);
                   5703:                                                str_tb(mtotex(M=muldo(M,N,L)|var=Var),Tb);
                   5704:                                                str_tb(S,Tb);
                   5705:                                        }
                   5706:                                }
                   5707:                                PT=QT;QT=T[1];
                   5708:                        }
                   5709:                        if(DVI==2){
                   5710:                                FT=fctr(PT);
                   5711:                                for(R=1;FT!=[];FT=cdr(FT)){
                   5712:                                        if(mydeg(car(FT)[0],L[1])<1)
                   5713:                                                for(J=car(FT)[1];J>0;J--) R*=car(FT)[0];
                   5714:                                }
                   5715:                                if(R!=1){
                   5716:                                        str_tb(texcr(79),Tb);
                   5717:                                        M=muldo(M,mat([R,0],[0,1]),L);
                   5718:                                        str_tb(mtotex(M|var=Var),Tb);
                   5719:                                        str_tb(S=mtotex(mat([PT/R],[QT])|var=Var),Tb);
                   5720:                                }
                   5721:                                str_tb(texcr(43)+S+"&=",Tb);
                   5722:                                if(type(Var)==4){
                   5723:                                        N=mdivisor(M,L|trans=1);
                   5724:                                        N=N[1];
                   5725:                                }else
                   5726:                                        N=myinv(M);
                   5727:                                str_tb(mtotex(N|var=Var),Tb);
                   5728:                                str_tb(S0,Tb);
                   5729:                        }
                   5730:                        Out=str_tb(0,Tb);
                   5731:                        if(Dvi>0){
                   5732:                                dviout(Out|eq="align*");
                   5733:                                return 1;
                   5734:                        }
                   5735:                        return Out;
                   5736:                }
                   5737:        }
                   5738:        Q = rede(P,L);
                   5739:        R = red(P/Q);
                   5740:        return [Q,red(CP[0]/R),red(CP[1]/R),red(CQ[0]/R),red(CQ[1]/R)];
                   5741: }
                   5742:
                   5743: def mylcm(P,Q,L)
                   5744: {
                   5745:        Rev=(getopt(rev)==1)?1:0;
                   5746:        if(Rev==1){
                   5747:                P=adj(P); Q=adj(Q);
                   5748:        }
                   5749:        R = mygcd(P,Q,L);
                   5750:        S=(type(L)<=2)?R[3]*P:muldo(R[3],P,L);
                   5751:        S = nm(S);
                   5752:        if(type(S) <= 1 && type(L) <= 1){
                   5753:                if(S<0) S = -S;
                   5754:                return S;
                   5755:        }
                   5756:        if(type(L) == 2)
                   5757:                return easierpol(S,L);
                   5758:        S=rede(easierpol(S,L[1]),L);
                   5759:        return (Rev==1)?adj(S):S;
                   5760: }
                   5761:
                   5762: def sftpexp(P,LL,F,Q)
                   5763: {
                   5764:        if(type(LL[0]) < 4)
                   5765:                LL = [LL];
                   5766:        for(L0=L1=[],LT=LL;LT!=[];LT=cdr(LT)){
                   5767:                W=vweyl(car(LT));
                   5768:                L0=cons(W,L0);
                   5769:                D=mydiff(F,W[0]);
                   5770:                if(D!=0) L1=cons(W[1]+Q*D/F,L1);
                   5771:                else L1=cons(W[1],L1);
                   5772:        }
                   5773:        return rede(transpdosub(P,L0,L1),L0);
                   5774: }
                   5775:
                   5776: def applpdo(P,F,LL)
                   5777: {
                   5778:        if(type(F)>3)
                   5779: #ifdef USEMODULE
                   5780:                return mmulbys(os_md.applpdo,P,F,[LL]);
                   5781: #else
                   5782:                return mmulbys(applpdo,P,F,[LL]);
                   5783: #endif
                   5784:        L = vweyl(LL[0]);
                   5785:        LL = cdr(LL);
                   5786:        Deg = deg(P,L[1]);
                   5787:        S = F;
                   5788:        for(I = R = 0; I <= Deg ; I++){
                   5789:                if(I > 0)
                   5790:                        S = mydiff(S,L[0]);
                   5791:                if(LL == [])
                   5792:                        R = radd(R,mycoef(P,I,L[1])*S);
                   5793:                else
                   5794:                        R = radd(R,applpdo(mycoef(P,I,L[1]), S, LL));
                   5795:        }
                   5796:        return R;
                   5797: }
                   5798:
                   5799: def tranlpdo(P,L,M)
                   5800: {
                   5801:        N = length(L);
                   5802:        R = size(M);
                   5803:        if(R[0] != N || R[1] != N){
                   5804:                print("Strange size");
                   5805:                return;
                   5806:        }
                   5807:        InvM = M;
                   5808:        if(InvM[1] == 0){
                   5809:                print("Not invertible");
                   5810:                return;
                   5811:        }
                   5812:        XL = newvector(N);
                   5813:        DL = newvector(N);
                   5814:        for(I = 0; I < 0; I++){
                   5815:                R = vweyl(L[I]);
                   5816:                XL[I] = R[0];
                   5817:                DL[I] = R[1];
                   5818:        }
                   5819:        for(I = 0; I < N; I++){
                   5820:                for(J = XX = D0 = 0; J < N; J++){
                   5821:                        XX = radd(XX,M[I][J]*XL[J]);
                   5822:                        DD = radd(DD, red(InvM[0][I][J]/InvM[1])*DL[J]);
                   5823:                        P = mysubst(P,[[XL[I],XX],[DL[I],DD]]);
                   5824:                }
                   5825:        }
                   5826:        return P;
                   5827: }
                   5828:
                   5829: def divdo(P,Q,L)
                   5830: {
                   5831:        if(L==0){
                   5832:                R=P-idiv(P,Q)*Q;
                   5833:                if(R<0){
                   5834:                        if(Q>0) R+=Q;
                   5835:                        else R-=Q;
                   5836:                }
                   5837:                return [(P-R)/Q,R,1];
                   5838:        }
                   5839:        L = vweyl(L);
                   5840:        if(getopt(rev)==1){
                   5841:                R=divdo(adj(P,L),adj(Q,L),L);
                   5842:                return [adj(R[0],L),adj(R[1],L),R[2]];
                   5843:        }
                   5844:        X = L[0]; DX = L[1];
                   5845:        S = 0;
                   5846:        M = 1;
                   5847:        I = mydeg(Q,DX);
                   5848:        CQ = mycoef(Q,I,DX);
                   5849:        while((J=mydeg(P,DX)) >= I){
                   5850:         C = mycoef(P,J,DX);
                   5851:         SR = red(C/CQ);
                   5852:                 if(dn(SR) != 1){
                   5853:                        M *= dn(SR);
                   5854:                        P *= dn(SR);
                   5855:                        S *= dn(SR);
                   5856:                        SR = nm(SR);
                   5857:                }
                   5858:                P -= muldo(SR*(DX)^(J-I),Q,L);
                   5859:                S += SR*(DX)^(J-I);
                   5860:        }
                   5861:        return [S,P,M];
                   5862: }
                   5863:
                   5864: def qdo(P,Q,L)
                   5865: {
                   5866:        L = vweyl(L); DX = L[1]; OD = deg(P,DX);
                   5867:        V = newvect(OD+1);
                   5868:        for(I = 0; I <= OD; I++){
                   5869:                if(I)
                   5870:                        Q = muldo(DX,Q,L);
                   5871:                S = divdo(Q,P,L);
                   5872:                V[I] = S[1]*DX-S[2]*zz^I;
                   5873:        }
                   5874:        for(K = [], I = OD; I >= 0; I--)
                   5875:                K = cons(DX^(I+1), K);
                   5876:        R = lsol(V,K);
                   5877:        S = length(R);
                   5878:        for(I = P1 = 0; I < S; I++){
                   5879:                if(type(R[I]) < 4 && mydeg(R[I],DX) == 0 && R[I] != 0
                   5880:                        && (mydeg(R[I],zz) <= mydeg(P,DX)))
                   5881:                                P1 = R[I];
                   5882:                else if(type(R[I]) == 4 && R[I][0] == DX)
                   5883:                                P2 = R[I][1];
                   5884:        }
                   5885:        T=fctr(P1);
                   5886:        for(I=0, S=length(T), P1=1; I<S; I++){
                   5887:                if(mydeg(T[I][0],zz) > 0)
                   5888:                        P1 *= T[I][0]^(T[I][1]);
                   5889:        }
                   5890:        return subst([P1,P2],zz,DX);
                   5891: }
                   5892:
                   5893: def sqrtdo(P,L)
                   5894: {
                   5895:        L = vweyl(L);
                   5896:        P = toeul(P,L,0);
                   5897:        V = -1;
                   5898:        for(R = 0, Ord = mydeg(P,L[1]); Ord >= 0; Ord--){
                   5899:                Q = coef(P,Ord,L[1]);
                   5900:                M = mydeg(Q,L[0]);
                   5901:                N = mymindeg(Q,L[0]);
                   5902:                if(V < 0)
                   5903:                        V = M+N;
                   5904:                else if(V != M+N){
                   5905:                        print("Cannot be transformed!");
                   5906:                        return;
                   5907:                }
                   5908:                Q = tohomog(red(Q/L[0]^N), [L[0]], z_z);
                   5909:                if(irem(Ord,2))
                   5910:                        B = x-z_z;
                   5911:                else
                   5912:                        B = x+z_z;
                   5913:                Q = substblock(Q,x,B,z_zz);
                   5914:                if(mydeg(Q,x) > 0){
                   5915:                        print("Cannot be transformed!");
                   5916:                        return;
                   5917:                }
                   5918:                R += mysubst(Q,[z_zz,x])*L[1]^Ord;
                   5919:        }
                   5920:        return fromeul(R,L,0);
                   5921: }
                   5922:
                   5923: def ghg(A,B)
                   5924: {
                   5925:        R = dx;
                   5926:        while(length(B)>0){
                   5927:                R = muldo(x*dx+car(B),R,[x,dx]);
                   5928:                B = cdr(B);
                   5929:        }
                   5930:        T = 1;
                   5931:        while(length(A)>0){
                   5932:                T = muldo(x*dx+car(A),T,[x,dx]);
                   5933:                A = cdr(A);
                   5934:        }
                   5935:        return R-T;
                   5936: }
                   5937:
                   5938: def ev4s(A,B,C,S,T)
                   5939: {
                   5940:  R4 = x^2*(x-1)^2;
                   5941:  R3 = x*(x-1)*((2*A-2*B-8)*x-2*A+5);
                   5942:  R2 = (-3/2*(A^2+B^2)+3*A*B+9*A-9*B-29/2+1/4*(S^2+T^2))*x^2
                   5943:        +(5*A^2/2-13*A-3*A*B+B^2/2+7*B-C^2+C+35/2 - 1/4*(S^2+T^2))*x
                   5944:        - (2*A+2*C-5)*(2*A-2*C-3)/4;
                   5945:  R1 = 1/4*(A-B-2)*(2*A^2-4*A*B-8*A+2*B^2+8*B+10-S^2-T^2)*x
                   5946:         +15/4+3*B^2/4-C^2/2+11*A^2/4 - 11*A/2+3*B+B*C-7*A*B/2+C/2-A*B^2/2
                   5947: #if 1
                   5948:         + A^2*B
                   5949: #endif
                   5950:         - B*C^2 - A^3/2+(2*A-3)*(S^2+T^2)/8;
                   5951: /* OK? for the above term added */
                   5952:  R0 = -(A-B-1-S)*(A-B-1+S)*(A-B-1-T)*(A-B-1+T)/16;
                   5953:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   5954: }
                   5955:
                   5956: def b2e(A,B,C,S,T)
                   5957: {
                   5958:        R4 = x^2*(x-1)^2;
                   5959:        R3 = x*(x-1)*(2*x-1)*(2*c-5);
                   5960:        R2 = (-6*C^2+24*C-25+1/2*S^2+1/2*T^2)*x^2
                   5961:                        +(6*C^2-24*C+25-1/2*S^2-1/2*T^2-A^2+B^2+A-B)*x
                   5962:                        +A^2-C^2-A+4*C-15/4;
                   5963:        R1 = (2*C-3)*(2*C^2-6*C+5-1/2*S^2-1/2*T^2)*x
                   5964:                        +(2*C-3)*(-C^2+3*C+1/2*A^2-1/2*B^2+1/2*B-1/2*A-5/2+1/4*S^2+1/4*T^2);
                   5965:        R0 = -(2-2*C+S+T)*(2-2*C-S-T)*(2-2*C+S-T)*(2-2*C-S+T)/16;
                   5966:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   5967: }
                   5968:
                   5969:
                   5970: /*
                   5971:        T^m = T(T-1)....(T-m+1)
                   5972:        f(t) -> g(t)
                   5973:
                   5974:        f(t)   = a_mt^m + ... + a_1t+a_0
                   5975:        g(x*dx) = a_m*x^m*dx^m + ... + a_1*x*dx+a_0
                   5976:
                   5977:        ret: x(x-1)...(x-i+1)
                   5978:  */
                   5979: def sftpow(X,I)
                   5980: {
                   5981:         R = 1;
                   5982:         for(J=0;J<I;J++)
                   5983:                R *= X-J;
                   5984:         return(R);
                   5985: }
                   5986:
                   5987: /*
                   5988:        ret: x(x+K)(x+2*k)...(x+(i-1)*k)
                   5989: */
                   5990: def sftpowext(X,I,K)
                   5991: {
                   5992:         R = 1;
                   5993:         for(J=0;J<I;J++)
                   5994:                R *= X+K*J;
                   5995:         return(R);
                   5996: }
                   5997:
                   5998: def polinsft(F,A)
                   5999: {
                   6000:         R = 0;
                   6001:         while(F != 0){
                   6002:                 D = mydeg(F,A);
                   6003:                 C = mycoef(F,D,A);
                   6004:                 R += C*A^D;
                   6005:                 F -= C*sftpow(A,D);
                   6006:         }
                   6007:         return R;
                   6008: }
                   6009:
                   6010: def pol2sft(F,A)
                   6011: {
                   6012:        S=getopt(sft);
                   6013:        if(type(S)<0 || type(S)>2) S=1;
                   6014:        R = 0;
                   6015:        for(I = mydeg(F,A); I >= 0; I--)
                   6016:                R = R*(A-I*S) + mycoef(F,I,A);
                   6017:        return R;
                   6018: }
                   6019:
                   6020: def binom(P,N)
                   6021: {
1.20      takayama 6022:        if(type(N)!=1 || N<=0) return 1;
1.6       takayama 6023:        for(S=1;N>0;N--,P-=1)   S*=P/N;
                   6024:        return red(S);
                   6025: }
                   6026:
                   6027: def expower(P,R,N)
                   6028: {
                   6029:        if(type(N)!=1 || N<0) return 0;
                   6030:        for(S=S0=K=1;K<=N;K++,R-=1){
                   6031:                S0*=P*R/K;S+=S0;
                   6032:        }
                   6033:        return red(S);
                   6034: }
                   6035:
                   6036: def seriesHG(A,B,X,N)
                   6037: {
1.20      takayama 6038:        if(N==0) return 1;
1.6       takayama 6039:        if(type(N)!=1 || N<0) return 0;
                   6040:        if(type(X)<4){
                   6041:                for(K=0,S=S0=1;K<N;K++){
                   6042:                        for(T=A; T!=[]; T=cdr(T))       S0*=car(T)+K;
                   6043:                        for(T=B; T!=[]; T=cdr(T))       S0/=car(T)+K;
                   6044:                        S0=red(S0*X/(K+1));
                   6045:                        DN=dn(S0);
                   6046:                        S=red((red(S*DN)+nm(S0))/DN);
                   6047:                }
                   6048:                return S;
                   6049:        }
                   6050:        S=0;
                   6051:        for(K=0;K<=N;K++){
                   6052:                for(I=0;I<=N-K;I++){
                   6053:                        C=1/sftpowext(1,I,1)/sftpowext(1,J,1);
                   6054:                        for(T=A[0];T!=[];T=cdr(T)) C*=sftpowext(car(T),I+K,1);
                   6055:                        for(T=A[1];T!=[];T=cdr(T)) C*=sftpowext(car(T),I,1);
                   6056:                        for(T=A[2];T!=[];T=cdr(T)) C*=sftpowext(car(T),K,1);
                   6057:                        for(T=B[0];T!=[];T=cdr(T)) C/=sftpowext(car(T),I+K,1);
                   6058:                        for(T=B[1];T!=[];T=cdr(T)) C/=sftpowext(car(T),I,1);
                   6059:                        for(T=B[2];T!=[];T=cdr(T)) C/=sftpowext(car(T),K,1);
                   6060:                        S+=red(C*X[0]^I*X[1]^K);
                   6061:                }
                   6062:        }
                   6063:        return S;
                   6064: }
                   6065:
                   6066: def evalred(F)
                   6067: {
                   6068:        Opt=getopt(opt);
                   6069:        if(type(Opt)!=4){
                   6070:                 Opt=[];
                   6071:        }else if(length(Opt)==2 && type(Opt[0])!=4)     Opt=[Opt];
                   6072:        for(;;){
1.17      takayama 6073:                G=mysubst(F,[[tan(0),0],[asin(0),0],[atan(0),0],[sinh(0),0],[tanh(0),0],
                   6074:                        [log(1),0],[cosh(0),1],[exp(0),1]]);
1.6       takayama 6075:                for(Rep=Opt; Rep!=[]; Rep=cdr(Rep))
                   6076:                        G=subst(G,car(Rep)[0],car(Rep)[1]);
                   6077:                Var=vars(G);
                   6078:                for(V=Var; V!=[]; V=cdr(V)){
1.17      takayama 6079:                        if(!(VV=args(CV=car(V)))) continue;
                   6080:                        if((functor(CV)==sin||functor(CV)==cos)){
                   6081:                                P=2*red(VV[0]/@pi);
                   6082:                                if(functor(CV)==sin) P=1-P;
                   6083:                                if(isint(P)){
                   6084:                                        if(iand(P,1)) G=subst(G,CV,0);
                   6085:                                        else if(!iand(P,3)) G=subst(G,CV,1);
                   6086:                                        else G=subst(G,CV,-1);
                   6087:                                        continue;
                   6088:                                }
                   6089:                                if(isint(P*=3/2)){
                   6090:                                        if(iand(P,3)==1) G=subst(G,CV,1/2);
                   6091:                                        else G=subst(G,CV,-1/2);
                   6092:                                }
                   6093:                        }
                   6094:                        for(;VV!=[];VV=cdr(VV))
                   6095:                                if(car(VV)!=(TV=evalred(car(VV)))) G=subst(G,car(VV),TV);
                   6096:                        if(functor(CV)!=pow || (args(CV)[0])!=1) continue;
                   6097:                        G=subst(G,CV,1);
1.6       takayama 6098:                }
                   6099:                if(G==F) return F;
                   6100:                F=G;
                   6101:        }
                   6102: }
                   6103:
                   6104: def seriesMc(F,N,V)
                   6105: {
                   6106:        if(type(V)<4) V=[V];
                   6107:        V=reverse(V);
                   6108:        L=length(V);
                   6109:        if(type(Opt=getopt(evalopt))!=4) Opt=[];
                   6110:        P=newvect(L);
                   6111:        G=newvect(L+1);
                   6112:        G[0]=F;
                   6113:        for(I=0;I<L;I++)
                   6114:                G[I+1]=eval(evalred(subst(G[I],V[I],0)|opt=Opt));
                   6115:        R=G[L];
                   6116:        for(;;){
                   6117:                for(M=0,I=0;I<L;I++){
                   6118:                        M+=P[I];
                   6119:                        if(M==N) break;
                   6120:                }
                   6121:                if(M<N){
                   6122:                        P[L-1]++;
                   6123:                        G[L-1]=mydiff(G[L-1],V[L-1]);
                   6124:                        G[L]=eval(evalred(mysubst(G[L-1],[V[L-1],0])|opt=Opt));
                   6125:                }else{
                   6126:                        if(I--==0) break;
                   6127:                        P[I]++;
                   6128:                        G[I]=mydiff(G[I],V[I]);
                   6129:                        while(I++<L){
                   6130:                                G[I]=eval(evalred(mysubst(G[I-1],[V[I-1],0])|opt=Opt));
                   6131:                                if(I<L) P[I]=0;
                   6132:                        }
                   6133:                }
                   6134:                K=1;
                   6135:                for(I=0;I<L;I++) K*=V[I]^P[I]/fac(P[I]);
                   6136:                R+=G[L]*K;
                   6137:        }
                   6138:        return R;
                   6139: }
                   6140:
                   6141: def seriesTaylor(F,N,V)
                   6142: {
                   6143:        G=F;
                   6144:        if(isvar(V)) V=[V];
                   6145:        if(length(V)==2 && type(car(V))!=4 && !isvar(V[1])) V=[V];
                   6146:        for(V0=V1=[];V!=[];V=cdr(V)){
                   6147:                if(type(T=car(V))!=4) T=[T];
                   6148:                V0=cons(X=car(T),V0);
                   6149:                if(length(T)==1 || T[1]==0){
                   6150:                        V1=cons(X,V1);continue;
                   6151:                }
                   6152:                S=my_tex_form(-T[1]);
                   6153:                if(str_char(S,0,"-")!=0) S="+"+S;
                   6154:                S="("+my_tex_form(X)+S+")";
                   6155:                V1=cons([X,S],V1);
                   6156:                F=red(subst(F,T[0],T[0]+T[1]));
                   6157:        }
                   6158:        V0=reverse(V0);V1=reverse(V1);
                   6159:        F=seriesMc(F,N,V0|option_list=getopt());
                   6160:        if(getopt(frac)==0) F=frac2n(F);
                   6161:        T=getopt(dviout);
                   6162:        if(type(T)!=1) T=0;
                   6163:        F=fctrtos(F|var=V1,rev=1,TeX=(T==0||T==2)?2:3);
                   6164:        if(getopt(small)==1) F=str_subst(F,"\\frac{","\\tfrac{");
                   6165:        if(T<0 || T==1) F="\\begin{align}\\begin{split}\n"+
                   6166:                my_tex_form(G)+"&="+F+"+\\cdots\n\\end{split}\\end{align}\n";
                   6167:        if(T==1) dviout(F);
                   6168:        else if(T==1) dviout(F|eq=4);
                   6169:        return F;
                   6170: }
                   6171:
1.27      takayama 6172: def mulpolyMod(P,Q,X,N)
                   6173: {
                   6174:        Red=(type(P)>2||type(Q)>2)?1:0;
                   6175:        for(I=R=0;I<=N;I++){
                   6176:                P0=mycoef(P,I,X);
                   6177:                for(J=0;J<=N-I;J++){
                   6178:                        R+=P0*mycoef(Q,J,X)*X^(I+J);
                   6179:                        if(Red) R=red(R);
                   6180:                }
                   6181:        }
                   6182:        return R;
                   6183: }
                   6184:
1.26      takayama 6185: def taylorODE(D){
                   6186:        Dif=(getopt(dif)==1)?1:0;
                   6187:        if(D==0) return Dif?f:f_00;
1.27      takayama 6188:        if(type(T=getopt(runge))!=1||ntype(T)!=0) T=0;
1.26      takayama 6189:        if(type(F=getopt(f))!=7&&type(F)<2) F="f_";
                   6190:        if(type(D)!=1||ntype(D)!=0||D<0||D>30) return 0;
                   6191:        if(type(H=getopt(taylor))==4&&length(H)==2){
1.27      takayama 6192:                if(type(Lim=getopt(lim))==2) DD=D;
                   6193:                else if(type(Lim)==4){
                   6194:                        DD=Lim[1];Lim=Lim[0];
                   6195:                }else Lim=0;
                   6196:                for(R=I=0;I<=D;I++){
                   6197:                        if(I){
                   6198:                                if(Lim) H0=mulpolyMod(H0,H[0],Lim,DD);
                   6199:                                else H0*=H[0];
                   6200:                        }else  H0=1;
                   6201:                        if(type(F)!=7) G=I?mydiff(G,x):F;
                   6202:                        for(J=0;J<=D-I;J++){
                   6203:                                if(J){
                   6204:                                        if(Lim) H1=mulpolyMod(H1,H[1],Lim,DD);
                   6205:                                        else H1*=H[1];
                   6206:                                }else H1=H0;
                   6207:                                if(type(F)==7) G=makev([F,I,J]);
                   6208:                                else if(J) G=mydiff(G,y);
                   6209:                                R+=G*H1/fac(I)/fac(J);
1.26      takayama 6210:                        }
                   6211:                }
1.27      takayama 6212:                if(Lim) R=os_md.polcut(R,DD,Lim);
                   6213:                return R;
1.26      takayama 6214:        }else{
                   6215:                if(type(H=getopt(series))>=0||getopt(list)==1){
                   6216:                        if(type(F)!=7){
                   6217:                                for(PP=[F],I=1;I<D;I++)
                   6218:                                        PP=cons(mydiff(car(PP),x)+mydiff(car(PP),y)*F,PP);
                   6219:                                if(type(H)<0) return PP;
                   6220:                                for(R=0,DD=D;DD>=1;DD--,PP=cdr(PP)) R+=car(PP)*H^DD/fac(DD);
                   6221:                                return red(R);
                   6222:                        }
                   6223:                        if(type(H)>=0) D--;
                   6224:                        PP=taylorODE(D-1|list=1);
                   6225:                        if(type(PP)!=4) PP=[PP];
                   6226:                        P=car(PP);
                   6227:                }else P=taylorODE(D-1);
                   6228:                for(R=I=0;I<D;I++){
                   6229:                        for(J=0;J<D-I;J++){
                   6230:                                Q=diff(P,makev([F,I,J]));
                   6231:                                if(Q!=0) R+=Q*(f_00*makev([F,I,J+1])+makev([F,I+1,J]));
                   6232:                        }
                   6233:                }
                   6234:                if(getopt(list)==1){
                   6235:                        R=cons(R,PP);
                   6236:                        if(Dif!=1) return R;
                   6237:                }else if(type(H)>=0){
                   6238:                        R=y+R*H^(D+1)/fac(D+1);
                   6239:                        for(DD=D;DD>0;PP=cdr(PP),DD--) R+=car(PP)*H^(DD)/fac(DD);
                   6240:                        if(T){
1.35      takayama 6241:                                if(T<0){
                   6242:                                        Dif=0;TT=-T;
                   6243:                                }else TT=T;
1.26      takayama 6244:                                K=newvect(TT);K[0]=Dif?f:f_00;
1.35      takayama 6245:                                if(getopt(c1)==1) K[0]=taylorODE(D|taylor=[c_1*H,0]);
1.26      takayama 6246:                                for(I=1;I<TT;I++){
                   6247:                                        for(S=J=0;J<I;J++) S+=makev(["a_",I+1,J+1])*K[J];
1.35      takayama 6248:                                        K[I]=taylorODE(D|taylor=[makev(["c_",I+1])*H,S*H],lim=[H,D]);
1.26      takayama 6249:                                }
                   6250:                                for(S=I=0;I<TT;I++) S+=makev(["b_",I+1])*K[I];
                   6251:                                S=S*H+y;
                   6252:                                R=S-R;
                   6253:                                if(T<0){
                   6254:                                        for(V=[H],I=0;I<=D;I++)
                   6255:                                                for(J=0;J<=D-I;J++) V=cons(makev([F,I,J]),V);
                   6256:                                        return os_md.ptol(R,reverse(V)|opt=0);
                   6257:                                }
                   6258:                        }else T=0;
                   6259:                }
                   6260:        }
                   6261:        if(Dif){
                   6262:                for(I=0;I<=D;I++){
                   6263:                        for(J=0;J<=D;J++){
                   6264:                                if(I==0&&J==0){
                   6265:                                        R=subst(R,f_00,f);
                   6266:                                        continue;
                   6267:                                }
                   6268:                                V=makev([F,str_times("x",I),str_times("y",J)]);
                   6269:                                R=subst(R,makev([F,I,J]),V);
                   6270:                        }
                   6271:                }
                   6272:        }
                   6273:        return R;
                   6274: }
                   6275:
1.6       takayama 6276: def toeul(F,L,V)
                   6277: {
                   6278:        L = vweyl(L);
                   6279:        X = L[0]; DX = L[1];
                   6280:        I = mydeg(F,DX);
                   6281:        if(V == "infty"){
                   6282:                for(II=I; II>=0; II--){
                   6283:                        J = mydeg(P=mycoef(F,I,DX),X);
                   6284:                        if(II==I) S=II-J;
                   6285:                        else if(P!=0 && II-J>S) S=II-J;
                   6286:                }
                   6287:                F *= X^S;
                   6288:                R = 0;
                   6289:                for( ; I >= 0; I--)
                   6290:                         R += red((mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I));
                   6291:                return(subst(pol2sft(R,DX),DX,-DX));
                   6292:        }
                   6293:        F = subst(F,X,X+V);
                   6294:        for(II=I; II>=0; II--){
                   6295:                J = mymindeg(P=mycoef(F,II,DX),X);
                   6296:                if(II==I) S=II-J;
                   6297:                else if(P!=0 && II-J>S) S=II-J;
                   6298:        }
                   6299:        F *= X^S;
                   6300:        R = 0;
                   6301:        for( ; I >= 0; I--)
                   6302:                R += (red(mycoef(F,I,DX)/X^I))*DX^I;
                   6303:        return pol2sft(R,DX);
                   6304: }
                   6305:
                   6306: /*
                   6307: def topoldif(P,F,L)
                   6308: {
                   6309:        L = vweyl(L);
                   6310:        P = nm(red(P));
                   6311:        while(deg(P,L[1]) > 0){
                   6312:                R = coef(P,0,L[0]);
                   6313:                Q = red((P-R)/(F*L[0]);
                   6314:                P = nm(Q)*zz+F*R*dn(Q);
                   6315:        }
                   6316: }
                   6317: */
                   6318:
                   6319: def fromeul(P,L,V)
                   6320: {
                   6321:        if(P == 0)
                   6322:                return 0;
                   6323:        L = vweyl(L);
                   6324:        X = L[0]; DX = L[1];
                   6325:        I = mydeg(P,DX);
                   6326:        if(V == "infty"){
                   6327:                P = subst(P,DX,-DX);
                   6328:                J = mydeg(P,X);
                   6329:                P = red(mysubst(P,[X,1/X])*X^J);
                   6330:        }
                   6331:        R = mycoef(P,0,DX);
                   6332:        S = 1;
                   6333:        for(S = J = 1; J <= I; J++){
                   6334:                S = DX*(S*X + mydiff(S,DX));
                   6335:                R += mycoef(P,J,DX)*S;
                   6336:        }
                   6337:        while(mycoef(R,0,X) == 0)
                   6338:                R = tdiv(R,X);
                   6339:        if(V != "infty" && V != 0)
                   6340:                R = mysubst(R,[X,X-V]);
                   6341:        return R;
                   6342: }
                   6343:
                   6344: def sftexp(P,L,V,N)
                   6345: {
                   6346:        L = vweyl(L); DX = L[1];
                   6347:        P = mysubst(toeul(P,L,V),[DX,DX+N]);
                   6348:        return fromeul(P,L,V);
                   6349: }
                   6350:
                   6351:
                   6352: def fractrans(P,L,N0,N1,N2)
                   6353: {
                   6354:        L = vweyl(L);
                   6355:        if(N2 != "infty"){
                   6356:                if(N0 == "infty")
                   6357:                        N0 = 0;
                   6358:                else
                   6359:                        N0 = red(1/(N0-N2));
                   6360:                if(N1 == "infty")
                   6361:                        N1 = 0;
                   6362:                else
                   6363:                        N1 = red(1/(N1-N2));
                   6364:                P = mysubst(P,[L[0],L[0]+N2]);
                   6365:                P = fromeul(toeul(P,L,"infty"),L,0);
                   6366:        }
                   6367:        if(N0 != 0){
                   6368:                P = mysubst(P,[L[0],L[0]+N0]);
                   6369:                N1 -= N0;
                   6370:        }
                   6371:        if(N1 != 1)
                   6372:                P = mysubst(P,[[L[0],L[0]/N1],[L[1],L[1]*N1]]);
                   6373:        return P;
                   6374: }
                   6375:
                   6376: def soldif(P,L,V,Q,N)
                   6377: {
                   6378:        L = vweyl(L); X = L[0]; DX = L[1];
                   6379:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   6380:        DEG = mydeg(P,X);
                   6381:        P0 = newvect(DEG+1);
                   6382:        for(I = 0; I <= DEG; I++)
                   6383:                P0[I] = coef(P,I,X);
                   6384:        if(P0[0] == 0)
                   6385:                return 0;
                   6386:        if(subst(P0[0],DX,0) != 0){
                   6387:                mycat([Q,"is not the exponent at", V])$
                   6388:                return 0;
                   6389:        }
                   6390:        R = newvect(N+1);
                   6391:        R[0] = 1;
                   6392:        for(I = 1; I <= N; I++){
                   6393:                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   6394:                        S += mysubst(P0[K],[DX,I-K])*R[I-K];
                   6395:                S = red(S);
                   6396:                M = mysubst(P0[0],[DX,I]);
                   6397:                if(M != 0){
                   6398:                        R[I] = -red(S/M);
                   6399:                        if(R1 != 0){
                   6400:                                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   6401:                                        S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   6402:                                                         mysubst(P1[K],[DX,I-K])*R[I-K];
                   6403:                                R1[I] = -red(S/M);
                   6404:                        }
                   6405:                }else{
                   6406:                        if(S == 0){
                   6407:                                if(R1 != 0){
                   6408:                                        for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   6409:                                                 S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   6410:                                                                 mysubst(P1[K],[DX,I-K])*R[I-K];
                   6411:                                }
                   6412:                                if(S == 0)
                   6413:                                        continue;
                   6414:                        }
                   6415:                        R1 = newvect(N+1);
                   6416:                        for(K = 0; K < I; K++){
                   6417:                                R1[K] = R[K];
                   6418:                                R[K] = 0;
                   6419:                        }
                   6420:                        R1[I] = 0;
                   6421:                        P1 = newvect(DEG);
                   6422:                        for(K = 0; K <= DEG; K++)
                   6423:                                P1[K] = mydiff(P0[K], DX);
                   6424:                        M = mysubst(P1[0],[DX,I]);
                   6425:                        if(M == 0){
                   6426:                                cat(["multiple log at ", I])$
                   6427:                                return 0;
                   6428:                        }
                   6429:                        R[I] = -red(S/M);
                   6430:                }
                   6431:        }
                   6432:        if(R1 != 0)
                   6433:                return [R1, R];
                   6434:        else
                   6435:                return R;
                   6436: }
                   6437:
                   6438: def chkexp(P,L,V,Q,N)
                   6439: {
                   6440:        L = vweyl(L); X = L[0]; DX = L[1];
                   6441:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   6442:        P = fromeul(P,L,0);
                   6443:        D = mydeg(P,DX);
                   6444:        Z = mindeg(mycoef(P,D,DX), X) - (D-N);
                   6445:        R = [];
                   6446:        for(I = 0; I < Z; I++){
                   6447:                S = mycoef(P,I,X);
                   6448:                if(S != 0){
                   6449:                        for(J = mydeg(S,DX); J >= 0; J--){
                   6450:                                T = mycoef(S,J,DX);
                   6451:                                if(T != 0)
                   6452:                                        R = cons(T,R);
                   6453:                        }
                   6454:                }
                   6455:        }
                   6456:        return R;
                   6457: }
                   6458:
                   6459:
                   6460: def sqrtrat(P)
                   6461: {
                   6462:        if(P==0) return 0;
                   6463:        if(type(P)==3||type(P)==2){
                   6464:                P=red(P);
                   6465:                if(imag(dn(P))!=0||imag(nm(P))!=0){
                   6466:                        if(imag(dn(P))==0&&real(P)!=0){
                   6467:                                F=red(imag(P)/real(P));
                   6468:                                if(F==3^(1/2)||F==-3^(1/2)){
                   6469:                                        if(eval(real(P))<0)
                   6470:                                                return -real(P)+imag(P)*@i;
                   6471:                                        else{
                   6472:                                                if(eval(imag(P))>0) return imag(P)+real(P)*@i;
                   6473:                                                else return -imag(P)-real(P)*@i;
                   6474:                                        }
                   6475:                                }
                   6476:                        }
                   6477:                        return [];
                   6478:                }
                   6479:                F=fctr(dn(P));
                   6480:                R=sqrtrat(car(F)[0]);
                   6481:                for(F=cdr(F);F!=[];F=cdr(F)){
                   6482:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   6483:                        else return [];
                   6484:                }
                   6485:                F=fctr(nm(P));
                   6486:                R=sqrtrat(car(F)[0])/R;
                   6487:                for(F=cdr(F);F!=[];F=cdr(F)){
                   6488:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   6489:                        else return [];
                   6490:                }
                   6491:                return R;
                   6492:        }
                   6493:        if(ntype(P)==4){
                   6494:                P0=real(P);P1=imag(P)/2;
                   6495:                X=makenewv(P);
                   6496:                for(R=fctr(X^4-P0*X^2-P1^2);R!=[];R=cdr(R)){
                   6497:                        RT=car(R)[0];
                   6498:                        if(deg(RT,X)==1){
                   6499:                                X=-mycoef(RT,0,X)/mycoef(RT,1,X);
                   6500:                                return X+P1/X*@i;
                   6501:                        }
                   6502:                        if(deg(RT,X)==2){
                   6503:                                if((D=mycoef(RT,1,X)^2-4*mycoef(RT,2,X)*mycoef(RT,0,X))<0) continue;
                   6504:                                X=(-mycoef(RT,1,X)+sqrtrat(D))/(2*mycoef(RT,2,X));
                   6505:                                return X+P1*sqrt2rat(1/X)*@i;
                   6506:                        }
                   6507:                }
                   6508:                D=P0^2+4*P1^2;
                   6509:                if(P1>0) return ((sqrtrat(D)+P0)/2)^(1/2)+((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   6510:                return ((sqrtrat(D)+P0)/2)^(1/2)-((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   6511:        }else if(ntype(P)!=0) return [];
                   6512:        if(P==1) return P;
                   6513:        Dn=dn(P);Nm=nm(P);C=R=1;
                   6514:        N=pari(factor,Dn);
                   6515:        if(N){
                   6516:                for(II=car(size(N))-1;II>=0;II--){
                   6517:                        if(iand(K=N[II][1],1)){
                   6518:                                R*=N[II][0];
                   6519:                                K++;
                   6520:                        }
                   6521:                        C/=N[II][0]^(K/2);
                   6522:                }
                   6523:        }
                   6524:        N=pari(factor,Nm);
                   6525:        if(N){
                   6526:                for(II=car(size(N))-1;II>=0;II--){
                   6527:                        if(N[II][0]==-1){
                   6528:                                C*=@i;
                   6529:                        continue;
                   6530:                        }
                   6531:                        K=N[II][1];
                   6532:                        if(iand(K,1)){
                   6533:                                R*=N[II][0];
                   6534:                                K--;
                   6535:                        }
                   6536:                        if(K!=0) C*=N[II][0]^(K/2);
                   6537:                }
                   6538:        }
                   6539:        if(R!=1) C*=R^(1/2);
                   6540:        return C;
                   6541: }
                   6542:
                   6543: def fctri(F)
                   6544: {
                   6545:        R=(iscoef(F,os_md.israt))?fctr(F):[[1,1],[F,1]];
                   6546:        if(!iscoef(F,os_md.iscrat)||chkfun("af_noalg",0)==0) return R;
                   6547:        X=makenewv(vars(F));
                   6548:        for(S=[];R!=[];R=cdr(R)){
                   6549:                if(length(Var=vars(R0=car(R)[0])) == 1 && (D=mydeg(R0,Var=car(Var))) > 0){
                   6550:                        if(imag(T=mycoef(R0,D,Var))!=0) R0/=T;
                   6551:                        T=af_noalg(real(R0)+imag(R0)*X,[[X,X^2+1]]);
                   6552:                        if(length(T)>1||T[0][1]>1){
                   6553:                                T=subst(T,X,@i);
                   6554:                                for(; T!=[];T=cdr(T)){
                   6555:                                        if(vars(T[0])!=[])
                   6556:                                                S=cons([car(T)[0],car(T)[1]*car(R)[1]],S);
                   6557:                                }
                   6558:                                continue;
                   6559:                        }
                   6560:                }
                   6561:                S=cons(R[0],S);
                   6562:        }
                   6563:        return reverse(S);
                   6564: }
                   6565:
                   6566: def getroot(F,X)
                   6567: {
                   6568:        S=[];
                   6569:        if(type(Cpx=getopt(cpx))!=1) Cpx=0;
                   6570:        M=getopt(mult);
                   6571:        if(type(F) == 3)
                   6572:                F = nm(red(F));
                   6573:        for(R=fctri(F); length(R)>0; R = cdr(R)){
                   6574:                T=car(R);
                   6575:                P=car(T);
                   6576:                I=car(cdr(T));
                   6577:                if(mydeg(P,X)>0){
                   6578:                        if(mydeg(P,X)==1){
                   6579:                                C = mycoef(P,1,X);
                   6580:                                P = X - red(P/C);
                   6581:                        }else if(mydeg(P,X)==2 && Cpx>0){
                   6582:                                C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);
                   6583:                                C=sqrt2rat(C1^2-4*C0*C2);
                   6584:                                C0=[];
                   6585:                                if(type(C)==0&&ntype(C)==0&&pari(issquare,-C)) C0=sqrt(C);
                   6586:                                else if(Cpx>1) C0=sqrtrat(C);
                   6587:                                if(C0==[]&&Cpx>2) C0=C^(1/2);
                   6588:                                if(C0!=[]){
                   6589:                                        if(M==1)
                   6590:                                                S=cons([I,sqrt2rat((-C1+C0)/(2*C2))],S);
                   6591:                                        else{
                   6592:                                                for(II=I; II>0; II--)
                   6593:                                                        S=cons(sqrt2rat((-C1+C0)/(2*C2)),S);
                   6594:                                        }
                   6595:                                        P=sqrt2rat((-C1-C0)/(2*C2));
                   6596:                                }
                   6597:                        }else if(mydeg(P,X)==3 && Cpx>1){
                   6598:                                Omg=(-1+3^(1/2)*@i)/2;
                   6599:                                PP=P/mycoef(P,3,X);
                   6600:                                C2=mycoef(PP,2,X)/3;
                   6601:                                PP=subst(PP,X,X-C2);
                   6602:                                if((C1=mycoef(PP,1,X))==0){
                   6603:                                        C0=mycoef(PP,0,X);
                   6604:                                        if(real(C0)==0||imag(C0)==0){
                   6605:                                                if(real(C0)==0){
                   6606:                                                        PP=getroot(X^3+imag(C0),X);
                   6607:                                                        if(length(PP)==3){
                   6608:                                                                for(;PP!=[];PP=cdr(PP)){
                   6609:                                                                        if(imag(PP[0])==0){
                   6610:                                                                                C0=PP[0]*@i;
                   6611:                                                                                break;
                   6612:                                                                        }
                   6613:                                                                }
                   6614:                                                                if(PP==[]) C0=0;
                   6615:                                                        }
                   6616:                                                }else{
                   6617:                                                        if(C0>0) C0=C0^(1/3);
                   6618:                                                        else C0=-(-C0)^(1/3);
                   6619:                                                }
                   6620:                                                if(C0!=0){
                   6621:                                                        if(M==1){
                   6622:                                                                S=cons([I,C0-C2],S);
                   6623:                                                                S=cons([I,C0*Omg-C2],S);
                   6624:                                                                S=cons([I,C0*(-1-Omg)-C2],S);
                   6625:                                                        }else{
                   6626:                                                                for(II=I; II>0; II--){
                   6627:                                                                        S=cons(C0-C2,S);
                   6628:                                                                        S=cons(C0*Omg-C2,S);
                   6629:                                                                        S=cons(C0*(-1-Omg)-C2,S);
                   6630:                                                                }
                   6631:                                                        }
                   6632:                                                        continue;
                   6633:                                                }
                   6634:                                        }
                   6635:                                }
                   6636:                                if(Cpx>2){
                   6637:                                        Q=X^2+(mycoef(PP,1,X)/3)*X+mycoef(PP,0,X)^3;
                   6638:                                        SQ=getroot(Q,X|cpx=2);
                   6639:                                        SQ=SQ[0]^(1/3);SQ2=mycoef(PP,0,X)/SQ;
                   6640:                                        if(M==1){
                   6641:                                                S=cons([I,SQ+SQ2-C2],S);
                   6642:                                                S=cons([I,SQ*Omg+SQ2*(-1-Omg)-C2],S);
                   6643:                                                S=cons([I,SQ*(-1-Omg)+SQ2*Omg-C2],S);
                   6644:                                        }else{
                   6645:                                                for(II=I; II>0; II--){
                   6646:                                                        S=cons(SQ+SQ2-C2,S);
                   6647:                                                        S=cons(SQ*Omg+SQ2*(-1-Omg)-C2,S);
                   6648:                                                        S=cons(SQ*(-1-Omg)+SQ2*Omg-C2,S);
                   6649:                                                }
                   6650:                                        }
                   6651:                                        continue;
                   6652:                                }
                   6653:                        }else if(mydeg(P,X)==4 && Cpx>0){
                   6654:                                C2=mycoef(P,3,X)/(4*mycoef(P,4,X));
                   6655:                                PP=subst(P,X,X-C2);
                   6656:                                if(mycoef(PP,1,X)==0){
                   6657:                                        PP=mycoef(PP,4,X)*X^2+mycoef(PP,2,X)*X+(SQ2=mycoef(PP,0,X));
                   6658:                                        SQ=getroot(PP,X|cpx=2);
                   6659:                                        if(length(SQ)==2){
                   6660:                                                if((C0=sqrtrat(SQ[0]))==[]){
                   6661:                                                        if(mycoef(PP,1,X)==0){
                   6662:                                                                if(SQ2<0) C0=(-SQ2)^(1/4);
                   6663:                                                                else C0=SQ2^(1/4)*(1+@i)/2;
                   6664:                                                        }
                   6665:                                                        else if(Cpx>2) C0=SQ[0]^(1/2);
                   6666:                                                        else C0=0;
                   6667:                                                }
                   6668:                                                if((C1=sqrtrat(SQ[1]))==[]){
                   6669:                                                        if(mycoef(PP,1,X)==0) C1=-C0;
                   6670:                                                        else C1=SQ[1]^(1/2);
                   6671:                                                }
                   6672:                                                if(C0!=0){
                   6673:                                                        if(M==1)
                   6674:                                                                S=append([[I,C0-C2],[I,-C0-C2],[I,C1-C2],[I,-C1-C2]],S);
                   6675:                                                        else{
                   6676:                                                                for(II=I; II>0; II--)
                   6677:                                                                        S=append([C0-C2,-C0-C2,C1-C2,-C1-C2],S);
                   6678:                                                        }
                   6679:                                                        continue;
                   6680:                                                }
                   6681:                                        }
                   6682:                                }else{
                   6683:                                        PP/=mycoef(PP,4,X);
                   6684:                                        CC=mycoef(PP,2,X);C1=mycoef(PP,1,X);C0=mycoef(PP,0,X);
                   6685:                                        SQ=getroot(X*(CC+X)^2-4*C0*X-C1^2,X|cpx=Cpx);
                   6686:                                        if(length(SQ)>1){
                   6687:                                                SQ=sqrt2rat(SQ[0]);
                   6688:                                                SQ2=getroot(X^2-SQ,X|cpx=Cpx);
                   6689:                                                if(length(SQ2)>1){
                   6690:                                                        C1=SQ2[0]*X-C1/SQ2[0]/2;
                   6691:                                                        C0=getroot(X^2+CC/2+SQ/2+C1,X|cpx=Cpx);
                   6692:                                                        C1=getroot(X^2+CC/2+SQ/2-C1,X|cpx=Cpx);
                   6693:                                                        if(length(C0)>1&&length(C1)>1){
                   6694:                                                                C0=[sqrt2rat(C0[0]-C2),sqrt2rat(C0[1]-C2),
                   6695:                                                                        sqrt2rat(C1[0]-C2),sqrt2rat(C1[1]-C2)];
                   6696:                                                                if(M==1) for(II=0;II<4;II++) S=cons([I,C0[II]],S);
                   6697:                                                                else for(II=I; II>0; II--) S=append(C0,S);
                   6698:                                                                continue;
                   6699:                                                        }
                   6700:                                                }
                   6701:                                        }
                   6702:                                }
                   6703:                        }
                   6704:                        if(M==1)
                   6705:                                S=cons([I,P],S);
                   6706:                        else for( ; I>0; I--) S=cons(P,S);
                   6707:                }
                   6708:        }
                   6709:        S=qsort(S);
                   6710:        if(M==1) S=reverse(S);
                   6711:        return S;
                   6712: }
                   6713:
                   6714: def expat(F,L,V)
                   6715: {
                   6716:         L = vweyl(L);
                   6717:         if(V == "?"){
                   6718:                 Ans = [];
                   6719:
                   6720:                 F = nm(red(F));
                   6721:                 S = fromeul(toeul(F,L,"infty"),L,0);
                   6722:                 S = mycoef(S,mydeg(S,L[1]),L[1]);
                   6723:                 if(mydeg(S,L[0]) > 0)
                   6724:                         Ans = cons(["infty", expat(F,L,"infty")],Ans);
                   6725:
                   6726:                 S = mycoef(F,mydeg(F,L[1]), L[1]);
                   6727:                 R = getroot(S,L[0]);
                   6728:                 for(I = 0; I < length(R); I++){
                   6729:                         if(I > 0 && R[I-1] == R[I])
                   6730:                                 continue;
                   6731:                         if(mydeg(R[I], L[0]) <= 0)
                   6732:                                 Ans = cons([R[I], expat(F,L,R[I])], Ans);
                   6733:                         else
                   6734:                                 Ans = cons([R[I]], Ans);
                   6735:                 }
                   6736:                 return Ans;
                   6737:         }
                   6738:         return getroot(subst(toeul(F,L,V),L[0],0),L[1]);
                   6739: }
                   6740:
                   6741: def polbyroot(P,X)
                   6742: {
                   6743:        R = 1;
                   6744:        while(length(P)){
                   6745:                R *= X-car(P);
                   6746:                if(type(R)>2) R = red(R);
                   6747:                P = cdr(P);
                   6748:        }
                   6749:        return R;
                   6750: }
                   6751:
                   6752: def polbyvalue(P,X)
                   6753: {
                   6754:        R = 1; S = 0;
                   6755:        while(length(P)){
                   6756:                T = car(P);
                   6757:                V0 = T[1] - mysubst(S,[X,T[0]]);
                   6758:                if(V0 != 0){
                   6759:                        if(type(R) > 2) R = red(R);
                   6760:                        V1 = mysubst(R,[X,T[0]]);
                   6761:                        if(V1 == 0){
                   6762:                                erno(0);
                   6763:                                return 0;
                   6764:                        }
                   6765:                        S += (V0/V1)*R;
                   6766:                        if(type(S) > 2) S = red(S);
                   6767:                }
                   6768:                R *= X - T[0];
                   6769:                P = cdr(P);
                   6770:        }
                   6771:        return S;
                   6772: }
                   6773:
                   6774:
                   6775: def pcoef(P,L,Q)
                   6776: {
                   6777:        if(L==0)
                   6778:                return 1;
                   6779:        Coef=TP=0;
                   6780:        if(type(Q)>=4){
                   6781:                TP=1;
                   6782:                V=Q[0];
                   6783:                if(type(V)==4)
                   6784:                        V=ltov(V);
                   6785:                else V=dupmat(V);
                   6786:                N=length(V);
                   6787:                if(type(Q[1])==5) MR=dupmat(Q[1]);
                   6788:                else{
                   6789:                        MR=newvect(N);
                   6790:                        for(K=Q[1], I=0; I< N; I++){
                   6791:                                MR[I] = car(K);
                   6792:                                K = cdr(K);
                   6793:                        }
                   6794:                }
                   6795:        }else{
                   6796:                V=ltov(vars(P));
                   6797:                N=length(V);
                   6798:                MR=newvect(N);
                   6799:                for(I=0;I<N;I++){
                   6800:                        MR[I]=mydeg(Q,V[I]);
                   6801:                        Q=mycoef(Q,MR[I],V[I]);
                   6802:                }
                   6803:                if(type(Q)>1) return 0;
                   6804:        }
                   6805:        if(L==1){
                   6806:                for(I=0;I<N;I++)
                   6807:                        P=mycoef(P,MR[I],V[I]);
                   6808:                return P;
                   6809:        }
                   6810:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   6811:                for(K1=MR[I],K2=V[I],J=I-1; J>=0 && MR[J]<K1; J--);
                   6812:                for(II=I-1;II>J;II--){
                   6813:                        MR[II+1]=MR[II];V[II+1]=V[II];
                   6814:                }
                   6815:                MR[II+1]=K1;V[II+1]=K2;
                   6816:        }
                   6817:        for(NN=N; N>0 && MR[N-1]==0; N--);
                   6818:        Mon=[];Coe=[];Q=P;
                   6819:        while(Q!=0){
                   6820:                M=newvect(N);
                   6821:                for(R=Q,F=I=0,MT=1;I<NN;I++){
                   6822:                        K=mydeg(R,V[I]);
                   6823:                        R=mycoef(R,K,V[I]);
                   6824:                        if(I<N) M[I]=K;
                   6825:                        if(K>0) MT*=V[I]^K;
                   6826:                        if(K>MR[I]) F=1;
                   6827:                }
                   6828:                Q -= R*MT;
                   6829:                if(F==0){
                   6830:                        Mon=cons(M,Mon);
                   6831:                        Coe=cons(R,Coe);
                   6832:                }
                   6833:        }
                   6834:        Mon=ltov(reverse(Mon));
                   6835:        Coe=ltov(reverse(Coe));
                   6836:        Len=length(Mon);
                   6837:        S=newvect(Len);
                   6838:        for(JL=0; JL<Len;JL++){
                   6839:                if(L*Mon[JL][0]<MR[0]) break;
                   6840:        }
                   6841:        S[0]=L;
                   6842:
                   6843:        K0=Mon[0][0];
                   6844:        K=L*K0-MR[0];
                   6845:        for(I=II=0;II<Len && K>=0;II++){
                   6846:                if((K1=K0-Mon[0][II])>0){
                   6847:                        while(K>K1 && S[I]>0){
                   6848:                                S[I]--;S[II]++;
                   6849:                                K-=K1;
                   6850:                                I=II;
                   6851:                                K0=Mon[0][II];
                   6852:                        }
                   6853:                }else break;
                   6854:        }
                   6855:
                   6856:        I=0;
                   6857:        while(1){
                   6858:         for(T=T0=J=JP=0; J<Len; J++){
                   6859:                 if(S[J]!=0){
                   6860:                         if(T0==0 && J>=JL) return Coef;
                   6861:                         JP=J;T0=1;
                   6862:                         T+=S[J]*Mon[J][I];
                   6863:                 }
                   6864:         }
                   6865:         if(T==MR[I]){
                   6866:                 if(++I<N) continue;
                   6867:                 for(TT=1,J=1; J<=L; J++)  /* find a solution */
                   6868:                         TT*=J;
                   6869:                 for(J=0;J<Len;J++){
                   6870:                         if(S[J]!=0){
                   6871:                                 TT*=Coe[J]^S[J];
                   6872:                                 for(II=S[J]; II>1; II--)
                   6873:                                         TT/=II;
                   6874:                         }
                   6875:                 }
                   6876:                 Coef+=TT;
                   6877:                 if(TP==1 && type(Coef)==3) Coef=red(Coef);
                   6878:                 if(JP<Len-2 && S[JP]>1){
                   6879:                         S[JP]-=2;S[JP+1]++;S[JP+2]++;
                   6880:                 }else{
                   6881:                         for(JT=JP-1;JT>=0&&S[JT]==0;JT--);
                   6882:                         if(JT<0) break;
                   6883:                         if(JT==JP-1){
                   6884:                                 S[JT]--;
                   6885:                                 if(JP<Len-1)
                   6886:                                         S[JP+1]++;
                   6887:                                 else
                   6888:                                         S[JP]++;
                   6889:                         }else{
                   6890:                                 S[JT]--;
                   6891:                                 S[JT+1]+=S[JP]+1;
                   6892:                                 S[JP]=0;
                   6893:                         }
                   6894:                 }
                   6895:                 I=0;
                   6896:                 continue;
                   6897:         }
                   6898:         if(JP<Len-1){
                   6899:                 for(JP1=JP+1;JP1<Len-1;JP1++){
                   6900:                                if(Mon[JP1][I]!=Mon[JP][I]) break;
                   6901:                 }
                   6902:
                   6903:                 if(I>0 && Mon[JP1][0] < Mon[JP][0]){
                   6904:                         S[JP]--;S[Len-1]++;JP=JP-1;
                   6905:                 }else{
                   6906:
                   6907:                         S[JP]--;
                   6908:                         if(JP1<Len){
                   6909:                                 S[JP1]++;
                   6910:                         }else{
                   6911:                                 S[JP1-1]++;
                   6912:                         }
                   6913:                 }
                   6914:         }
                   6915:         if(JP==Len-1){
                   6916:                 for(JT=JP-1;JT>=0 && S[JT]==0;JT--);
                   6917:                 if(JT<0) break;
                   6918:                 S[JT]--;
                   6919:                 if(JT==JP-1){
                   6920:                         S[JP]++;
                   6921:                 }else{
                   6922:                         S[JT+1]+=S[JP]+1;
                   6923:                         S[JP]=0;
                   6924:                 }
                   6925:         }
                   6926:         I=0;
                   6927:        }
                   6928:        return Coef;
                   6929: }
                   6930:
                   6931: def prehombf(P,Q)
                   6932: {
                   6933:        if((Mem=getopt(mem))!=1 && Mem!=-1)
                   6934:                return prehombfold(P,Q);
                   6935:        if(Q==0) Q=P;
                   6936:        V=ltov(vars(P));
                   6937:        N=length(V);
                   6938:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   6939:                for(K=mydeg(P,V[I]),K1=V[I],J=I-1; J>=0 && mydeg(P,V[J])<K; J--);
                   6940:                for(II=I-1;II>J;II--) V[II+1]=V[II];
                   6941:                V[II+1]=K1;
                   6942:        }
                   6943:        S=newvect(N);T=newvect(N);U=newvect(N);
                   6944:        for(R=P,M=1,Deg=I=0;I<N;I++){  /* extreme vector */
                   6945:                Deg+=(S[I]=mydeg(R,V[I]));
                   6946:                R=mycoef(R,S[I],V[I]);
                   6947:        }
                   6948:        DR=[[-1,0]];
                   6949:        if((R1=N/Deg)!=1){
                   6950:                DR=cons([-R1,0],DR);
                   6951:                Sft=1;
                   6952:        }else Sft=0;
                   6953:        if(Deg%2==0) Sg=1;
                   6954:        else Sg=-1;
                   6955:        for(I=0,R=R2=1,QQ=Q; 2*I+Sft < Deg; I++){
                   6956:                if(Mem==-1){
                   6957:                        print(I+1,0);print("/",0);print(idiv(Deg-Sft+1,2),0);print(" ",2);
                   6958:                }
                   6959:                Coef=0;
                   6960:                Q=QQ;
                   6961:                while(Q!=0){
                   6962:                        for(R=Q,J=0,RR=1;J<N;J++){
                   6963:                                T[J]=mydeg(R,V[J]);
                   6964:                                R=mycoef(R,T[J],V[J]);
                   6965:                                if(T[J]>0) RR*=V[J]^T[J];
                   6966:                        }
                   6967:                        Q-=R*RR;
                   6968:                        for(J=0,CC=R;J<N;J++){
                   6969:                                U[J]=I*S[J]+T[J];
                   6970:                                for(II=0; II<T[J]; II++)
                   6971:                                        CC*=(U[J]-II);
                   6972:                        }
                   6973:                        CC*=pcoef(P,I+1,[V,U]);
                   6974:                        if(Mem==-1) print("*",2);
                   6975:                        Coef+=CC;
                   6976:                }
                   6977:                DR=cons([I,Coef],DR);
                   6978:                DR=cons([-R1-1-I,Sg*Coef],DR);
                   6979:                if(Mem==-1) print("");
                   6980:        }
                   6981:        P = polbyvalue(DR,s);
                   6982:        return fctr(P);
                   6983: }
                   6984:
                   6985: def prehombfold(P,Q)
                   6986: {
                   6987:        V = vars(P);
                   6988:        if(Q==0) Q=P;
                   6989:        for(Deg=0, R=P, V1=V, DD=[]; V1!=[]; V1=cdr(V1)){
                   6990:                VT = car(V1);
                   6991:                D = mydeg(R,VT);
                   6992:                R = mycoef(R,D,VT);
                   6993:                Deg += D;
                   6994:                X = makev(["d",VT]);
                   6995:                Q = subst(Q,VT,X);
                   6996:                DD=cons([VT,X],DD);
                   6997:        }
                   6998:        DR=[[-1,0]];
                   6999:        NV=length(V);
                   7000:        if((R1=NV/Deg)!=1){
                   7001:                DR=cons([-R1,0],DR);
                   7002:                Sft=1;
                   7003:        }else
                   7004:                Sft=0;
                   7005:        if(Deg%2==0)
                   7006:                Sg=1;
                   7007:        else Sg=-1;
                   7008:        for(I = 0, R=R2=1; 2*I+Sft < Deg; I++){
                   7009:                R = R2;
                   7010:                R2 = R*P;
                   7011:                S = appldo(Q,R2,DD);
                   7012:                QQ = sdiv(S,R);
                   7013:                DR=cons([I,QQ],DR);
                   7014:                DR=cons([-R1-1-I,Sg*QQ],DR);
                   7015:        }
                   7016:        P = polbyvalue(DR,s);
                   7017:        return fctr(P);
                   7018: }
                   7019:
                   7020: def sub3e(P0,P1,P2,N0,N1,N)
                   7021: {
                   7022:        R = x^N0*(x-1)^N1*dx^N;
                   7023:        for(V = I = 1, J = 1; I <= N; I++){
                   7024:                S = 0;
                   7025:                M = N-I;
                   7026:                if(I <= N0){
                   7027:                        T = mycoef(P0,N0-I,x);
                   7028:                        S += T;
                   7029:                        R += T*x^(N0-I)*(x-1)^N1*dx^M;
                   7030:                        K1 = N0-I+1;
                   7031:                }else
                   7032:                        K1 = 0;
                   7033:                if(I <= N1){
                   7034:                        T = mycoef(P1,N1-I,x);
                   7035:                        S += T;
                   7036:                        R += T*x^N0*(x-1)^(N1-I)*dx^M;
                   7037:                        K2 = N0-1;
                   7038:                }else
                   7039:                        K2 = N-I;
                   7040:                for(K = K1; K <= K2; K++){
                   7041:                        if(K == K2){
                   7042:                                R += (mycoef(P2,N-I,x)-S)*x^K*(x-1)^(M-K)*dx^M;
                   7043:                                continue;
                   7044:                        }
                   7045:                        R += strtov("r"+rtostr(V))*x^K*(x-1)^(M-K)*dx^M;
                   7046:                        S += strtov("r"+rtostr(V++));
                   7047:                }
                   7048:        }
                   7049:        if(V > 1)
                   7050:                mycat([V-1, "accessory parameters: r1,r2,..."]);
                   7051:        return R;
                   7052: }
                   7053:
                   7054: def fuchs3e(P,Q,R)
                   7055: {
                   7056:        return getbygrs([R,P,Q],3);
                   7057: }
                   7058:
                   7059: def okubo3e(P,Q,R)
                   7060: {
                   7061:        if(getopt(opt)==1){
                   7062:                N=length(R);
                   7063:                M1=N-length(P);M2=N-length(Q);
                   7064:                V=(M1-1)*(M2-1);
                   7065:                if(V>0) mycat([V, "accessory parameters"]);
                   7066:                return getbygrs([R,cons([M1,0],P),cons([M2,0],Q)],3);
                   7067:        }
                   7068:        S = 0;
                   7069:        V = -1;
                   7070:        L = newvect(3,[[],[],[]]);
                   7071:        N = newvect(3,[0,0,0]);
                   7072:        if(type(R) < 4){
                   7073:                I = -1;
                   7074:                V = 3;
                   7075:        }else{
                   7076:                I = 2;
                   7077:                V = -1;
                   7078:        }
                   7079:        for( ; I >= 0; I--){
                   7080:                if(I == 2)
                   7081:                        U = R;
                   7082:                else if(I == 1)
                   7083:                        U = Q;
                   7084:                else
                   7085:                        U = P;
                   7086:                for( ; length(U); U = cdr(U)){
                   7087:                        T = car(U);
                   7088:                        if( T == "?"){
                   7089:                                if(V < 0)
                   7090:                                        V = I;
                   7091:                                else
                   7092:                                        return 0;
                   7093:                        }else{
                   7094:                                if(I == 2)
                   7095:                                        L[I] = cons(-T, L[I]);
                   7096:                                else
                   7097:                                        L[I] = cons(T, L[I]);
                   7098:                                S += T;
                   7099:                        }
                   7100:                        N[I]++;
                   7101:                }
                   7102:        }
                   7103:        if(V == 3){
                   7104:                N[2] = N[0] + N[1];
                   7105:                P2 = x^N;
                   7106:                for(I = 1; I <= N; I++)
                   7107:                        P2 += makev([R,I])*x^(N-I);
                   7108:        }else{
                   7109:                if(N[0]+N[1] != N[2]){
                   7110:                        print("Number of exponents are wrong",0);
                   7111:                        return -1;
                   7112:                }
                   7113:                S -= N[0]*N[1];
                   7114:                if(V < 0){
                   7115:                        if(S != 0){
                   7116:                                mycat(["Viorate Fuchs relation ->",S]);
                   7117:                                return -2;
                   7118:                        }
                   7119:                }else{
                   7120:                        if(V != 2)
                   7121:                                S = -S;
                   7122:                        L[V] = cons(S, L[V]);
                   7123:                }
                   7124:                P2 = polinsft(polbyroot(L[2],x),x);
                   7125:        }
                   7126:        P0 = polinsft(mysubst(polbyroot(L[0],x),[x,x+N[1]]),x);
                   7127:        P1 = polinsft(mysubst(polbyroot(L[1],x),[x,x+N[0]]),x);
                   7128:        return sub3e(P0,P1,P2,N[0],N[1],N[2]);
                   7129: }
                   7130:
                   7131: /*    N = 2*M (N-M = M)  or  2*M+1 (N-M = M+1)
                   7132:                0 : 0   1 ..... M-1 B B+1 ... B+N-M-2 A
                   7133:                1 : C C+1 ... C+M-1 0   1 ....  N-M-2 N-M-1
                   7134:  */
                   7135: def eosub(A,B,C,N)
                   7136: {
                   7137:        M = N%2;
                   7138:        P = [];
                   7139:        Q = [];
                   7140:        P = cons(A,P);
                   7141:        for(I = 0; I < N-M-1; I++)
                   7142:                P = cons(B+I,P);
                   7143:        for(I = 0; I < M; I++)
                   7144:                Q = cons(C+I,Q);
                   7145:        P = okubo3e(P,Q,s);
                   7146:
                   7147:        C  = newvect(2);
                   7148:        L  = newvect(2);
                   7149:        C[1] = chkexp(P,[x,dx],0,b,N-M-1);
                   7150:        C[0] = chkexp(P,[x,dx],1,c,M);
                   7151:        for(LL = K = 0; K < 2; K++){
                   7152:                L[K] = length(C[K]);
                   7153:                C[K] = ltov(C[K]);
                   7154:                if(L[K] > LL)
                   7155:                        LL = L[K];
                   7156:        }
                   7157:        JJ = 0;
                   7158:
                   7159:        for(I = 1; Do; I++){
                   7160:                Do = 0;
                   7161:                S = makev(["r",I]);
                   7162:                for(J = JJ; J < LL; J++){
                   7163:                        JJ = LL;
                   7164:                        for(K = 0; K < 2; K++){
                   7165:                                if(J >= L[K] || C[K][J] == 0)
                   7166:                                        continue;
                   7167:                                if(J < JJ)
                   7168:                                        JJ = J;
                   7169:                                if(Do == 1){
                   7170:                                        CC = C[K];
                   7171:                                        CC[J] = mysubst(CC[J], [S, Var]);
                   7172:                                        continue;
                   7173:                                }
                   7174:                                if(mydeg(C[K][J]) >= 1){
                   7175:                                        if(mydeg(C[K][J]) > 1){
                   7176:                                                print("Internal error");
                   7177:                                                return;
                   7178:                                        }
                   7179:                                        Var = getroot(C[K][J],S);
                   7180:                                        Var = Var[0];
                   7181:                                        CC = C[K];
                   7182:                                        CC[J] = 0;
                   7183:                                        P = mysubst(P, [S, Var]);
                   7184:                                        Do = 1;
                   7185:                                        J = JJ - 1;
                   7186:                                        K++;
                   7187:                                }
                   7188:                        }
                   7189:                }
                   7190:        }
                   7191:        if(JJ != L){
                   7192:                print("Internal error (non Rigid)");
                   7193:                return;
                   7194:        }
                   7195:        return P;
                   7196: }
                   7197:
                   7198: def even4e(X,Y){
                   7199:        if(length(X) != 4 || length(Y) != 2){
                   7200:                print("Usage: even4e([a,b,c,d],[e,f])");
                   7201:                print("0:     0 1 e f");
                   7202:                print("1;     0 1 * *+1");
                   7203:                print("infty: a b c d");
                   7204:                return;
                   7205:        }
                   7206:        S = -3;
                   7207:        for(I = 0; I < 4; I++){
                   7208:                S += X[I];
                   7209:                if(I < 2)
                   7210:                        S += Y[I];
                   7211:        }
                   7212:        S = -S/2;
                   7213:        P = okubo3e(Y,[S,"?"],X);
                   7214:        T = chkexp(P,x,1,S,2);
                   7215:        T = getroot(T[0],r1);
                   7216:        return mysubst(P,[r1,T[0]]);
                   7217: }
                   7218:
                   7219: def odd5e(X,Y)
                   7220: {
                   7221:        if(length(X) != 5 || length(Y) != 2){
                   7222:                print("Usage: spec6e([a,b,c,d,e],[f,g])");
                   7223:                print("0:     0  1  f  g g+1");
                   7224:                print("1:     0  1  2  * *+1");
                   7225:                print("infty: a  b  c  d  e");
                   7226:                return;
                   7227:        }
                   7228:        S = -4;
                   7229:        for(I = 0; I < 5; I++){
                   7230:                S += X[I];
                   7231:                if(I < 2)
                   7232:                        S += Y[I];
                   7233:        }
                   7234:        S = -(S + Y[1])/2;
                   7235:        P = okubo3e([Y[0],Y[1],Y[1]+1],[S,"?"],X);
                   7236:        T = chkexp(P,x,1,S,2);
                   7237:        T = getroot(T[0],r1);
                   7238:        P = mysubst(P,[r1,T[0]]);
                   7239:        T = chkexp(P,x,0,Y[1],2);
                   7240:        T = getroot(T[0],r2);
                   7241:        return mysubst(P,[r2,T[0]]);
                   7242: }
                   7243:
                   7244: def extra6e(X,Y)
                   7245: {
                   7246:        if(length(X) != 6 || length(Y) != 2){
                   7247:                print("Usage: extra6e([a,b,c,d,e,f],[g,h])");
                   7248:                print("0:     0  1  g g+1 h h+1");
                   7249:                print("1:     0  1  2  3  * *+1");
                   7250:                print("infty: a  b  c  d  e  f");
                   7251:                return;
                   7252:        }
                   7253:        S = -5;
                   7254:        for(I = 0; I < 6; I++){
                   7255:                S += X[I];
                   7256:                if(I < 2)
                   7257:                        S += 2*Y[I];
                   7258:        }
                   7259:        S = -S/2;
                   7260:        P = okubo3e([Y[0],Y[0]+1,Y[1],Y[1]+1],[S,"?"],X);
                   7261:        T = chkexp(P,x,1,S,2);
                   7262:        T = getroot(T[0],r1);
                   7263:        P = mysubst(P,[r1,T[0]]);
                   7264:        T = chkexp(P,x,0,Y[0],2);
                   7265:        T = getroot(T[0],r3);
                   7266:        P = mysubst(P,[r3,T[0]]);
                   7267:        T = chkexp(P,x,0,Y[1],2);
                   7268:        T = getroot(T[0],r2);
                   7269:        return mysubst(P,[r2,T[0]]);
                   7270: }
                   7271:
                   7272: def rigid211(X,Y,Z)
                   7273: {
                   7274:        if(length(X) != 2 || length(Y) != 2 || length(Z) != 2){
                   7275:                print("Usage: rigid211([a,b],[c,d],[e,f])");
                   7276:                print("0:     0  1   a  b");
                   7277:                print("1:     0  1   c  d");
                   7278:                print("infty: e  e+1 f  *");
                   7279:                return;
                   7280:        }
                   7281:        P = okubo3e(X,Y,[Z[0],Z[0]+1,Z[1],"?"]);
                   7282:        T = chkexp(P,x,"infty",Z[0],2);
                   7283:        T = getroot(T[0],r1);
                   7284:        return mysubst(P,[r1,T[0]]);
                   7285: }
                   7286:
                   7287: def solpokuboe(P,L,N)
                   7288: {
                   7289:        if(type(N) > 1 || ntype(N) != 0 || dn(N) != 1){
                   7290:                mycat(["Irrigal argument :", N]);
                   7291:                return 0;
                   7292:        }
                   7293:        L = vweyl(L);
                   7294:        DD=N+1;
                   7295:        for(U = S = L[0]^N; U != 0; ){
                   7296:                D = mydeg(U,L[0]);
                   7297:                if(D>=DD){
                   7298:                        mycat(["Internal Error",D,DD]);
                   7299:                        return -1;
                   7300:                }
                   7301:                DD=D;
                   7302:                UU = L[0]^D;
                   7303:                R  = appldo(P,UU,L);
                   7304:                if(mydeg(R,L[0]) > D){
                   7305:                        printf("Bad operator\n");
                   7306:                        return 0;
                   7307:                }
                   7308:                CC = mycoef(R,D,L[0]);
                   7309:                if(D == N){
                   7310:                        P -= (E = CC);
                   7311:                        U = R-E*U;
                   7312:                        continue;
                   7313:                }
                   7314:                if(CC == 0){
                   7315:                        printf("No polynomial\n");
                   7316:                        return 0;
                   7317:                }
                   7318:                CC= mycoef(U,D,L[0])/CC;
                   7319:                S = red(S - UU*CC);
                   7320:                U = red(U - R*CC);
                   7321:        }
                   7322:        return [nm(S),E];
                   7323: }
                   7324:
                   7325: def stoe(M,L,N)
                   7326: {
                   7327:        L = vweyl(L);
                   7328:        Size = size(M);
                   7329:        S = Size[0];
                   7330:        NN = 0;
                   7331:        if(type(N) == 4){
                   7332:                NN=N[0]; N=N[1];
                   7333:        }else if(N < 0){
                   7334:                NN=-N; N=0;
                   7335:        }
                   7336:        if(S != Size[1] || N >= S || NN >= S)
                   7337:                return;
                   7338:        D = newmat(S+1,S+1);
                   7339:        MN = dupmat(M);
                   7340:        MD = newmat(S,S);
                   7341:        DD = D[0];
                   7342:        DD[N] = 1; DD[S] = 1;
                   7343:        for(Lcm = I = 1; ; ){
                   7344:                DD = D[I];
                   7345:                MM = MN[N];
                   7346:                for(J = 0; J < S; J++){
                   7347:                        DD[J] = MM[J];
                   7348:                        Lcm = lcm(dn(DD[J]),Lcm);
                   7349:                }
                   7350:                DD[S] = L[1]^I;
                   7351:                for(J = 0; J <= S; J++)
                   7352:                         DD[J] = red(DD[J]*Lcm);
                   7353:                if(I++ >= S)
                   7354:                        break;
                   7355:                if(I==S && NN>0){
                   7356:                        DD = D[I];
                   7357:                        DD[0]=-z_zz; DD[NN]=1;
                   7358:                        break;
                   7359:                }
                   7360:                Mm = dupmat(MN*M);
                   7361:                for(J = 0; J < S; J++){
                   7362:                        for(K = 0; K < S; K++)
                   7363:                                MN[J][K] = red(diff(MN[J][K],L[0])+Mm[J][K]);
                   7364:                }
                   7365:        }
                   7366: #if 0
                   7367:        P = fctr(mydet2(D));
                   7368: #else
                   7369:        P = fctr(det(D));
                   7370: #endif
                   7371:        for(I = R = 1; I < length(P); I++){
                   7372:                if(mydeg(P[I][0],L[1]) > 0)
                   7373:                         R *= P[I][0]^P[I][1];
                   7374:        }
                   7375:        if(NN > 0)
                   7376:                R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));
                   7377:        return R;
                   7378: }
                   7379:
                   7380: def dform(L,X)
                   7381: {
                   7382:        if(type(X)==2) X=[X];
                   7383:        if(type(L[0])!=4) L=[L];
                   7384:        if(type(X)==4) X=ltov(X);
                   7385:        M=length(X);
                   7386:        if(length(car(L))==2){
                   7387:                R=newvect(M);
                   7388:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   7389:                        for(I=0; I<M; I++){
                   7390:                                RT=rmul(car(LL)[0],mydiff(car(LL)[1],X[I]));
                   7391:                                R[I] = (R[I]==0)?RT:radd(R[I],RT);
                   7392:                        }
                   7393:                }
                   7394:                Dif=getopt(dif);
                   7395:                for(RR=[], I=M-1; I>=0; I--){
                   7396:                        if(Dif==1) RR=cons([1,R[I],X[I]],RR);
                   7397:                        else RR=cons([R[I],X[I]],RR);
                   7398:                }
                   7399:                if(Dif==1) RR=dform(RR,X);
                   7400:                return RR;
                   7401:        }else if(length(car(L))!=3) return L;
                   7402:        N=M*(M-1)/2;
                   7403:        R=newvect(N);
                   7404:        S=newvect(N);
                   7405:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   7406:                for(I=K=0; I<M; I++){
                   7407:                        for(J=I+1; J<M; J++, K++){
                   7408:                                if(LL==L) S[K]=[X[I],X[J]];
                   7409:                                LT=car(LL);
                   7410:                                R1=mydiff(LT[2],X[J]);
                   7411:                                R2=mydiff(-LT[2],X[I]);
                   7412:                                if(R2==0){
                   7413:                                        if(R1==0) continue;
                   7414:                                        R1=rmul(mydiff(LT[1],X[I]),R1);
                   7415:                                }else if(R1==0){
                   7416:                                        R1=rmul(mydiff(LT[1],X[J]),R2);
                   7417:                                }else
                   7418:                                        R1=rmul(mydiff(LT[1],X[I]),R1)+rmul(mydiff(LT[1],X[J]),R2);
                   7419:                                R1=rmul(LT[0],R1);
                   7420:                                R[K] = (R[K]==0)?R1:radd(R[K],R1);
                   7421:                        }
                   7422:                }
                   7423:        }
                   7424:        for(RR=[],I=N-1; I>=0; I--)
                   7425:                RR=cons([R[I],S[I][0],S[I][1]],RR);
                   7426:        return RR;
                   7427: }
                   7428:
                   7429: def polinvsym(P,Q,Sym)
                   7430: {
                   7431:        N  = length(Q);
                   7432:        T  = polbyroot(Q,zz);
                   7433:        for(I = 1; I <= N; I++){
                   7434:                P = mysubst(P,[makev([Sym,I]), (-1)^I*coef(T,N-I,zz)]);
                   7435:        }
                   7436:        return P;
                   7437: }
                   7438:
                   7439: def polinsym(P,Q,Sym)
                   7440: {
                   7441:        if(type(P) == 3){
                   7442:                P = red(P);
                   7443:                if(type(P) == 3){
                   7444:                        D = polinsym(dn(P),Q,Sym);
                   7445:                         if(D == 0)
                   7446:                                 return 0;
                   7447:                        return polinsym(nm(P),Q,Sym)/D;
                   7448:                }
                   7449:        }
                   7450:        N  = length(Q);
                   7451:        V  = newvect(N+1);
                   7452:        S  = newvect(N+1);
                   7453:        E  = newvect(N+1);
                   7454:        E0 = newvect(N+1);
                   7455:        T  = polbyroot(Q,zzz);
                   7456:        for(J = 1; J <= N; J++){
                   7457:                K = coef(T,N-J,zzz);
                   7458:                if(J % 2)
                   7459:                        K = -K;
                   7460:                S[J] = K;
                   7461:                V[J] = makev([Sym,J]);
                   7462:        }
                   7463:        K = deg(P,Q[0]);
                   7464:        for(J = 0; J <= N; J++)
                   7465:                E0[J] = K+1;
                   7466:        E[0] = K+1;
                   7467:        while(deg(P,Q[0]) > 0){
                   7468:                for(P0 = P, J = 1; J <= N; J++){
                   7469:                        E[J] = deg(P0,Q[J-1]);
                   7470:                        P0 = coef(P0,E[J],Q[J-1]);
                   7471:                }
                   7472:        /* P0*Q[0]^E[1]*Q[1]^E[2]*...  E[1] >= E[2} >= ... */
                   7473:                for(J = 1; J <= N; J++){
                   7474:                        if(E[J] < E0[J])
                   7475:                                break;
                   7476:                        if(E[J-1] < E[J])
                   7477:                                J = N;
                   7478:                }
                   7479:                if(J > N){
                   7480:                        print("Not symmetric");
                   7481:                        return 0;
                   7482:                }
                   7483:                for(J = 1; J <= N; J++)
                   7484:                        E0[J] = E[J];
                   7485:                for(J = N; J > 1; J--){
                   7486:                        if(E[J] != 0)
                   7487:                                for(K = 1; K < J; K++)
                   7488:                                        E[K] -= E[J];
                   7489:                }
                   7490:                for(R0 = P0, K = 1; K <= N; K++){
                   7491:                        if(E[K] > 0)
                   7492:                                P0 *= S[K]^E[K];
                   7493:                                R0 *= V[K]^E[K];
                   7494:                }
                   7495:                P += R0 - P0;
                   7496:        }
                   7497:        return P;
                   7498: }
                   7499:
                   7500: def tohomog(P,L,V)
                   7501: {
                   7502:        while(length(L)>0){
                   7503:                P = mysubst(P,[car(L),car(L)/V]);
                   7504:                L = cdr(L);
                   7505:        }
                   7506:        P = red(P);
                   7507:        N = mindeg(dn(P),V);
                   7508:        if(N > 0)
                   7509:                P = red(P*V^N);
                   7510:        N = mindeg(dn(P),V);
                   7511:        if(N > 0)
                   7512:                P = red(P/(V^N));
                   7513:        return P;
                   7514: }
                   7515:
                   7516: def substblock(P,X,Q,Y)
                   7517: {
                   7518:        P = red(P);
                   7519:        if(deg(dn(P),X) > 0)
                   7520:                return substblock(nm(P),X,Q,Y)/substblock(dn(P),X,Q,Y);
                   7521:        N = mydeg(Q,X);
                   7522:        if(N < 1)
                   7523:                return P;
                   7524:        R = mycoef(Q,N,X);
                   7525:        while(M = mydeg(P,X), M >= N)
                   7526:                P = red(P - mycoef(P,M,X)*(Q-Y)*X^(M-N)/R);
                   7527:        return P;
                   7528: }
                   7529:
                   7530: def okuboetos(P,L)
                   7531: {
                   7532:        L = vweyl(L); X = L[0]; DX = L[1];
                   7533:        N = mydeg(P,DX);
                   7534:        C = mycoef(P,N,DX);
                   7535:        K = mydeg(C,X);
                   7536:        if(K > N){
                   7537:                print("Irregular singularity at infinity")$
                   7538:                return 0;
                   7539:        }
                   7540:        if(N > K)
                   7541:                P *= x^(N-K);
                   7542:
                   7543:        L = getroot(mycoef(P,N,DX),x);
                   7544:        L = ltov(reverse(L));
                   7545:        if(length(L) != N || N == 0){
                   7546:                print("Cannot get exponents")$
                   7547:                return 0;
                   7548:        }
                   7549:        if( type(LL = getopt(diag)) == 4 ){
                   7550:                LL = ltov(LL);
                   7551:                if(length(LL) != N){
                   7552:                        mycat(["Length of the option should be", N]);
                   7553:                        return 0;
                   7554:                }
                   7555:                Tmp = newvect(N);
                   7556:                for(I = N-1; I >= 0; I--){
                   7557:                         for(LLT = LL[I], J = N-1; J >=0 ; J--){
                   7558:                                 if(LLT == L[J] && Tmp[J] == 0){
                   7559:                                         Tmp[J] = 1;
                   7560:                                         break;
                   7561:                                 }
                   7562:                         }
                   7563:                         if(J < 0){
                   7564:                                 print("option is wrong");
                   7565:                                 return 0;
                   7566:                         }
                   7567:                }
                   7568:                L = LL;
                   7569:        }
                   7570:        P /= mycoef(C,N,X);
                   7571:        A  = newmat(N,N);
                   7572:        AT = newmat(N+1,N+1);
                   7573:        Phi= newvect(N+1);
                   7574:        Phi[0] = 1;
                   7575:        for(J = 0; J < N; J++)
                   7576:                Phi[J+1] = Phi[J]*(X-L[J]);
                   7577:        for(ATT = AT[N], J = 0; J < N; J++)
                   7578:                ATT[J] = mycoef(P,J,DX);
                   7579:
                   7580:        for(K = 1; K <= N; K++){
                   7581:                for(J = N; J >= K; J--){
                   7582:                        Aj = A[J-1];
                   7583:                        SIG = AT[J][J-K];
                   7584:                        for(I = 0; I <= K-2; I++)
                   7585:                                SIG += Aj[J-I-1]*AT[J-I-1][J-K];
                   7586:                        if(K == 1)
                   7587:                                DAT = mydiff(Phi[J-1],X);
                   7588:                        else
                   7589:                                DAT = mydiff(AT[J-1][J-K],X);
                   7590:                        Aj[J-K] = -SIG+(X-L[J-1])*DAT;
                   7591:                        Aj[J-K] /= Phi[J-K];
                   7592:                        Aj[J-K] = mysubst(Aj[J-K],[X,L[J-1]]);
                   7593:                        if(J < K+1) continue;
                   7594:                        ATj = AT[J-1];
                   7595:                        ATj[J-K-1] = SIG+Aj[J-K]*Phi[J-K];
                   7596:                        ATj[J-K-1] /= (X - L[J-1]);
                   7597:                        ATj[J-K-1] = red(ATj[J-K-1]-DAT);
                   7598:                }
                   7599:        }
                   7600:
                   7601:        ATT  = newmat(N,N);
                   7602:        for(J = 0; J < N; J++){
                   7603:                for(K = 0; K < N; K++){
                   7604:                        ATj = ATT[J];
                   7605:                        ATj[K] = AT[J][K];
                   7606:                }
                   7607:                ATj[J] = Phi[J];
                   7608:                if(J < N-1){
                   7609:                        ATj = A[J];
                   7610:                        ATj[J+1] = 1;
                   7611:                }
                   7612:        }
                   7613:        return [L,A,ATT];
                   7614: }
                   7615:
                   7616: def heun(X,P,R)
                   7617: {
                   7618:        if(type(X) != 4 || length(X) != 5){
                   7619:                print("Usage: huen([a,b,c,d,e],p,r)");
                   7620:                print("0:     0  c");
                   7621:                print("1:     0  d");
                   7622:                print("p:     0  e");
                   7623:                print("infty: a  b");
                   7624:                print("Fuchs relation: a+b+1 = c+d+e");
                   7625:                return;
                   7626:        }
                   7627:        S = 1;
                   7628:        V = -1;
                   7629:        X = ltov(X);
                   7630:        for(I = 0; I < 5; I++){
                   7631:                if(X[I] == "?"){
                   7632:                        if(V >= 0)
                   7633:                                return;
                   7634:                        V = I;
                   7635:                }else if(I < 2){
                   7636:                        S += X[I];
                   7637:                }else
                   7638:                        S -= X[I];
                   7639:        }
                   7640:        if(V >= 0){
                   7641:         if(V < 2)
                   7642:                 X[V] = -S;
                   7643:         else
                   7644:                 X[V] = S;
                   7645:        }else if(S != 0){
                   7646:                mycat(["Fuch relation:", S,"should be zero!"]);
                   7647:                return;
                   7648:        }
                   7649:        return
                   7650:         x*(x-1)*(x-P)*dx^2
                   7651:                + (X[2]*(x-1)*(x-P)+X[3]*x*(x-P)+X[4]*x*(x-1))*dx
                   7652:                + X[0]*X[1]*(x-R);
                   7653: }
                   7654:
                   7655: def fspt(M,T)
                   7656: {
                   7657:        if(type(M)==7) M=s2sp(M);
                   7658:        if(T == 3)            /* 3: cut 0 */
                   7659:                return cutgrs(M);
                   7660:        if(T == 4 || T== 5){  /* 4: short  5: long */
                   7661:                for(MN = [] ; M != []; M = cdr(M)){
                   7662:                        MT = car(M);
                   7663:                        for(MNT = []; MT != []; MT = cdr(MT)){
                   7664:                                if(type(car(MT)) <= 3){
                   7665:                                        if(T == 4) MNT = cons(car(MT),MNT);
                   7666:                                        else       MNT = cons([1,car(MT)],MNT);
                   7667:                                }else{
                   7668:                                        if(T == 5 || car(MT)[0] > 1) MNT = cons(car(MT),MNT);
                   7669:                                        else if(car(MT)[0] == 1)  MNT = cons(car(MT)[1],MNT);
                   7670:                                }
                   7671:                        }
                   7672:                        MN = cons(reverse(MNT), MN);
                   7673:                }
                   7674:                return reverse(MN);
                   7675:        }
                   7676:        if(type(M[0][0]) == 4){
                   7677:                for(MN = [] ; M != []; M = cdr(M)){
                   7678:                        MT = car(M);
                   7679:                        for(MNT = []; MT != []; MT = cdr(MT))
                   7680:                                MNT = cons(car(MT)[0], MNT);
                   7681:                         MN = cons(reverse(MNT), MN);
                   7682:                }
                   7683:                return fspt(reverse(MN),T);
                   7684:        }
                   7685:        if(T == 0)  /* 0: sp */
                   7686:                return M;
                   7687:        for(MN = [] ; M != []; M = cdr(M)){
                   7688:                MT = qsort(ltov(car(M)));
                   7689:                L = length(MT);
                   7690:                for(MNT = [], I = 0; I < L; I++)
                   7691:                        MNT = cons(MT[I], MNT);
                   7692:                MN = cons(MNT, MN);
                   7693:        }
                   7694:        MN = reverse(MN);
                   7695:        if(T==6) return MN; /* 7: sort */
                   7696:        L = length(MN);
                   7697:        for(M = MN; M != []; M = cdr(M)){
                   7698:                for(I = 0, MT = car(M); MT != []; MT = cdr(MT))
                   7699:                        I += car(MT);
                   7700:                if(OD == 0)
                   7701:                        OD = I;
                   7702:                else if(OD != I || OD == 0)
                   7703:                        return 0;
                   7704:        }
                   7705:        ALL = [MN];
                   7706:        RD=[];
                   7707:        while(OD > 0){
                   7708:                for(S = 0, MT = MN; MT != []; MT = cdr(MT))
                   7709:                        S += car(MT)[0];
                   7710:                S -= (L-2)*OD;
                   7711:                if(S <= 0){
                   7712:                        if(T==7) return [ALL[0],ALL[length(ALL)-1],RD];
                   7713:                        return (T==1)?MN:ALL;
                   7714:                }
                   7715:                RD=cons([S,0,0],RD);
                   7716:                for(NP=0, M = [], MT = MN; MT != []; NP++, MT = cdr(MT)){
                   7717:                        MTT = car(MT);
                   7718:                        I = MTT[0] - S;
                   7719:                        if(I < 0){
                   7720:                                if(I+OD!=0) return 0;
                   7721:                                if(T==7) return [ALL[0],ALL[length(ALL)-1],cdr(RD)];
                   7722:                                return (T==1)?MN:ALL;
                   7723:                        }
                   7724:                        MTT = cdr(MTT);
                   7725:                        NC=1; DO=0;
                   7726:                        for(MNT = []; MTT != []; MTT = cdr(MTT)){
                   7727:                                if(MTT[0] > I){
                   7728:                                        if(DO==0) RD=cons([MTT[0]-I,NP,NC++],RD);
                   7729:                                        MNT = cons(MTT[0], MNT);
                   7730:                                }
                   7731:                                else if(MTT[0] <= I && I != 0){
                   7732:                                        DO=1;
                   7733:                                        MNT = cons(I, MNT);
                   7734:                                        I = 0;
                   7735:                                        if(MTT[0] > 0)
                   7736:                                                MNT = cons(MTT[0], MNT);
                   7737:                                }
                   7738:                        }
                   7739:                        if(I > 0)
                   7740:                                MNT = cons(I,MNT);
                   7741:                        M = cons(reverse(MNT), M);
                   7742:                }
                   7743:                MN = reverse(M);
                   7744:                ALL = cons(MN,ALL);
                   7745:                OD -= S;
                   7746:        }
                   7747: }
                   7748:
                   7749: def abs(X)
                   7750: {
                   7751:        if(vars(X)!=[]) return todf(os_md.abs,[X]);
                   7752:        if(type(X)==4){
                   7753:                P=X[1];X=X[0];
                   7754:        }else P=0;
                   7755:        if(type(X)==1){
                   7756:                if((T=ntype(X))<2 || T==3){
                   7757:                        if(X<0) X=-X;
                   7758:                }else if(T==4) X=P?pari(abs,X,P):pari(abs,X);
                   7759:        }
                   7760:        return X;
                   7761: }
                   7762:
1.20      takayama 7763: def sgn(X)
                   7764: {
                   7765:        if(X==0) return 0;
                   7766:        if(type(X)==1){
                   7767:                return (X>0)?1:-1;
                   7768:        }
                   7769:        if(type(X)==5) X=vtol(X);
                   7770:        if(type(X)==4){
                   7771:                for(W=0,Y=X;Y!=[];Y=cdr(Y))
                   7772:                        for(Z=cdr(Y);Z!=[];Z=cdr(Z))
                   7773:                                if(car(Y)>car(Z)) W++;
                   7774:                if(getopt(val)==1) return W;
                   7775:                return (iand(W,1))?-1:1;
                   7776:        }
                   7777: }
                   7778:
1.6       takayama 7779: def calc(X,L)
                   7780: {
1.10      takayama 7781:        if(type(X)<4||type(X)==7){
                   7782:                if(type(L)==4||type(L)==7){
1.6       takayama 7783:                        V=L[1];
1.10      takayama 7784:                        if(type(X)!=7){
                   7785:                                if((L0=L[0])=="+") X+=V;
                   7786:                                else if(L0=="-")   X-=V;
                   7787:                                else if(L0=="*")   X*=V;
                   7788:                                else if(L0=="/")   X/=V;
                   7789:                                else if(L0=="^")   X^=V;
                   7790:                        }
                   7791:                        if((L0=L[0])==">")      X=(X>V);
                   7792:                        else if(L0=="<")        X=(X<V);
                   7793:                        else if(L0=="=")        X=(X==V);
1.6       takayama 7794:                        else if(L0==">=")   X=(X>=V);
                   7795:                        else if(L0=="<=")   X=(X<=V);
                   7796:                        else if(L0=="!=")       X=(X!=V);
1.10      takayama 7797:                }else if(type(L)==7&&type(X)<4){
1.6       takayama 7798:                        if(L=="neg") X=-X;
                   7799:                        else if(L=="abs") X=abs(X);
                   7800:                        else if(L=="neg") X=-X;
                   7801:                        else if(L=="sqr") X*=X;
                   7802:                        else if(L=="inv") X=1/X;
                   7803:                        else if(L=="sgn"){
                   7804:                                if(X>0)X=1;
                   7805:                                else if(X<0) X=-1;
                   7806:                        }
                   7807:                }
                   7808:        }
                   7809:        return X;
                   7810: }
                   7811:
1.23      takayama 7812: def tobig(X)
                   7813: {
                   7814:        if((type(X)==1 && ntype(X)==3)||type(X)>3) return X;
                   7815:        return eval(X*exp(0));
                   7816: }
                   7817:
1.6       takayama 7818: def isint(X)
                   7819: {
                   7820:        if(X==0||(type(X)==1 && ntype(X)==0 && dn(X)==1)) return 1;
                   7821:        return 0;
                   7822: }
                   7823:
                   7824: def israt(X)
                   7825: {
                   7826:        if(X==0||(type(X)==1 && ntype(X)==0)) return 1;
                   7827:        return 0;
                   7828: }
                   7829:
                   7830: def iscrat(X)
                   7831: {
                   7832:        if(X==0 || (type(X)==1 && israt(real(X)) && israt(imag(X)))) return 1;
                   7833:        return 0;
                   7834: }
                   7835:
                   7836: def isalpha(X)
                   7837: {
                   7838:        return ((X>64&&X<91)||(X>96&&X<123))?1:0;
                   7839: }
                   7840:
                   7841: def isnum(X)
                   7842: {
                   7843:        return (X>47&&X<58)?1:0;
                   7844: }
                   7845:
                   7846: def isalphanum(X)
                   7847: {
                   7848:        return (isalpha(X)||isnum(X))?1:0;
                   7849: }
                   7850:
1.8       takayama 7851: def isdecimal(X)
                   7852: {
                   7853:        if(type(X)!=7) return 0;
                   7854:        F=S=0;
                   7855:        L=strtoascii(X);
                   7856:        while(L!=[]&&car(L)==32) L=cdr(L);
                   7857:        if(L!=[]&&car(L)==45) L=cdr(L);  /* - */
                   7858:        while(L!=[]&&isnum(car(L))){
                   7859:                F=1; L=cdr(L);
                   7860:        }
                   7861:        while(L!=[]&&car(L)<33){
                   7862:                S=1;L=cdr(L);
                   7863:        }
                   7864:        if(L==[]) return F;
                   7865:        else if(S||car(L)!=46) return 0; /* . */
                   7866:        L=cdr(L);F=0;
                   7867:        while(L!=[]&&isnum(car(L))){
                   7868:                F=1; L=cdr(L);
                   7869:        }
                   7870:        while(L!=[]&&car(L)<33) L=cdr(L);
                   7871:        return (L==[])?F:0;
                   7872: }
                   7873:
1.6       takayama 7874: def isvar(X)
                   7875: {
                   7876:        return ([X]==vars(X)&&vtype(X)<3)?1:0;
                   7877: }
                   7878:
                   7879: def isyes(F)
                   7880: {
                   7881:        if((CC=getopt(set))==1){
                   7882:                IsYes=(type(F[0])==4)?F:[F];
                   7883:                return 1;
                   7884:        }else if(CC==0) return(IsYes);
                   7885:        if(type(CC)!=7)
                   7886:                CC=IsYes;
                   7887:        for(;CC!=[]; CC=cdr(CC)){
                   7888:                C=car(CC);
                   7889:                V=call(C[0],cons(F,C[1]));
                   7890:                if(type(C[2])!=4){
                   7891:                        if(V!=C[2])     break;
                   7892:                }else{
                   7893:                        if(C[2][0]!="" && V<C[2][0]) break;
                   7894:                        if(C[2][1]!="" && V>C[2][1]) break;
                   7895:                }
                   7896:        }
                   7897:        return (CC==[])?1:0;
                   7898: }
                   7899:
                   7900: def isall(FN,M)
                   7901: {
                   7902:        if(type(M)<4 || type(M)>6) return ((*FN)(M)==0)?0:1;
                   7903:        if(type(M)==4){
                   7904:                for(;M!=[];M=cdr(M))
                   7905:                        if((*FN)(car(M))==0) return 0;
                   7906:        }else if(type(M)==5){
                   7907:                K=length(M);
                   7908:                for(I=0;I<K;I++)
                   7909:                        if((*FN)(M[I])==0) return 0;
                   7910:        }else if(type(M)==6){
                   7911:                K=size(M)[0];
                   7912:                for(I=0;I<K;I++)
                   7913:                        if (isall(FN,M[I])==0) return 0;
                   7914:        }
                   7915:        return 1;
                   7916: }
                   7917:
                   7918: def sproot(MP,T)
                   7919: {
                   7920:        if((I=str_chr(T,0,","))>0){
                   7921:                if(type(MP)==7) M=s2sp(MP);
                   7922:                else M=chkspt(MP|opt=0);
                   7923:                if(I==length(M[0])){
                   7924:                        N=s2sp(T);S=SM=SN=K=0;
                   7925:                        for(MM=M,NN=N;MM!=[];MM=cdr(MM),NN=cdr(NN),K++){
                   7926:                                for(MT=car(MM),NT=car(NN);MT!=[];MT=cdr(MT),NT=cdr(NT)){
                   7927:                                        S+=car(MT)*car(NT);
                   7928:                                        if(K==0){
                   7929:                                                SM+=car(MT);SN+=car(NT);
                   7930:                                        }
                   7931:                                }
                   7932:                        }
                   7933:                        return S-(length(M)-2)*SM*SN;
                   7934:                }
                   7935:        }
                   7936:        MM=chkspt(MP|opt=7);
                   7937:        if(T=="base") return MM;
                   7938:        Keep=(getopt(keep)==1)?1:0;
                   7939:        Null=getopt(null);
                   7940:        Only=getopt(only);
                   7941:        if(type(Only)!=1) Only=7;
                   7942:        M0=MM[0];
                   7943:        M1=MM[1];
                   7944:        M=MM[2];
                   7945:        if(T=="length") return length(M);
                   7946:        if(T=="height"){
                   7947:                for(J=2,S=M1[0][0],M2=M1; M2!=[]; M2=cdr(M2)){
                   7948:                        for(MT=cdr(car(M2)); MT!=[]; J++, MT=cdr(MT)){
                   7949:                                S+= J*car(MT);
                   7950:                        }
                   7951:                        J=1;
                   7952:                }
                   7953:                return S;
                   7954:        }
                   7955:        for(OD=0, MT=M1[0]; MT!=[]; MT=cdr(MT)) OD+=car(MT);
                   7956:        if(T=="type"){
                   7957:                R=newvect(OD+1);
                   7958:                for(MT=M; MT!=[]; MT=cdr(MT)) R[MT[0][0]]++;
                   7959:                for(RR=[],I=OD; I>0; I--)
                   7960:                        if(R[I]>0) RR=cons([R[I],I],RR);
                   7961:                return RR;
                   7962:        }
                   7963:        if(T=="part"||T=="pair"||T=="pairs"){
                   7964:                NP=length(M1);
                   7965:                LM=newvect(NP);
                   7966:                R=newvect(length(M));
                   7967:                for(K=0; K<NP; K++) LM[K]=length(M1[K]);
                   7968:                for(I=0,TM=M; TM!=[]; I++, TM=cdr(TM)){
                   7969:                        V=newvect(NP);
                   7970:                        for(K=0; K<NP; K++) V[K]=newvect(LM[K]);
                   7971:                        TP=car(TM);
                   7972:                        if(TP[2]==0){
                   7973:                                for(K=0;K<NP;K++) V[K][0]=1;
                   7974:                                for(J=0; J<I; J++){
                   7975:                                        VJ=R[J][1];
                   7976:                                        for(S=K=0;K<NP;K++) S+=VJ[K][0];
                   7977:                                        for(OD=0,K=0;K<LM[0];K++) OD+=VJ[0][K];
                   7978:                                        S-=(NP-2)*OD;
                   7979:                                        for(K=0;K<NP;K++) VJ[K][0]-=S;
                   7980:                                }
                   7981:                        }else{
                   7982:                                K=TP[1]; P=TP[2];
                   7983:                                V[K][P-1]=-1; V[K][P]=1;
                   7984:                                for(J=0; J<I; J++){
                   7985:                                        VJ=R[J][1];
                   7986:                                        S=VJ[K][P]; VJ[K][P]=VJ[K][P-1]; VJ[K][P-1]=S;
                   7987:                                }
                   7988:                        }
                   7989:                        R[I]=[TP[0],V];
                   7990:                }
                   7991:                if(T=="pair"||T=="pairs"){
                   7992:                        MV=ltov(M1);
                   7993:                        for(K=0; K<NP; K++) MV[K] = ltov(MV[K]);
                   7994:                        for(RR=UU=SS=[],I=0; I<length(M); I++){
                   7995:                                V=newvect(NP); W=newvect(NP); U=newvect(NP);
                   7996:                                for(K=0; K<NP; K++){
                   7997:                                        U[K]=newvect(LM[K]); V[K]=newvect(LM[K]); W[K]=newvect(LM[K]);
                   7998:                                }
                   7999:                                S=R[I][0];
                   8000:                                for(K=0; K<NP; K++){
                   8001:                                        for(Q=J=0; J<LM[K]; J++){
                   8002:                                                V[K][J] = S*(U[K][J] = R[I][1][K][J]);
                   8003:                                                Q+=(W[K][J] = MV[K][J] - V[K][J]);
                   8004:                                        }
                   8005:                                }
                   8006:                                if(Q>0 && iand(Only,1)==0) continue;
                   8007:                                if(Q==0 && iand(Only,2)==0) continue;
                   8008:                                if(Q<0 && iand(Only,4)==0) continue;
                   8009:                                for(K=0; K<NP; K++){
                   8010:                                        V[K] = vtol(V[K]); W[K] = vtol(W[K]); U[K]=vtol(U[K]);
                   8011:                                }
                   8012:                                V=vtol(V); W=vtol(W);U=vtol(U);
                   8013:                                if(Q<0) S=-S;
                   8014:                                RR = cons([V,W], RR); UU = cons(U,UU); SS=cons(S,SS);
                   8015:                        }
                   8016:                        RR = reverse(RR); UU=reverse(UU); SS=reverse(SS);
                   8017:                        if(getopt(dviout)==1 && (Null!=1 || RR!=[])){
                   8018:                                 Out=string_to_tb("\\begin{align}\\begin{split}"+s2sp(M1)+"&=");
                   8019:                                 for(I=0,R=RR, U=UU; R!=[]; I++, R=cdr(R), U=cdr(U)){
                   8020:                                         if(I>0) str_tb("\\\\\n &=",Out);
                   8021:                                         if(T=="pairs"){
                   8022:                                                 if((S=SS[I])<0) S=-S;
                   8023:                                                 if(S>1) str_tb([my_tex_form(S),"("],Out);
                   8024:                                                 str_tb(s2sp(car(U)),Out);
                   8025:                                                 if(S>1) str_tb(")",Out);
                   8026:                                                 str_tb(" \\oplus ",Out);
                   8027:                                                 if(SS[I]<0){
                   8028: #ifdef USEMODULE
                   8029:                                                         str_tb(["-(",s2sp(mtransbys(os_md.abs,car(R)[1],[])),")"],Out);
                   8030: #else
                   8031:                                                         str_tb(["-(",s2sp(mtransbys(abs,car(R)[1],[])),")"],Out);
                   8032: #endif
                   8033:                                                 }else
                   8034:                                                         str_tb(s2sp(car(R)[1]),Out);
                   8035:                                         }else
                   8036:                                                 str_tb([s2sp(car(R)[0])," \\oplus ",s2sp(car(R)[1])],Out);
                   8037:                                }
                   8038:                                 str_tb("\n\\end{split}\\end{align}",Out);
                   8039:                                 dviout(str_tb(0,Out)|keep=Keep);
                   8040:                        }
                   8041:                        return RR;
                   8042:                }
                   8043:                for(I=0; I<length(M); I++){
                   8044:                        for(K=0; K<NP; K++) R[I][1][K] = vtol(R[I][1][K]);
                   8045:                        R[I] = [R[I][0],vtol(R[I][1])];
                   8046:                }
                   8047:                R = vtol(R);
                   8048:                return [M0,M1,R];
                   8049:        }
                   8050: }
                   8051:
                   8052: def spgen(MO)
                   8053: {
                   8054:        Eq=(getopt(eq)==1)?1:0;
                   8055:        Sp=getopt(sp);
                   8056:        if(type(Sp)==7) Sp=s2sp(Sp);
                   8057:        St=getopt(str);
                   8058:        LP=getopt(pt);
                   8059:        F=getopt(std);
                   8060:        if(F!=1&&F!=-1) F=0;
                   8061:        if(type(LP)==4){
                   8062:                L0=LP[0]; L1=LP[1];
1.29      takayama 8063:        }else if(type(LP)==1){
                   8064:                L0=L1=LP;
1.6       takayama 8065:        }else{
                   8066:                L0=0; L1=MO+1;
                   8067:        }
                   8068:        if(MO<=0){
                   8069:                MO=-MO;
                   8070:                if(iand(MO,1)==1) return [];
                   8071:                if(MO>1){
                   8072:                        if(isMs()==0) return [];
                   8073:                        Cmd="okubo "+rtostr(-MO);
                   8074:                        MO/=2;
                   8075:                        if(L1>0) Cmd=Cmd+"+"+rtostr(L0)+"-"+rtostr(L1);
                   8076:                        else L1=MO+4;
                   8077:                        Cmd=Cmd+" B";
                   8078:                        Id=getbyshell(Cmd);
                   8079:                        if(Id<0) return [];
                   8080:                        B=[];
                   8081:                        while((S=get_line(Id)) !=0){
                   8082:                                P0=str_chr(S,1,":")+1;
                   8083:                                if(P0>1){
                   8084:                                        P1=str_chr(S,P,"\n");
                   8085:                                        if(P1<0) P1=str_len(S);
                   8086:                                        B=cons(sub_str(S,P0,P1-1),B);
                   8087:                                }
                   8088:                        }
1.17      takayama 8089:                        close_file(Id);
1.6       takayama 8090:                }else{
                   8091:                        MO/=2;
                   8092:                        if(L1<=1) L1=MO+4;
                   8093: BB=[
                   8094: ["11,11,11,11","111,111,111","1^4,1^4,22","1^6,222,33"],
                   8095: ["11,11,11,11,11","1^4,1^4,211","211,22,22,22","1^6,2211,33",
                   8096: "2211,222,222","22211,2^4,44","2^511,444,66","1^4,22,22,31",
                   8097: "2^5,3331,55","1^5,1^5,32","1^8,332,44","111,111,21,21","1^5,221,221"],
                   8098: ["11,11,11,11,11,11","1^4,1^4,1^4","1^4,22,22,22","111,111,111,21",
                   8099: "1^6,21^4,33","21^4,222,222","221^4,2^4,44","2^41^4,444,66",
                   8100: "1^5,1^5,311","1^8,3311,44","1^6,222,321","321,33,33,33",
                   8101: "3321,333,333","33321,3^4,66","3^721,666,99","2^5,3322,55",
                   8102: "1^6,1^6,42","222,33,33,42","1^a,442,55","1^6,33,33,51",
                   8103: "222,222,33,51","1^9,333,54","2^7,554,77","1^5,2111,221",
                   8104: "2^41,333,441","1^7,2221,43","211,211,22,22","2211,2211,222",
                   8105: "22211,22211,44","1^4,211,22,31","2^411,3331,55","1^4,1^4,31,31",
                   8106: "22,22,22,31,31","1^7,331,331","2221,2221,331","111,21,21,21,21"],
                   8107: ["11,11,11,11,11,11,11","111,111,111,111","1^6,1^6,33",
                   8108: "1^6,222,222","222,33,33,33","1^5,1^5,221",
                   8109: "1^4,211,22,22","1^4,1^4,22,31","22,22,22,22,31",
                   8110: "111,111,21,21,21","21^6,2^4,44","2221^6,444,66",
                   8111: "1^6,222,3111","3111,33,33,33","33111,333,333",
                   8112: "333111,3^4,66","3^5111,666,99","2^5,33211,55",
                   8113: "1^8,3221,44","3222,333,333","33222,3^4,66",
                   8114: "3^4222,666,99","1^6,1^6,411","222,33,33,411",
                   8115: "1^a,4411,55","2^4,2^4,431","431,44,44,44",
                   8116: "2^6,4431,66","4431,444,444","44431,4^4,88",
                   8117: "4^531,888,cc","1^a,433,55","1^7,1^7,52",
                   8118: "1^c,552,66","3^4,444,552","1^8,2^4,53",
                   8119: "1^8,44,44,71","3^5,555,771","21^4,2211,222",
                   8120: "221^4,22211,44","2221^4,3331,55","1^6,2211,321",
                   8121: "2^411,3322,55","1^7,322,331","2211,33,33,42",
                   8122: "3^42,4442,77","2211,222,33,51","3^51,5551,88",
                   8123: "2^611,554,77","2221,2221,322","2^41,2^41,54",
                   8124: "1^5,2111,2111","222111,333,441","1^7,22111,43",
                   8125: "1^5,1^5,41,41","1^9,441,441","22111,2221,331",
                   8126: "1^5,221,32,41","221,221,221,41","211,211,211,22",
                   8127: "2211,2211,2211","1^4,211,211,31","211,22,22,31,31",
                   8128: "1^4,22,31,31,31","1^5,32,32,32","221,221,32,32","21,21,21,21,21,21"],
                   8129: ["11,11,11,11,11,11,11,11","1^4,1^4,22,22","1^8,2^4,44",
                   8130: "1^6,2211,222","2211,33,33,33","111,111,111,21,21",
                   8131: "1^5,1^5,2111","1^4,211,211,22","1^4,1^4,211,31",
                   8132: "211,22,22,22,31","1^4,22,22,31,31","111,21,21,21,21,21",
                   8133: "221^8,444,66","2^5,331^4,55","1^8,32111,44",
                   8134: "32211,333,333","332211,3^4,66","3^42211,666,99",
                   8135: "2^5,32221,55","1^7,1^7,511","1^c,5511,66",
                   8136: "3^4,444,5511","541,55,55,55","5541,555,555",
                   8137: "55541,5^4,aa","5^541,aaa,ff","1^8,1^8,62",
                   8138: "1^a1^4,662,77","1^a,55,55,91","2^71,555,87",
                   8139: "21^6,22211,44","221^6,3331,55","1^6,2211,3111",
                   8140: "2^411,33211,55","1^7,3211,331","2211,33,33,411",
                   8141: "3^42,44411,77","22211,2^4,431","2^511,4431,66",
                   8142: "1^8,332,431","3^42,4433,77","1^8,22211,53",
                   8143: "2221,2221,3211","221^5,333,441","1^7,21^5,43",
                   8144: "1^b,443,65","21^5,2221,331","2^51,3332,65",
                   8145: "21^4,21^4,222","221^4,221^4,44","1^6,21^4,321",
                   8146: "2221^4,3322,55","21^4,33,33,42","21^4,222,33,51",
                   8147: "2^51^4,554,77","2^4,3311,3311","3^411,4442,77",
                   8148: "321,321,33,33","3321,3321,333","33321,33321,66",
                   8149: "222,321,33,42","1^6,321,33,51","222,222,321,51",
                   8150: "1^9,3321,54","1^7,322,322","3^422,5551,88",
                   8151: "1^6,33,42,42","1^6,222,42,51","33,33,33,42,51",
                   8152: "1^6,1^6,51,51","222,33,33,51,51","1^b,551,551",
                   8153: "1^5,221,311,41","2^41,3321,441","22111,2221,322",
                   8154: "2^51,443,551","222111,2^41,54","21^4,2211,2211",
                   8155: "1^5,311,32,32","3331,3331,442","2211,2211,33,51",
                   8156: "221,221,311,32","22111,22111,331","1^5,2111,32,41",
                   8157: "2111,221,221,41","2111,221,32,32","211,211,211,211",
                   8158: "211,211,22,31,31","1^4,211,31,31,31","22,22,31,31,31,31"],
                   8159: ["11,11,11,11,11,11,11,11,11","1^5,1^5,1^5","2^5,2^5,55",
                   8160: "111,111,111,111,21","2^41,333,333","1^4,1^4,211,22",
                   8161: "211,22,22,22,22","1^8,22211,44","1^4,1^4,1^4,31",
                   8162: "1^4,22,22,22,31","1^7,1^7,43","1^7,2221,331",
                   8163: "2221,2221,2221","1^6,21^4,222","21^4,33,33,33",
                   8164: "1^6,1^6,321","222,321,33,33","1^6,33,33,42",
                   8165: "222,222,33,42","1^6,222,33,51","222,222,222,51",
                   8166: "33,33,33,33,51","1^6,2211,2211","111,111,21,21,21,21",
                   8167: "1^5,1^5,32,41","1^5,221,221,41","1^5,221,32,32",
                   8168: "221,221,221,32","1^4,211,211,211","211,211,22,22,31",
                   8169: "1^4,211,22,31,31","1^4,1^4,31,31,31","22,22,22,31,31,31",
                   8170: "21,21,21,21,21,21,21","21^a,444,66","1^8,31^5,44",
                   8171: "321^4,333,333","3321^4,3^4,66","3^421^4,666,99",
                   8172: "2^5,322111,55","32^41,3^4,66","3332^41,666,99",
                   8173: "1^8,1^8,611","2^4,44,44,611","1^d,6611,77",
                   8174: "4^5,66611,aa","2^6,444,651","3^4,3^4,651",
                   8175: "651,66,66,66","3^6,6651,99","6651,666,666",
                   8176: "66651,6^4,cc","6^551,ccc,ii","2^8,655,88",
                   8177: "1^9,1^9,72","1^g,772,88","1^c,444,75",
                   8178: "2^6,3^4,75","1^c,66,66,b1","3^4,444,66,b1",
                   8179: "3^7,777,ba","1^7,2221,4111","2^41,333,4311",
                   8180: "1^9,2^41,63","21^8,3331,55","2^411,331^4,55",
                   8181: "1^7,31^4,331","2^411,32221,55","22211,2^4,422",
                   8182: "2^511,4422,66","1^8,332,422","2^5,3331,541",
                   8183: "22211,44,44,62","2^411,2^5,64","2^711,664,88",
                   8184: "1^a,3331,64","2221,2221,31^4","21^7,333,441",
                   8185: "333,333,441,81","2^6111,555,87","21^6,221^4,44",
                   8186: "221^6,3322,55","2^41^6,554,77","1^6,21^4,3111",
                   8187: "3111,321,33,33","33111,3321,333","333111,33321,66",
                   8188: "222,3111,33,42","1^6,3111,33,51","222,222,3111,51",
                   8189: "1^9,33111,54","2221^4,33211,55","1^7,3211,322",
                   8190: "3^4211,5551,88","2^4,3221,3311","333221,4442,77",
                   8191: "3222,3321,333","33222,33321,66","1^9,3222,54",
                   8192: "21^4,33,33,411","3^411,44411,77","222,321,33,411",
                   8193: "1^6,33,411,42","1^6,222,411,51","33,33,33,411,51",
                   8194: "221^4,2^4,431","2^41^4,4431,66","1^8,3311,431",
                   8195: "3^411,4433,77","33321,444,552","1^8,221^4,53",
                   8196: "3311,44,44,53","4^42,5553,99","2^4,3311,44,71",
                   8197: "3^421,555,771","4^52,7771,bb","3^611,776,aa",
                   8198: "2^41,33111,441","22111,2221,3211","2^41,3222,441",
                   8199: "2^61,4441,76","3331,3331,4411","22211,22211,431",
                   8200: "3331,3331,433","3^41,3^41,76","1^7,1^7,61,61",
                   8201: "1^d,661,661","21^5,2221,322","221^5,2^41,54",
                   8202: "2^51,33311,65","21^5,22111,331","3^41,4441,661",
                   8203: "1^7,331,43,61","2221,2221,43,61","2221,331,331,61",
                   8204: "21^4,21^4,2211","21^4,2211,33,51","22211,3311,3311",
                   8205: "1^5,311,311,32","2211,321,33,42","2211,222,321,51",
                   8206: "3322,3331,442","2211,222,42,42","2^411,442,442",
                   8207: "1^6,2211,42,51","2211,33,33,51,51","221,221,311,311",
                   8208: "1^5,2111,311,41","222111,3321,441","22111,22111,322",
                   8209: "222111,222111,54","2111,221,311,32","2111,2111,221,41",
                   8210: "1^5,221,41,41,41","2221,43,43,43","1^5,32,32,41,41",
                   8211: "331,331,43,43","221,221,32,41,41","221,32,32,32,41",
                   8212: "211,211,211,31,31","211,22,31,31,31,31","1^4,31,31,31,31,31"]];
                   8213:                        B=BB[MO];
                   8214:                }
                   8215:                if(St!=1){
                   8216:                        for(R=[]; B!=[]; B=cdr(B)){
                   8217:                                RT=F?s2sp(car(B)|std=F):s2sp(car(B));
                   8218:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   8219:                                R=cons(RT,R);
                   8220:                        }
                   8221:                        return reverse(R);
                   8222:                }else{
                   8223:                        if(L0<=3 && L1>=MO+4) return B;
                   8224:                        for(R=[]; B!=[]; B=cdr(B)){
                   8225:                                RT=s2sp(T=car(B));
                   8226:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   8227:                                if(F) T=s2sp(s2sp(T|std=K));
                   8228:                                R=cons(T,R);
                   8229:                        }
                   8230:                        return reverse(R);
                   8231:                }
                   8232:        }
                   8233:        MP=(L1<MO+1)?L1:MO+1;
                   8234:        LL=newvect(MO+1);
                   8235:        R=newvect(MP+2);
                   8236:        R0=newvect(MP+2);
                   8237:        for(I=1; I<=MO; I++) LL[I]=[];
                   8238:        if(type(Sp)==4){
                   8239:                if(getopt(basic)==1) Sp=chkspt(Sp[6]);
                   8240:                R=chkspt(Sp);
                   8241:                if(R[1]>MO) return 0;
                   8242:                LL[R[1]]=R;
                   8243:                K=R[1];
                   8244:        }
                   8245:        if(K==1||type(Sp)!=4){
                   8246:                LL[1]=[[[1]]];
                   8247:                for(I=2; I<=MO && I<MP;I++){
                   8248:                        for(T=[], J=0; J<I+1; J++)
                   8249:                                T=cons([I-1,1],T);
                   8250:                        LL[I]=cons(T,LL[I]);
                   8251:                }
                   8252:                K=2;
                   8253:        }
                   8254:        for(OD=K; OD<MO; OD++){
                   8255:                for(LT=LL[OD]; LT!=[]; LT=cdr(LT)){
                   8256:                        for(II=0,L=car(LT); L!=[]; II++, L=cdr(L)){
                   8257:                                R0[II]=R[II]=car(L);
                   8258:                        }
                   8259:                        for(; ;){
                   8260:                                for(S=-2*OD, I=0; I<II; I++){
                   8261:                                        S += OD;
                   8262:                                        if(R[I]!=[]) S-=car(R[I]);
                   8263:                                }
                   8264:                                --I;
                   8265:                                for(;S+OD<=MO && I<=MP;S+=OD,I++){
                   8266:                                        if(S<=0) continue;
                   8267:                                        for(J=0;J<=I;J++){
                   8268:                                                if(J>=II){
                   8269:                                                        if(S<OD) break;
                   8270:                                                }else
                   8271:                                                        if(S+((R[J]==[])?0:car(R[J]))<car(R0[J])) break;
                   8272:                                        }
                   8273:                                        if(--J>=I){
                   8274:                                                V=newvect(I);
                   8275:                                                RRR=[];
                   8276:                                                for(;J>=0;J--){
                   8277:                                                        if(J>=II) RR=[OD,S];
                   8278:                                                        else{
                   8279:                                                                K=length(R[J]);
                   8280:                                                                RR=[S+((K==0)?0:car(R[J]))];
                   8281:                                                                K=length(R0[J])-K;
                   8282:                                                                for(RT=R0[J]; RT!=[]; K--,RT=cdr(RT)){
                   8283:                                                                        if(K!=0) RR=cons(car(RT),RR);
                   8284:                                                                }
                   8285:                                                        }
                   8286:                                                        RRR=cons(reverse(RR),RRR);
                   8287:                                                }
                   8288:                                                RRR=qsort(reverse(RRR));
                   8289:                                                if(findin(RRR,LL[S+OD])<0)
                   8290:                                                        LL[S+OD]=cons(RRR,LL[S+OD]);
                   8291:                                        }
                   8292:                                }
                   8293:                                for(K=0; K<II; K++){
                   8294:                                        if(R[K]!=[]){
                   8295:                                                S=car(R[K]);
                   8296:                                                while((R[K]=cdr(R[K]))!=[] && car(R[K])==S);
                   8297:                                                break;
                   8298:                                        }else R[K]=R0[K];
                   8299:                                }
                   8300:                                if(K>=II) break;
                   8301:                        }
                   8302:                }
                   8303:        }
                   8304:        if(L0>0 || L1<MO+1 || St==1 || F){
                   8305:                for(J=1; J<=MO; J++){
                   8306:                        for(RT=[],R=LL[J];R!=[];R=cdr(R)){
                   8307:                                L=length(T=car(R));
                   8308:                                if(L<L0 || L>L1) continue;
                   8309:                                if(F) T=s2sp(T|std=F);
                   8310:                                RT=cons((St==1)?s2sp(T):T,RT);
                   8311:                        }
                   8312:                        LL[J] = reverse(RT);
                   8313:                }
                   8314:        }
                   8315:        if(Eq==1) return LL[MO];
                   8316:        return LL;
                   8317: }
                   8318:
                   8319: def spType2(L)
                   8320: {
                   8321:        C=0;R=[];
                   8322:        for(LT=L;LT!=[];LT=cdr(LT)){
                   8323:                D=-1;LP=car(LT);
                   8324:                for(LPT=LP;LPT!=[];LPT=cdr(LPT)){
                   8325:                        if(D==-1) D=car(LPT);
                   8326:                        else D=igcd(D,car(LPT));
                   8327:                        if(D==1){
                   8328:                                C++;break;
                   8329:                        }
                   8330:                }
                   8331:                if(C==2) return 0;
                   8332:                R=cons(D,R);
                   8333:        }
                   8334:        if(C==0) return L;
                   8335:        if(C==1){
                   8336:                for(K=length(R)-1;R[K]!=1;K--);
                   8337:                D=-1;
                   8338:                for(I=length(R)-1;I>=0;I--){
                   8339:                        if(I==K) continue;
                   8340:                        if(D==-1) D=R[I];
                   8341:                        else D=igcd(D,R[I]);
                   8342:                        if(D==1) return 0;
                   8343:                }
                   8344:        }
                   8345:        return L;
                   8346: }
                   8347:
                   8348:
                   8349: /* ret [#points, order, idx, Fuchs, reduction order, reduction exponents, fund] */
                   8350: def chkspt(M)
                   8351: {
                   8352:        Opt= getopt(opt);
                   8353:        Mat= getopt(mat);
                   8354:        if(type(M)==7) M=s2sp(M);
1.28      takayama 8355:        if(type(Opt) >= 0&&Opt!="idx"){
1.6       takayama 8356:                if(type(Opt) == 7)
                   8357:                        Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);
                   8358:                if(Opt < 0){
                   8359:                        erno(2);
                   8360:                        return 0;
                   8361:                }
                   8362:                return fspt(M,Opt);
                   8363:        }
                   8364:        P  = length(M);
                   8365:        OD = -1;
                   8366:        XM = newvect(P);
                   8367:        Fu = 0;
                   8368:        for( I = SM = SSM = 0; I < P; I++ ){
                   8369:                LJ = length(M[I]);
                   8370:                JM = JMV = 0;
                   8371:                for(J = SM = 0; J < LJ; J++){
                   8372:                        MV = M[I][J];
                   8373:                        if(type(MV) == 4){
                   8374:                                Fu += MV[0]*MV[1];
                   8375:                                MV = MV[0];
                   8376:                        }
                   8377:                        if(MV > JMV){
                   8378:                                JM = J; JMV = MV;
                   8379:                        }
                   8380:                        SM  += MV;
                   8381:                        SSM += MV^2;
                   8382:                }
                   8383:                if(OD < 0)
                   8384:                        OD = SM;
                   8385:                else if(OD != SM){
1.28      takayama 8386:                        if(getopt(dumb)!=1) print("irregal partitions");
                   8387:                        return -1;
1.6       takayama 8388:                }
                   8389:                XM[I] = JM;
                   8390:        }
                   8391:        SSM -= (P-2)*OD^2;
                   8392:        for(I = SM = JM = 0; I < P; I++){
                   8393:                MV = M[I][XM[I]];
                   8394:                if(type(MV) == 4){
                   8395:                        MV = MV[0]; JM = 1;
                   8396:                }
                   8397:                if(I == 0)
                   8398:                 SMM = MV;
                   8399:                else if(SMM > MV)
                   8400:                 SMM = MV;
                   8401:                SM += MV;
                   8402:        }
                   8403:        SM -= (P-2)*OD;
1.28      takayama 8404:        if(Opt=="idx") return SSM;
1.6       takayama 8405:        if(SM > SMM && SM != 2*OD){
1.28      takayama 8406:                if(getopt(dumb)!=1) print("not realizable");
                   8407:                return 0;
1.6       takayama 8408:        }
                   8409:        if(JM==1 && Mat!=1)
                   8410:                Fu -= OD - SSM/2;
1.28      takayama 8411:        return [P, OD, SSM, Fu, SM, XM, fspt(M,1)];
1.6       takayama 8412: }
                   8413:
                   8414: def cterm(P)
                   8415: {
                   8416:        V = getopt(var);
                   8417:        if(type(V) != 4)
                   8418:                V=vars(P);
                   8419:        for(; V !=[]; V = cdr(V))
                   8420:                P = mycoef(P,0,car(V));
                   8421:        return P;
                   8422: }
                   8423:
                   8424: def terms(P,L)
                   8425: {
                   8426:        Lv=getopt(level);
                   8427:        if(type(Lv)!=1) Lv=0;
                   8428:        V=car(L);L=cdr(L);
                   8429:        for(R=[],D=mydeg(P,V);D>=0; D--){
                   8430:                if((Q=mycoef(P,D,V))==0) continue;
                   8431:                if(L!=[]){
                   8432:                        R0=terms(Q,L|level=Lv+1);
                   8433:                        for(;R0!=[];R0=cdr(R0)) R=cons(cons(D,car(R0)),R);
                   8434:                }else R=cons([D],R);
                   8435:        }
                   8436:        if(Lv>0) return R;
                   8437:        R=qsort(R);
                   8438:        Rev = getopt(rev); Dic=getopt(dic);
                   8439:        if(Dic==1 && Rev==1) R=reverse(R);
                   8440:        for(R0=[];R!=[];R=cdr(R)){
                   8441:                for(RT=car(R),S=0;RT!=[];RT=cdr(RT))    S+=car(RT);
                   8442:                R0=cons(cons(S,car(R)),R0);
                   8443:        }
                   8444:        if(Dic==1) return R0;
                   8445:        if(Rev==1){
                   8446:                for(R=[];R0!=[];R0=cdr(R0)){
                   8447:                        T=car(R0);
                   8448:                        R=cons(cons(-car(T),cdr(T)),R);
                   8449:                }
                   8450:                R0=R;
                   8451:        }
                   8452:        R0=qsort(R0);
                   8453:        if(Rev==1){
                   8454:                for(R=[];R0!=[];R0=cdr(R0)){
                   8455:                        T=car(R0);
                   8456:                        R=cons(cons(-car(T),cdr(T)),R);
                   8457:                }
                   8458:                R0=R;
                   8459:        }
                   8460:        return (Rev==1)?R0:reverse(R0);
                   8461: }
                   8462:
                   8463: def polcut(P,N,L)
                   8464: {
                   8465:        if(type(L)==2) L=[L];
                   8466:        M=getopt(top);
                   8467:        if(type(M)!=1) M=0;
                   8468:        T=terms(P,L);
                   8469:        for(S=0;T!=[];T=cdr(T)){
                   8470:                LT=car(T);
                   8471:                if(LT[0]<M || LT[0]>N) continue;
                   8472:                for(PW=1,LT=cdr(LT),V=L,Q=P;LT!=[];LT=cdr(LT),V=cdr(V)){
                   8473:                        Q=mycoef(Q,car(LT),car(V));PW*=car(V)^car(LT);
                   8474:                }
                   8475:                S+=Q*PW;
                   8476:        }
                   8477:        return S;
                   8478: }
                   8479:
                   8480: def redgrs(M)
                   8481: {
                   8482:        Mat = getopt(mat);
                   8483:        if(Mat!=1) Mat=0;
                   8484:        R = chkspt(M|mat=Mat);
                   8485:        if(type(R) < 4)
                   8486:                return -1;
                   8487:        if(R[4] <= 0)
                   8488:                return 1-R[4];
                   8489:        if(R[4] == 2*R[1])
                   8490:                return 0;
                   8491:        V = newvect(R[0]);
                   8492:        Type = type(M[0][0]);
                   8493:        if(Type > 3){
                   8494:                Mu = Mat-1;
                   8495:                for(I = 0; I < R[0]; I++)
                   8496:                        Mu += M[I][R[5][I]][1];
                   8497:        }
                   8498:        for(I = 0; I < R[0]; I++){
                   8499:                IR = R[5][I]; L = []; MI = M[I]; MIE=MI[IR];
                   8500:                for(J = length(MI)-1; J >= 0; J--){
                   8501:                        if(Type <= 3){
                   8502:                                VM = MI[J];
                   8503:                                if(J == IR){
                   8504:                                        VM -= R[4];
                   8505:                                        if(VM < 0) return -1;
                   8506:                                }
                   8507:                                L = cons(VM, L);
                   8508:                        }else{
                   8509:                                VM = MI[J][0];
                   8510:                                if(J == IR){
                   8511:                                        VM -= R[4];
                   8512:                                        if(VM < 0)
                   8513:                                                return -1;
                   8514:                                        if(I == 0)
                   8515:                                                EV = 1-Mat-Mu;
                   8516:                                        else
                   8517:                                                EV = 0;
                   8518:                                }else{
                   8519:                                        if(I == 0)
                   8520:                                                EV = MI[J][1] - M[0][R[5][0]][1] + 1-Mat; /* + MX - Mu; */
                   8521:                                        else
                   8522:                                                EV = MI[J][1] - MIE[1] + Mu;
                   8523:                                }
                   8524:                                L = cons([VM,EV], L);
                   8525: /*
1.24      takayama 8526:                                if(R[2] >= 2){ */ /* rigid */
1.6       takayama 8527: /*          P = dx^(R[1]);
                   8528:                                } */
                   8529:                        }
                   8530:                }
                   8531:                V[I] = L;
                   8532:        }
                   8533:        return [R[5], vtol(V)];
                   8534: }
                   8535:
                   8536: def cutgrs(A)
                   8537: {
                   8538:        for(AL=[] ; A!=[]; A=cdr(A)){    /* AT: level 2 */
                   8539:                for(ALT=[], AT=car(A); AT!=[]; AT=cdr(AT)){
                   8540:                        M = (type(car(AT)) < 4)?car(AT):car(AT)[0];
                   8541:                        if(M > 0)
                   8542:                                ALT = cons(car(AT), ALT);  /* ALT: level 2 */
                   8543:                }
                   8544:                AL = cons(reverse(ALT), AL);   /* AL: level 3 */
                   8545:        }
                   8546:        return reverse(AL);
                   8547: }
                   8548:
                   8549: def mcgrs(G, R)
                   8550: {
                   8551:        NP = length(G);
                   8552:        Mat = (getopt(mat)==1)?0:1;
1.36      takayama 8553:        if(Mat==0 && type(SM=getopt(slm))==4){
1.24      takayama 8554:                SM0=SM[0];SM1=anal2sp(SM[1],["*",-1]);
                   8555:                if(findin(0,SM0)>=0){
                   8556:                        for(SM=[],I=length(G)-1;I>0;I--)
                   8557:                                if(findin(I,SM0)<0) SM=cons(I,SM);
                   8558:                        SM=[SM,SM1];
1.36      takayama 8559:                        G=mcgrs(G,R|mat=1,slm=SM);
1.24      takayama 8560:                        return [G[0],anal2sp(G[1],["*",-1])];
                   8561:                }
                   8562:        }else SM0=0;
1.6       takayama 8563:        for(R = reverse(R) ; R != []; R = cdr(R)){
                   8564:                GN = [];
                   8565:                L = length(G)-1;
                   8566:                RT = car(R);
                   8567:                if(type(RT) == 4){
1.37      takayama 8568:                        if(length(RT)==L+1&&RT[0]!=0){
                   8569:                                R=cons(cdr(RT),cdr(R));
1.24      takayama 8570:                                R=cons(RT[0],R);
1.37      takayama 8571:                                R=cons(0,R);
1.24      takayama 8572:                                continue;
                   8573:                        }               /* addition */
                   8574:                        RT = reverse(RT); S = ADS = 0;
1.37      takayama 8575:                        for(G = reverse(G); G != []; G = cdr(G), L--, RT=cdr(RT)){
                   8576:                                AD = car(RT);
1.24      takayama 8577:                                if(L > 0){
1.6       takayama 8578:                                        S += AD;
1.24      takayama 8579:                                        if(SM && findin(L,SM0)>=0) ADS+=AD;
                   8580:                                }else
1.6       takayama 8581:                                        AD = -S;
                   8582:                                for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))
                   8583:                                        GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);
                   8584:                                GN = cons(GTN, GN);
                   8585:                        }
                   8586:                        G = GN;
1.24      takayama 8587:                        if(SM0){
                   8588:                                for(ST=reverse(SM1),SM1=[]; ST!=[]; ST=cdr(ST))
                   8589:                                        SM1 = cons([car(ST)[0],car(ST)[1]+ADS], SM1);
                   8590:                        }
1.6       takayama 8591:                        continue;
                   8592:                }
1.24      takayama 8593:                if(RT==0) continue;
                   8594:                VP = newvect(L+1); GV = ltov(G);        /* middle convolution */
1.6       takayama 8595:                for(I = S = OD = 0; I <= L; I++){
                   8596:                        RTT = (I==0)?(Mat-RT):0;
                   8597:                        VP[I] = -1;
1.24      takayama 8598:                        for(J = M = K = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){
1.6       takayama 8599:                                if(I == 0)
                   8600:                                        OD += car(GT)[0];
                   8601:                                if(car(GT)[1] == RTT && car(GT)[0] > M){
                   8602:                                        S += car(GT)[0]-M;
1.36      takayama 8603:                                        M=car(GT)[0];
1.6       takayama 8604:                                        VP[I] = J;
                   8605:                                }
                   8606:                        }
1.24      takayama 8607:                }
                   8608:                S -= (L-1)*OD;
                   8609:                for(GN = []; L >= 0; L--){
                   8610:                        GT = GV[L];
                   8611:                        RTT = (L==0)?(-RT):RT;
1.38      takayama 8612:                        GTN = (VP[L]>=0 || S == 0)?[]:[[-S,(L==0)?(Mat-RT):0]];
1.24      takayama 8613:                        for(J = 0; GT != []; GT = cdr(GT), J++){
                   8614:                                if(J != VP[L]){
                   8615:                                        GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);
                   8616:                                        continue;
1.6       takayama 8617:                                }
1.24      takayama 8618:                                K = car(GT)[0] - S;
                   8619:                                if(K < 0){
                   8620:                                        print("Not realizable");
                   8621:                                        return;
                   8622:                                }
1.38      takayama 8623:                                if(K>0) GTN = cons([K,(L==0)?(Mat-RT):0], GTN);
1.24      takayama 8624:                        }
                   8625:                        GN = cons(reverse(GTN), GN);
                   8626:                }
1.36      takayama 8627:                if(SM0&&RT!=0){
                   8628:                        for(M0=M1=-OD,L=length(G)-1;L>=0;L--){
                   8629:                                if(findin(L,SM0)>=0){
                   8630:                                        M0+=OD;
                   8631:                                        if(VP[L]>=0) M0-=GV[L][VP[L]][0];
                   8632:                                }else{
                   8633:                                         M1+=OD;
                   8634:                                        if(VP[L]>=0) M1-=GV[L][VP[L]][0];
                   8635:                                }
                   8636:                        }
                   8637:                        SM2=[];
                   8638:                        if((Mx1=anal2sp(SM1,["max",1,-RT])[0])<0){
                   8639:                                if(M1>0) SM2=cons([M1,0],SM2);
1.38      takayama 8640:                        }else M1+=car(SM1[Mx1]);
1.36      takayama 8641:                        if((Mx0=anal2sp(SM1,["max",1,0])[0])<0){
                   8642:                                if(M0>0) SM2=cons([M0,RT],SM2);
1.38      takayama 8643:                        }else M0+=car(SM1[Mx0]);
1.36      takayama 8644:                        for(J=0;SM1!=[];J++,SM1=cdr(SM1)){
                   8645:                                if(J==Mx0){
                   8646:                                        if(M0>0) SM2=cons([M0,-RT],SM2);
                   8647:                                }else if(J==Mx1){
                   8648:                                        if(M1>0) SM2=cons([M1,0],SM2);
                   8649:                                }else SM2=cons([car(SM1)[0],car(SM1)[1]+RT],SM2);
1.6       takayama 8650:                        }
1.36      takayama 8651:                        SM1=reverse(SM2);
1.6       takayama 8652:                }
                   8653:                G = cutgrs(GN);
                   8654:        }
1.36      takayama 8655:        return SM0?[G,SM1]:G;
1.6       takayama 8656: }
                   8657:
1.38      takayama 8658: def spslm(M,TT)
                   8659: {
                   8660:        R=getbygrs(M,1|mat=1);
                   8661:        if(type(R)!=4||type(R[0])!=4||type(S=R[0][1])!=4){
                   8662:                errno(0);return0;
                   8663:        }
                   8664:        if(S[1]!=[[1,0]]){
                   8665:                print("Not rigid!");return0;
                   8666:        }
                   8667:        if((F=S[0][0][1])!=0){
                   8668:                for(V=vars(F);V!=[];V=cdr(V)){
                   8669:                        if(mydeg(F,car(V))==1){
                   8670:                                T=lsol(F,car(V));
                   8671:                                break;
                   8672:                        }
                   8673:                }
                   8674:                if(V==[]){
                   8675:                        print("Violate Fuchs condition!");
                   8676:                        return0;
                   8677:                }
                   8678:        }
                   8679:        for(P=[];R!=[];R=cdr(R))
                   8680:                P=cons(car(R)[0],P);
                   8681:        if(F!=0){
                   8682:                S=mysubst(S,[car(V),T]);P=mysubst(P,[car(V),T]);
                   8683:        }
                   8684:        return mcgrs(S,P|mat=1,slm=[TT,[[1,0]]]);
                   8685: }
                   8686:
1.6       takayama 8687: /*
                   8688:   F=0 : unify
                   8689:   F=["add",S] :
                   8690:   F=["sub",S] :
                   8691:   F=["+",A,B] :
                   8692:   F=["*",A,B] :
                   8693:   F=["mul",K];
                   8694:   F=["get",F,V] :
                   8695:   F=["put",F,V] :
                   8696:   F=["get1",F,V] :
                   8697:   F=["put1",F,V] :
1.24      takayama 8698:   F=["max"] :
                   8699:   F=["max",F.V] :
1.6       takayama 8700:   F=["put1"] :
                   8701:   F=["val",F];
                   8702:   F=["swap"];
                   8703:  */
                   8704: def anal2sp(R,F)
                   8705: {
                   8706:        if(type(F)==4&&type(F[0])==4){ /* multiple commands */
                   8707:                for(;F!=[];F=cdr(F)) R=anal2sp(R,car(F));
                   8708:                return R;
                   8709:        }
                   8710:        if(type(F)==7) F=[F];
                   8711:        if(F==0){               /* unify */
                   8712:                R=ltov(R);
                   8713:                L=length(R);
                   8714:                for(J=1;J<L;J++){
                   8715:                        for(I=0;I<J;I++){
                   8716:                                if(cdr(R[I])==cdr(R[J])){
                   8717:                                        R[I]=cons(R[I][0]+R[J][0],cdr(R[I]));
                   8718:                                        R[J]=cons(0,cdr(R[J]));
                   8719:                                        break;
                   8720:                                }
                   8721:                        }
                   8722:                }
                   8723:                for(G=[],I=L-1;I>=0;I--)
                   8724:                        if(R[I][0]!=0) G=cons(R[I],G);
                   8725:                if(length(G[0])==2){    /* sort by multiplicity */
                   8726:                        R=ltov(G);
                   8727:                        L=length(R);
                   8728:                        for(I=1;I<L;I++){
                   8729:                                for(J=I;J>0;J--){
                   8730:                                        if(R[J-1][0]>R[J][0]) break;
                   8731:                                        if(R[J-1][0]==R[J][0]){
                   8732:                                                S1=rtostr(R[J-1][1]);S2=rtostr(R[J][1]);
                   8733:                                                if((K=str_len(S1)-str_len(S2))<0) break;
                   8734:                                                if(!K&&S1<S2) break;
                   8735:                                        }
                   8736:                                        S=R[J-1];R[J-1]=R[J];R[J]=S;
                   8737:                                }
                   8738:                        }
                   8739:                        G=vtol(R);
                   8740:                }
                   8741:                return G;
                   8742:        }
                   8743:        if(F[0]=="add") return append(R,F[1]);
1.24      takayama 8744:        if(F[0]=="max"){
                   8745:                if(length(F)==3) C=1;
                   8746:                else C=0;
                   8747:                M=-10^10;K=[-1];
                   8748:                for(I=0;R!=[];R=cdr(R),I++){
                   8749:                        if(C>0&&car(R)[F[1]]!=F[2]) continue;
                   8750:                        if(M<car(R)[0]){
                   8751:                                M=car(R)[0];K=[I,car(R)];
                   8752:                        }
                   8753:                }
                   8754:                return K;
                   8755:        }
1.6       takayama 8756:        R=reverse(R);
                   8757:        if(F[0]=="sub"){
                   8758:                for(S=F[1];S!=[];S=cdr(S))
                   8759:                        R=cons(cons(-car(S)[0],cdr(car(S))),R);
                   8760:                return reverse(R);
                   8761:        }
                   8762:        if(F[0]=="swap"){
                   8763:                for(G=[];R!=[];R=cdr(R))
                   8764:                        G=cons([car(R)[0],car(R)[2],car(R)[1]],G);
                   8765:                return G;
                   8766:        }
                   8767:        if(F[0]=="+"){
1.24      takayama 8768:                L=length(F);
                   8769:                for(G=[];R!=[];R=cdr(R)){
                   8770:                        for(S=[],I=L-1;I>0;I--) S=cons(car(R)[I]+F[I],S);
                   8771:                        G=cons(cons(car(R)[0],S),G);
                   8772:                }
1.6       takayama 8773:                return G;
                   8774:        }
                   8775:        if(F[0]=="*"){
1.24      takayama 8776:                L=length(F);
                   8777:                for(G=[];R!=[];R=cdr(R)){
                   8778:                        for(S=0,I=1;I<L;I++) S+=car(R)[I]*F[I];
                   8779:                        G=cons([car(R)[0],S],G);
                   8780:                }
1.6       takayama 8781:                return G;
                   8782:        }
                   8783:        if(F[0]=="mult"){
                   8784:                K=F[1];
                   8785:                for(G=[];R!=[];R=cdr(R)) G=cons(cons(K*car(R)[0],cdr(car(R))),G);
                   8786:                return G;
                   8787:        }
                   8788:        if(F[0]=="get"){
                   8789:                for(G=[];R!=[];R=cdr(R))
                   8790:                        if(car(R)[F[1]]==F[2])  G=cons(car(R),G);
                   8791:                return G;
                   8792:        }
                   8793:        if(F[0]=="put"){
                   8794:                if(F[1]==1){
                   8795:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[2]],G);
                   8796:                }else{
                   8797:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   8798:                }
                   8799:                return G;
                   8800:        }
                   8801:        if(F[0]=="get1"){
                   8802:                if(length(F)==2){
                   8803:                        for(G=[];R!=[];R=cdr(R)) G=cons([R[0][0],car(R)[F[1]]],G);
                   8804:                        return G;
                   8805:                }
                   8806:                for(G=[];R!=[];R=cdr(R))
                   8807:                        if(car(R)[F[1]]==F[2])  G=cons([R[0][0],car(R)[3-F[1]]],G);
                   8808:                return G;
                   8809:        }
                   8810:        if(F[0]=="put1"){
                   8811:                if(length(F)==1)
                   8812:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],car(R)[1]],G);
                   8813:                else if(F[1]==1)
                   8814:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[1]],G);
                   8815:                else{
                   8816:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   8817:                }
                   8818:                return G;
                   8819:        }
                   8820:        if(F[0]=="val"){
                   8821:                V=(length(F)==1)?1:F[1];
                   8822:                for(I=J=0;R!=[];R=cdr(R)){
                   8823:                        I+=car(R)[0];
                   8824:                        J+=car(R)[0]*car(R)[V];
                   8825:                }
                   8826:                return [I,J];
                   8827:        }
                   8828:        return 0;
                   8829: }
                   8830:
                   8831: /*
                   8832:  G=0          get trivial common spct
                   8833:  G="..,..,"   spectre type of 4 singular points
                   8834:  P=["get"]    all spct
                   8835:  P=["get",L]
                   8836:     L=n        for variable x_n
                   8837:     L=[m,n]    for residue [m,n]
1.23      takayama 8838:     L=[m,n,l]  for residue [m,n,l]
1.6       takayama 8839:     L=[[m,n],[m',n']] for common spct
1.23      takayama 8840:  P=["eigen",I]   decomposition of A_I
1.6       takayama 8841:  P=["get0",[m,n],[m',n']] for the sum of residues
1.23      takayama 8842:  P=["rest",[m,n]] restriction
1.6       takayama 8843:  P=["swap",[m,n]] for symmetry
                   8844:  P=["perm",[...]] for symmetry
                   8845:  P=["deg"]
                   8846:  P=["homog"]
                   8847:  P=["sort"]
                   8848:  P=[[[m,n],c],...] for addition
                   8849:  P=[c] or [[c],...] for middle convolution wrt 0
                   8850:  P=[m,c] or [[m,c],...] for general middle convolution
                   8851:  P=[[a,b,c]] for special additions
                   8852:  P=[[d,a,b,c]] for middle convotution and additions
                   8853:  P=["multi",...] multiple commands
                   8854:  P=0,1,3 : return sim. spectre of 4 singular points
                   8855: */
                   8856: def mc2grs(G,P)
                   8857: {
                   8858:        if(G==0){
                   8859:                G=[];
                   8860:                for(I=4;I>=0;I--){
                   8861:                        V=lsort([0,1,2,3,4],[I],1);
                   8862:                        for(J=1;J<4;J++){
                   8863:                                for(T=[],K=3;K>0;K--)
                   8864:                                        if(K!=J) T=cons(V[K],T);
                   8865:                                G=cons([[[V[0],V[J]],T],[1,0,0]],G);
                   8866:                        }
                   8867:                }
                   8868:                G=mc2grs(G,"sort");
                   8869:        }else if(type(G)==7||(type(G)==4&&length(G)==4)){
                   8870:                if(type(G)==7) G=s2sp(G);
                   8871:                F=(getopt(top)==0)?1:0;
                   8872:                K=[];
                   8873:                if(type(P)==1&&iand(P,1)&&type(G[0][0])<4){
                   8874:                        G=s2sp(G|std=1);
                   8875:                        if(F) G=[G[1],G[2],G[3],G[0]];
                   8876:                        G=sp2grs(G,[d,c,b,a],[1,length(G[0]),-1]|mat=1);
                   8877:                        G=reverse(G);
                   8878:                        if(iand(P,3)==3){
                   8879:                                V=vars(G);
                   8880:                                for(H=L=[a,b,c,d];H!=[];H=cdr(H))
                   8881:                                        if(findin(car(H),V)>=0) G=subst(G,car(H),makev([car(H),1]));
                   8882:                                G=shortv(G,[a,b,c,d]);
                   8883:                                V=vars(G);
                   8884:                                for(H=G[3];H!=[];H=cdr(H)){
                   8885:                                        T=car(H)[1];
                   8886:                                        if(type(T)>1&&!isvar(T)){
                   8887:                                                K=[car(H)[0],T];
                   8888:                                                break;
                   8889:                                        }
                   8890:                                }
                   8891:                        }
                   8892:                        F=1;
                   8893:                }
                   8894:                if(F) G=[G[3],G[0],G[1],G[2]];
                   8895:                S=cons(["anal",1],getopt());
                   8896:                if(!(R=m2mc(G,0|option_list=S))) return R;
                   8897:                for(G=0,R=cdr(R);R!=[];R=cdr(R)){
                   8898:                        TR=car(R)[0];
                   8899:                        if(TR[0]) G=mc2grs(G,[[TR[0]]]);
                   8900:                        G=mc2grs(G,[cdr(TR)]);
                   8901:                }
                   8902:                if(type(P)==1&&K!=[]){
                   8903:                        for(T=10;T<36;T++){
                   8904:                                if(findin(X=makev([T]),V)>=0) continue;
                   8905:                                F=K[0]*(X-K[1]);
                   8906:                                return [F,simplify(G,[F],4)];
                   8907:                        }
                   8908:                }
                   8909:        }
                   8910:        if(type(P)<2) return G;
                   8911:        F=0;
1.25      takayama 8912:        if(type(P)==7||(type(P)==4&&
                   8913:                (type(P[0])<4||(type(P[0])==4&&length(P[0])==2&&type(P[0][0])<4&&type(P[1])<4))
                   8914:          )) P=[P];
1.6       takayama 8915:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   8916:        Keep=(Dvi==2)?1:0;
                   8917:        if(type(P)==4&&type(F=car(P))==7){
                   8918:                if(F=="mult"){
                   8919:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
                   8920:                        return G;
                   8921:                }
                   8922:                if(F=="show"){
                   8923:                        for(R=str_tb(0,0);G!=[];){
                   8924:                                L=car(G);
                   8925:                                I=L[0][0];J=L[0][1];
                   8926:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1])
                   8927:                                        +"}]&=\\left\\{",R);
                   8928:                                for(L=cdr(L);;){
                   8929:                                        S=car(L);
                   8930:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   8931:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   8932:                                        if((L=cdr(L))==[]) break;
                   8933:                                        str_tb(",\\,",R);
                   8934:                                }
                   8935:                                str_tb("\\right\\}",R);
                   8936:                                if((G=cdr(G))==[]) break;
                   8937:                                str_tb(",\\\\\n",R);
                   8938:                        }
                   8939:                        R=texbegin("align*",str_tb(0,R));
                   8940:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   8941:                        return R;
                   8942:                }
                   8943:                if(F=="show0"){
1.26      takayama 8944:                        if(type(Fig=getopt(fig))>0){
                   8945:                                PP=[[-1.24747,-5.86889],[1.24747,-5.86889],[3.52671,-4.8541],[5.19615,-3],
                   8946:                                  [5.96713,-0.627171],[5.70634,1.8541],[4.45887,4.01478],[2.44042,5.48127],
                   8947:                                  [0,6],[-2.44042,5.48127],[-4.45887,4.01478],[-5.70634,1.8541],
                   8948:                                  [-5.96713,-0.627171],[-5.19615,-3],[-3.52671,-4.8541]];
                   8949:                                PL=[[1.8,-5.2],[5.7,-1.7],[3.2,5],[-3.6,4.7],[2.2,3],[-2.8,2.8],
                   8950:                                  [-1.5,-1.4],[-3.2,-2.5],[0.76,-1.4],[-2,0.2]];
                   8951:                                PC=["black,dashed","green,dashed","red,dashed","blue,dashed",
                   8952:                                        "black","cyan","green","blue","red","magenta"];
                   8953:                                N=["1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
                   8954:                                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],
                   8955:                                  [2,9,14],[3,6,13]];
                   8956:                                TB=str_tb("\\draw\n",TB);
                   8957:                                if(type(Fig)==4){
                   8958:                                        if(type(car(Fig))==1){
                   8959:                                                PP=ptaffine(car(Fig)/12,PP);PL=ptaffine(car(Fig)/12,PL);
                   8960:                                                Fig=cdr(Fig);
                   8961:                                        }
                   8962:                                        if(Fig!=[]&&length(Fig)==10) PC=Fig;
                   8963:                                }
                   8964:                                for(R=mc2grs(G,"show0"|dviout=-1),I=0;R!="";I++){       /* 頂点 */
                   8965:                                        J=str_chr(R,0,",");
                   8966:                                        if(J>0){
                   8967:                                                S=str_cut(R,0,J-1);
                   8968:                                                R=str_cut(R,J+1,1000);
                   8969:                                        }else{
                   8970:                                                S=R;R="";
                   8971:                                        }
                   8972:                                        T=(str_chr(S,0,"1")==0)?"":"[red]";
                   8973:                                        str_tb(["node",T,"(",N[I],") at ",xypos(PP[I]),"{$",S,"$}\n"],TB);
                   8974:                                }
                   8975:                                for(S=PC,P=PL,I=0;I<4;I++){
                   8976:                                        for(J=I+1;J<5;J++,S=cdr(S),P=cdr(P)){                   /* 線の番号 */
                   8977:                                                SS=car(S);
                   8978:                                                if((K=str_chr(SS,0,","))>0) SS=sub_str(SS,0,K-1);
                   8979:                                                str_tb(["node[",SS,"] at ",xypos(car(P)),
                   8980:                                                        "{$[",rtostr(I),rtostr(J),"]$}\n"],TB);
                   8981:                                        }
                   8982:                                }
                   8983:                                str_tb(";\n",TB);
                   8984:                                for(I=0;I<10;I++){              /* 線 */
                   8985:                                        S=car(PC);P0=car(PC);L0=car(LL);PC=cdr(PC);LL=cdr(LL);
                   8986:                                        C=[N[L0[0]-1],N[L0[1]-1],N[L0[2]-1]];
                   8987:                                        str_tb(["\\draw[",S,"] (", C[0],")--(",C[1],") (",
                   8988:                                                C[0],")--(",C[2],") (",C[1],")--(",C[2],");\n"],TB);
                   8989:                                }
                   8990:                                R=str_tb(0,TB);
                   8991:                                if(TikZ==1&&Dvi!=-1) dviout(xyproc(R)|dviout=1,keep=Keep);
                   8992:                                return R;
                   8993:                        }
1.6       takayama 8994:                        for(S="",L=[];G!=[];G=cdr(G)){
                   8995:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   8996:                                TL=msort(TL,[-1,0]);
                   8997:                                if(Dvi){
                   8998:                                        if(S!="") S=S+",";
                   8999:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   9000:                                                if(car(T)==I) J++;
                   9001:                                                else{
                   9002:                                                        if(I>0&&J>0){
                   9003:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   9004:                                                                else S=S+rtostr(I);
                   9005:                                                                if(J>1){
                   9006:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   9007:                                                                        else S=S+"^"+rtostr(J);
                   9008:                                                                }
                   9009:                                                        }
                   9010:                                                        I=car(T);J=1;
                   9011:                                                }
                   9012:                                        }
                   9013:                                }
                   9014:                                L=cons(TL,L);
                   9015:                        }
                   9016:                        if(Dvi){
                   9017:                                if(Dvi!=-1) dviout(S|eq=0);
                   9018:                                return S;
                   9019:                        }
                   9020:                        return reverse(L);
                   9021:                }
                   9022:                if(F=="sort"){
                   9023:                        G=ltov(G);L=length(G);
                   9024:                        for(I=0;I<L;I++){
                   9025:                                S=G[I][0];
                   9026:                                if(S[0][0]>S[0][1]) S=[[S[0][1],S[0][0]],S[1]];
                   9027:                                if(S[1][0]>S[1][1]) S=[S[0],[S[1][1],S[1][0]]];
                   9028:                                if(S[0]>S[1]){
                   9029:                                        F=0;S=[S[1],S[0]];
                   9030:                                }
                   9031:                                if(S!=G[I][0]){
                   9032:                                        if(F==0) G[I]=cons(S,anal2sp(cdr(G[I]),"swap"));
                   9033:                                        else G[I]=cons(S,cdr(G[I]));
                   9034:                                }
                   9035:                                for(J=I;J>0;J--){
                   9036:                                        if(G[J-1][0]<G[J][0]) break;
                   9037:                                        S=G[J-1];G[J-1]=G[J];G[J]=S;
                   9038:                                }
                   9039:                        }
                   9040:                        return vtol(G);
                   9041:                }
                   9042:                if(F=="get"||F=="get0"){
                   9043:                        if(Dvi!=0) F="get";
                   9044:                        if(length(P)==1||type(P[1])<2){
                   9045:                                L=[];
                   9046:                                if(length(P)==1){
                   9047:                                        for(I=3;I>=0;I--){
                   9048:                                                for(J=4;J>I;J--) L=cons(mc2grs(G,[F,[I,J]]),L);
                   9049:                                        }
                   9050:                                }else{
                   9051:                                        for(I=P[1],J=4;J>=0;J--){
                   9052:                                                if(I==J) continue;
                   9053:                                                L=cons(mc2grs(G,[F,(I<J)?[I,J]:[J,I]]),L);
                   9054:                                        }
                   9055:                                }
                   9056:                                if(Dvi){
                   9057:                                        if(length(L)==10){
                   9058:                                                R=ltov(L);
                   9059:                                                if(R[6][0]==[1,4]){
                   9060:                                                        S=R[6];R[6]=R[7];R[7]=S;
                   9061:                                                        L=vtol(R);
                   9062:                                                }
                   9063:                                        }
                   9064:                                        for(R=S=[],L=reverse(L);L!=[];L=cdr(L)){
                   9065:                                                T=car(L);
                   9066:                                                R=cons(cdr(T),R);
                   9067:                                                if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   9068:                                                else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   9069:                                        }
                   9070:                                        L=ltotex(R|opt="GRS",pre=S);
1.26      takayama 9071:                                        if(type(D=getopt(div))==1 || type(D)==4) L=divmattex(L,D);
1.6       takayama 9072:                                        if(Dvi>0) dviout(L|eq=0,keep=Keep);
                   9073:                                }
                   9074:                                return L; /* get all spct */
                   9075:                        }
                   9076:                        if(type(T=P[1])==4){
                   9077:                                if(F=="get0"&&length(P)==3&&type(I=P[1])==4&&type(J=P[2])==4){
                   9078:                                        if(I[0]>I[1]) I=[I[1],I[0]];
                   9079:                                        if(J[0]>J[1]) J=[J[1],J[0]];
                   9080:                                        if(I[0]>I[0]){S=I;I=J;J=S;};
                   9081:                                        K=lsort(I,J,0);
                   9082:                                        if(length(K)==4){
1.24      takayama 9083:                                                S=mc2grs(G,["get0",[I,J]]);
1.6       takayama 9084:                                                return anal2sp(S,[["*",1,1],0]);
                   9085:                                        }
                   9086:                                        I=lsort(K,lsort(I,J,2),1);
                   9087:                                        S=lsort([0,1,2,3,4],K,1);
1.24      takayama 9088:                                        D=mc2grs(G,"deg");
1.6       takayama 9089:                                        if(findin(4,S)<0) D=-D;
1.24      takayama 9090:                                        J=mc2grs(G,["get0",[I,S]]);
1.6       takayama 9091:                                        if(I[0]>S[0]) J=sp2grs(J,"swap");
                   9092:                                        return anal2sp(J,[["+",0,D],["*",-1,1]]);
                   9093:                                }
                   9094:                                if(type(car(T))==4){
                   9095:                                        if(T[0][0]>T[0][1]) T=[[T[0][1],T[0][0]],T[1]];
                   9096:                                        if(T[1][0]>T[1][1]) T=[T[0],[T[1][1],T[1][0]]];
                   9097:                                        if(T[0][0]>T[1][0]) T=[T[1],T[0]];
                   9098:                                        for(PG=G;PG!=[];PG=cdr(PG))
                   9099:                                                if(car(PG)[0]==T) return (F=="get")?car(PG):cdr(car(PG));
                   9100:                                        return [];      /* get common spct */
                   9101:                                }
1.23      takayama 9102:                                if(length(T)==3){
                   9103:                                        T0=T;T=lsort([0,1,2,3,4],T,1);
                   9104:                                        if(length(T)!=2) return [];
                   9105:                                }else T0=0;
1.6       takayama 9106:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   9107:                                for(FT=0,PG=G;PG!=[];PG=cdr(PG)){
                   9108:                                        if(car(PG)[0][0]==T){
                   9109:                                                FT=1;break;
                   9110:                                        }
                   9111:                                        if(car(PG)[0][1]==T){
                   9112:                                                FT=2;break;
                   9113:                                        }
                   9114:                                }
                   9115:                                if(!FT) return [];
                   9116:                                L=anal2sp(cdr(car(PG)),[["get1",FT],0]);
1.23      takayama 9117:                                if(T0!=0){
                   9118:                                        if((K=mc2grs(G,"deg"))!=0){
                   9119:                                                if(T[1]!=4) K=-K;
                   9120:                                                R=reverse(L);
                   9121:                                                for(L=[];R!=[];R=cdr(R)) L=cons([car(R)[0],car(R)[1]+K],L);
                   9122:                                        }
                   9123:                                        T=T0;
                   9124:                                }
1.6       takayama 9125:                                return (F=="get")?cons(T,L):L;
                   9126:                        }
                   9127:                }
1.27      takayama 9128:                if(F=="rest"||F=="eigen"||F=="rest0"||F=="rest1"){
1.23      takayama 9129:                        if(F!="eigen") G=mc2grs(G,"homog");
1.26      takayama 9130:                        if(length(P)==1){
                   9131:                                for(R=[],I=0;I<4;I++){
                   9132:                                        for(J=I+1;J<5;J++){
                   9133:                                                S=mc2grs(G,[F,[I,J]]);
1.27      takayama 9134:                                                if(S!=[]) R=cons(cons([I,J],S),R);
1.26      takayama 9135:                                        }
                   9136:                                }
                   9137:                                R=reverse(R);
                   9138:                                if(Dvi){
                   9139:                                        TB=str_tb(0,0);
1.27      takayama 9140:                                        if(F=="rest0"||F=="rest1"){
1.26      takayama 9141:                                                for(T=R;;){
                   9142:                                                        TT=car(T);
                   9143:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   9144:                                                        str_tb(["[",S,"]","&: "],TB);
                   9145:                                                        for(TR=[],TT=cdr(TT);TT!=[];TT=cdr(TT))
                   9146:                                                                TR=cons(car(TT)[1],TR);
                   9147:                                                        for(TR=qsort(TR);TR!=[];TR=cdr(TR))
                   9148:                                                                str_tb([s2sp(car(TR)|short=1,std=-1),"\\ \\ "],TB);
                   9149:                                                        if((T=cdr(T))==[]) break;
                   9150:                                                        str_tb("\\\\\n",TB);
                   9151:                                                }
                   9152:                                        }else{
                   9153:                                                TB=str_tb(0,0);
                   9154:                                                for(T=R;;){
                   9155:                                                        TT=car(T);
                   9156:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   9157:                                                        str_tb(["[",S,"]",":\\ "],TB);
                   9158:                                                        for(TR=[],TT=cdr(TT);;){
                   9159:                                                                T0=car(TT);
                   9160:                                                                str_tb(["&",my_tex_form(car(T0)),"&&\\to\\ \n",
                   9161:                                                                        ltotex(cdr(T0)|opt="GRS")],TB);
                   9162:                                                                if((TT=cdr(TT))==[]) break;
                   9163:                                                                str_tb("\\\\\n",TB);
                   9164:                                                        }
                   9165:                                                        if((T=cdr(T))==[]) break;
                   9166:                                                        str_tb("\\allowdisplaybreaks\\\\\n",TB);
                   9167:                                                }
                   9168:                                        }
                   9169:                                        R=texbegin("align*",str_tb(0,TB));
                   9170:                                        if(Dvi!=-1) dviout(R|keep=Keep);
                   9171:                                }
                   9172:                                return R;
                   9173:                        }
1.23      takayama 9174:                        I=P[1];
                   9175:                        if(I[0]>I[1]) I=[I[1],I[0]];
                   9176:                        L=lsort([0,1,2,3,4],I,1);
1.29      takayama 9177:                        if(F=="rest"&&length(P)==3){
                   9178:                                J=P[2];if(J[0]>J[1]) J=[J[1],J[0]];
                   9179:                                L=lsort(L,J,1);
                   9180:                                if(length(L)!=1) return 0;
                   9181:                                return [mc2grs(G,["get0",I]),mc2grs(G,["get0",[I[0],J[0]],[I[1],J[1]]]),
                   9182:                                        mc2grs(G,["get0",[I[0],J[1]],[I[1],J[0]]]),mc2grs(G,["get0",[I[0],I[1],L[0]]])];
                   9183:                        }
1.23      takayama 9184:                        L=[[L[0],L[1]],[L[0],L[2]],[L[1],L[2]]];
1.24      takayama 9185:                        if(F!="eigen"){
                   9186:                                if(I==[0,4]) L=reverse(L);
                   9187:                                else{
                   9188:                                        for(V=[],J=2;J>=0;J--){
                   9189:                                                if(L[J][0]==0) V=cons([L[J][1],J],V);
                   9190:                                                else{
                   9191:                                                        for(K=4;K>=0;K--){
                   9192:                                                                if(findin(K,L[J])<0){
                   9193:                                                                        V=cons([K,J],V);break;
                   9194:                                                                }
                   9195:                                                        }
                   9196:                                                }
                   9197:                                        }
                   9198:                                        V=qsort(V);
                   9199:                                        L=[L[V[0][1]],L[V[1][1]],L[V[2][1]]];
                   9200:                                }
                   9201:                        }
1.23      takayama 9202:                        for(LL=[],T=L;T!=[];T=cdr(T))
                   9203:                                LL=cons(mc2grs(G,["get0",[I,car(T)]]),LL);
                   9204:                        LL=reverse(LL);
                   9205:                        for(R=[],Q=mc2grs(G,["get0",I]);Q!=[];Q=cdr(Q)){
1.24      takayama 9206:                                for(T=[],J=2;J>=0;J--){
                   9207:                                        V=anal2sp(LL[J],["get1",(I[0]<L[J][0])?1:2,car(Q)[1]]);
                   9208:                                        if(F=="rest"){
                   9209:                                                if(I[0]==0){
                   9210:                                                        if(I[1]!=4){
                   9211:                                                                if(L[J][1]!=4) V=anal2sp(V,["+",-car(Q)[1]]);
                   9212:                                                        }else if (L[J][0]!=2) V=anal2sp(V,["+",-car(Q)[1]]);
                   9213:                                                }else if(L[J][0]!=0) V=anal2sp(V,["+",-car(Q)[1]]);
                   9214:                                        }
                   9215:                                        T=cons(V,T);
                   9216:                                }
1.23      takayama 9217:                                R=cons(cons(car(Q)[1],T),R);
                   9218:                        }
1.27      takayama 9219:                        if(F=="rest0"||F=="rest1"){
                   9220:                                for(L=[];R!=[];R=cdr(R)){
                   9221:                                        TR=cdr(car(R));
1.28      takayama 9222:                                        if(F=="rest1"&&chkspt(TR|opt="idx")==2) continue;
1.27      takayama 9223:                                        L=cons([car(R)[0],s2sp(chkspt(TR|opt=6))],L);
                   9224:                                }
1.23      takayama 9225:                                R=reverse(L);
                   9226:                        }
                   9227:                        return R;
                   9228:                }
1.6       takayama 9229:                if(F=="deg"){
                   9230:                        for(S=I=0;I<3;I++){
                   9231:                                for(J=I+1;J<4;J++){
                   9232:                                        L=mc2grs(G,["get0",[I,J]]);
                   9233:                                        L=anal2sp(L,"val");
                   9234:                                        S+=L[1];
                   9235:                                }
                   9236:                        }
                   9237:                        return S/L[0];
                   9238:                }
1.27      takayama 9239:                if(F=="spct"||F=="spct1"){
                   9240:                        K=(F=="spct")?5:6;
1.6       takayama 9241:                        G=mc2grs(G,"get");
1.27      takayama 9242:                        M=newmat(5,K);
1.6       takayama 9243:                        for(;G!=[];G=cdr(G)){
                   9244:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   9245:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   9246:                                        L=cons(car(GT)[0],L);
                   9247:                                }
                   9248:                                L=reverse(qsort(L));
                   9249:                                M[I][J]=M[J][I]=L;
                   9250:                        }
                   9251:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   9252:                        for(I=0;I<5;I++){
                   9253:                                S=-2*D^2;
                   9254:                                for(J=0;J<5;J++){
                   9255:                                        if(I==J) continue;
                   9256:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   9257:                                }
                   9258:                                M[I][I]=S;
1.27      takayama 9259:                                if(K==6){
                   9260:                                        for(S=[],J=4;J>=0;J--)
                   9261:                                                if(I!=J) S=cons(M[I][J],S);
                   9262:                                        R=chkspt(S|opt=2);
                   9263:                                        M[I][5]=((L=length(R))>1)?s2sp(R[L-2]|short=1):"";
                   9264:                                }
1.6       takayama 9265:                        }
                   9266:                        if(Dvi){
                   9267:                                S=[];
                   9268:                                for(I=4;I>=0;I--){
1.27      takayama 9269:                                        L=(K==6)?[M[I][5]]:[];
                   9270:                                        L=cons(M[I][I],L);
1.6       takayama 9271:                                        for(J=4;J>=0;J--){
                   9272:                                                if(I==J) L=cons("",L);
                   9273:                                                else L=cons(s2sp([M[I][J]]),L);
                   9274:                                        }
                   9275:                                        S=cons(L,S);
                   9276:                                }
1.27      takayama 9277:                                T=(K==6)?["reduction"]:[];
                   9278:                                S=cons(append([x0,x1,x2,x3,x4,"idx"],T),S);
                   9279:                                M=ltotex(S|opt="tab",hline=[0,1,z],
                   9280:                                        vline=(K==6)?[0,1,z-2,z-1,z]:[0,1,z-2,z-1,z],
1.26      takayama 9281:                                        left=["","$x_0$","$x_1$","$x_2$","$x_3$","$x_4$"]);
1.6       takayama 9282:                                if(Dvi>0) dviout(M|keep=Keep);
                   9283:                        }
                   9284:                        return M;
                   9285:                }
                   9286:                if(F=="swap"||F=="perm"){
                   9287:                        if(F=="perm") TR=P[1];
                   9288:                        else{
                   9289:                                TR=newvect(5,[0,1,2,3,4]);
                   9290:                                K=P[1][0];L=P[1][1];
                   9291:                                TR[K]=L;TR[L]=K;
                   9292:                                if(TR[4]!=4) G=mc2grs(G,"deg");
                   9293:                        }
                   9294:                        V=newvect(2);
                   9295:                        for(L=[],T=G;T!=[];T=cdr(T)){
                   9296:                                TP=car(T)[0];
                   9297:                                for(TQ=[],I=1;I>=0;I--){
                   9298:                                        V=[TR[TP[I][0]],TR[TP[I][1]]];
                   9299:                                        if(V[0]>V[1]) V=[V[1],V[0]];
                   9300:                                        TQ=cons(V,TQ);
                   9301:                                }
                   9302:                                if(TQ[0][0]<TQ[1][0]){
                   9303:                                        L=cons(cons(TQ,cdr(car(T))),L);
                   9304:                                        continue;
                   9305:                                }
                   9306:                                TQ=[[TQ[1],TQ[0]]];
                   9307:                                for(TP=cdr(car(T));TP!=[];TP=cdr(TP))
                   9308:                                        TQ=cons([car(TP)[0],car(TP)[2],car(TP)[1]],TQ);
                   9309:                                L=cons(reverse(TQ),L);
                   9310:                        }
                   9311:                        return mc2grs(L,"sort");
                   9312:                }
                   9313:                if(F=="homog"){
                   9314:                        V=mc2grs(G,"deg");
                   9315:                        return mc2grs(G,[[[2,3],-V]]);
                   9316:                }else if(F=="deg"){
                   9317:                        R=mc2grs(G,4);
                   9318:                        for(V=0;R!=[];R++){
                   9319:                                for(TR=cdr(R);TR!=[];TR=cdr(TR))
                   9320:                                        V+=car(TR)[0]*car(TR)[1];
                   9321:                        }
                   9322:                        return -V;
                   9323:                }
                   9324:        }
                   9325:        if(type(F)!=4) return 0;
                   9326:        if(type(P[0])!=4) P=[P];
                   9327:        for(;P!=[];P=cdr(P)){
                   9328:                if(type((S=P[0])[0])==4){ /* addition */
                   9329:                        T=P[0][0];
                   9330:                        if(T[0]>T[1]) T=[T[1],T[0]];
                   9331:                        T1=[T[0],4];T2=[T[1],4];
                   9332:                        for(L=[],PG=reverse(G);PG!=[];PG=cdr(PG)){
                   9333:                                R=car(PG);R0=R[0];F=0;K=P[0][1];
                   9334:                                if(R0[0]==T) F=1;
                   9335:                                else if(R0[1]==T) F=2;
                   9336:                                else if(getopt(unique)!=1){
                   9337:                                        K=-K;
                   9338:                                        if(R0[0]==T1||R0[0]==T2) F=1;
                   9339:                                        else if(R0[1]==T1||R0[1]==T2) F=2;
                   9340:                                }
                   9341:                                if(F==0) L=cons(R,L);
                   9342:                                else{
                   9343:                                        R1=anal2sp(cdr(R),(F==1)?["+",K,0]:["+",0,K]);
                   9344:                                        L=cons(cons(R0,R1),L);
                   9345:                                }
                   9346:                        }
                   9347:                        G=L;
                   9348:                }else if(type(S[0])<4){
                   9349:                         if(length(S)==1){       /* mc wrt0 4:cases */
                   9350:                                U=mc2grs(G,"deg");
                   9351:                                C=P[0][0];
                   9352:                                L=[];
                   9353:                        /* [[0,1],[2,3]] : [K=[0,k],J=[i,j]], S=[k,4] : 3 cases */
                   9354:                                for(K=1;K<4;K++){
                   9355:                                        J=lsort([1,2,3],[K],1);
                   9356:                                        K4=[K,4];K0=[0,K];
                   9357:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   9358:                                        LT=anal2sp(G0,["+",C,0]);
                   9359:                                        G0=mc2grs(G,["get0",J]);
                   9360:                                        L0=anal2sp(G0,["put1",1,0]);
                   9361:                                        LT=anal2sp(LT,["add",L0]);
                   9362:                                        G0=mc2grs(G,["get0",K4]);
                   9363:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,U]]);
                   9364:                                        LT=anal2sp(LT,["add",L0]);
                   9365:                                        G0=mc2grs(G,["get0",[[0,J[0]],K4]]);
                   9366:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   9367:                                        LT=anal2sp(LT,["sub",L0]);
                   9368:                                        G0=mc2grs(G,["get0",[[0,J[1]],K4]]);
                   9369:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   9370:                                        LT=anal2sp(LT,["sub",L0]);
                   9371:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   9372:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9373:                                        LT=anal2sp(LT,["sub",L0]);
                   9374:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9375:                                        L0=anal2sp(G0,[["+",-C,0],["get",1,0]]);
                   9376:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9377:                                        L=cons(cons([K0,J],LT),L);
                   9378:                                }
                   9379:                        /* [[0,1],[2,4]] : [K,I]=[[0,k],[i,4]] S=[j,k] : 6 cases */
                   9380:                                for(K=1;K<4;K++){
                   9381:                                  for(I=1;I<4;I++){
                   9382:                                        if(I==K) continue;
                   9383:                                        for(J=1;J<4;J++) if(J!=I&&J!=K)  break;
                   9384:                                        I4=[I,4];S=(J<K)?[J,K]:[K,J];K0=[0,K];
                   9385:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   9386:                                        LT=anal2sp(G0,["+",C,0]);
                   9387:                                        G0=cdr(mc2grs(G,["get",I4]));
                   9388:                                        L0=anal2sp(G0,["put1",1,0]);
                   9389:                                        LT=anal2sp(LT,["add",L0]);
                   9390:                                        G0=cdr(mc2grs(G,["get",S]));
                   9391:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C-U]]);
                   9392:                                        LT=anal2sp(LT,["add",L0]);
                   9393:
                   9394:                                        G0=cdr(mc2grs(G,["get",[[0,I],S]]));
                   9395:                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C-U]]);
                   9396:                                        LT=anal2sp(LT,["sub",L0]);
                   9397:                                        G0=cdr(mc2grs(G,["get",[[0,J],I4]]));
                   9398:                                        L0=anal2sp(G0,["get",1,0]);
                   9399:                                        LT=anal2sp(LT,["sub",L0]);
                   9400:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   9401:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9402:                                        LT=anal2sp(LT,["sub",L0]);
                   9403:                                        G0=cdr(mc2grs(G,["get",[[0,4],S]]));
                   9404:                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C-U]]);
                   9405:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9406:                                        L=cons(cons([K0,I4],LT),L);
                   9407:                                  }
                   9408:                                }
                   9409:                        /* [[0,4],[2,3]] : [[0,4],J]=[[0,4],[i,j]] 3 cases */
                   9410:                                for(K=3;K>0;K--){
                   9411:                                        J=lsort([1,2,3],[K],1);
                   9412:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9413:                                        LT=anal2sp(G0,["+",-C,0]);
                   9414:                                        G0=mc2grs(G,["get0",J]);
                   9415:                                        L0=anal2sp(G0,["put1",1,-C]);
                   9416:                                        LT=anal2sp(LT,["add",L0]);
                   9417:                                        G0=mc2grs(G,["get0",[K,4]]);
                   9418:                                        L0=anal2sp(G0,[["put1",1,-C],["+",0,U]]);
                   9419:                                        LT=anal2sp(LT,["add",L0]);
                   9420:
                   9421:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   9422:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   9423:                                        LT=anal2sp(LT,["sub",L0]);
                   9424:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   9425:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   9426:                                        LT=anal2sp(LT,["sub",L0]);
                   9427:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   9428:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   9429:                                        LT=anal2sp(LT,["sub",L0]);
                   9430:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9431:                                        L0=anal2sp(G0,[["get",1,C],["put",1,0]]);
                   9432:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9433:                                        L=cons(cons([[0,4],J],LT),L);
                   9434:                                }
                   9435:                        /* [[1,2],[3,4]] : [J,K]=[[i,j],[k,4]] 3 cases  */
                   9436:                                for(K=3;K>0;K--){
                   9437:                                        J=lsort([1,2,3],[K],1);
                   9438:                                        if(K>1)
                   9439:                                                LT=mc2grs(G,["get0",[J,[K,4]]]);
                   9440:                                        else{
                   9441:                                                LT=mc2grs(G,["get0",[[K,4],J]]);
                   9442:                                                LT=anal2sp(LT,"swap");
                   9443:                                        }
                   9444:                                        G0=mc2grs(G,["get0",J]);
                   9445:                                        L0=anal2sp(G0,[["put1"],["+",0,-C-U]]);
                   9446:                                        LT=anal2sp(LT,["add",L0]);
                   9447:                                        G0=mc2grs(G,["get0",[K,4]]);
                   9448:                                        L0=anal2sp(G0,[["put1"],["+",U,0]]);
                   9449:                                        LT=anal2sp(LT,["add",L0]);
                   9450:
                   9451:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   9452:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   9453:                                        LT=anal2sp(LT,["sub",L0]);
                   9454:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   9455:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   9456:                                        LT=anal2sp(LT,["sub",L0]);
                   9457:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   9458:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",0,-C-U]]);
                   9459:                                        LT=anal2sp(LT,["sub",L0]);
                   9460:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9461:                                        L0=anal2sp(G0,[["get1",1,C],["put1"],["+",0,-C-U]]);
                   9462:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9463:                                        if(K==1){
                   9464:                                                LT=anal2sp(LT,"swap");
                   9465:                                                L=cons(cons([[K,4],J],LT),L);
                   9466:                                        }else L=cons(cons([J,[K,4]],LT),L);
                   9467:                                }
                   9468:                                G=L;
                   9469:                          }else if(length(S)==2){        /* general mc */
                   9470:                                if(S[1]!=0){
                   9471:                                        I=S[0];
                   9472:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   9473:                                        G=mc2grs(G,[S[1]]);
                   9474:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   9475:                                }
                   9476:                        }else if(length(S)==3||length(S)==4){   /* addition */
                   9477:                                for(I=1;I<4;I++,S=cdr(S))
                   9478:                                        if(S[0]) G=mc2grs(G,[[[0,I],S[0]]]);
                   9479:                                if(length(S)==1 && S[0])                        /* mc */
                   9480:                                        G=mc2grs(G,[S[0]]);
                   9481:                        }
                   9482:                }
                   9483:        }
                   9484:        return mc2grs(G,"sort");
                   9485: }
                   9486:
                   9487: def mcmgrs(G,P)
                   9488: {
                   9489:        if(type(G)<2){
                   9490:                if(G>1){
                   9491:                        N=G+2;G=[];
                   9492:                        for(I=1;I<=N;I++){
                   9493:                                for(J=1;J<N;J++){
                   9494:                                        if(I==J) continue;
                   9495:                                        for(K=J+1;K<=N;K++){
                   9496:                                                if(I==K) continue;
                   9497:                                                G=cons([[[0,I],[J,K]],[1,0,0]],G);
                   9498:                                        }
                   9499:                                }
                   9500:                        }
                   9501:                        for(I=1;I<=N;I++){
                   9502:                                for(J=1;J<I;J++) G=cons([[[0,I],[0,J,I]],[1,0,0]],G);
                   9503:                                for(J=I+1;J<=N;J++) G=cons([[[0,I],[0,I,J]],[1,0,0]],G);
                   9504:                        }
                   9505:                        return reverse(G);
                   9506:                }
                   9507:                return 0;
                   9508:        }
                   9509:        if(type(G)==7) G=os_md.s2sp(G);
                   9510:        if(type(G)!=4||type(G[0])!=4) return 0;
                   9511:        if(type(G[0][0])!=4){                   /* spectre type -> GRS */
                   9512:                G=s2sp(G|std=1);
                   9513:                L=length(G);
                   9514:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   9515:                V=cons(makev([L+9]),V);
                   9516:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   9517:                if(getopt(short)!=0){
                   9518:                        V=append(cdr(V),[V[0]]);
                   9519:                        G=shortv(G,V);
                   9520:                }
                   9521:                R=chkspt(G|mat=1);
                   9522:                if(R[2] != 2 || R[3] != 0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   9523:                if(getopt(anal)==1) return R;   /* called by mcmgrs() */
                   9524:                if(!(G=mcmgrs(L-2,0))) return 0;
                   9525:                for(R=cdr(R);R!=[];R=cdr(R)){
                   9526:                        TR=car(R)[0];
                   9527:                        if(TR[0]) G=mcmgrs(G,[[TR[0]]]);
                   9528:                        G=mcmgrs(G,[cdr(TR)]);
                   9529:                }
                   9530:        }
                   9531:        L=length(G);
                   9532:        for(N=4;N<25;N++){
                   9533:                K=N^2*(N-1)/2;
                   9534:                if(K>L) return 0;
                   9535:                if(K==L) break;
                   9536:        }
                   9537:        if(type(P)<2) return G;
                   9538:        F=0;
                   9539:        if(type(P)==7||(type(P)==4&&type(P[0])<4)) P=[P];
                   9540:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   9541:        Keep=(Dvi==2)?1:0;
                   9542:        if(type(P)==4 && type(F=car(P))==7){
                   9543:                if(F=="mult"){
1.24      takayama 9544:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
1.6       takayama 9545:                        return G;
                   9546:                }
                   9547:                if(F=="get"||F=="get0"){
                   9548:                        if(Dvi!=0) F="get";
                   9549:                        if(length(P)==2){
                   9550:                                if(type(P[1])==4){
                   9551:                                        if(type(P[1][1])==4){           /* [[,],[,]] */
                   9552:                                                for(PG=reverse(G);PG!=[];PG=cdr(PG)){
                   9553:                                                        TP=car(PG);
                   9554:                                                        if(TP[0]==P[1]) return (F=="get")?TP:cdr(TP);
                   9555:                                                }
                   9556:                                                return [];
                   9557:                                        }
                   9558:                                        if(P[1][0]==0){
                   9559:                                                if(length(P[1])==2){    /* [0,] */
                   9560:                                                        for(J=1;J<=N;J++) if(J!=P[1][1]) break;
                   9561:                                                        for(K=J+1;K<=N;K++) if(K!=P[1][1]) break;
                   9562:                                                        L=mcmgrs(G,["get0",[P[1],[J,K]]]);
                   9563:                                                        L=anal2sp(L,["get1",1]);
                   9564:                                                }else{                                  /* [0,*,*] */
                   9565:                                                        L=mcmgrs(G,["get0",[[P[1][0],P[1][1]],P[1]]]);
                   9566:                                                        L=anal2sp(L,["get1",2]);
                   9567:                                                }
                   9568:                                        }else{                                          /* [,] */
                   9569:                                                for(J=1;J<=N;J++) if(J!=P[1][0]&&J!=P[1][1]) break;
                   9570:                                                L=mcmgrs(G,["get0",[[0,J],P[1]]]);
                   9571:                                                L=anal2sp(L,["get1",2]);
                   9572:                                        }
                   9573:                                        L=anal2sp(L,0);
                   9574:                                        if(F=="get") L=cons(P[1],L);
                   9575:                                        return L;
                   9576:                                }else{  /* I */
                   9577:                                        for(L=[],I=P[1],J=0;J<=N;J++){
                   9578:                                                if(I==J) continue;
                   9579:                                                II=(I<J)?[I,J]:[J,I];
                   9580:                                                L=cons(mcmgrs(G,[F,II]),L);
                   9581:                                        }
                   9582:                                }
                   9583:                        }else{
                   9584:                                for(L=[],I=0;I<N;I++){
                   9585:                                        for(J=I+1;J<=N;J++) L=cons(mcmgrs(G,[F,[I,J]]),L);
                   9586:                                }
                   9587:                        }
                   9588:                        if(Dvi){
                   9589:                                for(R=S=[];L!=[];L=cdr(L)){
                   9590:                                        T=car(L);
                   9591:                                        R=cons(cdr(T),R);
                   9592:                                        if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   9593:                                        else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   9594:                                }
                   9595:                                L=ltotex(R|opt="GRS",pre=S);
                   9596:                                if(type(V=getopt(div))!=4) V=[];
                   9597:                                if(V==[]&&(K=length(R))>10)
                   9598:                                        for(I=9;I<K;I+=9) V=cons(I,V);
                   9599:                                V=reverse(V);
                   9600:                                if(V!=[]) L=divmattex(L,V);
                   9601:                                if(Dvi>0){
                   9602:                                        if(V!=[]) dviout(L|keep=Keep);
                   9603:                                        else dviout(L|eq=0,keep=Keep);
                   9604:                                }
                   9605:                        }else L=reverse(L);
                   9606:                        return L;
                   9607:                }
                   9608:                if(F=="show"){
                   9609:                        for(R=str_tb(0,0);G!=[];){
                   9610:                                L=car(G);
                   9611:                                I=L[0][0];J=L[0][1];
                   9612:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1]),R);
                   9613:                                if(length(J)==3) str_tb(rtostr(J[2]),R);
                   9614:                                str_tb("}]&=\\left\\{",R);
                   9615:                                for(L=cdr(L);;){
                   9616:                                        S=car(L);
                   9617:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   9618:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   9619:                                        if((L=cdr(L))==[]) break;
                   9620:                                        str_tb(",\\,",R);
                   9621:                                }
                   9622:                                str_tb("\\right\\}",R);
                   9623:                                if((G=cdr(G))==[]) break;
                   9624:                                str_tb(texcr(43),R);
                   9625:                        }
                   9626:                        R=texbegin("align*",str_tb(0,R));
                   9627:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   9628:                        return R;
                   9629:                }
                   9630:                if(F=="show0"){
                   9631:                        for(C=N*(N-1)*(N-2)/2,S="",L=[];G!=[];G=cdr(G)){
                   9632:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   9633:                                TL=msort(TL,[-1,0]);
                   9634:                                if(Dvi){
                   9635:                                        if(S!=""){
                   9636:                                                if(--C==0) S=S+";";
                   9637:                                                else S=S+",";
                   9638:                                        }
                   9639:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   9640:                                                if(car(T)==I) J++;
                   9641:                                                else{
                   9642:                                                        if(I>0&&J>0){
                   9643:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   9644:                                                                else S=S+rtostr(I);
                   9645:                                                                if(J>1){
                   9646:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   9647:                                                                        else S=S+"^"+rtostr(J);
                   9648:                                                                }
                   9649:                                                        }
                   9650:                                                        I=car(T);J=1;
                   9651:                                                }
                   9652:                                        }
                   9653:                                }
                   9654:                                L=cons(TL,L);
                   9655:                        }
                   9656:                        if(Dvi){
                   9657:                                if(Dvi!=-1) dviout(S|eq=0);
                   9658:                                return S;
                   9659:                        }
                   9660:                        return reverse(L);
                   9661:                }
                   9662:                if(F=="spct"){
                   9663:                        G=mcmgrs(G,"get");
                   9664:                        M=newmat(N+1,N+1);
                   9665:                        for(;G!=[];G=cdr(G)){
                   9666:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   9667:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   9668:                                        L=cons(car(GT)[0],L);
                   9669:                                }
                   9670:                                L=reverse(qsort(L));
                   9671:                                M[I][J]=M[J][I]=L;
                   9672:                        }
                   9673:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   9674:                        for(I=0;I<=N;I++){
                   9675:                                S=-(N-2)*D^2;
                   9676:                                for(J=0;J<=N;J++){
                   9677:                                        if(I==J) continue;
                   9678:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   9679:                                }
                   9680:                                M[I][I]=S;
                   9681:                        }
                   9682:                        if(Dvi){
                   9683:                                S=[];
                   9684:                                for(LS=[],I=N;I>=0;I--){
                   9685:                                        L=[M[I][I]];
                   9686:                                        for(J=N;J>=0;J--){
                   9687:                                                if(I==J) L=cons("",L);
                   9688:                                                else L=cons(s2sp([M[I][J]]),L);
                   9689:                                        }
                   9690:                                        S=cons(L,S);
                   9691:                                        LS=cons("$x_"+rtostr(I)+"$",LS);
                   9692:                                }
                   9693:                                S=cons(append(LS,["idx"]),S);
                   9694:                                M=ltotex(S|opt="tab",hline=[0,1,z],vline=[0,1,z-1,z],left=cons("",LS));
                   9695:                                if(Dvi>0) dviout(M|keep=Keep);
                   9696:                        }
                   9697:                        return M;
                   9698:                }
                   9699:                if(F=="deg"){
                   9700:                        for(S=I=0;I<N-1;I++){
                   9701:                                for(J=I+1;J<N;J++){
                   9702:                                        L=mcmgrs(G,["get0",[I,J]]);
                   9703:                                        L=anal2sp(L,"val");
                   9704:                                        S+=L[1];
                   9705:                                }
                   9706:                        }
                   9707:                        return S/L[0];
                   9708:                }
                   9709:        }
                   9710:        L=[];
                   9711:        if(type(F)!=4) return 0;
                   9712:        if(type(P[0])!=4||length(P[0])==2) P=[P];
                   9713:        for(;P!=[];P=cdr(P)){
                   9714:                if(type(T=(S=car(P))[0])==4){ /* addition */
                   9715:                        if((K=P[0][1])!=0){
                   9716:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   9717:                                T1=[T[0],N];T2=[T[1],N];
                   9718:                                T01=cons(0,T1);T02=cons(0,T2);
                   9719:                                for(PG=G;PG!=[];PG=cdr(PG)){
                   9720:                                        R=car(PG);R0=R[0];K1=K2=0;
                   9721:                                        TP=R0[0];
                   9722:                                        if(TP==T) K1=K;
                   9723:                                        else if(TP==T1||TP==T2) K1=-K;
                   9724:                                        if(length(TP=R0[1])==2){
                   9725:                                                if(TP==T) K2=K;
                   9726:                                                else if(TP==T1||TP==T2) K2=-K;
                   9727:                                        }else{
                   9728:                                                S=0;
                   9729:                                                if(findin(T[0],TP)>=0) S++;
                   9730:                                                if(findin(T[1],TP)>=0) S++;
                   9731:                                                if(S>0&&TP[2]==N) K2=-K;
                   9732:                                                else if(S==2) K2=K;
                   9733:                                        }
                   9734:                                        R1=anal2sp(cdr(R),["+",K1,K2]);
                   9735:                                        L=cons(cons(R0,R1),L);
                   9736:                                }
                   9737:                                G=reverse(L);
                   9738:                        }
                   9739:                }else if(length(S)==1){         /* middle convolution */
                   9740:                        C=S[0];L=[];
                   9741:                        for(I=1;I<=N;I++){
                   9742:                                for(J=1;J<=N;J++){
                   9743:                                        if(I==J) continue;
                   9744:                                        for(K=J+1;K<=N;K++){    /* [[0,I],[J,K]] */
                   9745:                                                if(I==K)continue;
                   9746:                                                T=[[0,I],JK=[J,K]];
                   9747:                                                if(I==N){
                   9748:                                                        LT=mcmgrs(G,["get0",T]);
                   9749:                                                        G0=mcmgrs(G,["get0",JK]);
                   9750:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9751:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   9752:                                                        LT=anal2sp(LT,["add",L0]);
                   9753:                                                        L0=anal2sp(G0,["put1",1,0]);
                   9754:                                                        LT=anal2sp(LT,["add",L0]);
                   9755:                                                        for(V=1;V<=N;V++){
                   9756:                                                                if(V==I){
                   9757:                                                                        G0=mcmgrs(G,["get0",T]);
                   9758:                                                                        L0=anal2sp(G0,["get",1,C]);
                   9759:                                                                }else if(V==J||V==K){
                   9760:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9761:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9762:                                                                }else{
                   9763:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9764:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9765:                                                                }
                   9766:                                                                LT=anal2sp(LT,["sub",L0]);
                   9767:                                                        }
                   9768:                                                        LT=anal2sp(LT,["+",-C,0]);
                   9769:                                                }else if(K==N){
                   9770:                                                        LT=mcmgrs(G,["get0",T]);
                   9771:                                                        LT=anal2sp(LT,["+",C,0]);
                   9772:                                                        G0=mcmgrs(G,["get0",JK]);
                   9773:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9774:                                                        LT=anal2sp(LT,["add",L0]);
                   9775:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   9776:                                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C]]);
                   9777:                                                        LT=anal2sp(LT,["add",L0]);
                   9778:                                                        for(V=1;V<=N;V++){
                   9779:                                                                if(V==I){
                   9780:                                                                        G0=mcmgrs(G,["get0",T]);
                   9781:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9782:                                                                }else if(V==J){
                   9783:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9784:                                                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C]]);
                   9785:                                                                }else if(V==N){
                   9786:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9787:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C]]);
                   9788:                                                                }else{
                   9789:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9790:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9791:                                                                }
                   9792:                                                                LT=anal2sp(LT,["sub",L0]);
                   9793:                                                        }
                   9794:                                                }else{
                   9795:                                                        G0=mcmgrs(G,["get0",T]);
                   9796:                                                        LT=anal2sp(G0,["+",C,0]);
                   9797:                                                        G0=mcmgrs(G,["get0",JK]);
                   9798:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9799:                                                        LT=anal2sp(LT,["add",L0]);
                   9800:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   9801:                                                        L0=anal2sp(G0,["put1",1,0]);
                   9802:                                                        LT=anal2sp(LT,["add",L0]);
                   9803:                                                        for(V=1;V<=N;V++){
                   9804:                                                                if(V==I){
                   9805:                                                                        G0=mcmgrs(G,["get0",T]);
                   9806:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9807:                                                                }else if(V==J||V==K){
                   9808:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9809:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9810:                                                                }else if(V==N){
                   9811:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9812:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9813:                                                                }else{
                   9814:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9815:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9816:                                                                }
                   9817:                                                                LT=anal2sp(LT,["sub",L0]);
                   9818:                                                        }
                   9819:                                                }
                   9820:                                                LT=anal2sp(LT,0);
                   9821:                                                L=cons(cons(T,LT),L);
                   9822:                                        }
                   9823:                                        T=[[0,I],(I<J)?[0,I,J]:[0,J,I]]; /* [0,I], [0,I,J] */
                   9824:                                        JK=(I<J)?[I,J]:[J,I];
                   9825:                                        if(I==N){
                   9826:                                                G0=mcmgrs(G,["get0",T]);
                   9827:                                                LT=anal2sp(G0,["+",-C,0]);
                   9828:                                                G0=mcmgrs(G,["get0",JK]);
                   9829:                                                L0=anal2sp(G0,[["put1",1,-C],["mult",N-3]]);
                   9830:                                                LT=anal2sp(LT,["add",L0]);
                   9831:                                                G0=mcmgrs(G,["get0",T[1]]);
                   9832:                                                L0=anal2sp(G0,["put1",1,-C]);
                   9833:                                                LT=anal2sp(LT,["add",L0]);
                   9834:                                                for(V=1;V<=N;V++){
                   9835:                                                        if(V==J){
                   9836:                                                                G0=mcmgrs(G,["get0",T]);
                   9837:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   9838:                                                        }else if(V==N){
                   9839:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   9840:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9841:                                                        }else{
                   9842:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9843:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   9844:                                                        }
                   9845:                                                        LT=anal2sp(LT,["sub",L0]);
                   9846:                                                }
                   9847:                                                LT=anal2sp(LT,["+",0,C]);
                   9848:                                        }else if(J==N){
                   9849:                                                G0=mcmgrs(G,["get0",T]);
                   9850:                                                LT=anal2sp(G0,["+",C,0]);
                   9851:                                                G0=mcmgrs(G,["get0",T[0]]);
                   9852:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9853:                                                LT=anal2sp(LT,["add",L0]);
                   9854:                                                G0=mcmgrs(G,["get0",T[1]]);
                   9855:                                                L0=anal2sp(G0,["put1",1,0]);
                   9856:                                                LT=anal2sp(LT,["add",L0]);
                   9857:                                                for(V=1;V<=N;V++){
                   9858:                                                        if(V==I){
                   9859:                                                                G0=mcmgrs(G,["get0",T]);
                   9860:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9861:                                                        }else if(V==N){
                   9862:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   9863:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9864:                                                        }else{
                   9865:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9866:                                                                L0=anal2sp(G0,["get",1,0]);
                   9867:                                                        }
                   9868:                                                        LT=anal2sp(LT,["sub",L0]);
                   9869:                                                }
                   9870:                                                LT=anal2sp(LT,["+",0,-C]);
                   9871:                                        }else{
                   9872:                                                G0=mcmgrs(G,["get0",T]);
                   9873:                                                LT=anal2sp(G0,["+",C,C]);
                   9874:                                                G0=mcmgrs(G,["get0",JK]);
                   9875:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9876:                                                LT=anal2sp(LT,["add",L0]);
                   9877:                                                G0=mcmgrs(G,["get0",T[1]]);
                   9878:                                                L0=anal2sp(G0,[["put1",1,0],["+",0,C]]);
                   9879:                                                LT=anal2sp(LT,["add",L0]);
                   9880:                                                for(V=1;V<=N;V++){
                   9881:                                                        if(V==I){
                   9882:                                                                G0=mcmgrs(G,["get0",T]);
                   9883:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,C]]);
                   9884:                                                        }else if(V==J){
                   9885:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   9886:                                                                L0=anal2sp(G0,[["get",1,0],["+",0,C]]);
                   9887:                                                        }else if(V==N){
                   9888:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);                                                                                                                                       L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9889:                                                        }else{
                   9890:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9891:                                                                L0=anal2sp(G0,["get",1,0]);
                   9892:                                                        }
                   9893:                                                        LT=anal2sp(LT,["sub",L0]);
                   9894:                                                }
                   9895:                                        }
                   9896:                                        LT=anal2sp(LT,0);
                   9897:                                        L=cons(cons(T,LT),L);
                   9898:                                }
                   9899:                        }
                   9900:                        for(G0=G=[];L!=[];L=cdr(L)){
                   9901:                                if(length(car(L)[0][1])==2) G0=cons(car(L),G0);
                   9902:                                else G=cons(car(L),G);
                   9903:                        }
                   9904:                        G=append(G0,G);
                   9905:                }else{
                   9906:                        if(length(S)==N-1||length(S)==N){               /* [a_1,...,a_{N-1},c] */
                   9907:                                for(I=1;I<N;S=cdr(S),I++) G=mcmgrs(G,[[0,I],car(S)]);
                   9908:                                if(length(S)==1) G=mcmgrs(G,[S[0]]);
                   9909:                        }else return 0;
                   9910:                }
                   9911:        }
                   9912:        return G;
                   9913: }
                   9914:
                   9915:
                   9916: def delopt(L,S)
                   9917: {
                   9918:        if((Inv=getopt(inv))!=1) Inv=0;
                   9919:        for(R=[];L!=[];L=cdr(L)){
                   9920:                if(type(car(L))!=4) F=0;
                   9921:                else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;
                   9922:                else F=(car(L)[0]==S)?1:0;
                   9923:                if(F==Inv) R=cons(car(L),R);
                   9924:        }
                   9925:        return reverse(R);
                   9926: }
                   9927:
                   9928: def str_char(S,N,L)
                   9929: {
                   9930:        if(type(S)==7){
                   9931:                if(type(L)==1) L=asciitostr([L]);
                   9932:                return str_chr(S,N,L);
                   9933:        }
                   9934:        if(type(L)==7)  L=strtoascii(L)[0];
                   9935:        if(type(S)==4){
                   9936:                M=N;
                   9937:                while(M-->0) S=cdr(S);
                   9938:                M=findin(L,S);
                   9939:                return (M>=0)?findin(L,S)+N:-1;
                   9940:        }else if(type(S)==5){
                   9941:                K=length(S);
                   9942:                for(I=N;I<K;I++)
                   9943:                        if(S[I]==L) return I;
                   9944:        }
                   9945:        return -1;
                   9946: }
                   9947:
                   9948: def str_pair(S,N,I,J)
                   9949: {
                   9950:        if(type(I)==7)  I=(II=strtoascii(I))[0];
                   9951:        if(type(J)==7)  J=(JJ=strtoascii(J))[0];
                   9952:        if(type(S)==7)  S=strtoascii(S);
                   9953:        if(getopt(inv)==1){
                   9954:                if(II!=0){
                   9955:                        I=asciitostr(reverse(II));
                   9956:                        IL=length(II);
                   9957:                }else IL=1;
                   9958:                if(JJ!=0) J=asciitostr(reverse(JJ));
                   9959:                R=str_pair(reverse(S),length(S)-N-1,J,I);
                   9960:                if(R>=0) R=length(S)-IL-R;
                   9961:                return R;
                   9962:        }
                   9963:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   9964:        if((II!=0&&length(II)>1)||(JJ!=0&&length(JJ)>1)){
                   9965:                for(;;){
                   9966:                        MJ=str_str(S,N|top=JJ,sjis=SJIS);
                   9967:                        if(MJ>=0){
                   9968:                                MI=str_str(S,II|top=N,sjis=SJIS);
                   9969:                                if(MI<0 || MI>MJ){
                   9970:                                        if(C==0) return MJ;
                   9971:                                        C--; N=MJ+length(II);
                   9972:                                }else if(MI>=0){
                   9973:                                        C++; N=MI+length(JJ);
                   9974:                                }
                   9975:                        }
                   9976:                        return -1;
                   9977:                }
                   9978:        }
                   9979:        if(type(S)==4){
                   9980:                M=N;
                   9981:                while(M-->0) S=cdr(S);
                   9982:                while(S!=[]){
                   9983:                        if(car(S)==I) C++;
                   9984:                        else if(car(S)==J){
                   9985:                                if(C==0) return N;
                   9986:                                C--;
                   9987:                        }
                   9988:                        S=cdr(S);N++;
                   9989:                }
                   9990:        }else if(type(S)==5){
                   9991:                K=length(S);
                   9992:                for(T=N;T<K && C>=0;T++){
                   9993:                        if(S[T]==I) C++;
                   9994:                        else if(S[T]==J){
                   9995:                                if(C==0) return T;
                   9996:                                C--;
                   9997:                        }
                   9998:                }
                   9999:        }
                   10000:        return -1;
                   10001: }
                   10002:
                   10003:
                   10004: def str_cut(S,I,J)
                   10005: {
                   10006:        if(type(S)==7) return sub_str(S,I,J);
                   10007:        if((JJ=length(S))<=J) J=JJ-1;
                   10008:        if(type(S)==5){
                   10009:                for(L=[],K=J; K>=I; K--)        L=cons(S[K],L);
                   10010:        }else if(type(S)==4){
                   10011:                J-=I;
                   10012:                while(I-->0) S=cdr(S);
                   10013:                for(L=[];J-->=0;S=cdr(S)) L=cons(car(S),L);
                   10014:                L=reverse(L);
                   10015:        }
                   10016:        return asciitostr(L);
                   10017: }
                   10018:
                   10019: def str_str(S,T)
                   10020: {
                   10021:        if(S==0) return -1;
                   10022:        if(type(S) == 7)
                   10023:                S = strtoascii(S);
                   10024:        if(type(J=getopt(top))!=1 || J<0) J=0;
                   10025:        LS=length(S);
                   10026:        if(LS-J<1)      return -1;
                   10027:        if(type(S)==4){
                   10028:                LS-=(J0=J);
                   10029:                for( ; J>0 && S!=[]; S=cdr(S),J--);
                   10030:        }
                   10031:        if(type(JJ=getopt(end))!=1 && JJ!=0) JJ=LS;
                   10032:        else JJ-=J0;
                   10033:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   10034:        if(JJ-J<0) return -1;
                   10035:        /* search from J-th to JJ-th */
                   10036:        if(type(T)==1)  T=[T];
                   10037:        else if(type(T)==7)     T = strtoascii(T);
                   10038:        else if(type(T)==4 && type(T[0])>3){
                   10039:                for(K=(KF=-1)-J0; T!=[]; F++,T=cdr(T)){
                   10040:                        JK=str_str(S,car(T)|top=J,end=JJ,sjis=SJIS);
                   10041:                        if(JK>=0){
                   10042:                                JJ=(K=JK)-1; KF=F;
                   10043:                                if(J>JJ) break;
                   10044:                        }
                   10045:                }
                   10046:                return [KF,J0+K];
                   10047:        }
                   10048:        if(type(T)==4)  T=ltov(T);
                   10049:        LT = length(T);
                   10050:        if(LT>0){
                   10051:                LE = LS-LT;
                   10052:                LP = T[0];
                   10053:                if(JJ==0 ||(type(JJ)==1 && JJ<LE)) LE=JJ;
                   10054:                if(type(S)==5){
                   10055:                        for(; J <= LE; J++){
                   10056:                                if(S[J] != LP){
                   10057:                                        if(SJIS && (V=S[J])>128){
                   10058:                                                if(V<160 || (V>223 && V<240)) J++;
                   10059:                                        }
                   10060:                                        continue;
                   10061:                                }
                   10062:                                for(I = 1; I < LT && S[I+J] == T[I]; I++);
                   10063:                                if(I >= LT)  return J;
                   10064:                        }
                   10065:                }else if(type(S)==4){
                   10066:                        for(; J<=LE; S=cdr(S),J++){
                   10067:                                if(car(S) != LP){
                   10068:                                        if(SJIS && (V=S[J])>128){
                   10069:                                                if(V<160 || (V>223 && V<240)) J++;
                   10070:                                        }
                   10071:                                        continue;
                   10072:                                }
                   10073:                                for(ST=cdr(S), I = 1; I < LT && car(ST) == T[I]; I++, ST=cdr(ST));
                   10074:                                if(I >= LT) return J0+J;
                   10075:                        }
                   10076:                }
                   10077:        }
                   10078:        return -1;
                   10079: }
                   10080:
                   10081: def str_times(S,N)
                   10082: {
                   10083:        if(!isint(N))   return "";
                   10084:        if(type(S)==7){
                   10085:                for(Tb=str_tb(0,0);N-->0;)
                   10086:                        str_tb(S,Tb);
                   10087:                return str_tb(0,Tb);
                   10088:        }
                   10089:        if(type(S)==4){
                   10090:                for(LT=[],I=0;I<N;I++){
                   10091:                        if(type(car(S))==7){
                   10092:                                LT=cons(car(S),LT);
                   10093:                                S=cdr(S);
                   10094:                                if(S==[]) S=[[""]];
                   10095:                        }else if(type(car(S))==4){
                   10096:                                ST=car(S);
                   10097:                                for(J=0;I<N;I++){
                   10098:                                        if(J==length(ST)) J=0;
                   10099:                                        LT=cons(ST[J++],LT);
                   10100:                                }
                   10101:                        }
                   10102:                }
                   10103:                return reverse(LT);
                   10104:        }
                   10105:        return S;
                   10106: }
                   10107:
                   10108: def ssubgrs(M,L)
                   10109: {
                   10110:        if(type(L)==7) L=s2sp(L);
                   10111:        for(S=0, L=L, M=M; L!=[]; L=cdr(L), M=cdr(M)){
                   10112:                 for(LT=car(L), MT=car(M); LT!=[]; LT=cdr(LT), MT=cdr(MT)){
                   10113:                         S += car(LT)*car(MT)[1];
                   10114:                 }
                   10115:        }
                   10116:        return S;
                   10117: }
                   10118:
                   10119: def s2os(S)
                   10120: {
                   10121:        return str_subst(S,[["\\","\\\\"],["\"","\\\""]],0);
                   10122: }
                   10123:
                   10124: def l2os(S)
                   10125: {
                   10126:        if(type(S)==6)
                   10127:                S=m2ll(S);
                   10128:        else if(type(S)==5)
                   10129:                S=vtol(S);
                   10130:        else if(type(S)==7) return "\""+s2os(S)+"\"";
                   10131:        else if(type(S)<4) return rtostr(S);
                   10132:        if(type(S)==4){
                   10133:                for(F=0,Tb=str_tb("[",0);S!=[];S=cdr(S)){
                   10134:                        if(F++) str_tb(", ",Tb);
                   10135:                        str_tb(l2os(car(S)),Tb);
                   10136:                }
                   10137:                str_tb("]",Tb);
                   10138:                return str_tb(0,Tb);
                   10139:        }
                   10140:        return 0;
                   10141: }
                   10142:
                   10143: def r2os(S)
                   10144: {
                   10145:        if(type(S)==6){
                   10146:                for(T="",S=m2ll(S);S!=[];S=cdr(S)){
                   10147:                        if(T!="") T=T+","+r2os(car(S));
                   10148:                        else T=r2os(car(S));
                   10149:                }
                   10150:                return "mat("+T+")\n";
                   10151:        }else if(type(S)==5){
                   10152:                for(T="",S=v2l(S);S!=[];S=cdr(S)){
                   10153:                        if(T!="") T=T+","+r2os(car(S));
                   10154:                        else T=r2os(car(S));
                   10155:                }
                   10156:                return "vect("+T+")\n";
                   10157:        }else if(type(S)<4) return rtostr(S);
                   10158:        else if(type(S)==4){
                   10159:                for(T="";S!=[];S=cdr(S)){
                   10160:                        if(T!="") T=T+","+r2os(car(S));
                   10161:                        else T=r2os(car(S));
                   10162:                }
                   10163:                return "["+T+"]";
                   10164:        }else if(type(S)==7) return "\""+s2os(S)+"\"";
                   10165:        return "";
                   10166: }
                   10167:
                   10168: def s2euc(S)
                   10169: {
                   10170:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   10171:                if((C=car(L)) == 0x1b && length(L)>1) {
                   10172:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   10173:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   10174:                                        Mode = 1;
                   10175:                                } else return 0;
                   10176:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   10177:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   10178:                                        Mode = 0;
                   10179:                                }else if(C == 0x49) {   /* I */
                   10180:                                        Mode = 2;
                   10181:                                }else{
                   10182:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   10183:                                }
                   10184:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   10185:                                L=cdr(L);
                   10186:                        }else{
                   10187:                                R=cons(0x1b,R);R=cons(C,R);
                   10188:                        }
                   10189:                }else if(C == 0x0e) {
                   10190:                        Mode = 2;
                   10191:         }else if(C == 0x0f) {
                   10192:             Mode = 0;
                   10193:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   10194:                        D=car(L=cdr(L));
                   10195:                        if(D>0x20 && D<0x7f) {
                   10196:                                R=cons(ior(C,0x80),R);R=cons(ior(D,0x80),R);
                   10197:                        } else return 0;
                   10198:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   10199:                        R=cons(0x8e,R);  R=cons(ior(C,0x80),R);
                   10200:                }else if(((C>0x80 && C<0xa0) || (C>0xdf && C<0xf0)) && length(L)>1) {   /* ShiftJIS */
                   10201:                        D=car(L=cdr(L));
                   10202:                        if(D>0x3f && D<0xfd && D!=0x7f) {
                   10203:                                T=sjis2jis([C,D]);
                   10204:                                R=cons(ior(T[0],0x80),R); R=cons(ior(T[1],0x80),R);
                   10205:                        }else return 0;
                   10206:                }else if(C>0x9f && C<0xe0) {            /* HanKana */
                   10207:                        R=cons(0x8e,R);  R=cons(C,R);
                   10208:                }else if(C == 0x0a){
                   10209:                        CR++;
                   10210:                }else if(C == 0x0d){
                   10211:                        R=cons(0x0d,R);
                   10212:                        CR=0;
                   10213:                }else{
                   10214:                        while(CR-->0) R=cons(0x0d,R);
                   10215:                        R=cons(C,R);
                   10216:                }
                   10217:        }
                   10218:        while(CR-->0) R=cons(0x0d,R);
                   10219:        return asciitostr(reverse(R));
                   10220: }
                   10221:
                   10222: def s2sjis(S)
                   10223: {
                   10224:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   10225:                if((C=car(L)) == 0x1b && length(L)>1) {
                   10226:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   10227:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   10228:                                        Mode = 1;
                   10229:                                } else return 0;
                   10230:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   10231:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   10232:                                        Mode = 0;
                   10233:                                }else if(C == 0x49) {   /* I */
                   10234:                                        Mode = 2;
                   10235:                                }else{
                   10236:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   10237:                                }
                   10238:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   10239:                                L=cdr(L);
                   10240:                        }else{
                   10241:                                R=cons(0x1b,R);R=cons(C,R);
                   10242:                        }
                   10243:                }else if(C == 0x0e) {
                   10244:                        Mode = 2;
                   10245:         }else if(C == 0x0f) {
                   10246:             Mode = 0;
                   10247:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   10248:                        D=car(L=cdr(L));
                   10249:                        if(D>0x20 && D<0x7f) {
                   10250:                                T=jis2sjis([C,D]);
                   10251:                                R=cons(T[0],R);R=cons(T[1],R);
                   10252:                        } else return 0;
                   10253:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   10254:                        R=cons(ior(C,0x80),R);
                   10255:                }else if(C>0xa0 && C<0xff && length(L)>1) {                             /* EUC */
                   10256:                        D=car(L=cdr(L));
                   10257:                        if(D>0xa0 && D<0xff) {
                   10258:                                T=jis2sjis([iand(C,0x7f),iand(D,0x7f)]);
                   10259:                                R=cons(T[0],R);R=cons(T[1],R);
                   10260:                        }else return 0;
                   10261:                }else if(C == 0x0a){
                   10262:                        CR++;
                   10263:                }else if(C == 0x0d){
                   10264:                        R=cons(0x0a,R);R=cons(0x0d,R);
                   10265:                        CR=0;
                   10266:                }else{
                   10267:                        while(CR-->0){
                   10268:                                R=cons(0x0a,R);R=cons(0x0d,R);
                   10269:                        }
                   10270:                        R=cons(C,R);
                   10271:                }
                   10272:        }
                   10273:        while(CR-->0){
                   10274:                R=cons(0x0a,R);R=cons(0x0d,R);
                   10275:        }
                   10276:        return asciitostr(reverse(R));
                   10277: }
                   10278:
                   10279: def r2ma(S)
                   10280: {
                   10281:        return evalma(S|inv=1);
                   10282: }
                   10283:
                   10284: def evalma(S)
                   10285: {
                   10286:        L0=["\n","\d","{","}","[","]","Log","Exp","Sinh","Cosh","Tanh","Sin","Cos","Tan",
                   10287:                "ArcSin","ArcCos","ArcTan"];
                   10288:        L1=["",  ""  ,"[","]","(",")","log","exp","sinh","cosh","tanh","sin","cos","tan",
                   10289:                "asin",  "acos", "atan"];
                   10290:        if(getopt(inv)==1){
                   10291:                if(type(S)==6) S=m2ll(S);
                   10292:                else if(type(S)==5) S=vtol(S);
                   10293:                if(type(S)==4){
                   10294:                        for(L=[];S!=[];S=cdr(S)){
                   10295:                                if(type(car(S))==6) L=cons(m2ll(car(S)),L);
                   10296:                                else if(type(car(S))==5) L=cons(vtol(car(S)),L);
                   10297:                                else L=cons(car(S),L);
                   10298:                        }
                   10299:                        S=reverse(L);
                   10300:                }else return 0;
                   10301:                return str_subst(rtostr(S),cdr(cdr(L1)),cdr(cdr(L0)));
                   10302:        }
                   10303:        if(S==0){
                   10304:                print("Mathematica text (terminated by ;) ?");
                   10305:                purge_stdin();
                   10306:                Tb=str_tb(0,0);
                   10307:                for(;;){
                   10308:                        S=get_line();
                   10309:                        str_tb(S,Tb);
                   10310:                        if(str_char(S,0,";")>=0) break;
                   10311:                }
                   10312:                S=str_tb(0,Tb);
                   10313:        }
                   10314: /*
                   10315:        while((P=str_chr(S,0,";"))>=0){
                   10316:                V0=evalma(str_cut(S,0,P+1));
                   10317:                S=str_cut(S,P+1,length(S));
                   10318:        }
                   10319:        if((P=str_char(S,0,"="))>=0){
                   10320:                X=strtoascii(str_cut(S,0,P));
                   10321:                L=length(X);
                   10322:                for(P0=P1=-1,I=0;I<L;I++){
                   10323:                        if(L(I)<=32) continue;
                   10324:                        if(isalphanum(L[I])){
                   10325:                                if(P0<0){
                   10326:                                        if(isnum(L[I])) break;
                   10327:                                        P0=I;
                   10328:                                }
                   10329:                                else if(P1!=I+1) break;
                   10330:                                P1=I;
                   10331:                        }
                   10332:                }
                   10333:                if(I==L && P0>=0){
                   10334:                        for(I==P0;I-->0;) X=cdr(X);
                   10335:                        if((X0=car(X))>96) X0-=32;
                   10336:                        Y=[X0];X=cdr(X);
                   10337:                        for(I=P1-P0;I-->0;X=cdr(X))
                   10338:                                Y=cons(car(X),Y);
                   10339:                        Y=cons(61,Y);
                   10340:                        Var=asciitostr(reverse(Y));
                   10341:                        S=str_cut(S,P,length(S));
                   10342:                }
                   10343:        }
                   10344: */
                   10345:        S=eval_str(str_subst(S,L0,L1));
                   10346:        if(type(S)==4){
                   10347:                for(L=-1,T=S;T!=[];T=cdr(T)){
                   10348:                        if(type(T0=car(T))>4) break;
                   10349:                        if(type(T0)<4){
                   10350:                                if(L>=0) break;
                   10351:                                L=-2;continue;
                   10352:                        }
                   10353:                        if(L<-2) break;
                   10354:                        if(L==-1) L=length(T0);
                   10355:                        else if(L!=length(T0)) break;
                   10356:                }
                   10357:                if(T==[]){
                   10358:                        if(L>0) S=s2m(S);
                   10359:                        else S=ltov(S);
                   10360:                }
                   10361:        }
                   10362: /*
                   10363:        if(S==0 && V0!=0) return V0;
                   10364:        if(type(Var)==7){
                   10365:                T=rtostr(S);
                   10366:                if(type(S)==7) T="\""+T+"\"";
                   10367:                S=eval_str(Var+T);
                   10368:                mycat(["Define",Var]);
                   10369:        }
                   10370: */
                   10371:        return S;
                   10372: }
                   10373:
                   10374: def i2hex(N)
                   10375: {
                   10376:        Opt=getopt();
                   10377:        if(type(N)==4 && isint(car(N))){
                   10378: #ifdef USEMODULE
                   10379:                L=mtransbys(os_md.i2hex,N,[]|option_list=Opt);
                   10380: #else
                   10381:                L=mtransbys(i2hex,N,[]|option_list=Opt);
                   10382: #endif
                   10383:                return rtostr(L);
                   10384:        }
                   10385:        if(!isint(N) || N<0) return 0;
                   10386:        if(!N) L=[];
                   10387:        else{
                   10388:                Cap=(getopt(cap)==1)?32:0;
                   10389:                for(L=[];N!=0;N=ishift(N,4)){
                   10390:                        J=iand(N,15);
                   10391:                        L=cons(((J>9)?(87-Cap):48)+J,L);
                   10392:                }
                   10393:        }
                   10394:        if(!isint(Min=getopt(min))) Min=2;
                   10395:        for(Min-=length(L);Min-->0;)
                   10396:                L=cons(48,L);
                   10397:        if(getopt(num)==1){
                   10398:                L=cons(120,L);L=cons(48,L);
                   10399:        }
                   10400:        return asciitostr(L);
                   10401: }
                   10402:
                   10403: def sjis2jis(L)
                   10404: {
                   10405:        L1=L[1];
                   10406:        if((L0=L[0])<=0x9f){
                   10407:                if(L1<0x9f) L0=L0*2-0xe1;
                   10408:                else L0=(L0*2)-0xe0;
                   10409:        }else{
                   10410:                if(L1<0x9f) L0=L0*2-0x161;
                   10411:                else L0=L0*2-0x160;
                   10412:        }
                   10413:        if(L1<0x7f) return [L0,L1-0x1f];
                   10414:        else if(L1<0x9f) return [L0,L1-0x20];
                   10415:        return [L0,L1-0x7e];
                   10416: }
                   10417:
                   10418: def jis2sjis(L)
                   10419: {
                   10420:        L1=L[1];
                   10421:        if(iand(L0=L[0],1)){
                   10422:                if(L1<0x60) L=[L1+0x1f];
                   10423:                else L=[L1+0x20];
                   10424:        }else L=[L1+0x7e];
                   10425:        if(L0<0x5f) return cons(ishift(L0+0xe1,1),L);
                   10426:        return cons(ishift(L0+0x161,1),L);
                   10427: }
                   10428:
                   10429: def verb_tex_form(P)
                   10430: {
                   10431:        L = reverse(strtoascii(rtostr(P)));
                   10432:        for(SS = []; L != []; L = cdr(L)){
                   10433:                Ch = car(L);  /* ^~\{} */
                   10434:                if(Ch == 92 || Ch == 94 || Ch == 123 || Ch == 125 || Ch == 126){
                   10435:                        SS = append([92,Ch,123,125],SS); /* \Ch{}  */
                   10436:                        if(Ch != 94 && Ch != 126)        /* \char` */
                   10437:                                SS = append([92,99,104,97,114,96],SS);
                   10438:                        continue;
                   10439:                }
                   10440:                SS = cons(Ch, SS);
                   10441:                if((Ch >= 35 && Ch <= 38) || Ch == 95)  /* #$%&_ */
                   10442:                        SS = cons(92, SS);  /* \Ch */
                   10443:        }
                   10444:        return asciitostr(SS);
                   10445: }
                   10446:
                   10447: def tex_cuteq(S,P)
                   10448: {
                   10449:        if(P==0) return 0;
                   10450:        if(S[P]==125){ /* } */
                   10451:                if((Q=str_pair(S,P-1,"{","}"|inv=1))<0) return -1;
                   10452:                if(Q<2||S[Q-1]!=95) return Q;
                   10453:                return tex_cuteq(S,Q-2);
                   10454:        }
                   10455:        if(!isalphanum(S[Q=P--])) return -1;
                   10456:        while(P>0&&isalphanum(S[P])) P--;
                   10457:        if(S[P]==92){ /* \ */
                   10458:                if(P==0) return P;
                   10459:                else P--;
                   10460:        }
                   10461:        if(S[P]!=95||P==0) return Q; /* _ */
                   10462:        return tex_cuteq(S,P-1);
                   10463: }
                   10464:
                   10465:
                   10466: def texket(S)
                   10467: {
                   10468:        if(!isint(F=getopt(all))) F=0;
                   10469:        if(type(S)==7){
                   10470:                L=str_len(S);
                   10471:                SS=strtoascii(S);
                   10472:        }else{
                   10473:                L=length(S);
                   10474:                SS=S;
                   10475:        }
                   10476:        for(T="",I=I0=0;I<L-1;){
                   10477:                J=str_char(SS,I,"(");
                   10478:                if(J<0) break;
                   10479:                if(J<L-1 && J>4 && str_str(SS,"\\left"|top=J-5,end=J-1)>=0){
                   10480:                        I=J+1;continue;
                   10481:                }
                   10482:                if((K=str_pair(SS,J+1,"(",")"))>=0){
                   10483:                        KK=str_char(SS,J+2,"(");
                   10484:                        if(KK>K||KK<0){
                   10485:                                if(F!=1){
                   10486:                                        if(!F){
                   10487:                                                for(N=J+1;N<K;N++)      /* + - _   { } */
                   10488:                                                        if(!isalphanum(P=SS[N])&&findin(P,[32,43,45,95,123,125])<0) break;
                   10489:                                        }else N=K;
                   10490:                                        if(N==K){
                   10491:                                                I=K+1;continue;
                   10492:                                        }
                   10493:                                }
                   10494:                                T=T+str_cut(SS,I0,J-1)+"\\left"+str_cut(SS,J,K-1)+"\\right)";
                   10495:                                I0=I=K+1;
                   10496:                        }else{
                   10497:                                T=T+str_cut(SS,I0,J-1)+"\\left("+texket(str_cut(SS,J+1,K-1)|all=F) +"\\right)";
                   10498:                                I0=I=K+1;
                   10499:                        }
                   10500:                }else break;
                   10501:        }
                   10502:        return T+str_cut(SS,I0,L);
                   10503: }
                   10504:
                   10505:
                   10506: def my_tex_form(S)
                   10507: {
                   10508:        if(getopt(skip) != 1){
                   10509:                if(type(S)==1 && S<0)   return "-"+print_tex_form(-S);
                   10510:                if(type(S)==6) return mtotex(S);
                   10511:                S = print_tex_form(S);
                   10512:                for(F=Top=0;(L=str_str(S,"\\verb`"|top=Top))>=0;Top=LV+1){
                   10513:                        F++;
                   10514:                        if(Top==0)      Tb = string_to_tb("");
                   10515:                        LV = str_chr(S, L+6, "`");
                   10516:                        if(LV<0)        LV=str_len(S);
                   10517:                        str_tb([my_tex_form(sub_str(S, Top, L-1)|skip=1), "\\texttt{"], Tb);
                   10518:                        str_tb([verb_tex_form(sub_str(S,L+6, LV-1)),"}"], Tb);
                   10519:                        Top=LV+1;
                   10520:                }
                   10521:                if(F>0){
                   10522:                        str_tb(my_tex_form(sub_str(S, Top,str_len(S)-1)|skip=1), Tb);
                   10523:                        return tb_to_string(Tb);
                   10524:                }
                   10525:        }
                   10526:        if(S==0) return "";
                   10527:        S = ltov(strtoascii(S));
                   10528:        L = length(S)-1;
                   10529:        while(L >= 1 && S[L] == 10)
                   10530:                L--;
                   10531:        if((Fr=getopt(frac))!=0 && Fr!=1) Fr=2;
                   10532:        for(I = L+1, T = K = 0, SS = []; --I >= 0; ){
                   10533:                if(S[I] == 32 && I!=L){
                   10534:                        if(I==L) continue;
                   10535:                        if(findin(S[I+1], [32,40,41,43,45,123,125]) >= 0  /* " ()+-{}" */
                   10536:                                || (S[I+1] >= 49 && S[I+1] <= 57))  /* 1 - 9 */
                   10537:                                        if(I == 0 || S[I-1] >= 32) continue;
                   10538:                }
                   10539:                if(Fr && S[I]>=48 && S[I]<=57){ /* 2/3 -> \tfrac{2}{3} */
                   10540:                        for(K=0,II=I; II>=0; II--){
                   10541:                                if(S[II]>=48 && S[II]<=57) continue;
                   10542:                                if(S[II]==47){  /* / */
                   10543:                                        if(K>0) break;
                   10544:                                        K=II;
                   10545:                                }else break;
                   10546:                        }
                   10547:                        if(K>II+1){
                   10548:                                SS=cons(125,SS);
                   10549:                                for(J=I; J>K; J--) SS=cons(S[J],SS);
                   10550:                                if(AMSTeX){
                   10551:                                        SS=cons(123,SS);SS=cons(125,SS);
                   10552:                                }else{
                   10553:                                        for(J=[114,101,118,111,92];J!=[];J=cdr(J))      /* \over */
                   10554:                                                SS=cons(car(J),SS);
                   10555:                                }
                   10556:                                for(J=K-1;J>II;J--) SS=cons(S[J],SS);
                   10557:                                SS=cons(123,SS);
                   10558:                                if(AMSTeX){
                   10559:                                        J=(Fr==2)?[99,97,114,102,116,92]:[99,97,114,102,92];
                   10560:                                        for(;J!=[];J=cdr(J))    /* \tfrac */
                   10561:                                                SS=cons(car(J),SS);
                   10562:                                }
                   10563:                                I=II+1;
                   10564:                        }else{
                   10565:                                for(;I>II;I--) SS = cons(S[I], SS);
                   10566:                                I++;
                   10567:                        }
                   10568:                        continue;
                   10569:                }
                   10570:                SS = cons(S[I], SS);
                   10571:        }
                   10572:        SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
                   10573:        Subst=getopt(subst);
                   10574:        Sub0=["{asin}","{acos}","{atan}"];
                   10575:        Sub1=["\\arcsin ","\\arccos","\\arctan "];
                   10576:        if(type(Subst) == 4){
                   10577:                Sub0=append(Sub0,Subst[0]);Sub1=append(Sub1,Subst[1]);
                   10578:        }
                   10579:        SS = str_subst(SS,Sub0,Sub1|raw=1);
                   10580:        S = ltov(SS);
                   10581:        L = length(S);
                   10582:        SS = [];
                   10583:        while(--L >= 0){
                   10584:                if(S[I=L] == 125){
                   10585:                        while(--I >= 0 && S[I] == 125);
                   10586:                        J = 2*I - L;
                   10587:                        if(J >= 0 && S[I] != 123){
                   10588:                                for(K = J; K < I && S[K] == 123; K++);
                   10589:                                if(K == I){
                   10590:                                        if(J-- <= 0 || S[J] < 65 || S[J] > 122 || (S[J] > 90 && S[J] < 97)){
                   10591:                                                SS = cons(S[I],SS);
                   10592:                                                L = J+1;
                   10593:                                                continue;
                   10594:                                        }
                   10595:                                }
                   10596:                        }
                   10597:                }
                   10598:                SS = cons(S[L],SS);
                   10599:        }
                   10600:        RT=getopt(root);
                   10601:        for(Top=0;;Top++){      /* ((x+1))^{y} , 1/y=2,3,...,9 */
                   10602: #if 1
                   10603:                P=str_str(SS,["))^","^{\\tfrac{1}"]|top=Top);
                   10604:                if(P[0]<0) break;
                   10605:                Sq=0;
                   10606:                if(P[0]==0){
                   10607:                        P=P[1];
                   10608:                        if((Q=str_pair(SS,P,"(",")"|inv=1))<0||SS[Q+1]!=40) continue;
                   10609:                        if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   10610:                        && SS[P+14]==125){
                   10611:                                if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   10612:                        }
                   10613:                        F=2;
                   10614:                }else{
                   10615:                        P=P[1];
                   10616:                        if(SS[P+12]!=125||(Sq=(SS[P+11]-48))<2||Sq>9) break;
                   10617:                        if(SS[P-1]==125){
                   10618:                                if((Q=str_pair(SS,P-2,"{","}"|inv=1))<0) break;
                   10619:                                if(Q>1&&SS[Q-1]==95){
                   10620:                                        if((Q=tex_cuteq(SS,Q-2))<0) break;
                   10621:                                        F=0;
                   10622:                                }else F=1;
                   10623:                        }else{
                   10624:                                if(!isalphanum(SS[Q=P-1]) || (Q=tex_cuteq(SS,Q))<0) break;
                   10625:                                F=0;
                   10626:                        }
                   10627:                        if(RT!=2&&P-Q>32) break;
                   10628:                }
                   10629: #else
                   10630:                if((P=str_str(SS,"))^"|top=Top))<0 || (Q=str_pair(SS,P,"(",")"|inv=1))<0) break;
                   10631:                else F=2;
                   10632:                Sq=0;
                   10633:                if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   10634:                   && SS[P+14]==125){
                   10635:                        if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   10636:                }
                   10637: #endif
                   10638:                for(I=0,S=[];SS!=[];SS=cdr(SS),I++){
                   10639:                        if(I==Q){
                   10640:                                if(Sq){
                   10641:                                        S=append([116,114,113,115,92],S);
                   10642:                                        if(Sq>2) S=append([93,Sq+48,91],S);
                   10643:                                        S=cons(123,S);
                   10644:                                        if(F==2) SS=cdr(SS);
                   10645:                                        else if(F==0) S=cons(car(SS),S);
                   10646:                                }else if(F==2&&P-Q==3){         /* (2)^x -> 2^x*/
                   10647:                                        SS=cdr(SS);SS=cdr(SS);
                   10648:                                        S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);
                   10649:                                        SS=cdr(SS);SS=cdr(SS);
                   10650:                                        I+=3;
                   10651:                                }
                   10652:                                continue;
                   10653:                        }else if(I==P){
                   10654:                                if(Sq){
                   10655:                                        if(F>0) S=cdr(S);
                   10656:                                        S=cons(125,S);
                   10657:                                        if(F==2) SS=cdr(SS);
                   10658:                                        for(J=0;J<12;J++) SS=cdr(SS);
                   10659:                                }
                   10660:                                continue;
                   10661:                        }
                   10662:                        S=cons(car(SS),S);
                   10663:                }
                   10664:                SS=reverse(S);
                   10665:                Top=P;
                   10666:        }
                   10667:        S=asciitostr(SS);
                   10668:        if((K=getopt(ket))==1) S=texket(S);
                   10669:        else if(K==2) S=texket(S|all=1);
                   10670:        return S;
                   10671: }
                   10672:
                   10673: def smallmattex(S)
                   10674: {
                   10675:  return str_subst(S,[["\\begin{pmatrix}","\\left(\\begin{smallmatrix}"],
                   10676:        ["\\end{pmatrix}","\\end{smallmatrix}\\right)"],
                   10677:        ["\\begin{Bmatrix}","\\left\\{\\begin{smallmatrix}"],
                   10678:        ["\\end{Bmatrix}","\\end{smallmatrix}\\right\\}"],
                   10679:        ["\\begin{bmatrix}","\\left[{\\begin{smallmatrix}"],
                   10680:        ["\\end{bmatrix}","\\end{smallmatrix}\\right]"],
                   10681:        ["\\begin{vmatrix}","\\left|\\begin{smallmatrix}"],
                   10682:        ["\\end{vmatrix}","\\end{smallmatrix}\\right|"],
                   10683:        ["\\begin{Vmatrix}","\\left\\|\\begin{smallmatrix}"],
                   10684:        ["\\end{Vmatrix}","\\end{smallmatrix}\\right\\|"],
                   10685:        ["\\begin{matrix}","\\begin{smallmatrix}"],
                   10686:        ["\\end{matrix}","\\end{smallmatrix}"]],0);
                   10687: }
                   10688:
                   10689:
                   10690: def divmattex(S,T)
                   10691: {
                   10692:        TF=["matrix","pmatrix","Bmatrix","bmatrix","vmatrix","Vmatrix"];
                   10693:        TG=[0,"(","\\{","[","|","\\|"];
                   10694:        TH=[0,")","\\}","]","|","\\|"];
                   10695:        if(type(S)!=7) S=mtotex(S);
                   10696:        S=strtoascii(S0=S);
                   10697:        if((P0=str_str(S,"\\begin{"))<0 || (P1=str_str(S,"}"|top=P0+7))<0)
                   10698:                return S0;
                   10699:        F=str_cut(S,P0+7,P1-1);
                   10700:        if((K=findin(F,TF))<0) return S0;
                   10701:        Q=str_str(S,"\\end{"+F+"}");
                   10702:        if(Q<0) return S0;
                   10703:        for(J=P1+1;S[J]<33;J++);
                   10704:        for(L0=L=[],I=J;J<Q;J++){
                   10705:                if(S[J]==38){   /* & */
                   10706:                        if(I>=J) L0=cons(0,L0);
                   10707:                        else L0=cons(str_cut(S,I,J-1),L0);
                   10708:                        I=J+1;
                   10709:                }
                   10710:                if(S[J]==92&&S[J+1]==92){ /* \\ */
                   10711:                        if(I>=J) L0=cons(0,L0);
                   10712:                        else L0=cons(str_cut(S,I,J-1),L0);
                   10713:                        L=cons(reverse(L0),L);
                   10714:                        L0=[];
                   10715:                        J++;
                   10716:                        for(I=J+1;S[I]<33;I++);
                   10717:                }
                   10718:        }
                   10719:        J--;
                   10720:        if(S[J]<33) J--;
                   10721:        if(I<=J) L0=cons(str_cut(S,I,J),L0);
                   10722:        if(length(L0)>0) L=cons(reverse(L0),L);
                   10723:        L=lv2m(reverse(L));     /* get matrix */
                   10724:        if(T==0) return L;
1.26      takayama 10725:        if(type(T)==1) T=[T];
1.6       takayama 10726:        Size=size(L);S0=Size[0];
                   10727:        if(type(T[0])!=4){
                   10728:                S1=Size[1];
                   10729:                T=append(T,[S1]);
                   10730:                for(TT=[],I=0;T!=[];T=cdr(T)){
                   10731:                        J=car(T);
                   10732:                        if(J>S1) J=S1;
                   10733:                        for(T0=[];J>I;J--) T0=cons(J-1,T0);
                   10734:                        if(T0!=[]) TT=cons(T0,TT);
                   10735:                        I=car(T);
                   10736:                }
                   10737:                T=reverse(TT);
                   10738:        }
                   10739:        SS=length(T);
                   10740:        St=str_tb(0,0);
                   10741:        if(SS==1) St=str_tb("\\begin{"+F+"}\n",St);
                   10742:        else{
                   10743:                if(K>0) St=str_tb("&\\left"+TG[K],St);
                   10744:                St=str_tb("\\begin{matrix}\n",St);
                   10745:        }
                   10746:        for(;T!=[];T=cdr(T)){
                   10747:                for(I=0;I<S0;I++){
                   10748:                        for(J=0,TT=car(T);TT!=[];TT=cdr(TT),J++){
                   10749:                                if(J>0) St=str_tb("&",St);
                   10750:                                if(L[I][car(TT)]!=0) St=str_tb(L[I][car(TT)],St);
                   10751:                        }
                   10752:                        if(I<S0-1) St=str_tb("\\\\",St);
                   10753:                        St=str_tb("\n",St);
                   10754:                }
                   10755:                if(length(T)>1)
                   10756:                        St=str_tb("\\end{matrix}\\right.\\\\\n&\\quad\\left.\\begin{matrix}\n",St);
                   10757:                else{
                   10758:                        if(SS==1) St=str_tb("\\end{"+F+"}\n",St);
                   10759:                        else St=str_tb("\\end{matrix}\\right"+TH[K]+"\n",St);
                   10760:                }
                   10761:        }
                   10762:        S=str_tb(0,St);
                   10763:        if(SS==1) return S;
                   10764:        return texbegin("align*",S);
                   10765: }
                   10766:
                   10767: def str_subst(S, L0, L1)
                   10768: {
                   10769:        if(type(S) == 7)
                   10770:                S = strtoascii(S);
                   10771:        if(type(S) == 4)
                   10772:                S = ltov(S);
                   10773:        SE = length(S);
                   10774:        if(L1 == 0){
                   10775:                for(L1 = L = [], L0 = reverse(L0); L0 != []; L0 = cdr(L0)){
                   10776:                        L  = cons(car(L0)[0], L);
                   10777:                        L1 = cons(car(L0)[1], L1);
                   10778:                }
                   10779:                L0 = L;
                   10780:        }
                   10781:        if(type(L0)==7) L0 = [strtoascii(L0)];
                   10782:        else{
                   10783:                for(LT = []; L0 != []; L0 = cdr(L0))
                   10784:                        LT = cons(strtoascii(car(L0)), LT);
                   10785:                L0 = ltov(LT);
                   10786:        }
                   10787:        E0 = length(L0);
                   10788:        if(type(L1)==7) L1 = [strtoascii(L1)];
                   10789:        else{
                   10790:                for(LT = []; L1 != []; L1 = cdr(L1))
                   10791:                        LT = cons(strtoascii(car(L1)), LT);
                   10792:                L1 = ltov(LT);
                   10793:        }
                   10794:        if(getopt(inv)==1){
                   10795:                L2=L0;L0=L1;L0=L2;
                   10796:        }
                   10797:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   10798:        for(J = JJ = 0, ST = []; J < SE; J++){
                   10799:                SP = S[J];
                   10800:                for(I = E0-1; I >= 0; I--){
                   10801:                        if(SP != L0[I][0] || J + (K = length(L0[I])) > SE)
                   10802:                                continue;
                   10803:                        while(--K >= 1)
                   10804:                                if(L0[I][K] != S[J+K]) break;
                   10805:                        if(K > 0) continue;
                   10806:                        for(KE = length(L1[I]), K = 0 ;K < KE; K++)
                   10807:                                ST = cons(L1[I][K],ST);
                   10808:                        J += length(L0[I])-1;
                   10809:                        break;
                   10810:                }
                   10811:                if(I < 0){
                   10812:                        ST = cons(S[J],ST);
                   10813:                        if(SJIS && (V=S[J])>128){
                   10814:                                if(V<160 || (V>223 && V<240)) ST = cons(S[J++],ST);
                   10815:                        }
                   10816:                }
                   10817:        }
                   10818:        if(getopt(raw)==1) return reverse(ST);
                   10819:        return asciitostr(reverse(ST));
                   10820: }
                   10821:
                   10822: def dviout0(L)
                   10823: {
                   10824:        Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas"];
                   10825:        if(type(Opt=getopt(opt))==7){
                   10826:                if((F=findin(Opt,Cmd)) < 0) return -1;
                   10827:                if(L==-1){
                   10828:                        if(F<=3){
                   10829:                                if(F==0) V=TikZ;
                   10830:                                else if(F==1) V=TeXLim;
                   10831:                                else if(F==2) V=TeXEq;
                   10832:                                else V=iand(DVIOUTF,1);
                   10833:                        }else{
                   10834:                                if(F==4) V=XYPrec;
                   10835:                                else if(F==5) V=XYcm;
                   10836:                                else if(F==6) V=XYLim;
                   10837:                                else V=Canvas;
                   10838:                        }
                   10839:                        return V;
                   10840:                }
                   10841:                if(F==0) TikZ=L;
                   10842:                else if(F==2) TeXEq=L;
                   10843:                else if(F==3){
                   10844:                        if(iand(DVIOUTF,1)==L)
                   10845:                                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   10846:                        else dviout0(4);
                   10847:                        return 1;
                   10848:                }else if(F==7&&type(L)==4)
                   10849:                        Canvas=L;
                   10850:                else if(L>0){
                   10851:                        if(F==1) TeXLim=L;
                   10852:                        else if(F==4) XYPrec=L;
                   10853:                        else if(F==5) XYcm=L;
                   10854:                        else if(F==6) XYLim=L;
                   10855:                }
                   10856:                mycat0([Cmd[F],"=",L],1);
                   10857:                return 1;
                   10858:        }
                   10859:        if(type(L) == 4){
                   10860:                for( ; L != []; L = cdr(L)) dviout0(car(L));
                   10861:                return 1;
                   10862:        }
                   10863:        if(type(L) == 7){
                   10864:                if(L=="")  dviout(" \n"|keep=1);
                   10865:                else if(L=="cls")  dviout0(0);
                   10866:                else if(L=="show") dviout(" ");
                   10867:                else if(L=="?")    dviout0(3);
                   10868:                else dviout("\\"+L+"\n"|keep=1);
                   10869:                return 1;
                   10870:        }
                   10871:        if(L == 0)
                   10872:                dviout(" "|keep=1,clear=1);
                   10873:        else if(L == 1)
                   10874:                dviout(" ");
                   10875:        else if(L == 2)
                   10876:                dviout(" "|clear=1);
                   10877:        else if(L>10)
                   10878:                dviout("\\setcounter{MaxMatrixCols}{"+rtostr(L)+"}%"|keep=1);
                   10879:        else if(L < 0)
                   10880:                dviout(" "|delete=-L,keep=1);
                   10881:        else if(L == 3){
                   10882:                mycat0(["DIROUT =\"", DIROUT,"\""],1);
                   10883:                mycat0(["DVIOUTH=\"", DVIOUTH,"\""],1);
                   10884:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   10885:                mycat0(["DVIOUTB=\"", DVIOUTB,"\""],1);
                   10886:                mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);
                   10887:                mycat(["Canvas =", Canvas]);
                   10888:                mycat(["TeXLim =", TeXLim]);
                   10889:                mycat(["TeXEq  =", TeXEq]);
                   10890:                mycat(["AMSTeX =", AMSTeX]);
                   10891:                mycat(["TikZ   =", TikZ]);
                   10892:                mycat(["XYPrec =", XYPrec]);
                   10893:                mycat(["XYcm   =", XYcm]);
                   10894:                mycat(["XYLim  =", XYLim]);
                   10895:        }else if(L==4){
                   10896:                Tmp=DVIOUTA; DVIOUTA=DVIOUTB; DVIOUTB=Tmp;
                   10897:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   10898:                DVIOUTF++;
                   10899:        }else if(L==5){
                   10900:                if(!iand(DVIOUTF,1)) dviout0(4);
                   10901:        }else if(L==6){
                   10902:                TikZ=1;mycat("TikZ=1");
                   10903:        }else if(L==7){
                   10904:                TikZ=0;mycat("TikZ=0");
                   10905:        }
                   10906:        return 1;
                   10907: }
                   10908:
                   10909: def myhelp(T)
                   10910: {
                   10911:        /* extern DVIOUT;       */
                   10912:        /* extern HDVI; */
                   10913:        /* extern DVIOUTH;      */
                   10914:
                   10915:        if(type(T)==2){
                   10916:                if(T==getbygrs){
                   10917:                        getbygrs(0,0);
                   10918:                        return 0;
                   10919:                }
                   10920:                else if(T==m2mc){
                   10921:                        m2mc(0,0);
                   10922:                        return 0;
                   10923:                }
                   10924:                else if(T==mgen){
                   10925:                        mgen(0,0,0,0);
                   10926:                        return 0;
                   10927:                }
                   10928:                else T=rtostr(T);
                   10929:        }
                   10930:        if(type(T)==4 && typeT[0]==7){
                   10931:                if(length(T)==2 && type(T[1])==1){
                   10932:                        DVIOUTH="start "+T[0]+" -"+rtostr(T[1])+"-hyper:0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #r:%LABEL%";
                   10933:                }else if(str_len(T[0])>2)       DVIOUTH=T[0];
                   10934:                mycat(["DVIOUTH="+DVIOUTH,"\nmyhelp(fn) is set!"]);
                   10935:                return 0;
                   10936:        }
                   10937:        if(T==0){
                   10938:                mycat([
                   10939:                        "myhelp(t) : show help\n",
                   10940: #ifdef USEMODULE
                   10941:                        " t : -1 (dvi), 1 (pdf) or os_md.getbygrs, os_md.m2mc, os_md.mgen\n",
                   10942: #else
                   10943:                        " t : -1 (dvi), 1 (pdf) or getbygrs, m2mc, mgen\n",
                   10944: #endif
                   10945:                        "    \"fn\"    : Help of the function fn\n",
                   10946:                        "    [path,n]  : path of dviout, n = # dviout\n",
                   10947:                        "    [DVIOUTH] : Way to jump to the help of a function\n",
                   10948:                        "       default: start dviout -2 \"%ASIRTOOT%\\help\\os_muldif.dvi\" #r:%LABEL%"
                   10949:                ]);
                   10950:                return 0;
                   10951:        }
                   10952:        if(type(T)==7){
                   10953:                if(str_str(T,"os_md.")==0) T=str_cut(T,6,str_len(T)-1);
                   10954:                Dr=str_subst(DVIOUTH,["%ASIRROOT%","%LABEL%"],[get_rootdir(),"r:"+str_subst(T,"_","")]);
                   10955:                shell(Dr);
                   10956:                return 0;
                   10957:        }
                   10958:        Dr=get_rootdir();
                   10959:        if(T==-1) Dr+="\\help\\os_muldif.dvi";
                   10960:        else Dr+="\\help\\os_muldif.pdf";
                   10961:        if(!isMs()) Dr=str_subst(Dr,"\\","/");
                   10962:        shell(Dr);
                   10963:        return 0;
                   10964: }
                   10965:
                   10966: def isMs()
                   10967: {
                   10968:        if(type(Tmp=getenv("TEMP"))!=7) {
                   10969:        if (type(Tmp=getenv("TMP")) != 7) Tmp=getenv("HOME");
                   10970:     }
                   10971:        if(type(Tmp)==7 && str_chr(Tmp,0,"\\")==2) return 1;
                   10972:        else return 0;
                   10973: }
                   10974:
                   10975: def tocsv(L)
                   10976: {
                   10977:        if(type(L)==6) L=m2ll(L);
                   10978:        else if(type(L)==5) L=vtol(L);
                   10979:        Null=getopt(null);
                   10980:        Tb=str_tb(0,0);
                   10981:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   10982:                LT=car(LL);
                   10983:                if(type(LT)==5) LT=vtol(LT);
                   10984:                if(type(LT)<4) LT=[LT];
                   10985:                for(N=0; LT!=[]; LT=cdr(LT),N++){
                   10986:                        if(N) str_tb(", ",Tb);
                   10987:                        if((T=car(LT))==Null) continue;
                   10988:                        if(type(T)==7){
                   10989:                                K=str_len(T);
                   10990:                                T=str_subst(T,["\""],["\"\""]);
                   10991:                                if(str_len(T)>K||str_char(T,0,",")>=0) T="\""+T+"\"";
                   10992:                                str_tb(T,Tb);
                   10993:                        }else str_tb(rtostr(T),Tb);
                   10994:                }
                   10995:                str_tb("\n",Tb);
                   10996:        }
1.16      takayama 10997:        S=str_tb(0,Tb);
                   10998:        if(type(EXE=getopt(exe))!=1&&EXE!=0&&type(EXE)!=7) return S;
                   10999:        if(type(F)!=7){
1.18      takayama 11000:                fcat(-1,0);
1.16      takayama 11001:                F="risaout";
                   11002:                if(EXE>=2&&EXE<=9) F+=rtostr(EXE);
                   11003:                F=DIROUTD+F+".csv";
                   11004:        }else F=S;
                   11005:        if(EXE!=0 && access(F)) remove_file(F);
                   11006:        fcat(F,S|exe=1);
                   11007:        return 1;
1.6       takayama 11008: }
                   11009:
                   11010: def readcsv(F)
                   11011: {
                   11012:        if((ID=open_file(F))<0) return -1;
                   11013:        SJIS=isMs();
                   11014:        L=[];
                   11015:        if(type(V=getopt(eval))!=4){
                   11016:                if(V=="all") V=1;
                   11017:                else if(type(V)==1) V=[V];
                   11018:                else V=[];
                   11019:        }
1.9       takayama 11020:        Eq=getopt(eq);
1.6       takayama 11021:        Sp=getopt(sp);
                   11022:        if(type(T=getopt(col))!=1) T=0;
                   11023:        Null=getopt(null);
1.9       takayama 11024:        if(type(Null)<0) Null=(Eq==1)?0:"";
1.6       takayama 11025:        while((S=get_line(ID))!=0){
                   11026:                S=strtoascii(S);
                   11027:                N=length(S);
                   11028:                for(I=J=F=0,LL=LT=[];I<N;I++){
                   11029:                        C=S[I];
                   11030:                        if(F==0){
                   11031:                                if(C<=32) continue;
                   11032:                                if(C==34){F=2;continue;}
                   11033:                                F=1;
                   11034:                        }
                   11035:                        if(F==2 && C==34){
                   11036:                                if(I<N-1&& S[I+1]==34){
                   11037:                                        LT=cons(34,LT);I++;continue;
                   11038:                                }
                   11039:                                F=-2;
                   11040:                        }
                   11041:                        if(F==1){
                   11042:                                if((C==44&&Sp!=1)||(C<=32&&Sp==1)) F=-1;
                   11043:                                else if(C<32 && C!=9) continue;
                   11044:                        }
                   11045:                        if(SJIS && I<N-1 && ((C>128 && C<160)||(C>223 && C<240))){
                   11046:                                LT=cons(C,LT);LT=cons(S[++I],LT);continue;
                   11047:                        }
                   11048:                        if(F>0){
                   11049:                                LT=cons(C,LT);continue;
                   11050:                        }
                   11051:                        LS=asciitostr(reverse(LT));
1.9       takayama 11052:                        if(V==1||findin(++J,V)>=0){
                   11053:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   11054:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   11055:                        }
1.6       takayama 11056:                        if(!T || T==J) LL=cons(LS,LL);
                   11057:                        if(F==-2) while(++I<N && Sp!=1 && S[I]!=44);
                   11058:                        F=0;LT=[];
                   11059:                }
                   11060:                if(I<=N && (Sp!=1 || length(LT)>0)){ /* lastline */
                   11061:                        LS=asciitostr(reverse(LT));
1.9       takayama 11062:                        if(V==1||findin(++J,V)>=0){
                   11063:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   11064:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   11065:                        }
1.6       takayama 11066:                        if(!T || T==J) LL=cons(LS,LL);
                   11067:                }
                   11068:                L=cons(reverse(LL),L);
                   11069:        }
                   11070:        close_file(ID);
                   11071:        if(T) L=m2l(L|flat=1);
1.16      takayama 11072:        L=reverse(L);
                   11073:        return L;
1.6       takayama 11074: }
                   11075:
                   11076: def showbyshell(S)
                   11077: {
                   11078:        Id = getbyshell(S);
                   11079:        if(Id<0) return Id;
                   11080:        while((S=get_line(Id))!=0) print(S,2);
                   11081:        return close_file(Id);
                   11082: }
                   11083:
                   11084:
                   11085: def getbyshell(S)
                   11086: {
                   11087:        /* extern DIROUT;       */
                   11088:
                   11089:        Home=getenv("HOME");
                   11090:        if(type(Home)!=7) Home="";
                   11091:        if(type(Tmp=getenv("TEMP"))!=7 && type(Tmp=getenv("TMP")) != 7)
                   11092:                Tmp=str_subst(DIROUT,["%HOME%","%ASIRROOT%"],[Home,get_rootdir()]);
                   11093:        Sep=isMs()?"\\":"/";
                   11094:        F=Tmp+Sep+"muldif.tmp";
1.16      takayama 11095:        if(type(S)<=1 && S>=0)  close_file(S);
1.6       takayama 11096:        remove_file(F);
                   11097:        if(type(S)<=1) return -1;
                   11098:        shell(S+" > \""+F+"\"");
                   11099:        return open_file(F);
                   11100: }
                   11101:
                   11102: def show(P)
                   11103: {
                   11104:        T=type(P);
                   11105:        S=P;
                   11106:        Var=getopt(opt);
                   11107:        if(Var=="verb"){
                   11108:                dviout("{\\tt"+verb_tex_form(T)+"}\n\n");
                   11109:                return;
                   11110:        }
                   11111:        if(type(Var)<0) Var=getopt(var);
                   11112:        if(T==6){
                   11113:                if((Sp=getopt(sp))==1 || Sp==2)
                   11114:                        S=mtotex(P|lim=1,small=2,sp=Sp,null=1,mat="B");
                   11115:                else if(type(Var)==4 || type(Var)==7)
                   11116:                        S=mtotex(P|lim=1,small=2,var=Var);
                   11117:                else
                   11118:                        S=mtotex(P|lim=1,small=2);
                   11119:                Size=size(P);
                   11120:                Size=(Size[0]>Size[1])?Size[0]:Size[1];
                   11121:                if(Size>10)     dviout0(Size);
                   11122:        }else if(T<=3){
                   11123:                X=0;
                   11124:                if(Var=="pfrac") X=var(P);
                   11125:                else X=getopt(pfrac);
                   11126:                if(isvar(X)){
                   11127:                                pfrac(P,X|dviout=1);
                   11128:                                return;
                   11129:                }
                   11130:                Opt=cons(["dviout",1],getopt());
                   11131:                if(type(Var)==2||type(Var)==4||type(Var)==7) fctrtos(P|option_list=Opt);
                   11132:                else{
                   11133:                        if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);
                   11134:                        else Opt=cons(["br",1],Opt);
                   11135:                        fctrtos(P|option_list=Opt);
                   11136:                }
                   11137:                return;
                   11138:        }else if(T==4){
                   11139:                if(type(Var)==4 || type(Var)==7){
                   11140:                        S=ltotex(P|option_list=getopt());
                   11141:                        if(Var=="text"){
                   11142:                                dviout(S);
                   11143:                                return;
                   11144:                        }
                   11145:                }else{
                   11146:                        for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   11147:                                LL=car(L);
                   11148:                                if(type(LL)==4){
                   11149:                                        if(F==0){
                   11150:                                                T=type(LL[0]);
                   11151:                                                if(T==4)        F=2;                    /* [[[? */
                   11152:                                                else if(T==1 || T==0)   F=1;    /* [[num,.. */
                   11153:                                        }
                   11154:                                        if(F==1){
                   11155:                                                if(length(LL)!=2 || !isint(LL[0]) || LL[0]<0 || type(LL[1])>3)
                   11156:                                                        F=-1;                                   /* [[num,rat],[num,rat],...] */
                   11157:                                        }else if(F==2){
                   11158:                                                for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   11159:                                                        LLL=car(LLT);           /* [[[num,rat],[num,rat],...],[[..],..]],....] */
                   11160:                                                        if(length(LLL)!=2 || !isint(LLL[0]) || LLL[0]<0 || type(LLL[1])>3)
                   11161:                                                                F=-1;
                   11162:                                                }
                   11163:                                        }
                   11164:                                }else if((F==0 || F==7) && type(LL)==7){
                   11165:                                        F=7;
                   11166:                                }else F=-1;
                   11167:                        }
                   11168:                        if(F==1)        S=ltotex(P|opt="spt");
                   11169:                        else if(F==2){
                   11170:                                M=mtranspose(lv2m(S));
                   11171:                                show(M|sp=1);   /* GRS */
                   11172:                                return;
                   11173:                        }else if(F==7)  S=ltotex(P|opt="spts");
                   11174:                        else{
                   11175:                                for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   11176:                                        LL=car(L);
                   11177:                                        if(type(LL)!=4){
                   11178:                                                F=-1; break;
                   11179:                                        }
                   11180:                                        for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   11181:                                                T=type(LLL=car(LLT));
                   11182:                                                if(T<7 && T!=4) F0++;
                   11183:                                                else if(T==7){
                   11184:                                                        if(str_char(LLL,0,"\\")<0) F1++;
                   11185:                                                        else F2++;
                   11186:                                                }else F=-1;
                   11187:                                        }
                   11188:                                }
                   11189:                        }
                   11190:                        if(F==0 && F0>0 && (F1+F2)>0){  /* list of list of eq and str */
                   11191:                                if(F2>0)        S=ltotex(P|opt=["cr","spts0"],str=1);
                   11192:                                else    S=ltotex(P|opt=["cr","spts"]);
                   11193:                        }else{
                   11194:                                for(S="[";;){
                   11195:                                        S+=my_tex_form(car(P));
                   11196:                                        if((P=cdr(P))==[]){
                   11197:                                                S+="]";break;
                   11198:                                        }
                   11199:                                        S+=",";
                   11200:                                }
                   11201:                        }
                   11202:                }
                   11203:        }else if(T==7){
                   11204:                if(Var=="raw" ||
                   11205:                        (Var !="eq" && str_chr(P,0,"\\")<0 && str_char(P,0,"^")<0 && str_char(P,0,"_")<0
                   11206:                        && str_char(P,0,"&")<0)){
                   11207:                                dviout(P+"\n\n");
                   11208:                                return;
                   11209:                }
                   11210:        }
                   11211:        dviout(S|eq=5);
                   11212: }
                   11213:
                   11214:
                   11215: /* options : eq = 1 - 8, clear=1, keep=1, delete=1, title=s,
                   11216:                                                 fctr=1, begin=s  */
                   11217: def dviout(L)
                   11218: {
                   11219:        /* extern AMSTeX, TeXEq, DIROUT, DVIOUTA, DVIOUTB, DVIOUTL;     */
                   11220:
                   11221:        MyEq = [
                   11222:                ["\\[\n ","\\]"],
                   11223:                ["\\begin{align}\n","\\end{align}"],
                   11224:                ["\\begin{gather}\n ","\\end{gather}"],
                   11225:                ["\\begin{multline}\n ","\\\\[-15pt]\\end{multline}"],
                   11226:                ["\\begin{align}\\begin{split}\n &","\\end{split}\\end{align}"],
                   11227:                ["\\begin{align*}\n &","\\end{align*}"],
                   11228:                ["\\begin{gather*}\n ","\\end{gather*}"],
                   11229:                ["\\begin{equation}\n ","\\end{equation}"]
                   11230:        ];
                   11231:        if(!chkfun("print_tex_form", "names.rr"))
                   11232:                return 0;
                   11233:        Home=getenv("HOME");
                   11234:        if(type(Home)!=7) Home="";
                   11235:        Dir=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],[Home,get_rootdir(),"/"]);
                   11236:        Dirout=Dir+(AMSTeX?"/out.tex":"/out0.tex");
                   11237:        Risaout=(AMSTeX)?"risaout":"risaout0";
                   11238:        Dirisa=Dir+"/"+Risaout+".tex";
                   11239:        Viewer="dviout";
                   11240:        SV=["c:/w32tex/dviout","c:/dviout"];
                   11241:        Risatex=str_subst(AMSTeX?DVIOUTA:DVIOUTL,
                   11242:                        ["%HOME%","%ASIRROOT%","%TikZ%"],[Home,get_rootdir(),rtostr(TikZ)]);
                   11243:        if(isMs() && !access(Risatex)){
                   11244:                for(TV=SV; TV!=[]; TV=cdr(TV)){
                   11245:                        VV=car(TV)+"/dviout.exe";
                   11246:                        if(access(VV)){
                   11247:                                Viewer=str_subst(VV,"/","\\");
                   11248:                                break;
                   11249:                        }
                   11250:                }
                   11251:                output(Risatex);
                   11252:                print("cd \""+str_subst(Dir,"/","\\")+"\"");
                   11253:                print("latex -src=cr,display,hbox,math,par "+Risaout);
                   11254:                print("start "+Viewer+" -1 \""+Dr+"\\tex\\"+Risaout+"\" 1000");
                   11255:                output();
                   11256:        }
                   11257:        if(access(Dirisa) == 0){
                   11258:                D0="\""+(isMs()?str_subst(Dir,"/","\\")+"\"":Dir);
                   11259:                shell("mkdir "+D0);
                   11260:                output(Dirisa);
                   11261:                if(AMSTeX){
                   11262:                        print("\\documentclass[a4paper]{amsart}");
                   11263:                        print("\\usepackage{amsmath,amssymb,amsfonts}");
                   11264:                }else
                   11265:                        print("\\documentclass[a4paper]{article}");
                   11266:                print("\\pagestyle{empty}\n\\begin{document}\n\\thispagestyle{empty}");
                   11267:                print(AMSTeX?"\\input{out}\n\\end{document}":"\\input{out0}\n\\end{document}");
                   11268:                output();
                   11269:        }
                   11270:        if((K = getopt(delete)) >= 1){  /* delete */
                   11271:                LC = 0;
                   11272:                if(type(K) == 1 && K > 10) K = 10;
                   11273:                if(type(K) == 4){
                   11274:                        K = qsort(K);
                   11275:                        LC = 1; /* specific lines */
                   11276:                }
                   11277:                Done = 1;
                   11278:                Id  = open_file(Dirout);
                   11279:                if(Id >= 0){
                   11280:                        Buf = Buf0 = Buf1 = Key = "";
                   11281:                        PE  = 0;
                   11282:                        if(type(K) == 1)
                   11283:                                BufE = newvect(K--);
                   11284:                        Dout = Dirout+"0";
                   11285:                        remove_file(Dout);
                   11286:                        output(Dout);
                   11287:                        while((S = get_line(Id)) != 0){
                   11288:                                if(LC){
                   11289:                                        while(K != [] && car(K) < LC)
                   11290:                                                K = cdr(K);
                   11291:                                        if(K == [] || car(K) > LC)
                   11292:                                                output(S);
                   11293:                                }
                   11294:                                if(Key == ""){
                   11295:                                         if((P0 = str_str(S,"\\begin{")) == 0){
                   11296:                                                 Key = sub_str(S,7,str_str(S,"}")-1);
                   11297:                                                 if(findin(Key,["align", "gather","multline", "equation","align*"]) < 0)
                   11298:                                                         Key = "";
                   11299:                                                 else{
                   11300:                                                         Key = "\\end{"+Key+"}";
                   11301:                                                         if(!LC){
                   11302:                                                                 if(Buf != ""){
                   11303:                                                                         if(PE < K)
                   11304:                                                                                 BufE[PE++] = Buf1+Buf;
                   11305:                                                                         else{
                   11306:                                                                                 if(K > 0){
                   11307:                                                                                         print(BufE[0]);
                   11308:                                                                                         for(I = 1; I < K; I++)
                   11309:                                                                                                 BufE[I-1]=BufE[I];
                   11310:                                                                                         BufE[K-1] = Buf1+Buf;
                   11311:                                                                                 }else
                   11312:                                                                                         print(Buf1+Buf);
                   11313:                                                                                 Done = 0;
                   11314:                                                                         }
                   11315:                                                                         Buf1 = Buf0;
                   11316:                                                                         Buf = Buf0 ="";
                   11317:                                                                 }
                   11318:                                                         }
                   11319:                                                 }
                   11320:                                         }
                   11321:                                         if(Key == "" && !LC) Buf0 += S;
                   11322:                                }
                   11323:                                if(Key != ""){
                   11324:                                        if(!LC) Buf += S;
                   11325:                                        if(str_str(S,Key) >= 0){
                   11326:                                                Key = "";
                   11327:                                                if(LC) LC++;
                   11328:                                        }
                   11329:                                }
                   11330:                        }
                   11331:                        output();
                   11332:                        close_file(Id);
                   11333:                }
                   11334:                if(Done==0){
                   11335:                         Id = open_file(Dout);
                   11336:                         if(Id >= 0){
                   11337:                                 remove_file(Dirout);
                   11338:                                 output(Dirout);
                   11339:                                 while((S = get_line(Id)) != 0)
                   11340:                                         print(S,0);
                   11341:                                 output();
                   11342:                                 close_file(Id);
                   11343:                         }
                   11344:                         remove_file(Dout);
                   11345:                }else L=" ";
                   11346:        }
                   11347:        if(getopt(clear) == 1 || Done == 1){  /* clear */
                   11348:                remove_file(Dirout);
                   11349:                if(L == "" || L == " "){
                   11350:                        output(Dirout);
                   11351:                        print("\\centerline{Risa/Asir}");
                   11352:                        output();
                   11353:                }
                   11354:        }
                   11355:        if(L != " "){
                   11356:                Eq=1;
                   11357:                Eqo = getopt(eq);
                   11358:                Fc = getopt(fctr);
                   11359:                if(Fc == 1 && (type(L) == 2 || type(L) == 3)){
                   11360:                        L = fctrtos(L|TeX=1);
                   11361:                        if(type(L) == 4)
                   11362:                                L = "\\fact{"+L[0]+"}{"+L[1]+"}";
                   11363:                        if(type(Eqo) != 0 && type(Eqo) !=7){
                   11364:                                Eqo=0;
                   11365:                        }
                   11366:                }
                   11367:                if(type(L) != 4 || getopt(mult) != 1)
                   11368:                        L = [L];
                   11369:                if(type(Eqo)!=7 && (Eqo<1 || Eqo>8))
                   11370:                        Eqo = (AMSTeX==1)?TeXEq:1;
                   11371:                Title = getopt(title);
                   11372:                if(type(Title) == 7){
                   11373:                        output(Dirout);
                   11374:                        print(Title);
                   11375:                        output();
                   11376:                }
                   11377:                Sb = getopt(subst);
                   11378:                for( ; L != []; L = cdr(L)){
                   11379:                        Eq = 1;
                   11380:                        if(type(LT=car(L)) != 7 && type(LT) != 21)
                   11381:                                LT = my_tex_form(LT);
                   11382:                        else if(type(getopt(eq)) < 0)
                   11383:                                Eq = 0;
                   11384:                        if(type(Sb) == 4)
                   11385:                                LT = str_subst(LT,Sb[0],Sb[1]);
                   11386:                        output(Dirout);
                   11387:                        if(Eq == 1){
                   11388:                                if(type(Eqo)==7)
                   11389:                                        print(texbegin(Eqo,LT));
                   11390:                                else if(Eqo >= 1 && Eqo <= 8){
                   11391:                                        mycat0([MyEq[Eqo-1][0],LT,"%"],1);
                   11392:                                        print(MyEq[Eqo-1][1]);
                   11393:                                }else print(LT);
                   11394:                        }else print(LT);
                   11395:                        output();
                   11396:                }
                   11397:        }
                   11398:        if(str_char(Risatex,0," ")>=0 && str_char(DVIOUTA,0," ")<0 && str_char(DVIOUTB,0," ")<0
                   11399:         && str_char(DVIOUTL,0," ")<0)
                   11400:                Risatex="\""+Risatex+"\"";
                   11401:        if(getopt(keep) != 1) shell(Risatex);
                   11402:        return 1;
                   11403: }
                   11404:
                   11405: def rtotex(P)
                   11406: {
                   11407:        S = my_tex_form(P);
                   11408:        return (str_len(S) == 1)?S:"{"+S+"}";
                   11409: }
                   11410:
                   11411: def mtotex(M)
                   11412: {
                   11413:        /* extern TexLim;       */
                   11414:
                   11415:        MB=mat(["(",")","p"],["\\{","\\}","B"],["[","]","b"],["|","|","v"],
                   11416:                ["\\|","\\|","V"], [".",".",""]);
                   11417:        if(type(MT=getopt(mat))==7){
                   11418:                MT=findin(MT,["p","B","b","v","V",""]);
                   11419:                if(MT<0)        MT=0;
                   11420:        }
                   11421:        else MT=0;
                   11422:        MT=MB[MT];
                   11423:        if((F=getopt(small))!=1 && F!=2) F=0;
                   11424:        Lim=getopt(lim);
                   11425:        if(type(Lim)==1){
                   11426:                 if(Lim<30 && Lim!=0) Lim = TexLim;
                   11427:        }else Lim=0;
                   11428:        FL=getopt(len);
                   11429:        Rw=getopt(raw);
                   11430:        Sp=getopt(sp);
                   11431:        Idx=getopt(idx);
                   11432:        if(type(Idx)==4) Idx=ltov(Idx);
                   11433:        if(type(Idx)==6 && length(Idx)==0)      Idx=-1;
                   11434:        Var=getopt(var);
                   11435:        if(Lim>0) FL=1;
                   11436:        Null=getopt(null);
                   11437:        if(Null!=1 && Null!=2) Null=0;
                   11438:        if(type(M)==5) M=lv2m([V]);
                   11439:        else if(type(M)!=6) return monototex(M);
                   11440:        S=size(M);
                   11441:        if(FL==1){
                   11442:                L=newmat(S[0],S[1]);    LL=newvect(S[1]);
                   11443:        }
                   11444:        SS=newmat(S[0],S[1]);
                   11445:        for(I=0; I<S[0]; I++){
                   11446:                for(J=0; J<S[1]; J++){
                   11447:                        if(type(P=M[I][J])<=3){
                   11448:                                if(P!=0 || Null == 0 || (Null==2 && I==J)){
                   11449:                                        SS[I][J]=(type(Var)>1)?fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);
                   11450:                                        if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)
                   11451:                                                SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);
                   11452:                                }
                   11453:                        }else if(type(P)==6){
                   11454:                                ST= mtotex(P|small=1,len=1);
                   11455:                                SS[I][J]=ST[0];
                   11456:                                L[I][J]=ST[1];
                   11457:                        }else if(type(P)==7){
                   11458:                                if(Rw==1)       SS[I][J]=P;
                   11459:                                else            SS[I][J]="\\text{"+P+"\}";
                   11460:                        }else if(type(P)==4 && length(P)==2 && P[0]>0 && (Sp==1 || Sp==2)){
                   11461:                                if(P[0]==1){
                   11462:                                        SS[I][J]=fctrtos(P[1]|TeX=2,lim=0);
                   11463:                                }else{
                   11464:                                        ST=my_tex_form(P[0]);
                   11465:                                        if(Sp==2)       ST="("+ST+")";
                   11466:                                        SS[I][J]="["+fctrtos(P[1]|TeX=2,lim=0)+"]_";
                   11467:                                        if(str_len(ST)<2)       SS[I][J]+=ST;
                   11468:                                        else    SS[I][J]+="{"+ST+"}";
                   11469:                                }
                   11470:                        }else
                   11471:                                SS[I][J]=my_tex_form(P);
                   11472:                        if(FL==1) L[I][J]=texlen(SS[I][J]);
                   11473:                }
                   11474:        }
                   11475:        if(Lim>0 || FL==1){
                   11476:                for(LLL=J=0; J<S[1];J++){
                   11477:                        for(I=K=0; I<S[0];I++){
                   11478:                                if(K<L[I][J])   K=L[I][J];
                   11479:                        }
                   11480:                        LLL+=(LL[J]=K);
                   11481:                }
                   11482:        }
                   11483:        if(Lim>0){
                   11484:                if(F==2 && LLL>Lim-2*S[1]-2)    F=1;
                   11485:                if(F==1)
                   11486:                        Lim=idiv(Lim*6,5);
                   11487:                if(LLL<=Lim-(2-F)*S[I]-2)       Lim=0;
                   11488:        }
                   11489:        Mat=(F==1)?"smallmatrix}":"matrix}";
                   11490:        if(F==1)        Out=str_tb("\\left"+MT[0]+"\\begin{",0);
                   11491:        else            Out=str_tb((Lim==0)?"\\begin{"+MT[2]:"\\left"+MT[0]+"\\begin{",0);
                   11492:        Out = str_tb(Mat,Out);
                   11493:        for(I=II=LT=0; II<=S[0]; II++){
                   11494:                if(Lim==0) II=S[0];
                   11495:                if(II<S[0]){
                   11496:                        K=LL[II]+(2-F);
                   11497:                        if(I==II){
                   11498:                                LT+=K;
                   11499:                                continue;
                   11500:                        }
                   11501:                        if(LT+K<Lim-2)  continue;
                   11502:                        LT=K;
                   11503:                }
                   11504:                for(I0=I; I<II; I++){
                   11505:                        if(I==I0){
                   11506:                                str_tb((I==0)?
                   11507:                                  "\n ":
                   11508:                                  "\\right.\\\\\n \\allowdisplaybreaks\\\\\n &\\ \\left.\\begin{"+Mat+"\n ", Out);
                   11509:                                if(Idx==1||Idx==0||type(Idx)==5){
                   11510:                                        for(J=I; J<II; J++){
                   11511:                                                if(type(Idx)!=4)
                   11512:                                                        str_tb("("+rtostr(J+Idx)+")",Out);
                   11513:                                                else{
                   11514:                                                        JJ=length(Idx)-1;
                   11515:                                                        if(J<JJ) JJ=J;
                   11516:                                                        str_tb(my_tex_form(Idx[JJ]),Out);
                   11517:                                                }
                   11518:                                                if(J<II) str_tb(" & ",Out);
                   11519:                                        }
                   11520:                                        str_tb("\\\\\n ",Out);
                   11521:                                }
                   11522:                        }
                   11523:                        else str_tb("\\\\\n ",Out);
                   11524:                        for(J=0; J<S[1]; J++){
                   11525:                                if(J!=0) str_tb(" & ",Out);
                   11526:                                if(type(SS[I][J])==7)   str_tb(SS[I][J],Out);
                   11527:                        }
                   11528:                }
                   11529:                Out=str_tb("\n\\end{", Out);
                   11530:                if(II==S[0])    Out=str_tb((Lim==0&&F!=1)?MT[2]+Mat:Mat+"\\right"+MT[1],Out);
                   11531:                else                    Out=str_tb(Mat+"\\right.",Out);
                   11532:        }
                   11533:        SS = str_tb(0,Out);
                   11534:        if(FL!=1)       return SS;
                   11535:        if(F==1)        LLL=idiv((LLL+S[1])*5+13,6);
                   11536:        else LLL+=2*(1+S[1]);
                   11537:        return [SS,LLL];
                   11538: }
                   11539:
                   11540: def sint(N,P)
                   11541: {
1.11      takayama 11542:     if( type(N)==1 || N==0 ) {
1.6       takayama 11543:                NT=ntype(N);
                   11544:                if((type(Opt=getopt(str))==1 || Opt==0) && Opt>=0 && P>=0){
                   11545:                        if(Opt==2 || Opt==4 || Opt==0){
1.11      takayama 11546:                                if(N==0) return (Opt>0)?"0":0;
1.6       takayama 11547:                                Pw=0;
                   11548:                                if(NT==4){
                   11549:                                        NN=abs(real(N));N1=abs(imag(N));
                   11550:                                        if(NN<N1) NN=N1;
                   11551:                                }else NN=abs(N);
                   11552:                                while(NN<1 && NN>-1){
                   11553:                                        Pw--;
                   11554:                                        N*=10;NN*=10;
                   11555:                                }
                   11556:                                while(N>=10 || N<=-10){
                   11557:                                        Pw++;
                   11558:                                        N/=10;NN/=10;
                   11559:                                }
                   11560:                                if(Opt==0) return sint(N*10^Pw,P-Pw-1);
                   11561:                                S=(getopt(sqrt)==1)?sint(N,P|str=(Opt==4)?3:1,sqrt=1):sint(N,P|str=(Opt==4)?3:1);
                   11562:                                if(Pw==0) return S;
                   11563:                                if(NT==4)
                   11564:                                        S="("+S+")";
                   11565:                                if(Pw==1){
                   11566:                                        if(Opt==2)
                   11567:                                                return S+"*10";
                   11568:                                        else
                   11569:                                                return S+"\\times10";
                   11570:                                }
                   11571:                                if(Opt==2)
                   11572:                                        return S+"*10^("+rtostr(Pw)+")";
                   11573:                                else
                   11574:                                        return S+"\\times10^{"+rtostr(Pw)+"}";
                   11575:                        }
                   11576:                        if(NT==4){
                   11577:                                NN=real(N);
                   11578:                                if(NN!=0){
                   11579:                                        S=sint(NN,P|str=1);
                   11580:                                        if(imag(N)>0) S=S+"+";
                   11581:                                }
                   11582:                                else S="";
                   11583:                                S=S+sint(imag(N),P|str=1)+((Opt==3)?((getopt(sqrt)==1)?"\\sqrt{-1}":"i"):"@i");
                   11584:                                return S;
                   11585:                        }
                   11586:                        if(N<0){
                   11587:                                N=-N;
                   11588:                                Neg="-";
                   11589:                        }else Neg="";
1.11      takayama 11590:                        N=rint(N*10^P)/10^P;
1.6       takayama 11591:                        NN=floor(N);
1.11      takayama 11592:                        NV=(N-NN+1)*10^P;
1.6       takayama 11593:                        NS=rtostr(NN);
                   11594:                        if(P<=0) return Neg+NS;
                   11595:                        if(NN==0 && getopt(zero)==0) NS="";
1.11      takayama 11596:                        return Neg+NS+"."+str_cut(rtostr(NV),1,P);
1.6       takayama 11597:                }
                   11598:                if(NT==4)
                   11599:                        return sint(real(N),P)+sint(imag(N),P)*@i;
                   11600:         X = rint( N*10^P );
1.11      takayama 11601:         return deval(X/10^P);
1.6       takayama 11602:        }
                   11603:     if( (type(N)==2) || (type(N)==3) ){
                   11604:                NN = eval(N);
                   11605:                if( type(NN)==1 )
                   11606:                        return sint(NN,P|option_list=getopt());
                   11607:                else return N;
                   11608:        }
1.8       takayama 11609:     if( type(N)>3 && type(N) < 7)
1.6       takayama 11610: #ifdef USEMODULE
                   11611:         return mtransbys(os_md.sint,N,[P]|option_list=getopt());
                   11612: #else
                   11613:         return mtransbys(sint,N,[P]|option_list=getopt()));
                   11614: #endif
1.8       takayama 11615:        return N;
1.6       takayama 11616: }
                   11617:
                   11618: def frac2n(N)
                   11619: {
                   11620:        if((T=type(N))<0) return N;
                   11621:        E=(getopt(big)==1)?eval(@e):0.1;
                   11622:        if(T==1){
1.15      takayama 11623:                if(ntype(N)==0) return (E*N)/E;
1.6       takayama 11624:                else if(ntype(N)!=4) return N;
1.15      takayama 11625:                else return (E*(1+@i)*N)/(E*(1+@i));
1.6       takayama 11626:        }
                   11627:        if(T==3||T==2){
                   11628:                N=red(N);
                   11629:                Nm=nm(N);Var=vars(Nm);V=car(Var);K=length(Var);
                   11630:                for(S=0,I=mydeg(Nm,V);I>=0;I--) S+=frac2n(mycoef(Nm,I,V))*V^I;
                   11631:                return S/dn(N);
                   11632:        }
1.15      takayama 11633:        if(T<4) return (E*N)/E;
1.6       takayama 11634: #ifdef USEMODULE
                   11635:         return mtransbys(os_md.frac2n,N,[]|option_list=getopt());
                   11636: #else
                   11637:         return mtransbys(frac2n,N,[]|option_list=getopt());
                   11638: #endif
                   11639: }
                   11640:
                   11641: def xyproc(F)
                   11642: {
                   11643:        if(type(Opt=getopt(opt))!=7) Opt="";
                   11644:        if(type(Env=getopt(env))!=7)
                   11645:                Env=(!TikZ)?"xy":"tikzpicture";
                   11646:        if(F==1)
                   11647:                return(Opt=="")?"\\begin{"+Env+"}\n":"\\begin{"+Env+"}["+Opt+"]\n";
                   11648:        if(F==0) return "\\end{"+Env+"}\n";
                   11649:        if(type(F)==7){
                   11650:                F=xyproc(1|opt=Opt,env=Env)+F+xyproc(0|env=Env);
                   11651:                if(getopt(dviout)==1) dviout(F);
                   11652:                else return F;
                   11653:        }
                   11654: }
                   11655:
                   11656: def xypos(P)
                   11657: {
                   11658:        if(type(P[0])==7){
                   11659:                if(P[0]=="") S="";
                   11660:                else S=(!TikZ)?"\""+P[0]+"\"":"("+P[0]+")";
                   11661:        }
                   11662:        else{
                   11663:                if(TikZ==0 && XYcm==1){
                   11664:                        X=sint(P[0]*10,XYPrec); Y=sint(P[1]*10,XYPrec);
                   11665:                }else{
                   11666:                        X=sint(P[0],XYPrec); Y=sint(P[1],XYPrec);
                   11667:                }
                   11668:                S="("+rtostr(X)+","+rtostr(Y)+")";
                   11669:        }
                   11670:        if(!TikZ){
                   11671:                if(length(P)>2 && (PP=P[2])!=""){
                   11672:                        S=S+" *";
                   11673:                        if(type(PP)==4 && length(PP)==2 && type(PP[0])==7){
                   11674:                                S=S+PP[0];
                   11675:                                PP=PP[1];
                   11676:                        }
                   11677:                        if(type(PP)==7){
                   11678:                                L=str_len(PP);
                   11679:                                if(str_chr(PP,0,"$")==0 && str_chr(PP,L-1,"$")==L-1){
                   11680:                                        PP=str_cut(PP,1,L-2);
                   11681:                                }else S+="\\txt";
                   11682:                        }
                   11683:                        else PP=my_tex_form(PP);
                   11684:                        S=S+"{"+PP+"}";
                   11685:                }
                   11686:                if(length(P)>3){
                   11687:                        if(type(P[3])==7 && P[3]!="") S=S+"=\""+P[3]+"\"";
                   11688:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   11689:                }
                   11690:        }else{
                   11691:                T="";
                   11692:                if(length(P)>2 && (PP=P[2])!=""){
                   11693:                        F=1;
                   11694:                        if(type(PP)==4){
                   11695:                                if(length(PP)==2 && type(PP[0])==7){
                   11696:                                        T="["+PP[0]+"]";
                   11697:                                        PP=PP[1];
                   11698:                                }
                   11699:                        }
                   11700:                        if(type(PP)!=7) PP="$"+my_tex_form(PP)+"$";
                   11701:                        S=S+"{"+PP+"}";
                   11702:                }else F=0;
                   11703:                if(length(P)>3){
                   11704:                        if(type(P[3])==7 && P[3]!="") T=T+"("+P[3]+")";
                   11705:                        else if(P[3]==1) T=T+"(_)";
                   11706:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   11707:                }
                   11708:                if(length(P)>2){
                   11709:                        if(F) S="node"+T+" at"+S;
                   11710:                        else  S="coordinate"+T+" at"+S;
                   11711:                }
                   11712:        }
                   11713:        return S;
                   11714: }
                   11715:
                   11716: def xyput(P)
                   11717: {
                   11718:        if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){
                   11719:                if(type(Sc)==1) Sc=[Sc,Sc];
                   11720:                Sx=Sc[0];Sy=Sc[1];
                   11721:                if(length(P)>2)
                   11722:                        P1=cons(Sy*P[1],cdr(cdr(P)));
                   11723:                else P1=[Sy*P[1]];
                   11724:                P=cons((type(P[0])==7)?P[0]:(Sx*P[0]),P1);
                   11725:        }
                   11726:        if(!TikZ) return "{"+xypos(P)+"};\n";
                   11727:        return "\\"+xypos(P)+";\n";
                   11728: }
                   11729:
                   11730: def xyline(P,Q)
                   11731: {
                   11732:        if(!TikZ)       return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";
                   11733:        if(type(T=getopt(opt))!=7) T="";
                   11734:        else T="["+T+"]";
                   11735:        if(length(P)<3 && length(Q)<3)
                   11736:                return "\\draw"+T+xypos(P)+"--"+xypos(Q)+";\n";
                   11737:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   11738:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   11739:                P=[P[0],P[1],P[2],"_0"];
                   11740:        else if(length(P)>4 && P[3]=="")
                   11741:                P=[P[0],P[1],P[2],"_0",P[4]];
                   11742:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   11743:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   11744:                Q=[Q[0],Q[1],Q[2],"_1"];
                   11745:        else if(length(Q)>4 && Q[3]=="")
                   11746:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   11747:        return "\\draw "+T+xypos(P)+" "+xypos(Q)+"("+P[3]+")--("+Q[3]+");\n";
                   11748: }
                   11749:
                   11750: def xylines(P)
                   11751: {
                   11752:        Lf=getopt(curve);
                   11753:        if(type(Lf)!=1) Lf=0;
                   11754:        SS=getopt(opt);
                   11755:        SF=(SS==0)?1:0;
                   11756:        if((Proc=getopt(proc))==1||Proc==2||Proc==3){
                   11757:                OL=cons(["opt",0],delopt(getopt(),["opt","proc"]));
                   11758:                R=xylines(P|option_list=OL);
                   11759:                OP=(type(SS)<0)?[]:((type(SS)==4)?[["opt",SS[0]],["cmd",SS[1]]]:[["opt",SS]]);
                   11760:                return [1,OP,R];
                   11761:        }
                   11762:        if(type(SS)!=7 && type(SS)!=4){
                   11763:                if(Lf==0 && !TikZ) SS="@{-}";
                   11764:                else SS="";
                   11765:        }
                   11766:        if(type(Sc=getopt(scale))==1 || type(Sc)==4){
                   11767:                if(type(Sc)==1) Sc=[Sc,Sc];
                   11768:                Sx=Sc[0];Sy=Sc[1];
                   11769:                if(Sx!=1 || Sy!=1){
                   11770:                        for(PP=[], P0=P; P0!=[]; P0=cdr(P0)){
                   11771:                                PT=car(P0);
                   11772:                                if((type(PT)!=4 && type(PT)!=5) || (type(PT[0])!=1 && PT[0]!=0))
                   11773:                                        PP=cons(PT,PP);
                   11774:                                else{
                   11775:                                        if(length(PT)>2 && type(PT)==4)
                   11776:                                                P1=cons(Sy*PT[1],cdr(cdr(PT)));
                   11777:                                        else P1=[Sy*PT[1]];
                   11778:                                        PP=cons(cons(Sx*PT[0],P1),PP);
                   11779:                                }
                   11780:                        }
                   11781:                        P=reverse(PP);
                   11782:                }
                   11783:        }
                   11784:        if(type(Cl=CL0=getopt(close))!=1) Cl=0;
                   11785:        if((Vb=getopt(verb))!=1&&type(Vb)!=4) Vb=0;
                   11786:        if(type(Lf)!=1 || Lf==0){       /* lines */
                   11787:                if(TikZ||SF){
                   11788:                        for(L=[],F=0,PT=P;PT!=[];PT=cdr(PT)){
                   11789:                                if(type(car(PT))<4){
                   11790:                                        L=cons(car(PT),L);
                   11791:                                        F=0;
                   11792:                                }else{
                   11793:                                        if(F++>1) L=cons(1,L);
                   11794:                                        L=cons(car(PT),L);
                   11795:                                }
                   11796:                        }
                   11797:                        if(Cl==1){
                   11798:                                L=cons(1,L);L=cons(-1,L);
                   11799:                        }
                   11800:                        if(L) L=reverse(L);
                   11801:                        if(SF) return L;
                   11802:                        if(type(SS)!=4) S=xybezier(L|opt=SS);
                   11803:                        else S=xybezier(L|opt=SS[0],cmd=SS[1]);
                   11804:
                   11805:                }else{
                   11806:                        Out = str_tb(0,0);
                   11807:                        for(PT=P; PT!=[]; ){
                   11808:                                PS1=car(PT);
                   11809:                                PT=cdr(PT);
                   11810:                                if(PT==[]){
                   11811:                                        if(Cl==1)       PS2=car(P);
                   11812:                                        else PS2=0;
                   11813:                                }else PS2=car(PT);
                   11814:                                str_tb(xyarrow(PS1,PS2|opt=SS),Out);
                   11815:                        }
                   11816:                        S=str_tb(0,Out);
                   11817:                }
                   11818:        }else if(Lf==2){        /* B-spline */
                   11819:                if(SF) return P;
                   11820:                if(!TikZ){
                   11821:                        Out = str_tb("{\\curve{",0);
                   11822:                        for(PT=P;PT!=[];PT=cdr(PT)){
                   11823:                                if(car(PT)==0){
                   11824:                                        str_tb("}};\n{\\curve{",Out);
                   11825:                                        continue;
                   11826:                                }
                   11827:                                if(PT!=P) str_tb("&",Out);
                   11828:                                str_tb(xypos([car(PT)[0],car(PT)[1]]),Out);
                   11829:                        }
                   11830:                        str_tb("}};\n",Out);
                   11831:                        S=str_tb(0,Out);
                   11832:                }else Out=str_tb(xybezier(P|opt=SS),0);
                   11833:                for(I=0;I<2;I++){
                   11834:                        Q=car(P);
                   11835:                        if(length(Q)>2)
                   11836:                                str_tb(xyput(Q),Out);
                   11837:                        P=reverse(P);
                   11838:                }
                   11839:                S=str_tb(0,Out);
                   11840:        }else{          /* extended Bezier */
                   11841:                RTo=getopt(ratio);
                   11842:                if(type(Acc=getopt(Acc))!=1) Acc=0;
                   11843:                if(type(RTo)!=1 || RTo>1.5 || RTo<0.001) RTo=0;
                   11844:                if(Cl==1){
                   11845:                        PR=reverse(P);
                   11846:                        PT=car(PR);
                   11847:                        PR=cons(P[0],PR);
                   11848:                        PR=cons(P[1],PR);
                   11849:                        P=cons(PT,reverse(PR));
                   11850:                }else if(Cl==-1) Cl=1;
                   11851:                for(L=P2=P3=0,PT=P;;){
                   11852:                        P1=P2;P2=P3;P3=P4;
                   11853:                        P4=(PT==[])?0:car(PT);
                   11854:                        if(PT==[] && (Cl==1 || P3==0)) break;
                   11855:                        PT=cdr(PT);
                   11856:                        if(P3==0)       str_tb("%\n", Out);
                   11857:                        if(P2==0 || P3==0 || (Cl==1 && P1==0)) continue;
                   11858:                        if(L!=0){
                   11859:                                if(car(L)==P2)
                   11860:                                        L=cons(1,L);
                   11861:                                else{
                   11862:                                        L=cons(0,L); L=cons(P2,L);
                   11863:                                }
                   11864:                        }else L=[P2];
                   11865:                        X=P3[0]-P2[0];Y=P3[1]-P2[1];
                   11866:                        DL1=DL2=0;DL=Acc?sqrt(X^2+Y^2):dsqrt(X^2+Y^2);
                   11867:                        if(P4!=0){
                   11868:                                XD1=P4[0]-P2[0];YD1=P4[1]-P2[1];DL1=Acc?sqrt(XD1^2+YD1^2):dsqrt(XD1^2+YD1^2);
                   11869:                        }
                   11870:                        if(P1!=0){
                   11871:                                XD2=P3[0]-P1[0];YD2=P3[1]-P1[1];DL2=Acc?sqrt(XD2^2+YD2^2):dsqrt(XD2^2+YD2^2);
                   11872:                        }
                   11873:                        if(RTo!=0)
                   11874:                                R=RTo;
                   11875:                        else if(DL1>0 && DL2>0){
                   11876:                                Cos=(XD1*XD2+YD1*YD2)/(DL1*DL2);
                   11877:                                RT=4/(3*(Acc?sqrt((1+Cos)/2):dsqrt((1+Cos)/2))+3);
                   11878:                                R=DL*RT/(DL1+DL2);
                   11879:                        }else if(DL1!=0)
                   11880:                                R=DL/(2*DL1);
                   11881:                        else if(DL2!=0)
                   11882:                                R=DL/(2*DL2);
                   11883:                        if(DL2!=0)      L=cons([P2[0]+R*XD2,P2[1]+R*YD2],L);
                   11884:                        if(DL1!=0)      L=cons([P3[0]-R*XD1,P3[1]-R*YD1],L);
                   11885:                        L=cons([P3[0],P3[1]],L);
                   11886:                }
                   11887:                if(CL0==1) L=cons(-1,cdr(L));
                   11888:                if(L!=0) L=reverse(L);
                   11889:                if(SF) return L;
                   11890:                if(type(SS)==4)
                   11891:                        S=xybezier(L|opt=SS[0],cmd=SS[1],verb=Vb);
                   11892:                else
                   11893:                        S=xybezier(L|opt=SS,verb=Vb);
                   11894:        }
                   11895:        if(getopt(dviout)!=1) return S;
                   11896:        xyproc(S|dviout=1);
                   11897: }
                   11898:
                   11899: def saveproc(S,Out)
                   11900: {
                   11901:        if(type(Out)==4){
                   11902:                Out=cons(S,Out);
                   11903:                return Out;
                   11904:        }else{
                   11905:                str_tb(S,Out);
                   11906:                return Out;
                   11907:        }
                   11908: }
                   11909:
1.18      takayama 11910: def xygrid(X,Y)
                   11911: {
                   11912:        for(RR=[],I=0,Z=X;I<2;I++){
1.19      takayama 11913:                U=Z[2];L=LL=[];M=Z[3];
                   11914:                if(Z[1]==1||Z[1]==-1){
1.18      takayama 11915:                        if(type(M)==4) L=M;
                   11916:                        else{
1.19      takayama 11917:                                if(U*(-dlog(1-1/20)/dlog(10))>=M){
1.18      takayama 11918:                                        L=cons([1,2,1/10],L);
1.19      takayama 11919:                                        LL=cons([1,2,1/2],LL);
                   11920:                                }else if(U*(-dlog(1-1/10)/dlog(10))>=M)
1.18      takayama 11921:                                        L=cons([1,2,1/5],L);
                   11922:                                else if(U*(-dlog(1-1/4)/dlog(10))>=M)
                   11923:                                        L=cons([1,2,1/2],L);
1.19      takayama 11924:                                if(U*(-dlog(1-1/50)/dlog(10))>=M){
1.18      takayama 11925:                                        L=cons([2,5,1/10],L);
1.19      takayama 11926:                                        LL=cons([2,5,1/2],LL);
                   11927:                                }else if(U*(-dlog(1-1/25)/dlog(10))>=M)
1.18      takayama 11928:                                        L=cons([2,5,1/5],L);
                   11929:                                else if(U*(-dlog(1-1/10)/dlog(10))>=M)
                   11930:                                        L=cons([2,5,1/2],L);
1.19      takayama 11931:                                if(U*(-dlog(1-1/100)/dlog(10))>=M){
1.18      takayama 11932:                                        L=cons([5,10,1/10],L);
1.19      takayama 11933:                                        LL=cons([5,10,1/2],LL);
                   11934:                                }
1.18      takayama 11935:                                else if(U*(-dlog(1-1/50)/dlog(10))>=M)
                   11936:                                        L=cons([5,10,1/5],L);
                   11937:                                else if(U*(-dlog(1-1/20)/dlog(10))>=M)
                   11938:                                        L=cons([5,10,1/2],L);
1.19      takayama 11939:                                L=cons(L,cons(LL,[[[1,10,1]]]));
1.18      takayama 11940:                        }
                   11941:                        R=scale(L|scale=U);
1.19      takayama 11942:                        if(Z[1]==-1){
                   11943:                                for(LL=[];R!=[];R=cdr(R)){
                   11944:                                        for(L=[],T=car(R);T!=[];T=cdr(T)) L=cons(U-car(T),L);
                   11945:                                        LL=cons(reverse(L),LL);
                   11946:                                }
                   11947:                                R=reverse(LL);
                   11948:                        }
1.18      takayama 11949:                }else if(Z[1]==0){
                   11950:                        if(type(M)==4){
                   11951:                                R=scale(M|f=x,scale=U);
                   11952:                        }else{
                   11953:                                V=0;
                   11954:                                if(U/10>=M) V=1/10;
                   11955:                                else if(U/5>=M) V=1/5;
                   11956:                                else if(U/2>=M) V=1/2;
                   11957:                                R=[];
                   11958:                                if(V>0){
                   11959:                                        UU=U*V;
                   11960:                                        for(R=[],J=UU;J<U;J+=UU) R=cons(J,R);
                   11961:                                }
1.19      takayama 11962:                                if(V==1/10) L=[U/2];
                   11963:                                else L=[];
                   11964:                                R=cons(R,cons(L,[[0,U]]));
1.18      takayama 11965:                        }
                   11966:                }else if(type(Z[1])==4){
                   11967:                        R=Z[1];
1.19      takayama 11968:                        if(length(R)==0||type(R[0])!=4) R=[[],[],R];
1.18      takayama 11969:                }else return 0;
1.19      takayama 11970:                K=length(R);
                   11971:                S=newvect(K);
                   11972:                for(J=0;J<K;J++){
                   11973:                        for(S[J]=[],JJ=0;JJ<=Z[0];JJ+=U){
                   11974:                                for(P=R[J];P!=[];P=cdr(P))
                   11975:                                        if(car(P)+JJ<=Z[0]) S[J]=cons(car(P)+JJ,S[J]);
                   11976:                        }
                   11977:                }
                   11978:                for(J=0;J<K;J++) S[J]=lsort(S[J],[],1);
                   11979:                for(U=[],J=K-1;J>0;J--){
                   11980:                        U=lsort(S[J],U,0);S[J-1]=lsort(S[J-1],U,1);
1.18      takayama 11981:                }
1.19      takayama 11982:                RR=cons(vtol(S),RR);
1.18      takayama 11983:                Z=Y;
                   11984:        }
                   11985:        if((Raw=getopt(raw))==1) return RR;
                   11986:        SS=[];
                   11987:        if(type(Sf=getopt(shift))==7){
                   11988:                Sx=Sf[0];Sy=Sf[1];
                   11989:        }else Sx=Sy=0;
                   11990:        for(I=0;I<2;I++){
                   11991:                for(S0=[],L=RR[I];L!=[];L=cdr(L)){
                   11992:                        for(S=[],T=car(L);T!=[];T=cdr(T)){
                   11993:                                if(S!=[]) S=cons(0,S);
                   11994:                                if(I==0){
                   11995:                                        S=cons([X[0]+Sx,car(T)+Sy],S);
                   11996:                                        S=cons([Sx,car(T)+Sy],S);
                   11997:                                }else{
                   11998:                                        S=cons([car(T)+Sx,Y[0]+Sy],S);
                   11999:                                        S=cons([car(T)+Sx,Sy],S);
                   12000:                                }
                   12001:                        }
                   12002:                        S0=cons(S,S0);
                   12003:                }
                   12004:                SS=cons(reverse(S0),SS);
                   12005:        }
                   12006:        SS=reverse(SS);
                   12007:        if(Raw==2) return SS;
                   12008:        if(length(Y)<5) T=[["",""]];
                   12009:        else if(type(Y[4])==4) T=[Y[4]];
                   12010:        else T=[Y[4],Y[4]];
                   12011:        if(length(X[4])==4) T=cons([""],T);
                   12012:        else if(type(X[4])==4) T=cons(X[4],T);
                   12013:        else T=cons([X[4]],T);
                   12014:        for(Sx=Sy=[],I=0;I<2;I++){
                   12015:                TT=T[I];
                   12016:                for(V=SS[I];V!=[];V=cdr(V)){
                   12017:                        Op=car(TT);
                   12018:                        if(length(TT)>1) TT=cdr(TT);
                   12019:                        if(car(V)==[]) continue;
                   12020:                        if(Op=="") S=xylines(car(V));
                   12021:                        else S=xylines(car(V)|opt=Op);
                   12022:                        if(I==0) Sx=cons(S,Sx);
                   12023:                        else Sy=cons(S,Sy);
                   12024:                }
                   12025:        }
                   12026:        for(S="",Sx=reverse(Sx), Sy=reverse(Sy);Sx!=[]&&Sy!=[];){
                   12027:                if(Sx!=[]){
                   12028:                        S+=car(Sx);Sx=cdr(Sx);
                   12029:                }
                   12030:                if(Sy!=[]){
                   12031:                        S+=car(Sy);Sy=cdr(Sy);
                   12032:                }
                   12033:        }
                   12034:        return S;
                   12035: }
                   12036:
                   12037:
1.22      takayama 12038: def addIL(I,L)
1.18      takayama 12039: {
1.22      takayama 12040:        if(I==0){
                   12041:                for(R=[];L!=[];L=cdr(L)) R=addIL(car(L),R);
                   12042:                return reverse(R);
1.18      takayama 12043:        }
1.22      takayama 12044:        if(type(In=getopt(in))==1){
                   12045:                if(In==-1){
                   12046:                        J=JJ=I[1];I=I[0];
                   12047:                        for(R=[];L!=[];L=cdr(L)){
                   12048:                                J=lmin([car(L)[0],JJ]);
                   12049:                                if(J>I) R=cons([I,J],R);
                   12050:                                I=lmax([car(L)[1],I]);
                   12051:                        }
                   12052:                        if(I<JJ) R=cons([I,JJ],R);
                   12053:                        return reverse(R);
                   12054:                }else{
                   12055:                        for(;L!=[];L=cdr(L)){
                   12056:                                if(car(L)[0]>I) return 0;
                   12057:                                if(car(L)[1]>=I){
                   12058:                                        if(In==3) return car(L);
                   12059:                                        if(In==1||(I!=car(L)[0]&&I!=car(L)[1])) return 1;
                   12060:                                        return 2;
                   12061:                                }
                   12062:                        }
                   12063:                        return 0;
                   12064:                }
                   12065:        }
                   12066:        I0=car(I);I1=I[1];
                   12067:        for(F=0,R=[];L!=[];L=cdr(L)){
                   12068:                if(I0>car(L)[1]){
                   12069:                        R=cons(car(L),R);
                   12070:                        continue;
                   12071:                }
                   12072:                if(I0<=car(L)[1]){
                   12073:                        I0=lmin([I0,car(L)[0]]);
                   12074:                        if(I1<car(L)[0]){
                   12075:                                R=cons([I0,I1],R);
                   12076:                                for( ;L!=[];L=cdr(L)) R=cons(car(L),R);
                   12077:                                F=1;
                   12078:                                break;
                   12079:                        }
                   12080:                        I1=lmax([I1,car(L)[1]]);
                   12081:                }
                   12082:        }
                   12083:        if(!F) R=cons([I0,I1],R);
                   12084:        return reverse(R);
1.18      takayama 12085: }
                   12086:
                   12087: def xy2curve(F,N,Lx,Ly,Lz,A,B)
                   12088: {
1.22      takayama 12089:        Raw=getopt(raw);
                   12090:        if(type(Gap=getopt(gap))==4){
                   12091:                MG=Gap[1];Gap=car(Gap);
                   12092:        }else MG=3;
                   12093:        if(type(Gap)!=1 && Gap!=0) Gap=0.7;
                   12094:        if(type(Dvi=getopt(dviout))<1) Dvi=0;
                   12095:        OL=[["dviout",Dvi]];
                   12096:        if(type(Opt=getopt(opt))<1) Opt=0;
                   12097:        else OL=cons(["opt",Opt],OL);
                   12098:        if(type(Sc=getopt(scale))!=1 && type(Sc)!=4) Sc=[1,1,1];
                   12099:        else if(type(Sc)!=4) Sc=[Sc,Sc,Sc];
                   12100:        else if(length(Sc)!=3) Sc=[Sc[0],Sc[1],Sc[1]];
                   12101:        M=diagm(3,Sc);
                   12102:        if(A!=0||B!=0){
                   12103:                if(type(A)==6) M=A;
                   12104:                else M=mrot([0,-B,-A]|deg=1)*M;
                   12105:                V=M*newvect(3,[x,y,z]);
                   12106:                Fx=compdf(V[0],[x,y,z],F);Fy=compdf(V[1],[x,y,z],F);Fz=compdf(V[2],[x,y,z],F);
                   12107:        }else{
                   12108:                for(I=0;I<3;I++){
                   12109:                        if(type(T=F[I])!=4) T=f2df(T);
                   12110:                        if(type(T)==4) T=cons(car(T)*Sc[I],cdr(T));
                   12111:                        else T*=Sc[I];
                   12112:                        if(I==0) Fx=T;
                   12113:                        else if(I==1) Fy=T;
                   12114:                        else Fz=T;
                   12115:                }
                   12116:        }
                   12117:        if(Raw==5||!Gap)
                   12118:                return (Dvi||!Gap)? xygraph([Fy,Fz],N,Lx,Ly,Lz|option_list=OL):[Fx,Fy,Fz];
1.18      takayama 12119:        R=xygraph([Fy,Fz],N,Lx,Ly,Lz|raw=2);
1.22      takayama 12120:        R0=cdr(car(R));R1=R[1];
                   12121:        for(LT=[];R0!=[];R0=cdr(R0),R1=cdr(R1))
                   12122:                if(car(R0)!=0) LT=cons([R1[0],R1[1]],LT);
                   12123:        LT=reverse(LT);
1.19      takayama 12124:        if(N<0){
                   12125:                Be=xylines(car(R)|curve=1,proc=3,close=-1);
                   12126:                LT=reverse(cdr(LT));
                   12127:                LT=reverse(cdr(LT));
                   12128:        }
                   12129:        else Be=xylines(car(R)|curve=1,proc=3);
1.18      takayama 12130:        Be=cdr(cdr(Be));
1.22      takayama 12131:        Be=lbezier(car(Be));
                   12132:        if(Raw==4) return [Be,LT,Lx];
                   12133:        X=ptcombz(Be,0,0);
                   12134:        Var=(length(Lx)==3)?car(Lx):x;
                   12135:        if(type(Eq=getopt(eq))!=1) Eq=0.01;
                   12136:        if(TikZ==1){
                   12137:                Gap/=10;Eq/=10;
1.18      takayama 12138:        }
                   12139:        for(R=[],XT=X;XT!=[];XT=cdr(XT)){
                   12140:                V=car(XT);
1.22      takayama 12141:                U=LT[V[0][0]];
                   12142:                T=U[0]*V[1][0]+U[1]*(1-V[1][0]);
                   12143:                VV=myfdeval(Fx,[Var,T]);
                   12144:                U=LT[V[0][1]];
1.18      takayama 12145:                T=U[0]*V[1][1]+U[1]*(1-V[1][1]);
1.22      takayama 12146:                VV-=myfdeval(Fx,[Var,T]);
                   12147:                if(abs(VV)<Eq) continue;
                   12148:                I=(VV<0)?0:1;
                   12149:                R=cons([V[0][I],V[1][I],V[0][1-I],V[1][1-I]],R);
1.18      takayama 12150:        }
                   12151:        R=qsort(R);
1.22      takayama 12152:        if(Raw==3) return [Be,R];
                   12153:     Db=newvect(L=length(Be));
                   12154:        for(I=0;I<L;I++) Db[I]=[];
                   12155:        for(TR=R;TR!=[];TR=cdr(TR)){
                   12156:        V1=ptbezier(Be,[I=car(TR)[0],P=car(TR)[1]])[1];
                   12157:                V2=ptbezier(Be,[car(TR)[2],car(TR)[3]])[1];
                   12158:                T=dsqrt(1-dvangle(V1,V2)^2);
                   12159:                if(T<1/MG) T=MG;
                   12160:                GP=Gap/T;
                   12161:                W=GP/dnorm(V1);
                   12162:                Db[I]=addIL([P-W,P+W],Db[I]);
                   12163:                if(P-W<0 && I>0) Db[I-1]=addIL([P-W+1,1],Db[I-1]);
                   12164:                if(P+W>1 && I+1<L) Db[I+1]=addIL([0,P+W-1],Db[I+1]);
                   12165:        }
                   12166:        Db=vtol(Db);
                   12167:        for(Bf=[];Be!=[];Be=cdr(Be),Db=cdr(Db)){
                   12168:                if(car(Db)==[]) Bf=cons(car(Be),Bf);
                   12169:                else{
                   12170:                        D=addIL([0,1],car(Db)|in=-1);
                   12171:                        for(;D!=[];D=cdr(D))
                   12172:                                Bf=cons(tobezier(car(Be)|inv=car(D)),Bf);
                   12173:                }
                   12174:        }
                   12175:        Bf=reverse(Bf);
                   12176:        if(Raw==2) return Bf;
                   12177:        OL=[];
                   12178:        if(Opt){
                   12179:                if(type(Opt)==4&&length(Opt)>1) OL=[["opt",Opt[0]],["cmd",Opt[1]]];
                   12180:                else OL=[["opt",Opt]];
                   12181:        }else OL=[];
                   12182:        S=xybezier(lbezier(Bf|inv=1)|option_list=OL);
                   12183:        if(Raw==1||!Dvi) return S;
                   12184:        return xyproc(S|dviout=Dvi);
                   12185: }
                   12186:
                   12187: def rungeKutta(F,N,Lx,Y,IY)
                   12188: {
                   12189:        if((Pr=getopt(prec))==1){
                   12190:                One=eval(exp(0));
                   12191:        }else{
                   12192:                One=1;Pr=0;
                   12193:        }
                   12194:        if((FL=getopt(last))!=1) FL=0;
                   12195:        if(length(Lx)>2){
                   12196:                V=car(Lx);Lx=cdr(Lx);
                   12197:        }else V=x;
                   12198:        if(Pr==0) Lx=[deval(Lx[0]),deval(Lx[1])];
                   12199:        else Lx=[eval(Lx[0]),eval(Lx[1])];
                   12200:        if(type(Y)==4){
                   12201:                if((Sing=getopt(single))==1||type(F)!=4)
                   12202:                        F=append(cdr(Y),[F]);
                   12203:                L=length(Y);
                   12204:                for(TF=[];F!=[];F=cdr(F))
                   12205:                        TF=cons(f2df(car(F)),TF);
                   12206:                F=reverse(TF);
                   12207:        }else{
                   12208:                L=1;
                   12209:                F=f2df(F);
                   12210:        }
                   12211:        if(getopt(val)==1) V1=1;
                   12212:        else V1=0;
                   12213:        H=(Lx[1]-Lx[0])/N;H2=H/2;
                   12214:        FV=findin(V,vars(F));
                   12215:        K=newvect(4);
                   12216:        if(L==1){
                   12217:                R=[[T=Lx[0],S=IY]];
                   12218:                if(!H) return R;
                   12219:                for(;;){
                   12220:                        for(I=0;I<4;I++){
                   12221:                                if(I==0)      W=[[V,T],[Y,S]];
                   12222:                                else if(I==3) W=[[V,T+H],[Y,S+H*K[2]]];
                   12223:                                else          W=[[V,T+H2],[Y,S+H2*K[I-1]]];
                   12224:                                if(FV<0) W=cdr(W);
                   12225:                                K[I]=Pr?myfeval(F,W)*One:myfdeval(F,W);
                   12226:                        }
                   12227:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                   12228:                        if(!FL) R=cons([deval(T),S],R);
                   12229:                        if((T+H-Lx[1])*H>0) break;
                   12230:                }
                   12231:        }else{
                   12232:                T=Lx[0];
                   12233:                R=[cons(T,V1?[car(IY)]:IY)];
                   12234:                S=ltov(IY);
                   12235:                if(!H) return R;
                   12236:                for(;;){
                   12237:                        for(I=0;I<4;I++){
                   12238:                                if(I==0)      W=cons([V,T   ],lpair(Y,vtol(S)));
                   12239:                                else if(I==3) W=cons([V,T+H ],lpair(Y,vtol(S+H*K[2])));
                   12240:                                else          W=cons([V,T+H2],lpair(Y,vtol(S+H2*K[I-1])));
                   12241:                                if(FV<0) W=cdr(W);
                   12242:                                for(TK=[],TF=F;TF!=[];TF=cdr(TF)){
                   12243:                                        TK=cons(Pr?myfeval(car(TF),W)*One:myfdeval(car(TF),W),TK);
                   12244:                                }
                   12245:                                K[I]=ltov(reverse(TK));
                   12246:                        }
                   12247:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                   12248:                        TS=vtol(S);
                   12249:                        if(V1) TS=[car(TS)];
                   12250:                        if(!FL) R=cons(cons(deval(T),TS),R);
                   12251:                        if((T+H-Lx[1])*H>0) break;
                   12252:                }
                   12253:        }
                   12254:        return FL?(V1?S[0]:S):reverse(R);
1.18      takayama 12255: }
                   12256:
1.6       takayama 12257: def xy2graph(F0,N,Lx,Ly,Lz,A,B)
                   12258: {
1.18      takayama 12259:        /* (x,y,z) -> (z sin B + x cos A cos B + y sin A cos B,
                   12260:            -x sin A + y cos A, z cos B - x cos A sin B - y sin A sin B) */
1.6       takayama 12261:        if((Proc=getopt(proc))==1||Proc==2){
                   12262:                OPT0=[["proc",3]];
                   12263:        }else{
                   12264:                Proc=0;OPT0=[];
                   12265:        }
                   12266:        if(type(DV=getopt(dviout))==4){
                   12267:                S=["ext","shift","cl","dviout"];
                   12268:                OL=delopt(getopt(),S);
                   12269:                OL=cons(["proc",1],OL);
                   12270:                R=xy2graph(F0,N,Lx,Ly,Lz,A,B|option_list=OL);
                   12271:                OL=delopt(getopt(),S|inv=1);
                   12272:                return execdraw(R,DV|optilon_list=OL);
                   12273:        }
                   12274:        if(N==0 || N>100 || N<-100) N=-16;
                   12275:        if(N<0){
                   12276:                N=-N;N1=-1;N2=NN+1;
                   12277:        }else{
                   12278:                N1=0;N2=NN=N;
                   12279:        }
                   12280:
                   12281:        Ratio=Ratio2=1;
                   12282:        if(type(Sc=Sc0=getopt(scale))!=1 && type(Sc)!=4) Sc=1;
                   12283:        if(type(Sc)==4){
                   12284:                Ratio=Sc[1]/Sc[0];
                   12285:                if(length(Sc)>2) Ratio2=Sc[2]/Sc[0];
                   12286:                Sc=Sc[0];
                   12287:        }
                   12288:        if(type(Vw=getopt(view))!=1) Vw=0;
                   12289:        if(type(Raw=getopt(raw))!=1) Raw=0;
                   12290:        if(type(M1=getopt(dev))==1) M2=M1;
                   12291:        else if(type(M1)==4){
                   12292:                M2=M1[1];M1=M1[0];
                   12293:        }else M1=0;
                   12294:        if(type(M3=getopt(acc))!=1 || (M3<0.5 && M3>100)) M3=1;
                   12295:        if(M1<=0) M1=16;
                   12296:        if(M2<=0) M2=16;
                   12297:        OL=[["para",1],["scale",Sc]];
                   12298:        if(Raw==1) OL=cons(["raw",1],OL);
                   12299:        if(type(Prec=getopt(prec))>=0) OL=cons(["prec",Prec],OL);
                   12300:        L=newvect(4,[[Lx[1],Ly[0]],[Lx[1],Ly[1]],[Lx[0],Ly[1]],[Lx[0],Ly[0]]]);
                   12301:        Lx=[deval(Lx[0]),deval(Lx[1])];
                   12302:        Ly=[deval(Ly[0]),deval(Ly[1])];
                   12303:        Lz=[deval(Lz[0]),deval(Lz[1])];
                   12304:        A=(A0=A)%360;
                   12305:        F00=F0;
                   12306:        if(type(F0)<4){
                   12307:                FC=f2df(F0);
                   12308:                if(findin(z,Vars=vars(FC))>=0 && findin(x,Vars)<0 && findin(y,Vars)<0)
                   12309:                        F0=[w,[z,0,x+y*@i],[w,os_md.abs,FC]];
                   12310:        }
                   12311:        if(type(Org=getopt(org))==4){   /* shift origin */
                   12312:                Lx=[Lx[0]-Org[0],Lx[1]-Org[0]];
                   12313:                Ly=[Ly[0]-Org[1],Ly[1]-Org[1]];
                   12314:                Lz=[Lz[0]-Org[2],Lz[1]-Org[2]];
                   12315:                F0=mysubst(F0,[[x,x+Org[0]],[y,y+Org[1]]]);
                   12316:                if(type(F0)==4){
                   12317:                        F0=cons(F0[0]-Org[2],cdr(F0));
                   12318:                }
                   12319:                else F0-=Org[2];
                   12320:        }else Org=[0,0,0];
                   12321:        Cpx=getopt(cpx);
                   12322:        if(type(Cpx)<0){
                   12323:                if(str_str(rtostr(F0),"@i")>=0) Cpx=1;
                   12324:                else Cpx=0;
                   12325:        }
                   12326:        if(A<0) A+=360;
                   12327:        if(A<90){
                   12328:                Sh=1;F1=F0;Cx=x-Org[0];Cy=y-Org[1];
                   12329:        }else if(A<180){        /* x -> y, y -> -x */
                   12330:                Sh=2;A-=90; F1=mulsubst(F0,[[x,-y],[y,x]]);
                   12331:                LL=Ly;Ly=[-Lx[1],-Lx[0]];Lx=LL;Cx=y-Org[1];Cy=-x+Org[0];
                   12332:        }else if(A<270){
                   12333:                Sh=3;A-=180; F1=subst(F0,[[x,-x],[y,-y]]);
                   12334:                Lx=[-Lx[1],-Lx[0]];Ly=[-Ly[1],-Ly[0]];Cx=-x+Org[0];Cy=-y+Org[1];
                   12335:        }else{
                   12336:                Sh=4;A-=270;F1=mulsubst(F0,[[x,y],[y,-x]]);
                   12337:                LL=Lx;Lx=[-Ly[1],-Ly[0]];Ly=LL;Cx=-y+Org[1];Cy=x-Org[0];
                   12338:        }
                   12339:        A=@pi*A/180; B=@pi*B/180;
                   12340:        if(A==0) A=@pi/3;
                   12341:        if(B==0) B=@pi/12;
                   12342:        NN=N*M2;
                   12343:        Ac=dcos(deval(A)); As=dsin(deval(A));
                   12344:        if(Ac<=0.087 || As<=0.087){
                   12345:                mycat(["Unsuitable angle",A0,"(6-th argument)!"]);
                   12346:                return -1;
                   12347:        }
                   12348:        Bc=Ratio*dcos(deval(B)); Bs=dsin(deval(B));
                   12349:        if(Bc<0){
                   12350:                mycat("Unsuitable angle (7-th argument)!");
                   12351:                return -1;
                   12352:        }
                   12353:        /*
                   12354:                z = f(x,y)  => X=-As*x+Ac*y, Y= Bc*f(x,y)-Bsc*x-Bss*y
                   12355:                Out X-coord is in [X0,X1], dvided by Dev segments
                   12356:                J-th segment of Y-coord : ZF[J]==1 =>  [Z0[0],Z1[J]]
                   12357:        */
                   12358:        Bsc=Bs*Ac;Bss=Bs*As;
                   12359:        if(Ratio2!=1){
                   12360:                if(Sh%2==1){
                   12361:                        Ac*=Ratio2;Bss*=Ratio2;
                   12362:                }else{
                   12363:                        As*=Ratio2;Bsc*=Ratio2;
                   12364:                }
                   12365:        }
                   12366:        CX=-As*Cx+Ac*Cy;CY=Bc*(z-Org[2])-Bsc*Cx-Bss*Cy;
                   12367:        if(type(Dvi=getopt(dviout))!=1 && getopt(trans)==1) return [CX*Sc,CY*Sc];
                   12368:        if(type(N1=getopt(inf))==1){
                   12369:                if(Proc) Dvi=N1;
                   12370:                else if(Dvi<=0) Dvi=-N1;
                   12371:        }
                   12372:        X0=-As*Lx[1]+Ac*Ly[0];X1=-As*Lx[0]+Ac*Ly[1];
                   12373:        F1=mysubst(F1,[@pi,deval(@pi)]);
                   12374:        Tf=type(F1=f2df(F1|opt=0));
                   12375:        if(Tf!=4)       F=Bc*F1-Bsc*x-Bss*y;
                   12376:        else    F=append([Bc*F1[0]-Bsc*x-Bss*y],cdr(F1));
                   12377:        Dx=(Lx[1]-Lx[0])/NN; Dy=(Ly[1]-Ly[0])/NN;
                   12378:        if(type(Err=getopt(err))==1)
                   12379:                F=mysubst(F,[[x,x+Err*Dx/1011.23],[y,y+Err*Dy/1101.34]]);
                   12380:        Out=(Proc)?[]:str_tb(0,0);
                   12381:        Dev=N*M1;
                   12382:        XD=(X1-X0)/Dev;
                   12383:        OLV=newvect(2,[OL,OL]);
                   12384:        if(type(Ura=getopt(opt))==4 || type(Ura)==7){
                   12385:                if(type(Ura)==7) Ura=[Ura,Ura];
                   12386:                else{
                   12387:                        OLV[0]=cons(["opt",Ura[0]],OL);
                   12388:                        OLV[1]=cons(["opt",Ura[1]],OL);
                   12389:                }
                   12390:        }
                   12391:        for(KC=0; KC<=1; KC++){         /* draw curves */
                   12392:                Z0=newvect(Dev+1); Z1=newvect(Dev+1); ZF=newvect(Dev+1);
                   12393:        for(I=0; I<=NN; I++){
                   12394:                        FV=I%M2;
                   12395:                        if(KC==0){
                   12396:                                X=x; Y=Ly[1]-I*Dy; LX=Lx; DD=Dx; G=mysubst(F,[y,Y]);
                   12397:                                if(!FV){
                   12398:                                        if(!Proc) str_tb(["%y=",rtostr(Y),"\n"],Out);
                   12399:                                        else Out=cons([-2,"y="+rtostr(Y)],Out);
                   12400:                                }
                   12401:                        }else{
                   12402:                                X=Lx[1]-I*Dx; Y=x; LX=Ly; DD=Dy; G=mysubst(F,[[x,X],[y,Y]]);
                   12403:                                if(!FV){
                   12404:                                        if(!Proc) str_tb(["%x=",rtostr(X),"\n"],Out);
                   12405:                                        else Out=cons([-2,"x="+rtostr(X)],Out);
                   12406:                                }
                   12407:                        }
                   12408:                        XX=-As*X+Ac*Y; A1=coef(XX,1,x); A0=coef(XX,0,x); /* XX = A1*x + A0, x = (XX-A0)/A1 */
                   12409:                        if(!FV && Vw==1){
                   12410:                                if(Proc) Out=cons(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1,proc=3),Out);
                   12411:                                else str_tb(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1),Out);
                   12412:                                continue;
                   12413:                        }
                   12414:                        V=VT=LX[1];
                   12415:                        J0=(subst(XX,x,LX[0])-X0)/XD; J1=(subst(XX,x,LX[1])-X0)/XD;
                   12416:                        if(J0<J1){
                   12417:                                J0=ceil(J0); J1=floor(J1); JD=1;        /* fixed x:  y: dec => (x,z):(dec,inc) */
                   12418:                        }else{
                   12419:                                J0=floor(J0); J1=ceil(J1); JD=-1;       /* fixed y:  x: dec => (x,z):(inc,inc) */
                   12420:                        }
                   12421:                        for(FF=1,J=J1;;J-=JD){
                   12422:                                V1=VT;
                   12423:                                VT=(X0+J*XD-A0)/A1;GG=mysubst(G,[x,VT]);
                   12424:                                if(Cpx>=1) VV=myeval(GG);
                   12425:                                else VV=(Tf==4)? mydeval(GG):deval(GG);         /* J -> V */
                   12426:                                if(ZF[J]==0 || VV<=Z0[J] || VV>=Z1[J]){                  /* visible */
                   12427:                                        if(FF==0){
                   12428:                                                V0=(VT+V1)/2;
                   12429:                                                if(!FV && Vw==-1 && Raw!=1){    /* draw doted line */
                   12430:                                                        K=ceil(M3*(V-V0)/(M2*DD));
                   12431:                                                        if(N1<0) K=-K;
                   12432:                                                        OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"],["scale",Sc],["para",1]]);
                   12433:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|
                   12434:                                                                option_list=OPT),Out);
                   12435:                                                }
                   12436:                                                V=V0;
                   12437:                                        }
                   12438:                                        if(ZF[J]==0){
                   12439:                                                ZF[J]=1; Z0[J]=Z1[J]=VV;
                   12440:                                        }else if(VV<=Z0[J]) Z0[J]=VV;
                   12441:                                        else Z1[J]=VV;
                   12442:
                   12443:                                        if(VV>=Z1[J]) FF=1;
                   12444:                                        else if(VV<=Z0[J]) FF=-1;
                   12445:                                }else{
                   12446:                                        if(FF!=0){
                   12447:                                                V0=(VT+V1)/2;
                   12448:                                                K=ceil(M3*(V-V0)/(M2*DD));
                   12449:                                                if(N1<0) K=-K;
                   12450:                                                if(!FV){
                   12451:                                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   12452:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   12453:                                                }
                   12454:                                                V=V0;
                   12455:                                        }
                   12456:                                        FF=0;
                   12457:                                }
                   12458:                                if(J==J0) break;
                   12459:                        }
                   12460:                        if(FV) continue;
                   12461:                        V0=LX[0];K=ceil(M3*(V-V0)/(M2*DD));
                   12462:                        if(N1<0) K=-K;
                   12463:                        if(FF!=0){
                   12464:                                if(Raw!=1){
                   12465:                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   12466:                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   12467:                        }else if(Vw==-1 && Raw!=1){
                   12468:                                OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"]]);
                   12469:                                Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   12470:                                }
                   12471:                        }
                   12472:                }
                   12473:        }
                   12474:        OptSc=(Sc==1)?[]:[["scale",Sc]];
                   12475:        if(type(LZ=getopt(ax))==4){             /* draw box */
                   12476:                FC=0;
                   12477:                if(length(LZ)==3) FC=LZ[2];
                   12478:                P0=newvect(2,[-As*Lx[1]+Ac*Ly[1],Bc*(LZ[0]-Org[0])-Bsc*Lx[1]-Bss*Ly[1]]);
                   12479:                Vx=newvect(2,[As*(Lx[1]-Lx[0]),Bsc*(Lx[1]-Lx[0])]);
                   12480:                Vy=newvect(2,[Ac*(Ly[0]-Ly[1]),Bss*(Ly[1]-Ly[0])]);
                   12481:                Vz=newvect(2,[0,Bc*(LZ[1]-LZ[0])]);
                   12482:                OL=OL0=append(OPT0,OL);
                   12483:                if(TikZ && type(Ura)==4 && length(Ura)>2) OL0=cons(["opt",Ura[2]],OL);
                   12484:                LL=[[P0+Vz,P0+Vx+Vz],[P0,P0+Vx]];
                   12485:                if(Bs>0){
                   12486:                        LL=cons([P0+Vy+Vz,Pz=P0+Vx+Vy+Vz],LL);
                   12487:                        LL=cons([P0+Vx+Vz,Pz],LL);
                   12488:                        PP=Pz-Vz;
                   12489:                }
                   12490:                else{
                   12491:                        LL=cons([P0+Vy,Pz=P0+Vx+Vy+Vz],LL);
                   12492:                        LL=cons([P0+Vx,Pz],LL);
                   12493:                        PP=Pz+Vz;
                   12494:                }
                   12495:                J=ceil((PP[0]-X0)/XD+0.5);
                   12496:                LL=append([[P0+Vy,P0+Vy+Vz],[P0+Vy,P0+Vy+Vz],[P0+Vx,P0+Vx+Vz],[P0,P0+Vz],
                   12497:                        [P0+Vz,P0+Vy+Vz],[P0,P0+Vy]],LL);
                   12498:                for(LL=reverse(LL);LL!=[];LL=cdr(LL)) Out=saveproc(xylines(car(LL)|option_list=OL0),Out);
                   12499:                if(Dev>4) Dev2=ceil(Dev/2);
                   12500:                if(FC<0 && Raw!=1){
                   12501:                        if(TikZ){
                   12502:                                if(type(Ura)==4 && length(Ura)>2)
                   12503:                                        OL1=cons(["opt",Ura[2]+",dotted"],OL);
                   12504:                                else OL1=cons(["opt","dotted"],OL);
                   12505:                        }else OL1=cons(["opt","@{.}"],OL);
                   12506:                        if(FC==-8) FC=0;
                   12507:                }
                   12508:                for(I=0;I<3;I++){               /* box with hidden part */
                   12509:                        if(I==1) Pz=PP-Vx;
                   12510:                        else if(I==2) Pz=PP-Vy;
                   12511:                        LP=Pz-PP;
                   12512:                        for(FV=-1,K=0;K<=Dev2; K++){
                   12513:                                PPx=PP[0]+(K/Dev2)*LP[0]; PPy=PP[1]+(K/Dev2)*LP[1];
                   12514:                                J=ceil((PPx-X0)/XD);
                   12515:                                if(K!=Dev2 && (J<0||J>Dev)) continue;
                   12516:                                if(K!=Dev2 && (ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){    /* visible */
                   12517:                                        if(FV!=1){
                   12518:                                                FV=1;
                   12519:                                                PPP=[PPx,PPy];
                   12520:                                        }
                   12521:                                }else{
                   12522:                                        if(FV!=0){
                   12523:                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   12524:                                                FV=0;
                   12525:                                        }
                   12526:                                }
                   12527:                        }
                   12528:                }
                   12529:                if(FC!=0 && Raw!=1){    /* show coordinate*/
                   12530:                        if(iand(FC,4)){
                   12531:                                Sub=1;
                   12532:                                if(TikZ){
                   12533:                                         S0="\\scriptsize";S1="";
                   12534:                                }else{
                   12535:                                         S0="{}_{"; S1="}";
                   12536:                                }
                   12537:                        }else Sub=0;
                   12538:                        if(iand(FC,2))
                   12539:                                LLL=[[1,0,P0+Vx,(TikZ)?"right":"+!L"],[3,0,P0+Vy,(TikZ)?"left":"+!R"]];
                   12540:                        else LL=[];
                   12541:                        if(Bs>0){
                   12542:                                LLL=cons([0,0,P0,(TikZ)?"below":"+!U"],LLL);
                   12543:                                LLL=cons([2,1,P0+Vx+Vy+Vz,(TikZ)?"above":"+!D"],LLL);
                   12544:                        }else{
                   12545:                                LLL=cons([2,0,P0+Vx+Vy,(TikZ)?"below":"+!U"],LLL);
                   12546:                                LLL=cons([0,1,P0+Vz,(TikZ)?"above":"+!D"],LLL);
                   12547:                        }
                   12548:                        for(TLL=LLL;TLL!=[];TLL=cdr(TLL)){
                   12549:                                TL=car(TLL);LL=L[(Sh+TL[0])%4];
                   12550:                                if(Cpx==0 || Cpx==3){
                   12551:                                        S=ltotex([LL[0],LL[1],LZ[TL[1]]]|opt="coord");
                   12552:                                        SS="("+rtostr(LL[0]) +","+rtostr(LL[1])+","+rtostr(LZ[TL[1]])+")";
                   12553:                                }else{
                   12554:                                        S=ltotex([LL[0]+LL[1]*@i,LZ[TL[1]]]|opt="coord",cpx=Cpx);
                   12555:                                        SS="("+rtostr(LL[0])+"+"+rtostr(LL[1])+"i,"+ rtostr(LZ[TL[1]])+")";
                   12556:                                }
                   12557:                                if(TikZ) S="$"+S+"$";
                   12558:                                if(Sub) S=S0+S+S1;
                   12559:                                if(!TikZ) S="$"+S+"$";
                   12560:                                if(Proc) Out=cons([2,OptSc,[TL[2][0],TL[2][1]],[[TL[3],S]],SS],Out);
                   12561:                                else str_tb(xyput([TL[2][0],TL[2][1],[TL[3],S]]|option_list=OptSc),Out);
                   12562:                        }
                   12563:                }
                   12564:        }
                   12565:        if(type(Pt=getopt(pt))==4){             /* option pt=[] */
                   12566:                if(type(Pt[0])<4) Pt=[[Pt]];
                   12567:                if(length(Pt)>1&&type(Pt[1])!=4) Pt=[Pt];
                   12568:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   12569:                        PP=car(PT);
                   12570:                        if(type(PP)==4 && length(PP)==3 && type(PP[0])<2 && type(PP[2])<2) PP=[PP];
                   12571:                        P=car(PP);
                   12572:                        if(type(P)==7) Q=[P,0];
                   12573:                        else if(P==1) Q=["_",0];
                   12574:                        else Q=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   12575:                        if(length(PP)>1 && type(PP[1])==4 && length(PP[1])==3){         /* draw line */
                   12576:                                PP=cdr(PP);P=car(PP);
                   12577:                                if(type(P)==7) Q1=P;
                   12578:                                else if(P==1) Q="_";
                   12579:                                else Q1=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   12580:                                if(length(PP)<2 || PP[1]==0 || iand(PP[1],1)) OL2="";
                   12581:                                else OL2=(TikZ)?"dotted":"@{.}";
                   12582:                                if(length(PP)>2 && type(PP[2])==7){
                   12583:                                        if(OL2=="") OL2=PP[2];
                   12584:                                        else{
                   12585:                                                if(TikZ)  OL2=OL2+",";
                   12586:                                                OL2=OL2+PP[2];
                   12587:                                        }
                   12588:                                }
                   12589:                                OL1=OL;
                   12590:                                if(OL2!="") OL1=cons(["opt",OL2],OL1);
                   12591:                                if(length(PP)<2 || PP[1]>=0)
                   12592:                                        Out=saveproc(xylines([Q,Q1]|option_list=OL1),Out);
                   12593:                                else{
                   12594:                                        LP0=Q1[0]-Q[0];LP1=Q1[1]-Q[1];
                   12595:                                        for(FV=-1,K=0;K<=Dev2; K++){
                   12596:                                                PPx=Q[0]+(K/Dev2)*LP0; PPy=Q[1]+(K/Dev2)*LP1;
                   12597:                                                J=ceil((PPx-X0)/XD);
                   12598:                                                if(K!=Dev2 && (J<0 || J>Dev || ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){
                   12599:                                                        /* visible */
                   12600:                                                        if(FV!=1){
                   12601:                                                                FV=1;
                   12602:                                                                PPP=[PPx,PPy];
                   12603:                                                        }
                   12604:                                                }else{
                   12605:                                                        if(FV!=0){
                   12606:                                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   12607:                                                                FV=0;
                   12608:                                                        }
                   12609:                                                }
                   12610:                                        }
                   12611:                                }
                   12612:                                continue;
                   12613:                        }
                   12614:                        if(length(PP)==1) S="$\\bullet$";
                   12615:                        else if(type(PP[1])==7) S=PP[1];
                   12616:                        else if(type(PP[1])==4){
                   12617:                                if(length(PP[1])>1 && type(PP[1][1])!=7)
                   12618:                                         S=cons(car(PP),cons("$\\bullet$",cdr(cdr(PP))));
                   12619:                                else S=PP[1];
                   12620:                        }else S="$\\bullet$";
                   12621:                        if(length(PP)<=2){
                   12622:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S]],Out);
                   12623:                                else str_tb(xyput([Q[0],Q[1],S]|option_list=OptSc),Out);
                   12624:                        }else if(!TikZ){
                   12625:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S,"",PP[2]]],Out);
                   12626:                                else str_tb(xyput([Q[0],Q[1],S,"",PP[2]]|option_list=OptSc),Out);
                   12627:                        }else{
                   12628:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],cons(S,cdr(cdr(PP)))],Out);
                   12629:                                else str_tb(xyput(append([Q[0],Q[1],S],cdr(cdr(PP)))|option_list=OptSc),Out);
                   12630:                        }
                   12631:                }
                   12632:        }
                   12633:        if(Proc){
                   12634:                S=reverse(Out);
                   12635:                if(Proc==1||Proc==3){
                   12636:                        for(W=[],I=0;I<2;I++) for(J=0;J<2;J++) for(K=0;K<2;K++)
                   12637:                                W=cons(mysubst([CX*Sc,CY*Sc],[[x,Lx[I]],[y,Ly[J]],[z,Lz[K]]]),W);
                   12638:                        W=ptbbox(W);
                   12639:                        S=cons([0,W[0],W[1],(TikZ)?1:1/10],S);
                   12640:                }
                   12641:        }else S=str_tb(0,Out);
                   12642:        if(type(Dvi)!=1||(Proc&&abs(Dvi)<2)) return S;
                   12643:        Lout=[];
                   12644:        if(abs(Dvi)>=2){
                   12645:                /* show title */
                   12646:                L0=[];
                   12647:                Title=getopt(title);
                   12648:                if(type(Title)!=7)
                   12649:                                 Title=(type(F00)==4)?("\\texttt{"+verb_tex_form(F00)+"}"):my_tex_form(F00);
                   12650:                if(type(Title)==7){
                   12651:                        T=my_tex_form(L[3][0])+"\\le x\\le "+my_tex_form(L[1][0])+",\\,"+
                   12652:                                my_tex_form(L[3][1])+"\\le y\\le "+my_tex_form(L[1][1])+")";
                   12653:                        if(Proc){
                   12654:                                if(Cpx>=1) L0=[[5,[["eq",1]],"|"+Title+"|\\quad(z=x+yi,\\ "+T]];
                   12655:                                else L0=[[5,[["eq",1]],"z="+Title+"\\ \\ ("+T]];
                   12656:                        }else{
                   12657:                                if(Cpx>=1) dviout("|"+Title+"|\\quad(z=x+yi,\\ "+T|eq=1,keep=1);
                   12658:                                else dviout("z="+Title+"\\ \\ ("+T|eq=1,keep=1);
                   12659:                        }
                   12660:                }
                   12661:                A=rint(deval(180*A/@pi))+90*(Sh-1);
                   12662:                if(A>=180) A-=180;
                   12663:                B=rint(deval(180*B/@pi));
                   12664:                if(abs(Dvi)>=3){
                   12665:                        T="\\text{angle } ("+my_tex_form(A)+"^\\circ,"+my_tex_form(B)+"^\\circ)";
                   12666:                        if(Ratio!=1 || Ratio2!=1) T=T+"\\quad\\text{ratio }1:"
                   12667:                                +my_tex_form(sint(Ratio2,2))+":"+my_tex_form(sint(Ratio,2));
                   12668:                        if(Proc) L0=cons([5,[["eq",1]],T],L0);
                   12669:                        else  dviout(T|eq=1,keep=1);
                   12670:                }
                   12671:                SS="% range "+rtostr([L[3][0],L[1][0]])+"x"+rtostr([L[3][1],L[1][1]])+
                   12672:                        "  angle ("+ rtostr(A) +","+ rtostr(B)+")  dev=";
                   12673:                if(M1==M2) SS=SS+rtostr(M1);
                   12674:                else SS=SS+rtostr([M1,M2]);
                   12675:                if(M3!=1) SS=SS+"  acc="+rtostr(M3);
                   12676:                if(type(Sc0)>=0) SS=SS+"  scale="+rtostr(Sc0);
                   12677:                if(Proc){
                   12678:                        S=cons([5,[],SS],S);
                   12679:                        for(;L0!=[];L0=cdr(L0)) S=cons(car(L0),S);
                   12680:                        return S;
                   12681:                }
                   12682:                if(Dvi>0){
                   12683:                        dviout(SS|keep=1);
                   12684:                        dviout(xyproc(S)|eq=8);
                   12685:                }else Lout=[SS,S];
                   12686:        }else{
                   12687:                if(Dvi>0) dviout(xyproc(S));
                   12688:                else Lout=[S];
                   12689:        }
                   12690:        if(getopt(trans)==1) return cons([CX*Sc,CY*Sc],Lout);
                   12691:        if(Dvi<0) return Lout;
                   12692: }
                   12693:
1.20      takayama 12694: def orthpoly(N)
                   12695: {
                   12696:        F=0;
                   12697:        if(type(P=getopt(pol))==7){
                   12698:                for(L=["Le","Ge","Tc","2T","Ja","He","La","Se"];L!=[];L=cdr(L),F++)
                   12699:                        if(str_str(P,car(L)|end=2)==0) break;
                   12700:        }else P=0;
                   12701:        if(type(D=N)==4) D=N[0];
                   12702:        if(!isint(D)||D<0) return 0;
                   12703:        if(F==0) return seriesHG([-D,D+1],[1],(1-x)/2,D);
                   12704:        if(F==1) return red(seriesHG([-D,D+2*N[1]],[N[1]+1/2],(1-x)/2,D)*binom(D+2*N[1]-1,D));
                   12705:        if(F==2) return seriesHG([-D,D],[1/2],(1-x)/2,D);
                   12706:        if(F==3){
                   12707:                if(D==0) return 0;
                   12708:                return orthpoly([D-1,1]|pol="Ge");
                   12709:        }
                   12710:        if(F==4) return red(seriesHG([-D,D+N[1]],[N[2]],x,D));
                   12711:        if(F==5){
                   12712:                for(S=I=1;I<=D;I+=2) S*=I;
                   12713:                if(iand(D,1)) return seriesHG([-(D-1)/2],[3/2],x^2/2,D-1)*x*S*(-1)^((D-1)/2);
                   12714:                else return seriesHG([-D/2],[1/2],x^2/2,D)*S*(-1)^(D/2);
                   12715:        }
                   12716:        if(F==6){
                   12717:                NN=(type(N)==4)?N[1]:0;
                   12718:                return red(seriesHG([-D],[NN+1],x,D)*binom(D+NN,D));
                   12719:        }
                   12720:        if(F==7){
                   12721:                NN=N[1];
                   12722:                for(S=1,I=1;I<=D;I++) S+=(-1)^I*binom(D,I)*binom(D+I,I)*sftpow(x,I)/sftpow(NN,I);
                   12723:                return S;
                   12724:        }
                   12725:        return 0;
                   12726: }
                   12727:
                   12728: def schurpoly(L)
                   12729: {
                   12730:        N=length(L);
                   12731:        for(R=[],I=1;L!=[];L=cdr(L),I++) R=cons(car(L)+N-I,R);
                   12732:        L=reverse(R);
                   12733:        if(type(X=getopt(var))!=4){
                   12734:                V=(type(X)>1)?X:"x";
                   12735:                for(X=[],I=0;I<N;I++) X=cons(makev([V,N-I]),X);
                   12736:        }
                   12737:        M=newmat(N,N);
                   12738:        for(I=0;I<N;I++)
                   12739:                for(J=0;J<N;J++) M[I][J]=X[I]^L[J];
                   12740:        P=det(M);
                   12741:        for(I=0;I<N;I++)
                   12742:                for(J=I+1;J<N;J++) P=sdiv(P,X[I]-X[J]);
                   12743:        return P;
                   12744: }
                   12745:
1.6       takayama 12746: def fouriers(A,B,X)
                   12747: {
1.20      takayama 12748:        if((Y=getopt(y))==0||type(Y)>0) Y=deval(Y);
                   12749:        else Y=0;
                   12750:        if((V=getopt(const))==0||type(V)>0){
                   12751:                V=myfeval(V,Y);
                   12752:                K=1;
                   12753:        }else K=0;
1.6       takayama 12754:        if(A!=[]&&type(car(A))>1){
1.20      takayama 12755:                for(C=[],I=A[1];I>=K;I--) C=cons(myf2eval(car(A),I,Y),C);
                   12756:                if(K) C=cons(0,C);
1.6       takayama 12757:                A=C;
                   12758:        }
1.20      takayama 12759:        if(K){
                   12760:                if(A!=[]) A=cdr(A);
                   12761:                A=cons(V,A);
                   12762:        }
1.6       takayama 12763:        if(B!=[]&&type(car(B))>1){
1.20      takayama 12764:                for(C=[],I=B[1];I>0;I--) C=cons(myf2eval(car(B),I,Y),C);
1.6       takayama 12765:                B=C;
                   12766:        }
1.20      takayama 12767:        L=length(B)+1;
                   12768:        if(length(A)>=L) L=length(A)+1;
                   12769:        if(type(Sum=getopt(sum))>0){
                   12770:                if(Sum==1) Sum=1-x;
                   12771:                else if(Sum==2) Sum=[(z__)/(3.1416*x),[z__,os_md.mysin,3.1416*x]];
                   12772:                else Sum=f2df(Sum);
                   12773:                C=[];
                   12774:                if(A!=[]){
                   12775:                        C=cons(car(A),C);
                   12776:                        A=cdr(A);
                   12777:                }
                   12778:                for(I=1;A!=[];A=cdr(A),I++) C=cons(car(A)*myf2eval(Sum,I/L,L),C);
                   12779:                A=reverse(C);
                   12780:                for(C=[],I=1;B!=[];B=cdr(B),I++) C=cons(car(B)*myf2eval(Sum,I/L,L),C);
                   12781:                B=reverse(C);
                   12782:        }
1.6       takayama 12783:        if(getopt(cpx)==1){
1.20      takayama 12784:                if(type(X=eval(X))>1) return todf([os_md.fouriers,[["cpx",1]]],[[A],[B],[X]]);
1.6       takayama 12785:                V=dexp(@i*X);
                   12786:                for(C=A,P=1,I=0;C!=[];C=cdr(C),I++){
1.20      takayama 12787:                        R+=S*car(C)*P;
1.6       takayama 12788:                        P*=V;
                   12789:                }
                   12790:                V=dexp(-@i*X);
                   12791:                for(C=B,P=1,I=0;C!=[];C=cdr(C),I++){
                   12792:                        P*=V;
                   12793:                        R+=car(C)*P;
                   12794:                }
                   12795:                return R;
                   12796:        }
                   12797:        if(type(X=eval(X))>1) return todf(os_md.fouriers,[[A],[B],[X]]);
                   12798:        for(C=A,I=0;C!=[];C=cdr(C),I++)
                   12799:                R+=car(C)*mycos(I*X);
                   12800:        for(C=B,I=1;C!=[];C=cdr(C),I++)
                   12801:                R+=car(C)*mysin(I*X);
                   12802:        return R;
                   12803: }
                   12804:
                   12805:
                   12806: def myexp(Z)
                   12807: {
                   12808:        if(type(Z=eval(Z))>1) return todf(os_md.myexp,[Z]);
                   12809:        if((Im=imag(Z))==0) return dexp(Z);
                   12810:        return dexp(real(Z))*(dcos(Im)+@i*dsin(Im));
                   12811: }
                   12812:
                   12813: def mycos(Z)
                   12814: {
                   12815:        if(type(Z=eval(Z))>1) return todf(os_md.mycos,[Z]);
                   12816:        if((Im=imag(Z))==0) return dcos(Z);
                   12817:        V=myexp(Z*@i);
                   12818:        return (V+1/V)/2;
                   12819: }
                   12820:
                   12821: def mysin(Z)
                   12822: {
                   12823:        if(type(Z=eval(Z))>1) return todf(os_md.mysin,[Z]);
                   12824:        if((Im=imag(Z))==0) return dsin(Z);
                   12825:        V=myexp(Z*@i);
                   12826:        return (1/V-V)*@i/2;
                   12827: }
                   12828:
                   12829: def mytan(Z)
                   12830: {
                   12831:        if(type(Z=eval(Z))>1) return todf(os_md.mytan,[Z]);
1.17      takayama 12832:        if((Im=imag(Z))==0) return dtan(Z);
1.6       takayama 12833:        V=myexp(2*Z*@i);
                   12834:        return @i*(1-V)/(1+V);
                   12835: }
                   12836:
                   12837: def mylog(Z)
                   12838: {
                   12839:        if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);
                   12840:        if((Im=imag(Z))==0) return dlog(Z);
                   12841:        return dlog(dabs(Z))+@i*myarg(Z);
                   12842: }
                   12843:
                   12844: def mypow(Z,R)
                   12845: {
                   12846:        if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);
                   12847:        if(Z==0) return 0;
                   12848:        if(isint(2*R)){
                   12849:                if(R==0) return 1;
                   12850:                if(isint(R)) return Z^R;
                   12851:                V=dsqrt(Z);
                   12852:                if(R==1/2) return V;
                   12853:                return Z^(R-1/2)*V;
                   12854:        }
                   12855:        return myexp(R*mylog(Z));
                   12856: }
                   12857:
                   12858: def myarg(Z)
                   12859: {
                   12860:        if(type(Z=map(eval,Z))==4){
                   12861:                if(length(Z)!=2) return todf(os_md.myarg,[Z]);
                   12862:                Re=Z[0];Im=Z[1];
                   12863:        }else if(type(Z)>1){
                   12864:                return todf(os_md.myarg,[Z]);
                   12865:        }else {
                   12866:                Im=imag(Z);Re=real(Z);
                   12867:        }
                   12868:        if(Re==0) return (Im<0)?-deval(@pi)/2:deval(@pi)/2;
                   12869:        V=datan(Im/Re);
                   12870:        if(Re>0) return V;
                   12871:        return (V>0)?(V-deval(@pi)):(V+deval(@pi));
                   12872: }
                   12873:
                   12874: def myatan(Z)
                   12875: {
                   12876:        if(type(Z=eval(Z))>1) return todf(os_md.myatan,[Z]);
                   12877:        if((Im=imag(Z))==0) return datan(Z);
                   12878:        mylog((1-Z*@i)/(1+Z*@i))*@i/2;
                   12879: }
                   12880:
                   12881: def myasin(Z)
                   12882: {
                   12883:        if(type(Z=eval(Z))>1) return todf(os_md.myasin,[Z]);
                   12884:        return deval(@pi/2)-myacos(Z);
                   12885: }
                   12886:
                   12887: def frac(X)
                   12888: {
                   12889:        if(type(X=eval(X))>1) return todf(os_md.frac,[X]);
                   12890:        return (ntype(X)==3)? pari(frac,X):(X-floor(X));
                   12891: }
                   12892:
                   12893: def myacos(Z)
                   12894: {
                   12895:        if(type(Z=eval(Z))>1) return todf(os_md.myacos,[Z]);
                   12896:        if(imag(Z)==0 && Z<=1 && Z>=-1) return dacos(Z);
                   12897:        return mylog(Z-dsqrt(Z^2-1))*@i;
                   12898: }
                   12899:
                   12900: def arg(Z)
                   12901: {
                   12902:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);
                   12903:     return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);
                   12904: }
                   12905:
                   12906: def sqrt(Z){
                   12907:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);
                   12908:        R=(type(Z)==4)?Z[1]:Z;
                   12909:        if(ntype(R)==0){
                   12910:                if(R==0) return 0;
                   12911:                if(R>0){
                   12912:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));
                   12913:                }else{
                   12914:                        R=-R;
                   12915:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;
                   12916:                }
                   12917:     }
                   12918:        return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);
                   12919: }
                   12920:
                   12921: def gamma(Z)
                   12922: {
                   12923:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.gamma,[Z]);
                   12924:     return (type(Z)==4)?pari(gamma,Z[0],Z[1]):pari(gamma,Z);
                   12925: }
                   12926:
                   12927: def lngamma(Z)
                   12928: {
                   12929:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.lngamma,[Z]);
                   12930:     return (type(Z)==4)?pari(lngamma,Z[0],Z[1]):pari(lngamma,Z);
                   12931: }
                   12932:
                   12933: def digamma(Z)
                   12934: {
                   12935:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.digamma,[Z]);
                   12936:     return (type(Z)==4)?pari(digamma,Z[0],Z[1]):pari(digamma,Z);
                   12937: }
                   12938:
                   12939: def dilog(Z)
                   12940: {
                   12941:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.dilog,[Z]);
                   12942:     return (type(Z)==4)?pari(dilog,Z[0],Z[1]):pari(dilog,Z);
                   12943: }
                   12944:
                   12945: def erfc(Z)
                   12946: {
                   12947:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.erfc,[Z]);
                   12948:        return (type(Z)==4)?pari(erfc,Z[0],Z[1]):pari(erfc,Z);
                   12949: }
                   12950:
                   12951: def zeta(Z)
                   12952: {
                   12953:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.zeta,[Z]);
                   12954:     return (type(Z)==4)?pari(zeta,Z[0],Z[1]):pari(zeta,Z);
                   12955: }
                   12956:
                   12957: def eta(Z)
                   12958: {
                   12959:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.eta,[Z]);
                   12960:     return (type(Z)==4)?pari(eta,Z[0],Z[1]):pari(eta,Z);
                   12961: }
                   12962:
                   12963: def jell(Z)
                   12964: {
                   12965:        if(vars(Z=map(eval,V))>1) return todf(os_md.jell,[Z]);
                   12966:     return (type(Z)==4)?pari(jell,Z[0],Z[1]):jell(jell,Z);
                   12967: }
                   12968:
                   12969: def evals(F)
                   12970: {
                   12971:        if(type(F)==7){
                   12972:                if(type(Del=getopt(del))!= 7) return eval_str(F);
                   12973:                S=strtoascii(Del);K=length(S);
                   12974:                if(K==0) return [eval_str(F)];
                   12975:                Raw=getopt(raw);
                   12976:                F=strtoascii(F);L=[];T1=0;
                   12977:                do{
                   12978:                        T2=str_str(F,S|top=T1);
                   12979:                        if(T2<0) T2=10000;
                   12980:                        FT=str_cut(F,T1,T2-1);
                   12981:                        L=cons((Raw==1)?FT:evals(FT),L);
                   12982:                        T1=T2+K;
                   12983:                }while(T2!=10000);
                   12984:                return reverse(L);
                   12985:        }
                   12986:        if(type(F)==4){
                   12987:                if(type(S=car(F))==7){
                   12988:                        S+="(";
                   12989:                        for(I=0,FT=cdr(F); FT!=[]; I++,FT=cdr(FT)){
                   12990:                                if(type(ST=car(FT))!=7) ST=rtostr(ST);
                   12991:                                if(I>0) S=S+","+ST;
                   12992:                                else S=S+ST;
                   12993:                        }
                   12994:                        S=S+")";
                   12995:                        return eval_str(S);
                   12996:                }else return call(S,cdr(F));
                   12997:        }
                   12998:        return F;
                   12999: }
                   13000:
                   13001: def myval(F)
                   13002: {
                   13003:        if(type(F)!=4){
                   13004:                F=f2df(sqrt2rat(F));
                   13005:                if(type(F)!=4) return F;
                   13006:        };
                   13007:        if(length(F)==1) V=car(F);
                   13008:        else for(V=car(F),F=cdr(F); F!=[];){
                   13009:                FT=car(F);
                   13010:                if(type(G=FT[1])==2){
                   13011:                        if(length(FT)>2){
                   13012:                                FT2=myval(FT[2]);
                   13013:                                if(length(FT)>3) FT3=myval(FT[3]);
                   13014:                        };
                   13015:                        X=red(FT2/@pi);Vi=-red(FT2*@i/@pi);W=red(FT2/@e);
                   13016:                        if(G==os_md.mypow && FT3==1/2){
                   13017:                                G=os_md.sqrt;
                   13018:                                FT=[FT[0],G,FT[2]];
                   13019:                        }
                   13020:                        if((T=findin(G,
                   13021:                                  [sin,os_md.mysin,cos,os_md.mycos,tan,os_md.mytan]))>=0
                   13022:                                  &&(isint(6*X)||isint(4*X))){
                   13023:                                if(T==2||T==3){
                   13024:                                        T=0;X=1/2-X;
                   13025:                                }
                   13026:                                X=X-floor(X/2)*2;
                   13027:                                if(T==0||T==1){
                   13028:                                        if(X>1){
                   13029:                                                S=-1;X-=1;
                   13030:                                        }else S=1;
                   13031:                                        if(X>1/2) X=1-X;
                   13032:                                        if(X==0) R=0;
                   13033:                                        else if(X==1/6) R=1/2;
                   13034:                                        else if(X==1/4) R=2^(1/2)/2;
                   13035:                                        else if(X==1/3) R=3^(1/2)/2;
                   13036:                                        else R=1;
                   13037:                                        R*=S;
                   13038:                                }else{
                   13039:                                        if(X>1) X-=1;
                   13040:                                        if(X>1/2){
                   13041:                                                S=-1;V=1-X;
                   13042:                                        }else S=1;
                   13043:                                        if(X==0) R=0;
                   13044:                                        else if(X==1/6) R=3^(1/2)/3;
                   13045:                                        else if(X==1/4) R=1;
                   13046:                                        else if(X==1/3) R=3^(1/2);
                   13047:                                        else R=2^512;
                   13048:                                        R*=S;
                   13049:                                }
                   13050:                        }else if((G==exp||G==os_md.myexp)&&(isint(FT2)||isint(6*Vi)||isint(4*Vi))){
                   13051:                                if(isint(FT2)) R=@e^FT2;
                   13052:                                else R=myval([z+w*@i,[z,cos,Vi*@pi],[w,sin,Vi*@pi]]);
                   13053:                        }else if((G==pow||G==os_md.mypow) && (isint(FT3)||FT2==1||FT2==0)){
                   13054:                                if(FT2==0) R=0;
                   13055:                                else if(FT2==1) R=1;
                   13056:                                else R=FT2^FT3;
                   13057:                        }else if(G==os_md.abs&&ntype(P=eval(FT2))<4){
                   13058:                                R=FT2;
                   13059:                                if(P<0) R=-R;
                   13060:                        }else if((G==os_md.sqrt||G==dsqrt)&&type(FT2)<2&&ntype(FT2)==0)
                   13061:                                R=sqrtrat(FT2);
                   13062:                        else if((G==os_md.mylog||G==dlog)&&(FT2==@e||FT2==1))
                   13063:                                R=(FT2==1)?0:1;
                   13064:                        else if(length(FT)==3) R=eval((*G)(myeval(FT2)));
                   13065: #ifdef USEMODULE
                   13066:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   13067: #else
                   13068:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   13069: #endif
                   13070:                }
                   13071:                else if(G==0) R=FT[2];
                   13072: #ifdef USEMODULE
                   13073:                        else R=eval(call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]));
                   13074: #else
                   13075:                        else R=eval(call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]));
                   13076: #endif
                   13077:                V=mysubst(V,[FT[0],R]);
                   13078:                F=mysubst(cdr(F),[FT[0],R]);
                   13079:        }
                   13080:        if(type(V)<4 && !iscoef(V,os_md.iscrat)) V=eval(V);
                   13081: #if 0
                   13082:        return (type(V)<4)?myeval(V):mtransbys(os_md.myeval,V,[]);
                   13083: #else
                   13084:        return V;
                   13085: #endif
                   13086: }
                   13087:
                   13088: /* -1:空  0:整数 1:有理数 2:Gauss整数 3:Gauss有理数 4:それ以外の複素数 */
                   13089: /* def vntype(F)
                   13090: {
                   13091:        if((T=type(F))<2){
                   13092:                if(T<0) return -1;
                   13093:                if((Tn=ntype(F))==0){
                   13094:                        return (isint(F))?0:1;
                   13095:                }
                   13096:                if(Tn==4){
                   13097:                        if(ntype(real(F))==0&&ntype(real(F))==0)
                   13098:                                return (isint(F)&&isint(F))?2:3;
                   13099:                        return 4;
                   13100:                }
                   13101:        }
                   13102:        if(T==2){
                   13103:                V=vars(F);
                   13104:                if((VV=lsort(V,[@e,@pi],1))==[]){
                   13105:                        FT=mycoef(
                   13106:                }else{
                   13107:                        if(length(VV)==1){
                   13108:                        }else
                   13109:                }
                   13110:        }else if(T==3){
                   13111:
                   13112:        }
                   13113: }
                   13114: */
                   13115:
                   13116:
                   13117: def myeval(F)
                   13118: {
                   13119:        if(type(F)!=4)  V=F;
                   13120:        else if(length(F)==1) V=car(F);
                   13121:        else for(V=car(F),F=cdr(F); F!=[];){
                   13122:                FT=car(F);
                   13123:                if(type(G=FT[1])==2){
                   13124:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   13125: #ifdef USEMODULE
                   13126:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   13127: #else
                   13128:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   13129: #endif
                   13130:                }
                   13131:                else if(G==0) R=myeval(FT[2]);
                   13132: #ifdef USEMODULE
                   13133:                        else R=call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]);
                   13134: #else
                   13135:                        else R=call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]);
                   13136: #endif
                   13137:                V=mysubst(V,[FT[0],R]);
                   13138:                F=mysubst(cdr(F),[FT[0],R]);
                   13139:        }
                   13140:        return (type(V)<4)?eval(V):mtransbys(eval,V,[]);
                   13141: }
                   13142:
                   13143: def mydeval(F)
                   13144: {
                   13145:        if(type(F)!=4) V=F;
                   13146:        else if(length(F)==1) V=car(F);
                   13147:        else for(V=car(F),F=cdr(F); F!=[]; ){
                   13148:                FT=car(F);
                   13149:                if(type(G=FT[1])==2){
                   13150:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   13151: #ifdef USEMODULE
                   13152:                        else R=call(G,map(os_md.mydeval,cdr(cdr(FT))));
                   13153: #else
                   13154:                        else R=call(G,map(mydeval,cdr(cdr(FT))));
                   13155: #endif
                   13156:                }
                   13157:                else if(G==0) R=mydeval(FT[2]);
                   13158: #ifdef USEMODULE
                   13159:                        else R=call(G[0],map(os_md.mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   13160: #else
                   13161:                        else R=call(G[0],map(mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   13162: #endif
                   13163:                V=mysubst(V,[FT[0],R]);
                   13164:                F=mysubst(cdr(F),[FT[0],R]);
                   13165:        }
                   13166:        return (type(V)<4)?deval(V):mtransbys(deval,V,[]);
                   13167: }
                   13168:
                   13169: def myfeval(F,X)
                   13170: {
                   13171:        if(type(X)==4){
                   13172:                if(isvar(X[0])&&length(X)==2)
                   13173:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   13174:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   13175:                        for(Y=X;Y!=[];Y=cdr(Y))
                   13176:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   13177:                        return myeval(F);
                   13178:                }
                   13179:        }
                   13180:        return myeval(mysubst(F,[x,X]));
                   13181: }
                   13182:
                   13183: def myf2eval(F,X,Y)
                   13184: {
                   13185:        return myeval(mysubst(F,[[x,X],[y,Y]]));
                   13186: }
                   13187:
                   13188: def myf3eval(F,X,Y,Z)
                   13189: {
                   13190:        return myeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   13191: }
                   13192:
                   13193: def myfdeval(F,X)
                   13194: {
                   13195:        if(type(X)==4){
                   13196:                if(isvar(X[0])&&length(X)==2)
                   13197:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   13198:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   13199:                        for(Y=X;Y!=[];Y=cdr(Y))
                   13200:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   13201:                        return mydeval(F);
                   13202:                }
                   13203:        }
                   13204:        return mydeval(mysubst(F,[x,X]));
                   13205: }
                   13206:
                   13207: def myf2deval(F,X,Y)
                   13208: {
                   13209:        return mydeval(mysubst(F,[[x,X],[y,Y]]));
                   13210: }
                   13211:
                   13212: def myf3deval(F,X,Y,Z)
                   13213: {
                   13214:        return mydeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   13215: }
                   13216:
                   13217: def df2big(F)
                   13218: {
                   13219:        AG=[[os_md.mysin,sin],[os_md.mycos,cos],[os_md.mytan,tan],[os_md.myasin,asin],
                   13220:                [os_md.acos,acos],[os_md,atan,atan],[os_md.myexp,exp],[os_md.mylog,log],[os_md.mypow,pow]];
                   13221:        if(getopt(inv)!=1) return mysubst(F,AG);
                   13222:        else return mysubst(F,AG|inv=1);
                   13223:
                   13224: }
                   13225:
                   13226: def f2df(F)
                   13227: {
                   13228:        if(type(Opt=getopt(opt))!=1) Opt=0;
                   13229:        if(iand(Opt,1)){
                   13230:                if(Opt>0) F=map(eval,F);
                   13231:                else F=map(deval,F);
                   13232:        }
                   13233:        Cpx=getopt(cpx);
                   13234:        if(type(F)==4 && iand(Opt,2)==0) return F;
                   13235:        K=getopt(level);
                   13236:        if(type(K)!=1) K=0;
                   13237:        AG=[sin,cos,tan,asin,acos,atan,exp,sinh,cosh,tanh,log,pow];
                   13238:        AGd=[os_md.mysin,os_md.mycos,os_md.mytan,os_md.myasin,os_md.myacos,
                   13239:                os_md.myatan,os_md.myexp,os_md.myexp,os_md.myexp,os_md.myexp,
                   13240:                os_md.mylog,os_md.sqrt,os_md.myexp];
                   13241:        for(R=[],I=0,Arg=vars(F);Arg!=[];Arg=cdr(Arg)){
                   13242:                Fn=functor(car(Arg));
                   13243:                if(vtype(Fn)!=3) continue;
                   13244:                V=args(car(Arg));
                   13245:                for(PAG=AG,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd)){
                   13246:                        if(Fn==car(PAG)){
                   13247:                                if(K==0) L="z__";
                   13248:                                else L="z"+rtostr(K)+"__";
                   13249:                                if(I==0) VC=makev([L]);
                   13250:                                else VC=makev([L,I]);
                   13251:                                I++;
                   13252:                                VC0=VC;
                   13253:                                if(Fn==sinh || Fn==cosh || Fn==tanh){
                   13254:                                        VC=makev([L,I++]);
                   13255:                                        if(Fn==sinh)
                   13256:                                                R=cons([VC0,0,(VC^2-1)/(2*VC)],R);
                   13257:                                        else if(Fn==cosh)
                   13258:                                                R=cons([VC0,0,(VC^2+1)/(2*VC)],R);
                   13259:                                        else
                   13260:                                                R=cons([VC0,0,(VC^2-1)/(VC^2+1)],R);
                   13261:                                }
                   13262:                                if(Fn==pow && (V[1]!=1/2||Cpx==1)){
                   13263: #if 0
                   13264:                                        R0=f2df(V[1]*((type(V[0])==1)?dlog(V[0]):log(V[0]))|level=K+1);
                   13265:                                        PAGd=cdr(PAGd);
                   13266: #else
                   13267:                                        R=cons([VC,os_md.mypow,V[0],V[1]],R);
                   13268:                                        F=mysubst(F,[car(Arg),VC0]);
                   13269:                                        Arg=cons(0,vars(F));
                   13270:                                        break;
                   13271: #endif
                   13272:                                }else R0=f2df(V[0]|level=K+1);
                   13273:                                R=cons([VC,car(PAGd),R0],R);
                   13274:                                F=mysubst(F,[car(Arg),VC0]);
                   13275:                                Arg=cons(0,vars(F));
                   13276:                                break;
                   13277:                        }
                   13278:                }
                   13279:        }
                   13280:        if(R==[])       return F;
                   13281:        if(Cpx==1){
                   13282:                for(PAG=P,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd))
                   13283:                        R=mysubst(R,[car(PADd),car(PAG)]);
                   13284:        }
                   13285:        return cons(F,reverse(R));
                   13286: }
                   13287:
                   13288: def todf(F,V)
                   13289: {
                   13290:        if(type(V)!=4) V=[V];
                   13291:        for(R=[];V!=[];V=cdr(V)){
                   13292:                R=cons(f2df(car(V)),R);
                   13293:        }
                   13294:        V=reverse(R);
                   13295:        Z=makenewv([F,V]);
                   13296:        return [Z,cons(Z,cons(F,V))];
                   13297: }
                   13298:
                   13299: def compdf(F,V,G)
                   13300: {
                   13301:        FL=["abs","floor","rint","zeta","gamma","arg","real","imag","conj"];
                   13302:        FS=[os_md.abs,floor,rint,os_md.zeta,os_md.gamma,os_md.myarg,real,imag,conj];
                   13303:        if(type(F)==7){
                   13304:                if(str_str(F,"|")==0){
                   13305:                        F="abs("+str_cut(F,1,str_len(F)-2)+")";
                   13306:                }else if(str_str(F,"[")==0){
                   13307:                        F="floor("+str_cut(F,1,str_len(F)-2)+")";
                   13308:                }
                   13309:                I=str_str(F,"(");
                   13310:                Var=x;
                   13311:                if(I>0){
                   13312:                        J=str_pair(F,I+1,"(",")");
                   13313:                        if(J<0) return 0;
                   13314:                        Var=eval_str(str_cut(F,I+1,J-1));
                   13315:                        Var=f2df(Var);
                   13316:                        F0=str_cut(F,0,I-1);
                   13317:                }
                   13318:                if((I=findin(F0,FL))<0&&(I=findin(F,FL))<0) F=f2df(eval_str(F));
                   13319:                else F=[z__,[z__,FS[I],Var]];
                   13320:        }
                   13321:        if(type(F)!=4) F=f2df(F);
                   13322:        if(type(G)!=4) G=f2df(G);
1.20      takayama 13323:        if(V==G) return F;      /* subst(F(V),V,G) */
1.6       takayama 13324:        VF=vars(F);VG=vars(G);
1.20      takayama 13325:        if(type(V)==4){
                   13326:                for(VT=[],VV=V;VV!=[];VV=cdr(VV)){
                   13327:                        if(findin(car(VV),VF)>=0){
                   13328:                                X=makenewv(append(VF,VG));
                   13329:                                VF=cons(X,VF);
                   13330:                                F=mysubst(F,[car(VV),X]);
                   13331:                                VT=cons(X,VT);
                   13332:                        }else VT=cons(car(VV),VT);
                   13333:                }
                   13334:                for(V=reverse(VT);V!=[];V=cdr(V),G=cdr(G)) F=compdf(F,car(V),car(G));
                   13335:                return F;
                   13336:        }
1.6       takayama 13337:        for(E=I=0;I<30;I++){
                   13338:                for(J=0;J<30;J++){
                   13339:                        X=makev(["z__",I,J]);
                   13340:                        if(findin(X,VF)<0 && findin(X,VG)<0){
                   13341:                                E=1;break;
                   13342:                        }
                   13343:                }
                   13344:                if(E) break;
                   13345:        }
                   13346:        if(!E) return 0;
                   13347:        if(type(G)<4) return mysubst(F,[V,G]);
                   13348:        if(type(F)<4) F=[F]; /* return compdf([X,[X,0,F]],V,G); */
                   13349:        F=mysubst(F,[V,X]);
                   13350:        if(isvar(G[0])){
                   13351:                G=mysubst(G,[G[0],X]);
                   13352:                if(length(G)==2&&type(G[1])==4&&G[1][0]==X) G=G[1];
                   13353:                G=cons(G,cdr(F));
                   13354:        }
                   13355:        else G=cons([X,0,G],cdr(F));
                   13356:        return cons(car(F),G);
                   13357: }
                   13358:
                   13359: def fzero(F,LX)
                   13360: {
                   13361:        if(length(LX)==3){
                   13362:                V=LX[0];LX=cdr(LX);
                   13363:        }else V=x;
                   13364:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   13365:        if(getopt(zero)==1){
                   13366:                if(getopt(cont)==1) CT=1;
                   13367:                else CT=0;
                   13368:                if(getopt(trans)!=1 && type(F)<4) F=f2df(F);
                   13369:                F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   13370:                if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   13371:                V1=myeval(mysubst(F,[V,X1=LX1]));
                   13372:                V2=myeval(mysubst(F,[V,X2=LX2]));
                   13373:                if(V1>0){
                   13374:                        V0=V1;V1=V2;V2=V0;
                   13375:                        X0=X1;X1=X2;X2=X0;
                   13376:                }
                   13377:                if(V1<0 && V2>0){
                   13378:                        D=(V2-V1)*1024;
                   13379:                        for(I=0; I<Dev; I++){
                   13380: /*     mycat([D,X1,V1,X2,V2]) ; */
                   13381:                                if(iand(I,1)) X0=(X1+X2)/2;
                   13382:                                else X0=(V2*X1-V1*X2)/(V2-V1);
                   13383:                                V0=myeval(mysubst(F,[V,X0]));
                   13384:                                if(V0==0||V0==V1||V0==V2) return [X0,V0];
                   13385:                                if(V0<0){
                   13386:                                        if(!CT && V0+D<0) return [];
                   13387:                                        V1=V0;X1=X0;
                   13388:                                }else{
                   13389:                                        if(!CT && V0>D) return [];
                   13390:                                        V2=V0;X2=X0;
                   13391:                                }
                   13392:                        }
                   13393:                        X0=(V2*X1-V1*X2)/(V2-V1);
                   13394:                        return [X0,myeval(mysubst(F,[V,X0]))];
                   13395:                }
                   13396:                if(V0==0) return [X0,V0];
                   13397:                if(V1==0) return [X1,V1];
                   13398:                return [];
                   13399:        }
                   13400:        if(type(F)<4) F=f2df(F);
                   13401:        F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   13402:        L=[];
                   13403:        if(type(F)<4){
                   13404:                if(type(F)==3) F=nm(red(F));
                   13405:                if((Deg=deg(F,V))<=2){
                   13406:                        if(Deg==2){
                   13407:                                D=(C1=coef(F,1,V))^2-4*(C2=coef(F,2,V))*coef(F,0,V);
                   13408:                                if(D>=0){
                   13409:                                        R=dsqrt(D);
                   13410:                                        if((S=(-C1+R)/(2*C2))>=LX1&&S<=LX2) L=[[S,mysubst(F,[V,S])]];
                   13411:                                        if(D!=0 && (S=(-C1-R)/(2*C2))>=LX1&&S<=LX2) L=cons([S,mysubst(F,[V,S])],L);
                   13412:                                }
                   13413:                                L=qsort(L);
                   13414:                        }else if(Deg==1&&(S=-coef(F,0,V)/coef(F,1,V))>=LX1&&S<=LX2)
                   13415:                                L=[[S,mysubst(F,[V,S])]];
                   13416:                        return L;
                   13417:                }
                   13418:                for(L=[];S!=[];S=cdr(S))
                   13419:                        if(car(S)>=LX1&&car(S)<=LX2) L=cons([car(S),mysubst(F,[V,car(S)])],L);
                   13420:                return qsort(L);
                   13421:        }
                   13422:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   13423:                Div = 2^(10);
                   13424:        W=(LX2-LX1)/Div;
                   13425:        for(I=V2=0;I<=Div;I++){
                   13426:                X1=X2;X2=LX1+I*W;V1=V2;
                   13427:                if((V2=myeval(mysubst(F,[V,X2])))==0)
                   13428:                        L=cons([X2,V2],L);
                   13429:                if(V1*V2<0){
                   13430:                        L0=fzero(F,[V,X1,X2]|zero=1,trans=1);
                   13431:                        if(L0!=[]) L=cons(L0,L);
                   13432:                }
                   13433:        }
                   13434:        return reverse(L);
                   13435: }
                   13436:
                   13437: def fmmx(F,LX)
                   13438: {
                   13439:        if(length(LX)==3){
                   13440:                V=LX[0];LX=cdr(LX);
                   13441:        }else V=x;
                   13442:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   13443:        FT=F;
                   13444:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(FT);
                   13445:        FT=mysubst(FT,[[@pi,eval(@pi)],[@e,eval(@e)]]);
                   13446:        if(type(G=getopt(dif))>=1){
                   13447:                if(G==1) G=os_md.mydiff(F,V);
                   13448:                L=fzero(G,[V,LX1,LX2]|option_list=getopt());
                   13449:                R=[[LX1,myeval(mysubst(FT,[V,LX1]))]];
                   13450:                for(I=0;L!=[];L=cdr(L),I++){
                   13451:                        X=car(L)[0];
                   13452:                        if(X==LX1) continue;
                   13453:                        R=cons([X,myeval(mysubst(FT,[V,X]))],R);
                   13454:                }
                   13455:                if(X!=LX2)      R=cons([LX2,myeval(mysubst(FT,[V,LX2]))],R);
                   13456:                if(getopt(mmx)!=1) return reverse(R);
                   13457:                for(Mi=Ma=car(R);R!=[];R=cdr(R)){
                   13458:                        if(car(R)[1]>Ma[1]) Ma=car(R);
                   13459:                        else if(car(R)[1]<Mi[1]) Mi=car(R);
                   13460:                }
                   13461:                return [Mi,Ma];
                   13462:        }
                   13463:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   13464:                Div = 2^(10);
                   13465:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   13466:        W=(LX2-LX1)/Div;
                   13467:        for(I=V2=V3=0;I<=Div;I++){
                   13468:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   13469:                V3=myeval(mysubst(FT,[V,X3]));
                   13470:                if(I==0) L=[[X3,V3]];
                   13471:                if(I<2) continue;
                   13472:                if((V1-V2)*(V2-V3)<0){
                   13473:                        X02=X2;V02=V2;X03=X3;V03=V3;
                   13474:                        for(J=0; J<Dev && X1!=X3; J++){
                   13475:                                X12=(X1+X2)/2;V12=myeval(mysubst(FT,[V,X12]));
                   13476:                                if((V1-V12)*(V12-V2)<=0){
                   13477:                                        X3=X2;V3=V2;X2=X12;V2=V12;continue;
                   13478:                                }
                   13479:                                X23=(X2+X3)/2;V23=myeval(mysubst(FT,[V,X23]));
                   13480:                                if((V12-V2)*(V2-V23)<=0){
                   13481:                                        X1=X12;V1=V12;X3=X23;V3=V23;continue;
                   13482:                                }
                   13483:                                if((V2-V23)*(V23-V3)<=0){
                   13484:                                        X1=X2;V1=V2;X2=X23;V2=V23;continue;
                   13485:                                }
                   13486:                        }
                   13487:                        L=cons([X2,V2],L);
                   13488:                        X2=X02;V2=V02;X3=X03;V3=V03;
                   13489:                }
                   13490:        }
                   13491:        L=cons([LX2,myeval(mysubst(FT,[V,LX2]))],L);
                   13492:        if(getopt(mmx)!=1) return L;
                   13493:        for(Mi=Ma=car(L);L!=[];L=cdr(L)){
                   13494:                if(car(L)[1]>Ma[1]) Ma=car(L);
                   13495:                else if(car(L)[1]<Mi[1]) Mi=car(L);
                   13496:        }
                   13497:        return [Mi,Ma];
                   13498: }
                   13499:
                   13500: def flim(F,L)
                   13501: {
                   13502:        FD=f2df(F);
                   13503:        Lim0=4;Lim=12;FS=1;
                   13504:        if(type(Pc=getopt(prec))==1){
                   13505:                if((Pc>1&&Pc<31)||Pc>-5) Lim+=Pc;
                   13506:        }
                   13507:        if(type(Pc=getopt(init))==1 && Pc>0) FS*=Pc;
                   13508:        if(type(L)==7) L=[L];
                   13509:        else if(type(L)<2){
                   13510:                K=flim(F,["+",L]|option_list=getopt());
                   13511:                if(K=="") return K;
                   13512:                K1=flim(F,["-",L]|option_list=getopt());
                   13513:                if(K1=="") return K1;
                   13514:                if(type(K)==7||type(K1)==7){
                   13515:                        if(K!=K1) return "";
                   13516:                        return K;
                   13517:                }
                   13518:                if(abs(K)<10^(-5)){
                   13519:                        if(abs(K1)<10^(-5)) return (K1+K)/2;
                   13520:                        else return "";
                   13521:                }
                   13522:                if(abs((K1-K)/K)<10^(-4)) return (K1+K)/2;
                   13523:                return "";
                   13524:        }
                   13525:        if(type(L)!=4||type(L[0])!=7) return "";
                   13526:        if(L[0]=="-"||L[0]=="-infty"){
                   13527:                FS=-FS;
                   13528:        }else if(L[0]!="+"&&L[0]!="infty") return "";
                   13529:        FI=(length(L)==1)?1:0;
                   13530:        for(Inf=0,I=Lim0;I<Lim;I++){
                   13531:                D1=FS*8^I;D2=8*D1;
                   13532:                if(FI==0){
                   13533:                        D1=1/D1;D2=1/D2;
                   13534:                }
                   13535:                if(D1>D2){
                   13536:                        D=D1;D1=D2;D1=D;
                   13537:                        X1=D1;X2=D2;
                   13538:                }
                   13539:                if(FI==0){
                   13540:                        D1+=L[1];D2+=L[1];
                   13541:                }
                   13542:                K=fmmx(FD,[D1,D2]|mmx=1,mesh=16,dev=4);
                   13543:                if(I>Lim0){
                   13544:                        if(DF<K[1][1]-K[0][1]&&DF>10^(-8)&&DF<10^7){
                   13545:                                if(I>Lim0+1){
                   13546:                                        if(Inf==0) return "";
                   13547:                                }else Inf=1;
                   13548:                        }else if(Inf==1) return "";
                   13549:                }
                   13550:                DF=K[1][1]-K[0][1];
                   13551:        }
                   13552:        if(Inf==1){
                   13553:                if(K[0][1]>10^8) return "+";
                   13554:                else if(K[1][1]<-10^8) return "-";
                   13555:                return "";
                   13556:        }
                   13557:        V=(myfeval(FD,D1)+1.0)-1.0;
                   13558:        if(V!=0 && abs(V)<10^(-9)) return 0;
                   13559:        return V;
                   13560: }
                   13561:
                   13562: def fcont(F,LX)
                   13563: {
                   13564:        if(length(LX)==3){
                   13565:                V=LX[0];LX=cdr(LX);
                   13566:        }else V=x;
                   13567:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   13568:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(F);
                   13569:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   13570:                Div = 2^(10);
                   13571:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   13572:        W=(LX2-LX1)/Div;
                   13573:        if((Df=getopt(dif))!=1){
                   13574:                Df=0;
                   13575:        }else{
                   13576:                if(Dev==16) Dev=6;
                   13577:                WD=W/2^(Dev+1);
                   13578:        }
                   13579:        F=FT;
                   13580:        C=2;
                   13581:        for(I=V2=V3=0;I<=Div;I++){
                   13582:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   13583:                V3=myeval(mysubst(F,[V,X3]));
                   13584:                if(Df){
                   13585:                        if(I==Div) break;
                   13586:                        V3=(myeval(mysubst(F,[V,X3+WD]))-V3)/WD;
                   13587:                }
                   13588:                if(I==0) L=[[X3,V3]];
                   13589:                if(I<2) continue;
                   13590:                if(C*dabs(2*V2-V1-V3) > dabs(V1-V3)){
                   13591:                        X01=X1;V01=V1;X02=X2;V02=V2;X03=X3;V03=V3;
                   13592:                        for(J=0; X01!=X03; J++){
                   13593:                                if(dabs(V01-V02)>dabs(V02-V03)){
                   13594:                                        X03=X02;V03=V02;
                   13595:                                }else{
                   13596:                                        X01=X02;V01=V02;
                   13597:                                }
                   13598:                                if(J==Dev) break;
                   13599:                                X02=(X01+X02)/2;
                   13600:                                V02=myeval(mysubst(F,[V,X02]));
                   13601:                                if(Df) V02=(myeval(mysubst(F,[V,WD]))-V02)/WD;
                   13602:                                if(C*dabs(2*V02-V01-V03) < dabs(V01-V03)) break;
                   13603:                        }
                   13604:                        if(J==Dev||X01==X03) L=cons([X01,X03,V03-V01],L);
                   13605:                }
                   13606:        }
                   13607:        return reverse(L);
                   13608: }
                   13609:
                   13610: def xygraph(F,N,LT,LX,LY)
                   13611: {
                   13612:        if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;
                   13613:        if(type(DV=getopt(dviout))==4){
                   13614:                OL=delopt(getopt(),["dviout","shift","ext","cl"]);
                   13615:                OL=cons(["proc",1],OL);
                   13616:                R=xygraph(F,N,LT,LX,LY|option_list=OL);
                   13617:                OL=delopt(getopt(),["shift","ext","cl"]|inv=1);
                   13618:                return execdraw(R,DV|optilon_list=OL);
                   13619:        }
                   13620:        if(N==0) N=32;
                   13621:        if(N<0){
                   13622:                N=-N;
                   13623:                N1=-1; N2=N+1;
                   13624:        }else{
                   13625:                N1=0; N2=N;
                   13626:        }
                   13627:        if(length(LT)==3 && isvar(LT[0])==1){
                   13628:                TT=LT[0]; LT=cdr(LT);
                   13629:                F=mysubst(F,[TT,x]);
                   13630:        }
                   13631:        if(LX==0) LX=LT;
                   13632:        if((Acc=getopt(Acc))!=1) Acc=0;
                   13633:        if(Acc){
                   13634:                LX=[eval(LX[0]),eval(LX[1])];
                   13635:                LY=[eval(LY[0]),eval(LY[1])];
                   13636:                LT=[eval(LT[0]),eval(LT[1])];
                   13637:        }else{
                   13638:                LX=[deval(LX[0]),deval(LX[1])];
                   13639:                LY=[deval(LY[0]),deval(LY[1])];
                   13640:                LT=[deval(LT[0]),deval(LT[1])];
                   13641:        }
                   13642:        TD=(LT[1]-LT[0])/N;
                   13643:        if(type(Mul=getopt(scale))!=1){
                   13644:                if(type(Mul)==4){
                   13645:                        MulX=Mul[0]; MulY=Mul[1];
                   13646:                }else MulX=MulY=1;
                   13647:        }else MulX=MulY=Mul;
                   13648:        if(type(Org=getopt(org))==4){
                   13649:                Orgx=Org[0];Orgy=Org[1];
                   13650:        }else Orgx=Orgy=0;
                   13651:        if(type(F)!=4 || (getopt(para)!=1 && length(F)>1 && type(F[0])<4 && type(F[1])==4)) {
                   13652:                if(getopt(rev)!=1){
                   13653:                        F1=x; /* LX[0]+(LX[1]-LX[0])*(x-LT[0])/(TD*N); */
                   13654:                        F2=F;
                   13655:                }else{
                   13656:                        F1=F;
                   13657:                        F2=x; /* LY[0]+(LY[1]-LY[0])*(x-LT[0])/(TD*N); */
                   13658:                }
                   13659:        }else{
                   13660:                F1=F[0]; F2=F[1];
                   13661:        }
                   13662:        if(F1==0 || F2==0) LT=[];
                   13663:        if(length(LT)==2){
                   13664:                if(Acc){
                   13665:                        for(LTT=[],I=N2;I>=N1;I--)
                   13666:                                LTT=cons(eval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   13667:                }else{
                   13668:                        for(LTT=[],I=N2;I>=N1;I--)
                   13669:                                LTT=cons(deval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   13670:                }
                   13671:                LT=LTT;
                   13672:        }
                   13673:        Cpx=getopt(cpx);
                   13674:        if(Cpx!=1 && (str_str(rtostr(F1),"@i")>=0 || str_str(rtostr(F2),"@i")>=0))
                   13675:                Cpx=1;
                   13676:        if(type(Cpx)<0) Cpx=0;
                   13677:        if(!Acc){
                   13678:                if(type(F1)<4) F1=f2df(F1);
                   13679:                if(type(F2)<4) F2=f2df(F2);
                   13680:        }
                   13681:        if(type(Err=getopt(err))==1){
                   13682:                F1=mysubst(F1,[x,x+Err*TD/1001.23]);
                   13683:                F2=mysubst(F2,[x,x+Err*TD/1001.23]);
                   13684:        }
                   13685:        if(type(F1)==4 || type(F2)==4){
                   13686:                Dn=1;
                   13687:        }else Dn=dn(F1)*dn(F2);
                   13688:        for(V=[],PT=LT;PT!=[]; PT=cdr(PT)){
                   13689:                T=car(PT);
                   13690:                if(myfeval(Dn,T)==0){
                   13691:                        V=cons(0,V); continue;
                   13692:                }
                   13693:                if(Cpx>0||Acc){
                   13694:                        X=myfeval(F1,T);Y=myfeval(F2,T);
                   13695:                }else{
                   13696:                        X=myfdeval(F1,T);Y=myfdeval(F2,T);
                   13697:                }
                   13698:                if((N1==0||(PT!=LT&&length(PT)!=1)) && (X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1]))
                   13699:                        V=cons(0,V);
                   13700:                else
                   13701:                        V=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],V);
                   13702:        }
                   13703:        V=reverse(V);
                   13704:        Gap0=Gap=Arg=0;
                   13705:        if(type(Prec=getopt(prec))<0)
                   13706:                Level=0;
                   13707:        else if(Prec==0) Level=4;
                   13708:        else if(type(Prec)==1){
                   13709:                Level=Prec;
                   13710:                if(Level<0){
                   13711:                        Level=-Level;
                   13712:                        Gap0=1;
                   13713:                }
                   13714:        }else if(type(Prec)==4){
                   13715:                Level=Prec[0];
                   13716:                if(length(Prec)>1) Arg=Prec[1];
                   13717:                if(length(Prec)>2) Gap0=Prec[2];
                   13718:        }
                   13719:        if(Level>0){
                   13720:                if(Level>16) Level=16;
                   13721:                if(Arg<=0) Arg=30;
                   13722:                else if(Arg>120) Arg=120;
                   13723:                Arg=Acc?eval(@pi*Arg/180):deval(@pi*Arg/180);
                   13724:                SL=dcos(Arg);
                   13725:        }
                   13726:        if(Gap0>0){
                   13727:                if(Gap0<2) Gap0=16;
                   13728:                else if(Gap0>512) Gap0=512;
                   13729:                Gap=((MulX*(LX[1]-LX[0]))^2+(MulY*(LY[1]-LY[0]))^2)/(Gap0^2);
                   13730:        }
                   13731:        for(I=0;I<Level;I++){
                   13732:                for(F=K=G=0,NV=NLT=[],PLT=LT,PV=V;PLT!=[];K++,PLT=cdr(PLT),PV=cdr(PV)){
                   13733:                        TG=0;D0=D1;CLT0=CLT;CV0=CV;CV=car(PV);CLT=car(PLT);
                   13734:                        if(length(PV)>1){
                   13735:                                if((CV1=car(cdr(PV)))!=0 && CV!=0)
                   13736:                                        D1=[CV[0]-CV1[0],CV[1]-CV1[1]];
                   13737:                                else D1=0;
                   13738:                        }else K=-1; /* ? */
                   13739:                        if(K>0 &&(((D1==0||D0==0)&&(CV0!=0||CV!=0||CV1!=0)) || dvangle(D0,D1)<SL ||
                   13740:                          (Gap>0 && type(D0)==4 && (TG=(D0[0]^2+D0[1]^2-Gap)>0)))){
                   13741:                                G++;T1=(CLT0+CLT)/2;
                   13742:                                if(F==0 && (CV0!=0 || CV!=0)){
                   13743:                                        if(myfdeval(Dn,T1)==0){
                   13744:                                                NV=cons(0,NV); NLT=cons(T1,NLT);
                   13745:                                        }
                   13746:                                        if(Cpx>0||Acc){
                   13747:                                                X=myfeval(F1,T1);Y=myfeval(F2,T1);
                   13748:                                        }else{
                   13749:                                                X=myfdeval(F1,T1);Y=myfdeval(F2,T1);
                   13750:                                        }
                   13751:                                        if(K==1 && N1<0){
                   13752:                                                NV=[];NLT=[];
                   13753:                                        }
                   13754:                                        if((K>1||N1==0)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   13755:                                                NV=cons(0,NV);NLT=cons(T1,NLT);F=0;
                   13756:                                        }else{
                   13757:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T1,NLT);
                   13758:                                        }
                   13759:                                }
                   13760:                                NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   13761:                                if(!TG&&(CV0!=0||CV1!=0)){
                   13762:                                        T2=(car(cdr(PLT))+CLT)/2;
                   13763:                                        if(myfdeval(Dn,T2)==0){
                   13764:                                                NV=cons(0,NV); NLT=cons(CLT,NLT);
                   13765:                                        }
                   13766:                                        if(Cpx>0||Acc){
                   13767:                                                X=myfeval(F1,T2);Y=myfeval(F2,T2);
                   13768:                                        }else{
                   13769:                                                X=myfdeval(F1,T2);Y=myfdeval(F2,T2);
                   13770:                                        }
                   13771:                                        if((N1==0||length(PV)!=2)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   13772:                                                NV=cons(0,NV);NLT=cons(T1,NLT);
                   13773:                                        }else{
                   13774:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T2,NLT);
                   13775:                                        }
                   13776:                                }
                   13777:                                if(length(PV)==2 && N1==-1)     break;
                   13778:                                F=1;
                   13779:                        }else{
                   13780:                                F=0;NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   13781:                        }
                   13782:                }
                   13783:                V=reverse(NV);LT=reverse(NLT);
                   13784:                if(G==0) break;
                   13785:        }
                   13786:        if(Gap>0){
                   13787:                for(NV=[],PV=V;PV!=[];PV=cdr(PV)){
                   13788:                        NV=cons(P0=car(PV),NV);
                   13789:                        if(length(PV)>1 && P0!=0 && PV[1]!=0
                   13790:                          && (P0[0]-PV[1][0])^2+(P0[1]-PV[1][1])^2>Gap) NV=cons(0,NV);
                   13791:                }
                   13792:                V=reverse(NV);
                   13793:        }
1.18      takayama 13794:        if((Raw=getopt(raw))==1) return V;
                   13795:        if(Raw==2) return [V,LT];
1.6       takayama 13796:        OL=[["curve",1]];OLP=[];
                   13797:        if(type(C=getopt(ratio))==1){
                   13798:                OL=cons(["ratio",C],OL);OLP=cons(["ratio",C],OLP);
                   13799:        }
                   13800:        if(Acc==1) OL=cons(["Acc",1],OL);
                   13801:        if(N1<0) OL=cons(["close",-1],OL);
                   13802:        if(type(Opt=getopt(opt))!=7 && type(Opt)!=4){
                   13803:                if(Opt==0) return xylines(V|option_list=cons(["opt",0],OL));
                   13804:        }
                   13805:        OL=cons(["opt",(Proc)?0:Opt],OL);
                   13806:        if(type(Opt)>=0) OLP=cons(["opt",Opt],OLP);
                   13807:        if(type(Vb=getopt(verb))==1||type(Vb)==4){
                   13808:                OL=cons(["verb",Vb],OL);OLP=cons(["verb",Vb],OL);
                   13809:        }
                   13810:        if(Proc){
                   13811:                S=(Proc==1)?
                   13812:                        [[0,[MulX*(LX[0]-Orgx),MulX*(LX[1]-Orgx)],[MulY*(LY[0]-Orgy),MulY*(LY[1]-Orgy)],
                   13813:                        (TikZ)?1:1/10]]:[];
                   13814:                S=cons([1,OLP,xylines(V|option_list=OL)],S);
                   13815:                if(Proc==3) return car(S);
                   13816:        }else S=xylines(V|option_list=OL);
                   13817:        if(type(Pt=getopt(pt))==4){
                   13818:                if(type(Pt[0])!=4) Pt=[Pt];
                   13819:                if(length(Pt)>1 && type(Pt[1])!=4) Pt=[Pt];
                   13820:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   13821:                        PP=car(PT);
                   13822:                        if(type(PP[0])!=4) PP=[PP];
                   13823:                        P=car(PP);PP=cdr(PP);
                   13824:                        Qx=MulX*(P[0]-Orgx);Qy=MulY*(P[1]-Orgy);
                   13825:                        if(length(PP)>0 && type(PP[0])==4){             /* draw line */
                   13826:                                P=car(PP);
                   13827:                                Q1x=MulX*(P[0]-Orgx);Q1y=MulY*(P[1]-Orgy);
                   13828:                                if(length(PP)<1 || car(PP)==0 || iand(car(PP),1))
                   13829:                                         OL=["opt",(TikZ)?"-":"@{-}"];
                   13830:                                else OL=["opt",(TikZ)?".":"@{.}"];
                   13831:                                if(Proc) S=cons([1,OL,[[Qx,Qy],[Q1x,Q1y]]],S);
                   13832:                                else S=S+xylines([[Qx,Qy],[Q1x,Q1y]]|optilon_list=OL);
                   13833:                                continue;
                   13834:                        }
                   13835:                        if(length(PP)==0 || type(car(PP))!=7)  SS="$\\bullet$";
                   13836:                        else SS=car(PP);
                   13837:                        if(length(PP)<=1){
                   13838:                                if(Proc) S=cons([2,[],[Qx,Qy],[SS]],S);
                   13839:                                else S=S+xyput([Qx,Qy,SS]);
                   13840:                        }else{
                   13841:                                if(Proc) S=cons([2,[],[Qx,Qy],[[SS],"",PP[1]]],S);
                   13842:                                S=S+xyput([Qx,Qy,SS,"",PP[1]]);
                   13843:                        }
                   13844:                }
                   13845:        }
                   13846:        if(type(Ax=getopt(ax))==4){  /* draw axis */
                   13847:                Adx0=Ady0=0; Adx1=Ady1=0.1;
                   13848:                if(!TikZ){
                   13849:                        if(!XYcm) Adx1=Ady1=1;
                   13850:                        LOp="@{-}"; LxOp="+!U"; LyOp="+!R";
                   13851:                }else{
                   13852:                        LOp="-"; LxOp="below"; LyOp="left";
                   13853:                }
                   13854:                LOp0=LOp1=LOp;
                   13855:                LxOO=(Ax[1]==LY[0])?LxOp:(TikZ)?"below left":"+!UR";
                   13856:                if(type(AxOp=getopt(axopt))>0){
                   13857:                        if(type(AxOp)==1){
                   13858:                                if(AxOp>0)      Adx1=Ady1=AxOp;
                   13859:                                else if(AxOp<0){
                   13860:                                        Adx1=Ady1=0; Adx0=Ady0=AxOp;
                   13861:                                }
                   13862:                        }else if(type(AxOp)==4){
                   13863:                                if(type(T=car(AxOp))==4 && length(AxOp)>1){
                   13864:                                        if(type(T)==7){
                   13865:                                                LxOp=T; LyOp=AxOp[1];
                   13866:                                        }else if(type(T)==4){
                   13867:                                                Ay0=T[0]; Ay1=T[1]; Ax0=AxOp[1][0]; Ax1=AxOp[1][1];
                   13868:                                                if(length(T)>2) LxOp=T[2];
                   13869:                                                if(length(AxOp[1])>2) LyOp=AxOp[1][2];
                   13870:                                        }
                   13871:                                }
                   13872:                                if(length(AxOp)>2 && type(AxOp[2])==7) LxOO=AxOp[2];
                   13873:                                if(length(AxOp)>3 && type(AxOp[3])==7) LOp0=AxOp[3];
                   13874:                                if(length(AxOp)>4 && type(AxOp[4])==7) LOp1=AxOp[4];
                   13875:                        }
                   13876:                        if(type(AxOp)==7) LOp0=AxOp;
                   13877:                }
                   13878:                if(Ax[0]>=LX[0] && Ax[0]<=LX[1]){       /* draw marks on x-axis */
                   13879:                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp0]]:[],
                   13880:                                [MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],[MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]],S);
                   13881:                        else S=S+xyarrow([MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],
                   13882:                                [MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]|opt=LOp0);
                   13883:                        if(length(Ax)>2){
                   13884:                                D=Ax[2];
                   13885:                                if(type(D)==1 && D>0){
                   13886:                                        I0=ceil((LX[0]-Ax[0])/D); I1=floor((LX[1]-Ax[0])/D);
                   13887:                                        for(DD=[],I=I0; I<=I1; I++){
                   13888:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   13889:                                                else if(Ax[4]==0) DD=cons([I*D,I*D+Ax[0]],DD);
                   13890:                                                else if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   13891:                                                else if(Ax[4]==2) DD=cons([I*D,I],DD);
                   13892:                                        }
                   13893:                                        D=DD;
                   13894:                                }
                   13895:                                if(type(D)==4){
                   13896:                                        for(;D!=[]; D=cdr(D)){
                   13897:                                                T=car(D);
                   13898:                                                if(type(T)==4) T=car(T);
                   13899:                                                X=MulX*(T+Ax[0]-Orgx); Y=MulY*(Ax[1]-Orgy);
                   13900:                                                if(T!=0){
                   13901:                                                        if(Proc) S=cons([3,(type(LOp1)>=0)?[["opt",LOp1]]:[],[X,Y+Ady0],[X,Y+Ady1]],S);
                   13902:                                                        else S=S+xyarrow([X,Y+Ady0],[X,Y+Ady1]|opt=LOp1);
                   13903:                                                }
                   13904:                                                if(type(car(D))==4){
                   13905:                                                        Arg=[(T==0)?LxOO:LxOp,D[0][1]];
                   13906:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[Arg]],S);
                   13907:                                                        else S=S+xyput([X,Y+Ady0,Arg]);
                   13908:                                                }
                   13909:                                        }
                   13910:                                }
                   13911:                        }
                   13912:                }
                   13913:                if(Ax[1]>=LY[0] && Ax[1]<=LY[1]){       /* draw marks on y-axis */
                   13914:                        if(Proc) S=cons([3,[["opt",LOp0]],
                   13915:                                        [MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   13916:                                        [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]],S);
                   13917:                        else S=S+xyarrow([MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   13918:                                [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]|opt=LOp0);
                   13919:                        if(length(Ax)>3){
                   13920:                                D=Ax[3];
                   13921:                                if(type(D)==1 && D>0){
                   13922:                                        I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[0])/D);
                   13923:                                        for(DD=[],I=I0; I<=I1; I++){
                   13924:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   13925:                                                else if(I!=0){
                   13926:                                                        if(Ax[4]==0) DD=cons([I*D,I*D+Ax[1]],DD);
                   13927:                                                        if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   13928:                                                        if(Ax[4]==2) DD=cons([I*D,I],DD);
                   13929:                                                }
                   13930:                                        }
                   13931:                                        D=DD;
                   13932:                                }
                   13933:                                if(type(D)==4){
                   13934:                                        for(;type(D)==4&&D!=[]; D=cdr(D)){
                   13935:                                                T=car(D);
                   13936:                                                if(type(T)==4) T=car(T);
                   13937:                                                X=MulX*(Ax[0]-Orgx); Y=MulY*(T+Ax[1]-Orgy);
                   13938:                                                if(T!=0){
                   13939:                                                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp1]]:[],
                   13940:                                                                [X+Adx0,Y],[X+Adx1,Y]],S);
                   13941:                                                        else S=S+xyarrow([X+Adx0,Y],[X+Adx1,Y]|opt=LOp1);
                   13942:                                                }
                   13943:                                                if(type(car(D))==4){
                   13944:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[[LyOp,D[0][1]]]],S);
                   13945:                                                        else S=S+xyput([X,Y+Ady0,[LyOp,D[0][1]]]);
                   13946:                                                }
                   13947:                                        }
                   13948:                                }
                   13949:                        }
                   13950:                }
                   13951:        }
                   13952:        if(Proc) return reverse(S);
                   13953:        if(getopt(dviout)!=1) return S;
                   13954:        xyproc(S|dviout=1);
                   13955: }
                   13956:
                   13957: def xyarrow(P,Q)
                   13958: {
                   13959:        Cmd = ["fill","filldaw","shade","shadedraw","clip ","pattern","path ","node","coordinate"];
                   13960:        if(type(P)<4) return "%\n";
                   13961:        SS=getopt(opt);
                   13962:        if(!TikZ){
                   13963:                if(type(Q)<4) return "";
                   13964:                S="{"+xypos(P)+" \\ar";
                   13965:                if(type(SS)==7) S=S+SS;
                   13966:                return S+" "+xypos(Q)+"};\n";
                   13967:        }
                   13968:        if(type(SS)==4 && length(SS)>1){
                   13969:                if(length(SS)>2) SU=SS[2];
                   13970:                ST=SS[1];
                   13971:                SS=SS[0];
                   13972:        }
                   13973:        if(type(SS)!=7) SS="->";
                   13974:        if(type(ST)!=7) ST=" -- ";
                   13975:        if(type(SU)!=7) SU="";
                   13976:        if(type(S=getopt(cmd))==7) S="\\"+S;
                   13977:        else S="\\draw";
                   13978:        if(type(Q)!=4){
                   13979:                if(Q>0 && Q<=length(Cmd)) S="\\"+Cmd[Q-1]+"";
                   13980:                if(SS!="-") S=S+"["+SS+"]";
                   13981:                if(SU!="") SU="["+SU+"]";
                   13982:                return S+xypos(P)+ST+SU+";\n";
                   13983:        }
1.8       takayama 13984:        if(SS!="-"&&SS!="") S=S+"["+SS+"]";
1.6       takayama 13985:        if(length(P)<3 && length(Q)<3)
                   13986:                return S+xypos(P)+ST+xypos(Q)+SU+";\n";
                   13987:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   13988:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   13989:                P=[P[0],P[1],P[2],"_0"];
                   13990:        else if(P[3]=="")
                   13991:                P=[P[0],P[1],P[2],"_0",P[4]];
                   13992:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   13993:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   13994:                Q=[Q[0],Q[1],Q[2],"_1"];
                   13995:        else if(Q[3]=="")
                   13996:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   13997:        return S+xypos(P)+" "+xypos(Q)+"("+P[3]+")"+ST+"("+Q[3]+")"+SU+";\n";
                   13998: }
                   13999:
                   14000: def xyarrows(P,Q,R)
                   14001: {
                   14002:        PQ=newvect(4);
                   14003:        PQ[0]=(type(P[0])!=4)?f2df(P[0]):P[0];
                   14004:        PQ[1]=(type(P[1])!=4)?f2df(P[1]):P[1];
                   14005:        PQ[2]=(type(Q[0])!=4)?f2df(Q[0]):Q[0];
                   14006:        PQ[3]=(type(Q[1])!=4)?f2df(Q[1]):Q[1];
                   14007:        if(type(R[0])!=4) R=[R];
                   14008:        TR=R[0];NX=TR[2];X=X0=TR[0];DX=(TR[1]-TR[0])/NX;
                   14009:        if(length(R)==2){
                   14010:                TR=R[1];NY=TR[2];Y=TR[0];DY=(TR[1]-TR[0])/NY;
                   14011:        }else{
                   14012:                NY=1;Y=DY=0;
                   14013:        }
                   14014:        if(type(L=getopt(abs))!=1) L=0;
                   14015:        if(type(Sc=getopt(scale))!=1) Sc=0;
                   14016:        OL=[];
                   14017:        if(type(Opt=getopt(opt))==7) OL=cons(["opt",Opt],OL);
                   14018:        Tb=str_tb(0,0);
                   14019:        for(J=0;J<NY;Y+=DY,J++){
                   14020:                for(I=0,X=X0;I<NX;I++,X+=DX){
                   14021:                        PX=myf2eval(PQ[0],X,Y);PY=myf2eval(PQ[1],X,Y);
                   14022:                        VX=myf2eval(PQ[2],X,Y);VY=myf2eval(PQ[3],X,Y);
                   14023:                        if(L>0){
                   14024:                                C=dnorm([VX,VY]);
                   14025:                                if(C!=0){
                   14026:                                        VX*=L/C;VY*=L/C;
                   14027:                                }
                   14028:                        }
                   14029:                        if(Sc){
                   14030:                                VX*=Sc;VY*=Sc;
                   14031:                        }
                   14032:                        if(VX||VY) str_tb(xyarrow([PX,PY],[PX+VX,PY+VY]|optilon_list=OL),Tb);
                   14033:                }
                   14034:        }
                   14035:        return str_tb(0,Tb);
                   14036: }
                   14037:
                   14038: def polroots(L,V)
                   14039: {
                   14040:        INIT=1;
                   14041:        if(type(CF=getopt(comp))!=1) CF=0;
                   14042:        OL=getopt();
                   14043:        if(CF>32){
                   14044:                CF-=64;
                   14045:                INIT=0;
                   14046:        }else OL=cons(["comp",CF+64],delopt(OL,"comp"));
                   14047:        if(type(V)==4&&length(V)==1){
                   14048:                L=L[0];V=V[0];
                   14049:        }
                   14050:        Lim=Lim2=[];
                   14051:        if(type(L)<4){
                   14052:                if(type(Lim=getopt(lim))==4){
1.17      takayama 14053:                        if(type(Lim[0])!=4){
                   14054:                                if(!isvar(Lim[0])) Lim=cons(V,[Lim]);
                   14055:                                Lim=[Lim];
                   14056:                        }
                   14057:                        if(!isvar(Lim[0][0])) Lim=[cons(V,Lim)];
1.6       takayama 14058:                        Lim=delopt(Lim,V|inv=1);
                   14059:                        if(Lim!=[]){
                   14060:                                Lim=Lim[0];
                   14061:                                if(length(Lim)==3) Lim2=Lim[2];
                   14062:                                Lim=Lim[1];
                   14063:                        }
                   14064:                }else{
                   14065:                        Lim=Lim2=[];
                   14066:                }
                   14067:                if((CF==-2||CF==-1||CF==2)&&iscoef(L,os_md.israt)){     /* Rat+Comp, Rat+Real or Rat */
                   14068:                        S=(CF==-1)?getroot(L,V|cpx=1):getroot(L,V);
                   14069:                        for(RR=[],F=x;S!=[];S=cdr(S)){
                   14070:                                if(findin(V,vars(C=car(S)))<0){         /* Rational solution */
                   14071:                                        if(type(C)<2){
                   14072:                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   14073:                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   14074:                                        }
                   14075:                                        if(F!=C) RR=cons(F=C,RR);
                   14076:                                }else if(CF<0){                                         /* Irrational solution */
                   14077:                                        if((R=pari(roots,mysubst(C,[V,x])))!=0){
                   14078:                                                for(R=vtol(R);R!=[];R=cdr(R))
                   14079:                                                        if((C=car(R))!=F && ntype(C)<CF+6){
                   14080:                                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   14081:                                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   14082:                                                                RR=cons(F=C,RR);
                   14083:                                                        }
                   14084:                                        }
                   14085:                                }
                   14086:                        }
                   14087:                        return qsort(RR);
                   14088:                }
                   14089:                R=pari(roots,subst(L,V,x));
                   14090:                if(R==0){
                   14091:                        R=[0];
                   14092:                        if(CF==1){
                   14093:                                for(R=[0],I=mydeg(L,V);I>1; I--)
                   14094:                                        R=cons(0,R);
                   14095:                        }
                   14096:                        return R;
                   14097:                }
                   14098:                if(CF==1){              /* Complex */
                   14099:                        if(Lim==[]&&Lim2==[]) return vtol(R);
                   14100:                        for(L=[],I=length(R)-1;I>=0;I--){
                   14101:                                C=R[I];
                   14102:                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   14103:                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   14104:                                L=cons(C,L);
                   14105:                        }
                   14106:                        return L;
                   14107:                }
                   14108:                for(L=[],F=x,I=length(R)-1;I>=0;I--){   /* Real */
                   14109:                        if(ntype(R[I])<4 && F!=R[I]){
                   14110:                                if(Lim!=[] && (R[I]<Lim[0]||R[I]>Lim[1])) continue;
                   14111:                                L=cons(F=R[I],L);
                   14112:                        }
                   14113:                }
                   14114:                return qsort(L);
                   14115:        }
                   14116:        if(SS==0&&INIT==1){
                   14117:                SS=polroots(L,V|option_list=OL);
                   14118:                if(SS!=0) return SS;
1.18      takayama 14119:                for(C=0;SS==0&&C<5;C++){
1.6       takayama 14120:                        I=(C==0)?1:(iand(random(),0xff)-0x80);
                   14121:                        for(LL=[],K=length(L)-1;K>=0;K--){
                   14122:                                for(Q=0,J=length(L)-1;J>=0;J--)
                   14123:                                        Q+=L[J]*(I+K)^J;
                   14124:                                LL=cons(Q,LL);
                   14125:                        }
                   14126:                        SS=polroots(LL,V|option_list=OL);
                   14127:                        if(SS!=0) return SS;
                   14128:                }
                   14129:                return SS;
                   14130:        }
                   14131:        C=2^(-32);
                   14132:        if(type(getopt(err))==1) C=err;
                   14133:        if((N=length(V))!=length(L)) return [];
                   14134:        if(N==1) return polroots(L[0],V[0]|option_list=OL);
                   14135:        for(L1=[],I=1;I<N;I++){
                   14136:                Res=res(V[0],L[I-1],L[I]);
                   14137:                if(type(Res)<2) return Res;
                   14138:                L1=cons(res(V[0],L[I-1],L[I]),L1);
                   14139:        }
                   14140:        R=polroots(L1,V1=cdr(V)|option_list=OL);
                   14141:        if(type(R)<2) return R;
                   14142:        for(SS=[];R!=[];R=cdr(R)){
                   14143:                RS=(N==2)?[car(R)]:car(R);
                   14144:                for(I=0,L0=L[0];I<N-1;I++) L0=mysubst(L0,[V1[I],RS[I]]);
1.17      takayama 14145:                if(L0==0) return 0;
1.6       takayama 14146:                S0=polroots(L0,V[0]|option_list=OL);
                   14147:                if(type(S0)<2) return S0;
                   14148:                for(S=S0;S!=[];S=cdr(S)){
                   14149:                        S0=cons(car(S),RS);
                   14150:                        for(LT=cdr(L);LT!=[];LT=cdr(LT)){
                   14151:                                for(I=0,TV=car(LT);I<N;I++) TV=mysubst(TV,[V[I],S0[I]]);
                   14152:                                if(abs(TV)>C) break;
                   14153:                        }
                   14154:                        if(LT==[]) SS=cons(S0,SS);
                   14155:                }
                   14156:        }
                   14157:        return reverse(SS);
                   14158: }
                   14159:
                   14160: def ptcommon(X,Y)
                   14161: {
                   14162:        if(length(X)!=2 || length(Y)!=2) return 0;
                   14163:        if(type(X[1])==4){ /* X is a line */
                   14164:                if((In=getopt(in))==-1||In==-2||In==-3){
                   14165:                        X0=(X[0][0]+X[1][0])/2;X1=(X[0][1]+X[1][1])/2;
                   14166:                        X=[[X0,X1],[X0+X[1][1]-X[0][1],X1-X[1][0]+X[0][0]]];
                   14167:                        if(In==-1&&type(Y[1])==4) return ptcommon(Y,X|in=-2);
                   14168:                        /* for the second line */
                   14169:                        if(In==-3) In=1;
                   14170:                        else In=0;
                   14171:                }else if(In==2||In==3){
                   14172:                        X=(X[1][0]-X[0][0])+(X[1][1]-X[0][1])*@i;
                   14173:                        if(X==0) return 0;
                   14174:                        Y=(Y[1][0]-Y[0][0])+(Y[1][1]-Y[0][1])*@i;
                   14175:                        X=myarg(Y/X);
                   14176:                        return (In==2)?X:(X*180/deval(@pi));
                   14177:                }else if(In!=1) In=0;
                   14178:                if(type(Y[0])<=3){
                   14179:                        if(In==1){
                   14180:                                return [(Y[1]*X[0][0]+Y[0]*X[1][0])/(Y[0]+Y[1]),
                   14181:                                (Y[1]*X[0][1]+Y[0]*X[1][1])/(Y[0]+Y[1])];
                   14182:                        }
                   14183:                        XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];
                   14184:                        Arg=(length(Y)<2)?0:Y[1];
                   14185:                        Arg=deval(Arg);
                   14186:                        if(Arg!=0){
                   14187:                                S=dcos(Arg)*XX-dsin(Arg)*YY;
                   14188:                                YY=dsin(Arg)*XX+dcos(Arg)*YY;
                   14189:                                XX=S;
                   14190:                        }
                   14191:                        S=dnorm([XX,YY]);
                   14192:                        if(S!=0){
                   14193:                                XX*=Y[0]/S;YY*=Y[0]/S;
                   14194:                        }
                   14195:                        return [X[1][0]+XX,X[1][1]+YY];
                   14196:                }
                   14197:                S=[X[0][0]+(X[1][0]-X[0][0])*x_,X[0][1]+(X[1][1]-X[0][1])*x_];
                   14198:                if(type(Y[1])==4){ /* Y is a line */
                   14199:                        T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],
                   14200:                                Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];
                   14201:                        R=lsol(T,[x_,y_]);
                   14202:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   14203:                                if(!In || (R[0][1]>=0&&R[0][1]<=1&&R[1][1]>=0&&R[1][1]<=1) )
                   14204:                                        return subst(S,x_,R[0][1],y_,R[1][1]);
                   14205:                        }
                   14206:                        if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;
                   14207:                        if(!In) return 1;
                   14208:                        I=(X[0][0]==X[1][0]&&Y[0][0]==Y[1][0]&&X[0][0]==Y[0][0])?1:0;
                   14209:                        if(X[0][I]<=X[1][I]){
                   14210:                                X0=X[0][I];X1=X[1][I];
                   14211:                        }else{
                   14212:                                X1=X[0][I];X0=X[1][I];
                   14213:                        }
                   14214:                        return ((Y[0][I]<X0 && Y[1][I]<X0)||(Y[0][I]>X1&&Y[1][I]>X1))?0:1;
                   14215:                }else if(Y[1]==0){ /* orth */
                   14216:                        T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],
                   14217:                                Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];
                   14218:                        R=lsol(T,[x_,y_]);
                   14219:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   14220:                                if(!In||(R[0][1]>=0&&R[0][1]<=1))
                   14221:                                        return subst(S,x_,R[0][1],y_,R[1][1]);
                   14222:                        }
                   14223:                        return (X[0]==X[1])?0:1;
                   14224:                }else if(type(Y[1])==1 && Y[1]>0){ /* circle */
                   14225:                        T=(S[0]-Y[0][0])^2+(S[1]-Y[0][1])^2-Y[1]^2;
                   14226:                        D=mycoef(T,1,x_)^2-4*mycoef(T,0,x_)*mycoef(T,2,x_);
                   14227:                        if(D==0){
                   14228:                                V=mycoef(T,1,x_)/(2*mycoef(T,2,x_));
                   14229:                                if(!in||(V>=0&&V<=1)) return [subst(S,x_,V)];
                   14230:                        }
                   14231:                        else if((type(D)==1&&D>0)){
                   14232:                                D=dsqrt(D);
                   14233:                                V=-(mycoef(T,1,x_)+D)/(2*mycoef(T,2,x_));
                   14234:                                if(!In||(V>=0&&V<=1)) L=[subst(S,x_,V)];
                   14235:                                else L=[];
                   14236:                                V=(D-mycoef(T,1,x_))/(2*mycoef(T,2,x_));
                   14237:                                if(!In||(V>=0&&V<=1)) L=cons(subst(S,x_,V),L);
                   14238:                                if(length(L)>0) return L;
                   14239:                        }
                   14240:                }
                   14241:                return 0;
                   14242:        }
                   14243:        if(type(Y[1])==4 || X[1]==0) return ptcommon(Y,X);
                   14244:        /* X is a circle */
                   14245:        if(Y[1]==0){    /* tangent line */
                   14246:                if(Y[0][0]==X[0][0]+X[1] || Y[0][0]==X[0][0]-X[1]) L=[[Y[0][0],X[0][1]]];
                   14247:                else L=[];
                   14248:                P=(Y[0][0]+x_-X[0][0])^2+(Y[0][1]+x_*y_-X[0][1])^2-X[1]^2;
                   14249:                Q=mycoef(P,1,x_)^2-4*mycoef(P,2,x_)*mycoef(P,0,x_);
                   14250:                for(R=polroots(Q,y_);R!=[];R=cdr(R)){
                   14251:                        X0=-subst(mycoef(P,1,x_)/(2*mycoef(P,2,x_)),y_,car(R));
                   14252:                        L=cons([Y[0][0]+X0,Y[0][1]+car(R)*X0],L);
                   14253:                }
                   14254:        }else{ /* Y is a circle */
                   14255:                P=(x_-X[0][0])^2+(y_-X[0][1])^2-X[1]^2;
                   14256:                Q=(x_-Y[0][0])^2+(y_-Y[0][1])^2-Y[1]^2;
                   14257:                V=(X[0][0]!=Y[0][0])?[x_,y_]:[y_,x_];
                   14258:                R=subst(P,V[0],T=lsol(P-Q,V[0]));
                   14259:                if(type(T[0])<4) return (T[0]==0)?1:0;
                   14260:                S=polroots(R,V[1]);
                   14261:                for(L=[];S!=[];S=cdr(S)){
                   14262:                        R=subst(T,V[1],car(S));
                   14263:                        if(V[0]==x_) L=cons([R,car(S)],L);
                   14264:                        else L=cons([S,R],L);
                   14265:                }
                   14266:        }
                   14267:        if(length(L)!=0) return L;
                   14268:        return 0;
                   14269: }
                   14270:
                   14271: def tobezier(L)
                   14272: {
                   14273:        if((Div=getopt(div))==1||Div==2){
                   14274:                if(length(L)!=4) return [tobezier(L|inv=[0,1/2]),tobezier(L|inv=[1/2,1])];
                   14275:                if(type(L)==4) L=ltov(L);
                   14276:                if(type(L[0])==4)
                   14277:                        L=[ltov(L[0]),ltov(L[1]),ltov(L[2]),ltov(L[3])];
                   14278:                S=[(L[0]+3*L[1]+3*L[2]+L[3])/8];
                   14279:                T=[L[3]];
                   14280:                S=cons((L[0]+2*L[1]+L[2])/4,S);
                   14281:                T=cons((L[2]+L[3])/2,T);
                   14282:                S=cons((L[0]+L[1])/2,S);
                   14283:                T=cons((L[1]+2*L[2]+L[3])/4,T);
                   14284:                S=cons(L[0],S);
                   14285:                T=cons((L[0]+3*L[1]+3*L[2]+L[3])/8,T);
                   14286:                return [S,T];
                   14287:        }
                   14288:        if(Div>2&&Div<257){
                   14289:                L=tobezier(L);
                   14290:                for(R=[],I=Div-1;I>=0;I--)
                   14291:                        R=cons(tobezier(L|inv=[I/Div,(I+1)/Div]),R);
                   14292:                return R;
                   14293:        }
                   14294:        if((V=getopt(inv))==1 || type(V)>3){
                   14295:                if(type(L[0])>3 && type(V)>3) L=tobezier(L);
                   14296:                if(type(V)>3 && length(V)>2) V2=V[2];
                   14297:                if(type(V2)!=2) V2=t;
                   14298:                if(type(V)>3) L=subst(L,V2,(V[1]-V[0])*V2+V[0]);
                   14299:                N=mydeg(L,V2);
                   14300:                for(R=[],I=0;I<=N;I++){
                   14301:                        RT=mycoef(L,I,V2);
                   14302:                        R=cons(RT/binom(N,I),R);
                   14303:                        L-=RT*V2^I*(1-V2)^(N-I);
                   14304:                }
                   14305:                return reverse(R);
                   14306:        };
                   14307:        N=length(L)-1;
                   14308:        V=newvect(2);
                   14309:        for(I=0;I<=N;I++,L=cdr(L)){
                   14310:                if(type(X=car(L))==4) X=ltov(X);
                   14311:                V+=X*binom(N,I)*t^I*(1-t)^(N-I);
                   14312:        }
                   14313:        return V;
                   14314: }
                   14315:
                   14316: def cutf(F,X,VV)
                   14317: {
                   14318:        if(type(car(V=VV))==2){
                   14319:                Y=[car(V),X];
                   14320:                V=cdr(V);
                   14321:        }else Y=X;
                   14322:        if(type(X)>1){
                   14323:                Y=(type(Y)==4)?Y[0]:x;
                   14324:                V1=makenewv(F);
                   14325:                if(X==Y||Y==x){
                   14326:                        V2=makenewv([F,V1]);
                   14327:                        F=mysubst(F,[Y,V2]);
                   14328:                        V=cons(V2,V);
                   14329:                }
                   14330:                return [V1,[V1,os_md.cutf,[F],X,[V]]];
                   14331:        }
                   14332:        if(car(V)!=[] && X<car(V)[0]) return myfeval(car(V)[1],Y);
                   14333:        for(V=cdr(V); ;V=R){
                   14334:                if((R=cdr(V))==[]){
                   14335:                        if(car(V)!=[] && car(V)[0]<X) return myfeval(car(V)[1],Y);
                   14336:                        return myfeval(F,Y);
                   14337:                }
1.20      takayama 14338:                if(car(V)==[]||X>car(V)[0]) continue;
1.6       takayama 14339:                if(X==car(V)[0]) return car(V)[1];
                   14340:                return myfeval(F,Y);
                   14341:        }
                   14342: }
                   14343:
1.12      takayama 14344: def fsum(F,L)
1.6       takayama 14345: {
1.12      takayama 14346:        if(getopt(df)==1){
                   14347:                F=f2df(F);
                   14348:        }else Sub=getopt(subst);
1.6       takayama 14349:        if(type(L[0])==2){
                   14350:                X=L[0];
                   14351:                L=cdr(L);
                   14352:        }else X=0;
                   14353:        V=(length(L)>2)?L[2]:1;
                   14354:        for(R=0,I=L[0];;I+=V){
                   14355:                if(V==0||(I-L[1])*V>0) return R;
1.12      takayama 14356:                R+=(Sub==1)?subst(F,X?X:x,I):os_md.myfeval(F,X?[X,I]:I);
1.6       takayama 14357:        }
                   14358: }
                   14359:
                   14360: def periodicf(F,L,X)
                   14361: {
                   14362:        if(type(L)==4) L=[eval(L[0]),eval(L[1])];
                   14363:        else L=eval(L);
                   14364:        if(isvar(X)){
1.20      takayama 14365:                Y=makenewv([X,F]);
                   14366:                Z=makenewv([X,Y,F]);
1.16      takayama 14367:                return [Z,[Z,os_md.periodicf,[mysubst(F,[x,Y])],(type(L)==4)?[L]:L,[[Y,X]]]];
                   14368:        }
                   14369:        if(type(X)==4){
                   14370:                V=X[0];
                   14371:                X=X[1];
                   14372:        }else V=x;
                   14373:        if(type(F)==5){
                   14374:                X=eval(X);
                   14375:                return myfeval(F[floor(X/L)%length(F)],[V,X-floor(X/L)*L]);
1.6       takayama 14376:        }
                   14377:        if(type(L)==4){
                   14378:                X-=floor((X-L[0])/(L[1]-L[0]))*(L[1]-L[0]);
                   14379:                return myfeval(F,[V,X]);
                   14380:        }
                   14381: }
                   14382:
                   14383: def cmpf(X)
                   14384: {
                   14385:        if(type(X)>3){
                   14386:                if(type(L)==7) return [S_Fc,Dx,S_Ic,S_Ec,S_EC,S_Lc];
                   14387:                S_Lc=0;
                   14388:                if(type(S_Fc=X[0])!=4) S_Fc=f2df(S_Fc);
                   14389:                S_Ic=X[1];
                   14390:                if(length(S_Ic)>2){
                   14391:                        S_Fc=mysubst(S_Fc,[S_Ic[0],x]);
                   14392:                        S_Ic=cdr(S_Ic);
                   14393:                }
                   14394:                S_Dc=(type(S_Ic[0])==7)?1:0;
                   14395:                if(type(S_Ic[1])==7) S_Dc=ior(S_Dc,2);
                   14396:                if(type(S_Ec=getopt(exp))!=1) S_Ec=0;
                   14397:                if(S_Ec<=0){
                   14398:                        S_EC=-S_Ec;
                   14399:                        if(S_EC==0) S_EC=1;
                   14400:                        if(S_Dc==3) S_EC*=2;
                   14401:                        else S_EC/=4;
                   14402:                        if(type(F=X[0])==3&&vars(F)==[x]&&(D=deg(nm(F),x))==deg(dn(F),x)-2){
                   14403:                                S_Lc=S_EC*coef(nm(F),D,x)/coef(dn(F),D+2,x);
                   14404:                        }
                   14405:                }else{
                   14406:                        S_EC=S_Ec;
                   14407:                        if(S_Dc==3) S_EC*=12;
                   14408:                        else S_EC/=6;
                   14409:                }
                   14410:                if(type(S_Fc)==3) S_Fc=red(S_Fc);
                   14411:                S_EC=1/S_EC;
                   14412:                return [z_,[z_,os_md.cmpf,x]];
                   14413:        }
                   14414:        if(X<=0 && iand(S_Dc,1)) return S_Lc;
                   14415:        if(X>=1 && iand(S_Dc,2)) return S_Lc;
                   14416:        if(S_Dc==3){
                   14417:                if(S_Ec>0){
                   14418:                        Y0=dexp(1/X)*S_EC;
                   14419:                        Y1=dexp(1/(1-X))*S_EC;
                   14420:                        return myfeval(S_Fc,Y1-Y0)*(Y0/X^2+Y1/(1-X)^2);
                   14421:                }
                   14422:                return myfeval(S_Fc,S_EC/(1-X)-S_EC/X)*(S_EC/(1-X)^2+S_EC/X^2);
                   14423:        }
                   14424:        if(S_Dc==1){
                   14425:                if(S_Ec>0){
                   14426:                        Y=dexp(1-1/X);
                   14427:                        R=myfeval(S_Fc,S_EC*(Y-1)+I[1])*Y;
                   14428:                }
                   14429:                else R=myfeval(S_Fc,I[1]+(1-1/X)*S_EC);
                   14430:                return R*S_EC/X^2;
                   14431:        }
                   14432:        if(S_Dc==2){
                   14433:                if(S_Ec>0){
                   14434:                        Y=dexp(X/(1-X));
                   14435:                        R=myfeval(S_Fc,S_EC*(Y-1)+S_Ic[0])*Y;
                   14436:                }else R=myfeval(S_Fc,S_EC*X/(1-X)+S_Ic[0]);
                   14437:                return R*S_EC/(1-X)^2;
                   14438:        }
                   14439:        X=S_Ic[0]+(S_Ic[1]-S_Ic[0])*X;
                   14440:        return myfeval(S_Fc,X)/(S_Ic[1]-Ic[0]);
                   14441: }
                   14442:
                   14443: def fresidue(P,Q)
                   14444: {
                   14445:        if(iscoef(Q,os_md.israt)) S=fctr(Q);
                   14446:        else S=[[Q,1]];
                   14447:        for(R=[];S!=[];S=cdr(S)){
                   14448:                T=car(S);
                   14449:                if((D=mydeg(T[0],z))==0) continue;
                   14450:                L=[];
                   14451:                if(iscoef(T[0],os_md.iscrat)) L=getroot(T[0],z|cpx=2);
                   14452:                if(findin(z,vars(L))>=0) L=[];
                   14453:                if(L==[]) L=polroots(T[0],z|comp=-1);
                   14454:                for(;L!=[];L=cdr(L)){
                   14455:                        QQ=Q;
                   14456:                        for(I=T[1]; I>1;I--) QQ=mydiff(QQ,z);
                   14457:                        for(U=0,W=I=T[1];I>0;I--,W++){
                   14458:                                QQ=diff(QQ,z);
                   14459:                                U+=subst(QQ,z,L[0])*(z-L[0])^(W-T[1])/fac(W);
                   14460:                        }
                   14461:                        UD=mydiff(U,z);
                   14462:                        for(I=T[1],K=1,PP=P; I>1;I--,K++)
                   14463:                                PP=diff(PP,z)*U-K*PP*UD;
                   14464:                        QQ=subst(PP,z,L[0])/subst(U,z,L[0])^K;
                   14465: /*                     if(D==2) QQ=sqrt2rat(QQ); */
                   14466:                        R=cons([L[0],sqrt2rat(QQ)],R);
                   14467:                }
                   14468:        }
                   14469:        if(type(L=getopt(cond))==4){
                   14470:                for(S=[];R!=[];R=cdr(R)){
                   14471:                        Z=car(R);
                   14472:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   14473:                                X=real(car(Z));Y=imag(car(Z));
                   14474:                                if(myf3eval(car(LL),X,Y,car(Z))<=0) break;
                   14475:                        }
                   14476:                        if(LL==[]) S=cons(Z,S);
                   14477:                }
                   14478:                R=reverse(S);
                   14479:        }
                   14480:        if((Sum=getopt(sum))==1||Sum==2){
                   14481:                for(S=0;R!=[];R=cdr(R)) S+=car(R)[1];
                   14482:                if(Sum==2) S*=2*@pi*@i;
                   14483:                return sqrt2rat(S);
                   14484:        }
                   14485:        return R;
                   14486: }
                   14487:
                   14488: def fint(F,D,V)
                   14489: {
                   14490:        if(((L=length(V))==2 || (L==3&&isvar(V[0])<3))
                   14491:          && (type(V[L-1])==7||(type(V[L-1])<3&&type(eval(V[L-1]))<2)))
                   14492:   /* real integral */
                   14493:                return areabezier([F,D,V]|option_list=getopt());
                   14494:   /* complex integral */
                   14495:        if(L>1&&type(V[1])==4&&type(V[1][1])<4){
                   14496:                if(type(V[0])==4&&type(V[0][0])<2){
                   14497:                        for(R=[],VT=car(V),VV=cdr(V);VV!=[];VV=cdr(VV),VT=VU){
                   14498:                                if((VU=car(VV))==-1) VU=car(V);
                   14499:                                R=cons([ptcommon([VT,VU],[t,1-t]|in=1),[0,1]],R);
                   14500:                        }
                   14501:                        V=reverse(R);
                   14502:                }
                   14503:                else if(L==2) V=[V];
                   14504:        }
                   14505:        Opt=cons(["cpx",1],getopt());
                   14506:        for(R=0;V!=[];V=cdr(V)){
                   14507:                VT=car(V);
                   14508:                X=car(VT)[0];XD=red(diff(X,t));
                   14509:                Y=car(VT)[1];YD=red(diff(Y,t));
                   14510:                F=mysubst(F,[[x,X],[y,Y],[z,X+@i*Y]]);
                   14511:                if(type(F)==4)
                   14512:                        FF=cons(F[0]*(XD+@i*YD),cdr(F));
                   14513:                else FF=red(F*(XD+@i*YD));
                   14514:                R+=areabezier([FF,D,cons(t,VT[1])]|option_list=Opt);
                   14515:        }
                   14516:        return R;
                   14517: }
                   14518:
                   14519: def areabezier(V)
                   14520: {
                   14521:        if(getopt(cpx)==1){
                   14522:                Opt=delopt(getopt(),"cpx");
                   14523:                F=V[0];
                   14524:                if(!isvar(Var=V[2][0])) Var=x;
                   14525:                if(type(F)==3 && vars(F)==[Var] && imag(dn(F))!=0){
                   14526:                        F=(nm(F)*conj(dn(F)))/(dn(F)*conj(dn(F)));
                   14527:                        V0=red(real(nm(F))/dn(F));
                   14528:                        R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14529:                        V0=red(imag(nm(F))/dn(F));
                   14530:                        return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14531:                }
                   14532:                if(getopt(Acc)!=1) F=f2df(F);
                   14533:                V0=compdf([o,[o,real,o_]],o_,F);
                   14534:                R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14535:                V0=compdf([o,[o,imag,o_]],o_,F);
                   14536:                return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14537:        }
                   14538:        if(type(V[0])!=4 || vars(V[0][0])!=0){
                   14539:                Mx=[-2.0^(512),2.0^(512)];
                   14540:                I=length(V[2]);
                   14541:                if(type(V[2][I-1])==7||type(V[2][I-2])==7){     /* infinite interval */
                   14542:                        if(type(Ec=getopt(exp))==1) R=cmpf([V[0],V[2]]|exp=Ec);
                   14543:                        else R=cmpf([V[0],V[2]]);
                   14544:                        V=[R,V[1],[0,1]];
                   14545:                }
                   14546:                if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){
                   14547:                        if(Int==2&&iand(V1,1)) V1++;
                   14548:                        if(!V1) V1=32;
                   14549:                        Opt=cons(["raw",1],getopt());
                   14550:                        W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   14551:                        SS=W[0][1];
                   14552:                        for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){
                   14553:                                if(iand(I,1)) S1+=car(L)[1];
                   14554:                                else S0+=car(L)[1];
                   14555:                                if (I==V1) SS+=car(L)[1];
                   14556:                        }
                   14557:                        VV=deval(V[2][1]-V[2][0]);
                   14558:                        if(Int==2)
                   14559:                                return (2*S0+4*S1-SS)*VV/(3*V1);
                   14560:                        else
                   14561:                                return (2*S0+2*S1-SS)*VV/(2*V1);
                   14562:                }
                   14563:                Opt=cons(["opt",0],getopt());
                   14564:                V=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   14565:        }
                   14566:        if(type(V[0][0])!=4) V=os_md.lbezier(V);
                   14567:        for(S=0; V!=[]; V=cdr(V)){
                   14568:                B=tobezier(car(V));
                   14569:                P=intpoly(B[1]*diff(B[0],t),t);
                   14570:                S+=mysubst(P,[t,1]);
                   14571:        }
                   14572:        return S;
                   14573: }
                   14574:
                   14575: def velbezier(V,L)
                   14576: {
                   14577:        if(L==0) L=[t,0,1];
                   14578:        else L=[(length(L)==3)?L[2]:t,L[0],L[1]];
                   14579:        for(R=[],II=length(V)-1;II>=0;II--){
                   14580:                S=fmmx(diff(V[II],L[0]|dif=1),L|dif=1);
                   14581:                for(U=0;S!=[];S=cdr(S)) if((T=abs(car(S)[1]))>U) U=T;
                   14582:                R=cons(U,R);
                   14583:        }
                   14584:        return R;
                   14585: }
                   14586:
                   14587: def ptbezier(V,L)
                   14588: {
                   14589:        if(type(V[0])==4&&type(V[0][0])!=4)  V=lbezier(V);
                   14590:        K=length(V);
                   14591:        if(type(L)<2){
                   14592:                if(L<0) return K;
                   14593:                if(L>=K-1) L=[K-1,1];
                   14594:                else{
                   14595:                        L0=floor(L);
                   14596:                        if(L0>=K-1) L0=K-1;
                   14597:                        L=[L0,L-L0];
                   14598:                }
                   14599:        }
                   14600:        if(L[0]>=0) B=V[L[0]];
                   14601:        else B=V[K+L[0]];
                   14602:        B=tobezier(B);
                   14603:        BB=[diff(B[0],t),diff(B[1],t)];
                   14604:        return [subst(B,t,L[1]),subst(BB,t,L[1])];
                   14605: }
                   14606:
                   14607: def ptcombezier(P,Q,T)
                   14608: {
                   14609:        if(type(T)<2){
                   14610:                if(T<2) T=20;           /*  default */
                   14611:                return ptcombezier(P,Q,[0,0,1,T]);
                   14612:        }
                   14613:        V=T[2]/2;;
                   14614:        PB=tobezier(P|div=1);
                   14615:        PP=[ptbbox(PB[0]),ptbbox(PB[1])];
                   14616:        QB=tobezier(Q|div=1);
                   14617:        QQ=[ptbbox(QB[0]),ptbbox(QB[1])];
                   14618:        for(L=[],I=0;I<2;I++){
                   14619:                for(J=0;J<2;J++){
                   14620:                        if(!iscombox(PP[I],QQ[J])) continue;
                   14621:                        if(T[3]<=1) return
                   14622:                                [[T[0]+(I+0.5)*V,T[1]+(J+0.5)*V,
                   14623:                                        [(PP[I][0][0]+PP[I][0][1])/2,(PP[I][1][0]+PP[I][1][1])/2]]];
                   14624:                        else{
                   14625: #if 0
                   14626:                                U=PB[I][0];V=PB[I][length(PB[I])-1];
                   14627:                                if(abs(A=(U[0]-V[0]))>abs(B=(U[1]-V[I])))
                   14628:                                        M=mat([1,0],[-B/A,1]);
                   14629:                                else if(U!=V)
                   14630:                                        M=mat([1,-A/B],[0,1]);
                   14631:                                else continue;
                   14632:                                if(!iscombox(ptbox(ptaffine(M,PB[I])),ptbox(ptaffine(M,QB[J])))) continue;
                   14633: #endif
                   14634:
                   14635:                                LN=ptcombezier(PB[I],QB[J],[T[0]+I*V,T[1]+J*V,V,T[3]-1]);
                   14636: #if 0
                   14637:                                L=append(LN,L);
                   14638: #else
                   14639:                                if(LN!=[]){
                   14640:                                        if(L==[]) L=LN;
                   14641:                                        else for(VV=3*V/2^T[3];LN!=[];LN=cdr(LN)){
                   14642:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   14643:                                                        if(abs(car(LN)[0]-car(LT)[0])<VV&&abs(car(LN)[1]-car(LT)[1])<VV) break;
                   14644:                                                }
                   14645:                                        }
                   14646:                                }
                   14647:                                if(length(L)>32){               /* Too many points */
                   14648:                                        I=J=2;
                   14649:                                }
                   14650: #endif
                   14651:                        }
                   14652:                }
                   14653:        }
                   14654:        return L;
                   14655: }
                   14656:
                   14657:
                   14658: def ptcombz(P,Q,T)
                   14659: {
                   14660:        if(P==Q) Q=0;
                   14661:        if(type(P[0][0])!=4) P=P0=lbezier(P);
                   14662:        if(Q==0){
                   14663:                Q=P;F=1;
                   14664:        }
                   14665:        else if(type(Q[0][0])!=4) Q=lbezier(Q);
                   14666:        for(R=[],I=0,Q0=Q;P!=[];P=cdr(P),I++){
                   14667:                for(J=0,Q=Q0;Q!=[];Q=cdr(Q),J++){
                   14668:                        if(F==1&&I<J+2) break;
                   14669:                        if((RT=ptcombezier(car(P),car(Q),T))!=[]){
                   14670:                                RT=cons([I,J],RT);
                   14671:                                R=cons(RT,R);
                   14672:                        }
                   14673:                }
                   14674:        }
                   14675:        if((Red=getopt(red))==1||Red==2){
                   14676:                if(type(M=getopt(prec))!=1) M=12;
                   14677:                for(F=0,T=P0;T!=[];T=cdr(T)){
                   14678:                        for(S=car(T);S!=[];S=cdr(S)){
                   14679:                                if(type(ST=car(S))==4 && type(ST[0])<2){
                   14680:                                        if(F++==0){
                   14681:                                                X0=X1=ST[0];Y0=Y1=ST[1];
                   14682:                                        }else{
                   14683:                                                if(ST[0]<X0) X0=ST[0];
                   14684:                                                if(ST[0]>X1) X1=ST[0];
                   14685:                                                if(ST[1]<Y0) Y0=ST[1];
                   14686:                                                if(ST[1]>Y1) Y1=ST[1];
                   14687:                                        }
                   14688:                                }
                   14689:                        }
                   14690:                }
                   14691:                V0=(X1-X0)/2^M;V1=(Y1-Y2)/2^M;
                   14692:                for(RR=[],RT=R;RT!=[];RT=cdr(RT))
                   14693:                        for(S=cdr(car(RT));S!=[];S=cdr(S)) RR=cons(car(S)[2],RR);
                   14694:                RR=ltov(RR);L=length(RR);
                   14695:                for(I=0;I<L;I++)
                   14696:                        for(K=1,J=I+1;K!=0&&J<L;J++)
                   14697:                                if(abs(RR[I][0]-RR[J][0])<V0 && abs(RR[I][1]-RR[J][1])<V1) RR[I]=K=0;
                   14698:                R0=[];
                   14699:                I=L-1;
                   14700:                if(Red==2){
                   14701:                        for(;I>=0;I--) if(RR[I]!=0) R0=cons(RR[I],R0);
                   14702:                }else{
                   14703:                        for(RT=R;RT!=[];RT=cdr(RT)){
                   14704:                                R00=[car(RT)[0]];
                   14705:                                for(S=cdr(car(RT));S!=[];S=cdr(S),I--)
                   14706:                                        if(RR[L-I-1]!=0) R00=cons(car(S),R00);
                   14707:                                if(length(R00)>1) R0=cons(reverse(R00),R0);
                   14708:                        }
                   14709:                }
                   14710:                return R0;
                   14711:        }
                   14712:        return reverse(R);
                   14713: }
                   14714:
                   14715: def draw_bezier(ID,IDX,B)
                   14716: {
                   14717:        if(getopt(init)==1){
                   14718:                S_FDot=0;
                   14719:                return;
                   14720:        }
                   14721:        if(type(Col=getopt(col))!=1&&Col!=0) Col=0;
                   14722:        Dot=0;
                   14723:        if(type(Opt=getopt(opt))==7){
                   14724:                if(!Col){
                   14725:                        Col=drawopt(Opt,0);
                   14726:                        if(Col==-1) Col=0;
                   14727:                }
                   14728:                T=drawopt(Opt,3);
                   14729:                if(iand(T,2)){
                   14730:                        M=iand(T,1)?1/8:1/4;
                   14731:                        for(C=Col,Col=I=0;I<20;I+=8)
                   14732:                                Col+=ishift(0xff-(floor((0xff-iand(0xff,ishift(C,I)))*M)),-I);
                   14733:                }
                   14734:                if(iand(T,4)) Dot=2;            /* 2 or 3 or 4 or 6 */
                   14735:                else if(iand(T,8)) Dot=4;
                   14736:        }
                   14737:        if(type(B)==4 && (type(B[0])==4||type(B[0])==5) && type(B[0][0])<2) B=lbezier(B);
                   14738:        else if(type(B)==5) B=[vtol(B)];
                   14739:        for(;B!=[];B=cdr(B)){
                   14740:                if(vars(F=car(B))==[]){
                   14741: #if 1
                   14742:                        if(length(F)<3&&!Dot){          /* line or point */
                   14743:                                if(length(F)>0){
                   14744:                                        G=[rint(F[0][0]),rint(F[0][1])];
                   14745:                                        if(length(F)==1) draw_obj(ID,IDX,G,Col);
                   14746:                                        else{
                   14747:                                                G=[G[0],G[1],rint(F[1][0]),rint(F[1][1])];
                   14748:                                                draw_obj(ID,IDX,G,Col);
                   14749:                                        }
                   14750:                                }
                   14751:                                continue;
                   14752:                        }
                   14753: #endif
                   14754:                        if(length(F)<2) continue;
                   14755:                        F=tobezier(F);
                   14756:                }
                   14757:                N=velbezier(F,0);
                   14758:                N=(N[0]>N[1])?N[0]:N[1];
                   14759:                if(!N) N=1;
                   14760:                for(I=0;I<=N;I++,S_FDot++){
                   14761:                        if(Dot!=iand(S_FDot,Dot)) continue;
                   14762:                        G=subst(F,t,I/N);
                   14763:                        G=[rint(G[0]),rint(G[1])];
                   14764:                        if(G!=G0){
                   14765:                                draw_obj(ID,IDX,G,Col);
                   14766:                                G0=G;
                   14767:                        }
                   14768:                }
                   14769:        }
                   14770:        if(S_FDot-->=2^32) S_FDot=0;
                   14771:        return 0;
                   14772: }
                   14773:
1.29      takayama 14774:
                   14775: /*
                   14776: def redbezier(L)
                   14777: {
                   14778:        V=newvect(4);ST=0;
                   14779:        for(R=[],I=0,T=L;T=[];T=cdr(T){
                   14780:                if(type(car(T))<4){
                   14781:                        F=0;
                   14782:                        if(I==3)
                   14783:                        if(car(T)==0){
                   14784:                        }else if(car(T)==1){
                   14785:                        }else if(car(T)==-1){
                   14786:                                if(I<3) V[I++]=ST;
                   14787:                        }
                   14788:                }else if(I==3){
                   14789:                        if(R==[] || car(R)!=1){
                   14790:                                R=cons(V[0],R);
                   14791:                                if(ST==0) ST=V[0];
                   14792:                        }
                   14793:                        for(J=1;J<3;J++) R=cons(V[J],R);
                   14794:                        while((T=cdr(T))!=[]){
                   14795:                                R=cons(car(T),R);
                   14796:                                if(type(car(R))<4)
                   14797:                        }
                   14798:                }else{
                   14799:                        if(ST==0) ST=car(T);
                   14800:                        V[I++]= car(T);
                   14801:                }
                   14802:        }
                   14803: }
                   14804: */
                   14805:
1.6       takayama 14806: def lbezier(L)
                   14807: {
                   14808:        if((In=getopt(inv))==1||In==2||In==3){
                   14809:                for(F=0,R=[];L!=[];L=cdr(L)){
                   14810:                        LT=car(L);
                   14811:                        if(F==car(LT)) R=cons(1,R);
                   14812:                        else{
                   14813:                                if(R!=[]&&F!=0) R=cons(0,R);
                   14814:                                R=cons(G=car(LT),R);
                   14815:                                if(In==3) In==2;
                   14816:                        }
                   14817:                        for(LT=cdr(LT);LT!=[];LT=cdr(LT))
                   14818:                                R=cons(car(LT),R);
                   14819:                        if((F=car(R))==G&&In==1){
                   14820:                                R=cons(-1,cdr(R));
                   14821:                                F=0;
                   14822:                        }
                   14823:                }
                   14824:                if(In==3 && car(R)==G) R=cons(-1,cdr(R));
                   14825:                return reverse(R);
                   14826:        }
                   14827:        for(F=0,RT=R=[];L!=[];L=cdr(L)){
                   14828:                if(type(T=car(L))==4||type(T)==5){
                   14829:                        if(F==0){
                   14830:                                FT=T;F=1;
                   14831:                        }
                   14832:                        RT=cons(T,RT);
                   14833:                }else if(T==0){
                   14834:                        if(RT==[]) R=cons(reverse(RT),R);
                   14835:                        RT=[];F=0;
                   14836:                }else if(T==1){
                   14837:                        if(RT!=[]){
                   14838:                                R=cons(reverse(RT),R);
                   14839:                                RT=[car(RT)];
                   14840:                        }else{
                   14841:                                RT=[];F=0;
                   14842:                        }
                   14843:                }else if(T==-1){
                   14844:                        RT=cons(FT,RT);
                   14845:                        R=cons(reverse(RT),R);
                   14846:                        RT=[];F=0;
                   14847:                }
                   14848:        }
                   14849:        if(RT!=[]) R=cons(reverse(RT),R);
                   14850:        return reverse(R);
                   14851: }
                   14852:
                   14853:
                   14854: def xybezier(L)
                   14855: {
                   14856:        if(L==0 || (LS=length(L))==0) return "";
                   14857:        Out=str_tb(0,0);
                   14858:        if(type(VF=getopt(verb))==4){
                   14859:                if(type(car(VF))>3){
                   14860:                        VFS=VF;VF=1;
                   14861:                }else{
                   14862:                        VFS=cdr(VF);VF=car(VF);
                   14863:                }
                   14864:        }else VFS=["$\\bullet$","$\\times$"];
                   14865:        if(VF!=1 && VF!=2) VF=0;
                   14866:        if(!TikZ){
                   14867:                if(VF) Ob=str_tb(0,0);
                   14868:                T="\n**\\crv{";
                   14869:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+Opt;
                   14870:                L00=Q=L[I0=0];S=S1="";
                   14871:                for(F=0,I=1;I<=LS;I++){
                   14872:                        P=Q;Q=(I==LS)?0:L[I];
                   14873:                        if(type(Q)==4){
                   14874:                                if(F==0){
                   14875:                                        S1="";L0=P;F=1;
                   14876:                                        continue;
                   14877:                                }else if(F==1)
                   14878:                                        F=2;
                   14879:                                else if(F==2){
                   14880:                                        S1=S1+"&";
                   14881:                                }
                   14882:                                S1=S1+xypos(P);
                   14883:                                if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   14884:                        }else{
                   14885:                                if(Q==0){
                   14886:                                        if(F>0){
                   14887:                                                str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   14888:                                                if(VF){
                   14889:                                                        str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   14890:                                                        if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   14891:                                                }
                   14892:                                                F=0;
                   14893:                                        }
                   14894:                                }else if(Q==1){
                   14895:                                        str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   14896:                                        if(VF){
                   14897:                                                str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   14898:                                                if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   14899:                                        }
                   14900:                                        F=1;
                   14901:                                }else if(Q==-1){
                   14902:                                        if(F==2)
                   14903:                                                S1=S1+"&";
                   14904:                                        str_tb("{"+xypos(L0)+";"+xypos(L00)+T+S1+xypos(P)+"}};\n",Out);
                   14905:                                        if(VF)  str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   14906:                                        F=0;
                   14907:                                }
                   14908:                                if(F==1){
                   14909:                                        if(I<LS-1 && type(L[I+1])<2){
                   14910:                                                if(L[I+1]==-1){
                   14911:                                                        str_tb("{"+xypos(P)+";"+xypos(L00)+T+"}};\n",Out);
                   14912:                                                }
                   14913:                                                if(VF)  str_tb(xyput([P[0][0],P[0][1],VFS[0]]),Ob);
                   14914:                                                F=0;
                   14915:                                        }
                   14916:                                }
                   14917:                                while(++I<LS && type(L[I])<2);
                   14918:                                if(I>=LS) break;
                   14919:                                if(F==1){
                   14920:                                        Q=P;I--;F=0;
                   14921:                                }else L00=Q=L[I];
                   14922:                        }
                   14923:                }
                   14924:        }else{
                   14925:                if(type(T=getopt(cmd))==7){
                   14926:                        if(T!="") T="\\"+T;
                   14927:                }else T="\\draw";
                   14928:                if((Rel=getopt(relative))==1)   VF=0;
                   14929:                if(VF) Ob=str_tb(0,0);
                   14930:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+"["+Opt+"]";
                   14931:                Out=str_tb(T,0);
                   14932:                Q=L[0];
                   14933:                for(F=M=0,I=1;I<=LS;I++){
                   14934:                        P=Q; Q=(I==LS)?0:L[I];
                   14935:                        if(++M>XYLim){
                   14936:                                str_tb("\n",Out);M=1;
                   14937:                        }
                   14938:                        if(type(Q)==4 || type(Q)==5 || type(Q)==7){
                   14939:                                if(F==0){
                   14940:                                        str_tb(" ",Out);
                   14941:                                        F=1;
                   14942:                                }else if(F==1){
                   14943:                                        str_tb(" .. controls ",Out);
                   14944:                                        F=2;
                   14945:                                }else if(F==2){
                   14946:                                        str_tb(" and ",Out);
                   14947:                                        F=2;
                   14948:                                }
                   14949:                                PP=xypos(P);
                   14950:                                if(Rel==1 && F==2) PP="+"+PP;
                   14951:                                str_tb(PP,Out);
                   14952:                                if(VF&&((F<2)||length(VFS)>1))
                   14953:                                        str_tb(xyput([P[0],P[1],(F<2)?VFS[0]:VFS[1]]),Ob);
                   14954:                        }else{
                   14955: /*                             if(I<LS-1) VF=0; */
                   14956:                                if(Q==0||Q==1){
                   14957:                                        PP=xypos(P);
                   14958:                                        if(Rel==1) PP="+"+PP;
                   14959:                                        str_tb(((F==0)?" ":((F==1)?" -- ":" .. "))+PP,Out);
                   14960:                                        if(VF) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   14961:                                        F=Q;
                   14962:                                }else if(Q==-1){
                   14963:                                        PP=xypos(P);
                   14964:                                        if(Rel==1) PP="+"+PP;
                   14965:                                        if(F==1)
                   14966:                                                str_tb("..controls "+PP+" .. cycle",Out);
                   14967:                                        else if(F==2)
                   14968:                                                str_tb(" and "+PP+" .. cycle",Out);
                   14969:                                        if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   14970:                                        F=0;
                   14971:                                }
                   14972:                                if(F==1){
                   14973:                                        if(I<LS-1){
                   14974:                                                if(L[I+1]==-1){
                   14975:                                                        str_tb(" -- cycle",Out);
                   14976:                                                        I=I+1;
                   14977:                                                        F=0;
                   14978:                                                }
                   14979:                                                else if(type(L[I+1])<2) F=0;
                   14980:                                        }
                   14981:                                }
                   14982:                                while(++I<LS && type(L[I])<2);
                   14983:                                if(I>=LS) break;
                   14984:                                Q=L[I];
                   14985:                        }
                   14986:                }
                   14987:                str_tb(";\n",Out);
                   14988:        }
                   14989:        if(VF)  str_tb(str_tb(0,Ob),Out);
                   14990:        return str_tb(0,Out);
                   14991: }
                   14992:
                   14993: def xybox(L)
                   14994: {
                   14995:        K=length(L);
                   14996:        P=L[0];Q=L[1];
                   14997:        if(K==2)
                   14998:                LL=[ P, [P[0],Q[1]], Q, [Q[0],P[1]] ];
                   14999:        else{
                   15000:                R=L[2];
                   15001:                LL=[ P, R, Q, [P[0]+Q[0]-R[0],P[1]+Q[1]-R[1]] ];
                   15002:        }
                   15003:        Opt=getopt();
                   15004:        SS=getopt(opt);
1.8       takayama 15005:        FL=getopt(color);
                   15006:        if(TikZ&&type(SS)<1&&K==2){
                   15007:                if(type(FL)==4){
                   15008:                        F=FL[0];
                   15009:                        if(length(FL)>1) CMD=FL[1];
                   15010:                }else if(type(FL)==7) F=FL;
                   15011:                else F="";
                   15012:                F=cons(F,["rectangle"]);
                   15013:                if(CMD) return xyarrow(P,Q|opt=F,cmd=CMD);
                   15014:                else return xyarrow(P,Q|opt=F);
                   15015:        }
1.6       takayama 15016:        if(type(SS)!=7&&!TikZ) Opt=cons(["opt","@{-}"],Opt);
                   15017:        Opt=cons(["close",1],Opt);
                   15018:        return xylines(LL|option_list=Opt);
                   15019: }
                   15020:
                   15021: def xyang(S,P,Q,R)
                   15022: {
                   15023:        Opt=getopt();
                   15024:        if(type(Prec=getopt(prec))!=1) Prec=0;
                   15025:        if(type(Q)>2){
                   15026:                if(R==1||R==-1){                                /* 直角 */
                   15027:                        P1=ptcommon([Q,P],[-S,0]);
                   15028:                        S*=R;
                   15029:                        P2=ptcommon([P,P1],[S,@pi/2]);
                   15030:                        P3=ptcommon([P1,P2],[S,@pi/2]);
                   15031:                        return xylines([P1,P2,P3]|option_list=Opt);
                   15032:                }else if((AR=abs(R))==0||AR==2||AR==3||AR==4){  /* 矢印 */
                   15033:                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   15034:                        if(R<0) Ang+=3.14159;
                   15035:                        ANG=[0.7854,0.5236,1.0472];
                   15036:                        X=(AR==0)?1.5708:ANG[AR-2];
                   15037:                        U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   15038:                        V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];      /* 矢先 */
                   15039:                        V=(X==0)?[U,V]:[U,P,V];
                   15040:                        if(getopt(ar)==1) V=append([Q,P,0],V);          /* 心棒 */
                   15041:                        return xylines(V|option_list=Opt);
                   15042:                }else if(AR>4&&AR<9){
                   15043:                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   15044:                        ANG=[0.7854,0.5236,0.3927,0.2618];
                   15045:                        X=ANG[AR-5];
                   15046:                        U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   15047:                        V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];
                   15048:                        W=ptcommon([P,U],[P,Q]|in=-2);
                   15049:                        W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];
                   15050:                        W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];
                   15051:                        L=[U,W1,P,1,W2,V];
                   15052:                        if(getopt(ar)==1) L=append([Q,P,0],L);
                   15053:                        if(type(Sc=getopt(scale))>0){
                   15054:                                if(type(Sc)==1) Sc=[Sc,Sc];
                   15055:                                L=ptaffine(diagm(2,Sc),L);
                   15056:                        }
                   15057:                        Opt=getopt(opt);
                   15058:                        if(type(Opt)>0) OL=[["opt",Opt]];
                   15059:                        else OL=[];
                   15060:                        if(getopt(proc)==1)     return append([2,OL],L);
                   15061:                        S=xybezier(L|optilon_list=OL);
                   15062:                        if(getopt(dviout)!=1) return S;
                   15063:                        dviout(S);
                   15064:                        return 1;
                   15065:                }
                   15066:        }
                   15067:        if(type(Q)<3){
                   15068:                X=deval(Q); Y=deval(R);
                   15069:        }else{
                   15070:                X=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   15071:                Y=myarg([R[0]-P[0],R[1]-P[1]]);
                   15072:        }
                   15073:        if(Prec>2) N=8;
                   15074:        else if(Prec==2) N=6;
                   15075:        else if(Prec==1) N=4;
                   15076:        else N=3;
                   15077:        U=deval(@pi)*2/N;
                   15078:        if(X==Y||Y-X>6.28318){
                   15079:                for(L=[],I=N-1;I>=0;I--) L=cons([P[0]+S*dcos(I*U),P[1]+S*dsin(I*U)],L);
                   15080:                return xylines(L|option_list=append([["curve",1],["close",1]],Opt));
                   15081:        }
                   15082:        for(M=1;(Y-X)/M>U;M++);
                   15083:        for(L=[],I=M+1;I>-2;I--){
                   15084:                Ang=X+(Y-X)*I/M;
                   15085:                L=cons([P[0]+S*dcos(Ang),P[1]+S*dsin(Ang)],L);
                   15086:        }
                   15087:        if(getopt(ar)!=1) return xylines(L|option_list=append([["curve",1],["close",-1]],Opt));
                   15088:        OL=delopt(Opt,["dviout","opt","proc"]);
                   15089:        S=xylines(L|option_list=append([["curve",1],["close",-1],["opt",0]],OL));
                   15090:        T=xylines([P,L[1]]|option_list=cons(["opt",0],OL));
                   15091:        S=ptaffine("close",[S,T]);                      /* connect curves */
                   15092:        if(getopt(opt)==0) return S;
                   15093:        OL=(type(SS=getopt(opt))>1)?[["opt",SS]]:[];
                   15094:        if(type(T=getopt(proc))==1 && T>=1 && T<=3) return [1,OL,S];
                   15095:        if(OL==[]) S=xybezier(S);
                   15096:        else S=(type(SS)==7)? xybezier(S|opt=SS):xybezier(S|opt=SS[0],cmd=SS[1]);
                   15097:        if(getopt(dviout)==1) return xyproc(S|dviout=1);
                   15098:        return S;
                   15099: }
                   15100:
                   15101: def xyoval(P,L,R)
                   15102: {
                   15103:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   15104:                if(length(Arg)>2)
                   15105:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180,@pi*Arg[2]/180];
                   15106:                else
                   15107:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   15108:        }
                   15109:        if(type(Arg)==4){
                   15110:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   15111:                if(length(Arg)>2) Arg2=deval(Arg[2]);
                   15112:                if(Arg1<Arg0 || Arg0<-7) return 0;
                   15113:        }
                   15114:        if(type(Prec=getopt(prec))!=0) Prec=0;
                   15115:        if((Ar=getopt(ar))!=1) Ar=0;
                   15116:        L=xyang(L,[0,0],Arg0,Arg1|prec=Prec,opt=0,ar=Ar);
                   15117:        Sc=getopt(scale);
                   15118:        if(type(Sc=getopt(scale))<1) Sc=[1,1];
                   15119:        else if(type(Sc)==1) Sc=[Sc,Sc];
                   15120:        M=mat([1,0],[0,R]);
                   15121:        L=ptaffine(M,L|shift=P);
                   15122:        M=mat([Sc[0],0],[0,Sc[1]]);
                   15123:        L=ptaffine(M,L|arg=Arg2);
                   15124:        if((Opt=getopt(opt))==0) return L;
                   15125:        Opt=(type(Opt)>1)? [["opt2",Opt]]:[];
                   15126:        if(getopt(proc)==1) return [1,Opt,L];
                   15127:        S=xybezier(L|option_list=getopt());
                   15128:        if(getopt(dviout)==1){
                   15129:                xyproc(S|dviout=1);
                   15130:                return 1;
                   15131:        }
                   15132:        return S;
                   15133: }
                   15134:
                   15135: def xycirc(P,R)
                   15136: {
                   15137:        ST=getopt(opt);
                   15138:        if(type(ST)<0) ST="";
                   15139:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   15140:                Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   15141:        }
                   15142: /*                                                             Is it OK?
                   15143:        if(TikZ==0 && XYcm==1){
                   15144:                R*=10; P=[P[0]*10,P[1]*10];
                   15145:        }
                   15146: */
                   15147:        if(type(Arg)==4){
                   15148:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   15149:                if(Arg1<=Arg0 || Arg0<-7 || Arg1-Arg0>7) return 0;
                   15150:                if(type(ST)==7)
                   15151:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   15152:         [P[1]-R-1,P[1]+R+1]|opt=ST);
                   15153:                else
                   15154:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   15155:         [P[1]-R-1,P[1]+R+1]);
                   15156:                if(getopt(close)==1){
                   15157:                        S=S+xyline([0,0],
                   15158:                                [deval(subst(R*cos(x)+P[0],x,Arg0)),deval(subst(R*sin(x)+P[0],x,Arg0))]);
                   15159:                        S=S+xyline([0,0],
                   15160:                                [deval(subst(R*cos(x)+P[0],x,Arg1)),deval(subst(R*sin(x)+P[0],x,Arg1))]);
                   15161:                }
                   15162:                return S;
                   15163:        }
                   15164:        if(TikZ){
                   15165:                SP="";
                   15166:                if(length(P)>2) SP=P[2];
                   15167:                if(type(SP)!=7) SP="$"+my_tex_form(SP)+"$";
                   15168:                if(R==0){
                   15169:                        if(ST!="") ST=ST+",";
                   15170:                        return "\\node ["+ST+"circle,draw]"+xypos([P[0],P[1]])+ "{"+SP+"};\n";
                   15171:                }
1.8       takayama 15172:                if(type(R)!=7) R=rtostr(deval(R));
1.6       takayama 15173:                if(ST!="") ST="["+ST+"]";
                   15174:                S="\\draw "+ST+xypos([P[0],P[1]])+" circle [radius="+R+"]";
                   15175:                if(SP!="") S=S+" node at"+xypos([P[0],P[1]])+" {"+SP+"}";
                   15176:                return S+";\n";
                   15177:        }
                   15178:        S="{"+xypos([P[0],P[1]]);
                   15179:        if(length(P)>2){
                   15180:                SP=P[2];
                   15181:                if(type(P)!=7) SP=my_tex_form(SP);
                   15182:                S=S+" *+{"+SP+"}";
                   15183:        }
                   15184:        S =S+" *\\cir";
                   15185:        if(R!=0){
1.8       takayama 15186:                R=deval(R);
1.6       takayama 15187:                S=S+"<"+rtostr(R)+((XYcm)?"cm>":"mm>");
                   15188:        }
                   15189:        S = S+"{";
                   15190:        if(type(ST)==7) S=S+ST;
                   15191:     return S+"}};\n";
                   15192: }
                   15193:
1.33      takayama 15194: def xypoch(W,H,R1,R2)
                   15195: {
                   15196:        if(H>R1||2*H>R2){
                   15197:                errno(0);
                   15198:                return;
                   15199:        }
                   15200:        if(type(Ar=getopt(ar))!=1) Ar=TikZ?0.25:2.5;
                   15201:        T1=dasin(H/R1);S1=R1*dcos(T1);
                   15202:        T2=dasin(H/R2);S2=R2*dcos(T2);
                   15203:        T3=dasin(2*H/R2);S3=R2*dcos(T3);
                   15204:        S=xyline([R1,0],[W-R1,0]);
                   15205:        S+=xyang(R1,[W,0],-@pi,@pi-T1);
                   15206:        S+=xyline([S2,H],[W-S1,H]);
                   15207:        S+=xyang(R2,[0,0],T2,2*@pi-T3);
                   15208:        S+=xylines([[S3,-2*H],[W-H-R2,-2*H],[W-H-R2,2*H],[W-S3,2*H]]);
                   15209:        S+=xyang(R2,[W,0],-@pi+T2,@pi-T3);
                   15210:        S+=xyline([W-T2,-H],[W-T2,-H]);
                   15211:        S+=xyang(R1,[0,0],0,2*@pi-T1);
                   15212:        S+=xyline([W-S2,-H],[S1,-H]);
                   15213:        if(Ar>0){
                   15214:                S+=xyang(Ar,[W/2,0],[0,0],8);
                   15215:                S+=xyang(Ar,[W/2,-2*H],[0,-2*H],8);
                   15216:                S+=xyang(Ar,[W/2-Ar,-H],[W,-H],8);
                   15217:                S+=xyang(Ar,[W/2-Ar,H],[W,H],8);
                   15218:                S+=xyang(Ar,[W-S3,2*H],[W-H-R2,2*H],8);
                   15219:        }
                   15220:        S+=xyput([R1,0,"$\\bullet$"]);
                   15221:        S+=xyput([0,0,"$\\times$"]);
                   15222:        S+=xyput([W,0,"$\\times$"]);
                   15223:        if(TikZ) S=str_subst(S,";\n\\draw","\n");
                   15224:        return S;
                   15225: }
                   15226:
1.6       takayama 15227: def ptaffine(M,L)
                   15228: {
                   15229:        if(type(L)!=4&&type(L)!=5){
                   15230:                erno(0);return L;
                   15231:        }
                   15232:        if(type(M)==7){ /* connect lists */
                   15233:                if(M=="reverse"){
                   15234:                        for(LO=LR=[],F=0,LT=L; LT!=[]; LT=cdr(LT)){
                   15235:                                if(type(P=car(LT))==4 || type(P)==7){
                   15236:                                        LR=cons(P,LR);
                   15237:                                        continue;
                   15238:                                }else{
                   15239:                                        if(P==-1){
                   15240:                                                LL=reverse(LR);
                   15241:                                                LO=append(reverse(cons(-1,cdr(LL))),LO);
                   15242:                                                LO=cons(car(LL),LO);
                   15243:                                                LR=[];
                   15244:                                        }else if(P==1){
                   15245:                                                LR=cons(car(LR),cons(1,cdr(LR)));
                   15246:                                        }else if(P==0 || length(LT)==1){
                   15247:                                                        if(LO!=[] && car(LO)!=0 && (type(car(LO))==4 || car(LO)==1))
                   15248:                                                                LO=cons(0,LO);
                   15249:                                                        LO=append(LR,LO);
                   15250:                                                        if(length(LT)>1&&length(LO)>0&&car(LO)!=0) LO=cons(0,LO);
                   15251:                                                        LR=[];
                   15252:                                        }
                   15253:                                }
                   15254:                        }
                   15255:                        return append(LR,LO);
                   15256:                }
                   15257:                if(type(L[0][0])!=4) L=[L];
                   15258:                LO=[];
                   15259:                if(M=="connect" || M=="close" || M=="loop"){
                   15260:                        Top=car(car(L));
                   15261:                        for(K=1,LL=L; LL!=[]; LL=cdr(LL)){
                   15262:                                for(F=0,LT=car(LL); LT!=[]; LT=cdr(LT),F++){
                   15263:                                        if((LTT=car(LT))==0) LTT=1;
                   15264:                                        if(F==0 && LO!=[]){
                   15265:                                                LO0=car(LO);
                   15266:                                                if(car(LO)!=1&&length(LO)>1) LO=cons(1,LO);
                   15267:                                                if(LTT==LO0) continue;
                   15268:                                                else LO=cons(1,cons(LTT, LO));
                   15269:                                        }else LO=cons(LTT, LO);
                   15270:                                }
                   15271:                        }
                   15272:                        if(M!="connect"){
                   15273:                                if(Top==car(LO) || car(LO)==1 || M=="loop")
                   15274:                                        LO=cons(-1,cdr(LO));
                   15275:                                else
                   15276:                                        LO=cons(-1,cons(1,LO));
                   15277:                        }
                   15278:                        return reverse(LO);
                   15279:                }
                   15280:                if(M=="union"){
                   15281:                        for(LL=reverse(L); LL!=[]; LL=cdr(LL)){
                   15282:                                if(LO!=[]) LO=cons(0,LO);
                   15283:                                LO=append(car(LL),LO);
                   15284:                        }
                   15285:                        L=LO;
                   15286:                }
                   15287:                return L;
                   15288:        }
                   15289:        if(type(Arg=getopt(deg))==1)
                   15290:                Arg=@pi*Arg/180;
                   15291:        else Arg=getopt(arg);
                   15292:        if(type(Arg)==2) Arg=deval(Arg);
                   15293:        if(type(Arg)==1)
                   15294:                M=M*mat([dcos(Arg),-dsin(Arg)],[dsin(Arg),dcos(Arg)]);
                   15295:        if(type(Sft=getopt(org))==4){
                   15296:                Sft=ltov(Sft);
                   15297:                Sft-=M*Sft;
                   15298:        }else Sft=ltov([0,0]);
                   15299:        if(type(V=getopt(shift))==4)
                   15300:                Sft+=ltov(V);
                   15301:        if(getopt(proc)==1){
                   15302:                if(Sft!=0&&ltov(Sft)!=[0,0]) Sft=[["shift",vtol(Sft)]];
                   15303:                else Sft=[];
                   15304:                for(LO=[],LT=L;LT!=[];LT=cdr(LT)){
                   15305:                        if(type(car(T=car(LT)))<2){
                   15306:                                if((P=car(T))==0){      /* exedraw 0 */
                   15307:                                        V=[[T[1][0],T[2][0]],[T[1][0],T[2][1]],[T[1][1],T[2][0]],[T[1][1],T[2][1]]];
                   15308:                                        V=ptbbox(ptaffine(M,V|option_list=Sft));
                   15309:                                        L1=cdr(cdr(cdr(T)));
                   15310:                                        LO=cons(append([0,V[0],V[1]],L1),LO);
                   15311:                                        continue;
                   15312:                                }else if(P==1){ /* exedraw 1 */
                   15313:                                        L1=[];
                   15314:                                        for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   15315:                                                D=car(TT);
                   15316:                                                if(type(D[0][0])==4){
                   15317:                                                        for(L2=[],DT=D;DT!=[];DT=cdr(DT))
                   15318:                                                                L2=cons(ptaffine(M,car(DT)|option_list=Sft),L2);
                   15319:                                                        L1=cons(reverse(L2),L1);
                   15320:                                                }else L1=cons(ptaffine(M,D|option_list=Sft),L1);
                   15321:                                        }
                   15322:                                        LO=cons(append([1,T[1]],reverse(L1)),LO);
                   15323:                                        continue;
                   15324:                                }else if(P>=2 && P<=5){
                   15325:                                        L1=ptaffine(M,cdr(cdr(T))|optilon_list=Sft);
                   15326:                                        LO=cons(append([P,T[1]],L1),LO);
                   15327:                                        continue;
                   15328:                                }
                   15329:                        }
                   15330:                        LO=cons(T,LO);
                   15331:                }
                   15332:                return reverse(LO);
                   15333:        }
                   15334:        F=0;
                   15335:        if(type(L)==4){
                   15336:                for(LT=L; LT!=[]; LT=cdr(LT)){
                   15337:                        if((T=type(car(LT)))==4||T==5){
                   15338:                                F=1; break;
                   15339:                        }
                   15340:                }
                   15341:        }
                   15342:        if(F==0) return (Sft==0)?ptaffine(M,[L])[0]:ptaffine(M,[L]|shift=vtol(Sft))[0];
                   15343:        for(LO=[],LT=L; LT!=[]; LT=cdr(LT)){
                   15344:                if(((T=type(P=car(LT)))!=4 && T!=5)||type(P[0])>3) LO=cons(P,LO);
                   15345:                else{
                   15346:                        if(T==4) P=ltov(P);
                   15347:                        V=M*P;
                   15348:                        if(Sft!=0) V+=Sft;
                   15349:                        if(T==4) V=vtol(V);
                   15350:                        LO=cons(V,LO);
                   15351:                }
                   15352:        }
                   15353:        return reverse(LO);
                   15354: }
                   15355:
                   15356: def ptlattice(M,N,X,Y)
                   15357: {
                   15358:        if(type(S=getopt(scale))!=1) S=1;
                   15359:        if(type(Cond=getopt(cond))!=4) Cond=[];
                   15360:        Line=getopt(line);
                   15361:        if(Line==1 || Line==2) F=newmat(M,N);
                   15362:        else Line=0;
                   15363:        if(type(Org=getopt(org))==4) Org=ltov(Org);
                   15364:        else Org=newvect(length(X));
                   15365:        X=ltov(X); Y=ltov(Y);
                   15366:        for(L=[],I=M-1;I>=0;I--){
                   15367:                for(P0=P1=0,J=N-1;J>=0;J--){
                   15368:                        P=Org+I*X+J*Y;
                   15369:                        for(C=Cond; C!=[]; C=cdr(C))
                   15370:                                if(subst(car(C),x,P[0],y,P[1])<0) break;
                   15371:                        if(C!=[]) continue;
                   15372:                        if(Line) F[I][J]=1;
                   15373:                        else L=cons(vtol(S*P),L);
                   15374:                }
                   15375:        }
                   15376:        if(Line==0) return L;
                   15377:        for(I=M-1;I>=0;I--){
                   15378:                for(T0=0,T1=J=N-1;J>=0;J--){
                   15379:                        if((K=F[I][J])!=0){
                   15380:                                if(T0==0) T0=J;
                   15381:                                else T1=J;
                   15382:                        }
                   15383:                        if(K==0 || T1==0){
                   15384:                                if(T1<T0){
                   15385:                                        L=cons(vtol(S*(Org+I*X+T0*Y)), L);
                   15386:                                        L=cons(vtol(S*(Org+I*X+T1*Y)), L);
                   15387:                                        L=cons(0,L);
                   15388:                                }
                   15389:                                T0=0; T1=N-1;
                   15390:                        }
                   15391:                }
                   15392:        }
                   15393:        for(J=N-1;J>=0;J--){
                   15394:                for(T0=0,T1=I=M-1;I>=0;I--){
                   15395:                        if((K=F[I][J])!=0){
                   15396:                                if(T0==0) T0=I;
                   15397:                                else T1=I;
                   15398:                        }
                   15399:                        if(K==0 || T1==0){
                   15400:                                if(T1<T0){
                   15401:                                        L=cons(vtol(S*(Org+T0*X+J*Y)), L);
                   15402:                                        L=cons(vtol(S*(Org+T1*X+J*Y)), L);
                   15403:                                        L=cons(0,L);
                   15404:                                }
                   15405:                                T0=0; T1=M-1;
                   15406:                        }
                   15407:                }
                   15408:        }
                   15409:        return cdr(L);
                   15410: }
                   15411:
                   15412: def ptpolygon(N,R)
                   15413: {
                   15414:        if(type(S=getopt(scale))!=1) S=1;
                   15415:        if(type(Org=getopt(org))!=4) Org=[0,0];
                   15416:        Pi=deval(@pi);
                   15417:        if(type(Arg=getopt(deg))==1)
                   15418:                Arg=Pi*Arg/180;
                   15419:        else Arg=getopt(arg);
                   15420:        if(type(Arg)==2) Arg=deval(Arg);
                   15421:        if(type(Arg)!=1) Arg=0;
                   15422:        Arg -= Pi*(1/2+1/N);
                   15423:        D=Pi*2/N;
                   15424:        for(L=[],I=N-1; I>=0; I--)
                   15425:                L=cons([S*(Org[0]+R*dcos(Arg+I*D)),S*(Org[1]+R*dsin(Arg+I*D))],L);
                   15426:        return L;
                   15427: }
                   15428:
                   15429: def ptwindow(L,X,Y)
                   15430: {
                   15431:        if(type(S=getopt(scale))==1){
                   15432:                X=[S*X[0],S*X[1]]; Y=[S*Y[0],S*Y[1]];
                   15433:        }
                   15434:        for(R=[],LT=L;LT!=[];LT=cdr(LT)){
                   15435:                P=car(LT);
                   15436:                if(P[0]<X[0] || P[0]>X[1] || P[1]<Y[0] || P[1]>Y[1])
                   15437:                        R=cons(0,R);
                   15438:                else R=cons(P,R);
                   15439:        }
                   15440:        return reverse(R);
                   15441: }
                   15442:
                   15443: def lninbox(L,W)
                   15444: {
                   15445:        if(L[0]==L[1]) return 0;
                   15446:        R=newvect(2);C=newvect(2);
                   15447:        for(J=0;J<2;J++){
                   15448:                C[J]=L[1][J]-L[0][J];
                   15449:                if(C[J]!=0){
                   15450:                        R[J]=[(W[J][0]-L[0][J])/C[J],(W[J][1]-L[0][J])/C[J]];
                   15451:                        if(R[J][0]>R[J][1]) R[J]=[R[J][1],R[J][0]];
                   15452:                }
                   15453:        }
                   15454:        if(R[0]==0) R[0]=R[1];
                   15455:        if(R[1]==0) R[1]=R[0];
                   15456:        S0=(R[0][0]<R[1][0])?R[1][0]:R[0][0];
                   15457:        S1=(R[0][1]<R[1][1])?R[0][1]:R[1][1];
                   15458:        if(getopt(in)==1){
                   15459:                if(S0<0) S0=0;
                   15460:                if(S1>1) S1=1;
                   15461:        }
                   15462:        if(S0>S1) return 0;
                   15463:        return [[L[0][0]+C[0]*S0,L[0][1]+C[1]*S0],[L[0][0]+C[0]*S1,L[0][1]+C[1]*S1]];
                   15464: }
                   15465:
                   15466: def ptbbox(L)
                   15467: {
                   15468:        J=length(L[0]);
                   15469:        if((Box=getopt(box))==1){
                   15470:                for(R=[],I=0;I<J;I++){
                   15471:                        P=car(LT=L)[I][0];Q=car(LT)[I][1];
                   15472:                        for(;LT!=[];LT=cdr(LT)){
                   15473:                                if((type(T=car(LT))==4 || type(T)==5) && length(T)==J){
                   15474:                                        if(T[I][0]<P) P=T[I][0];
                   15475:                                        if(T[I][1]>Q) Q=T[I][1];
                   15476:                                }
                   15477:                        }
                   15478:                        R=cons([P,Q],R);
                   15479:                }
                   15480:        }else if(type(Box)==4) return ptbbox([ptbbox(L),Box]|box=1);
                   15481:        else{
                   15482:                for(R=[],I=0;I<J;I++){
                   15483:                        P=Q=car(LT=L)[I];LT=cdr(LT);
                   15484:                        for(;LT!=[];LT=cdr(LT)){
                   15485:                                if((type(T=car(LT))==4||type(T)==5) && type(T[0])<2 && length(T)==J){
                   15486:                                        if((V=T[I])<P) P=V;
                   15487:                                        else if(V>Q) Q=V;
                   15488:                                }
                   15489:                        }
                   15490:                        R=cons([P,Q],R);
                   15491:                }
                   15492:        }
                   15493:        return reverse(R);
                   15494: }
                   15495:
                   15496: def iscombox(S,T)
                   15497: {
                   15498:        for(;S!=[];S=cdr(S),T=cdr(T))
                   15499:                if(car(S)[0]>car(T)[1] || car(S)[1]<car(T)[0]) return 0;
                   15500:        return 1;
                   15501: }
                   15502:
                   15503: def ptcopy(L,V)
                   15504: {
                   15505:        if(type(V[0])!=4) V=[V];
                   15506:        for(F=0,LL=[]; V!=[]; V=cdr(V)){
                   15507:                if(F)   LL=append(LL,[0]);
                   15508:                F++;
                   15509:                LL=append(LL,ptaffine(1,L|shift=car(V)));
                   15510:        }
                   15511: }
                   15512:
                   15513: def    average(L)
                   15514: {
1.32      takayama 15515:        if(getopt(opt)=="co"){
                   15516:                S0=average(L[0]);V0=car(S0);
                   15517:                S1=average(L[1]);V1=car(S1);
                   15518:                L0=os_md.m2l(L[0]|flat=1);
                   15519:                L1=os_md.m2l(L[1]|flat=1);
                   15520:                for(S=0;L0!=[];L0=cdr(L0),L1=cdr(L1))
                   15521:                        S+=(car(L0)-V0)*(car(L1)-V1);
                   15522:                S/=S0[1]*S1[1]*S0[2];
                   15523:                S=[S,S0,S1];
                   15524:        }else{
                   15525:                L=os_md.m2l(L|flat=1);
                   15526:                M0=M1=car(L);
                   15527:                for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){
                   15528:                        S+=(V=car(LT));
                   15529:                        SS+=V^2;
                   15530:                        if(V<M0)                M0=V;
                   15531:                        else if(V>M1)   M1=V;
                   15532:                }
                   15533:                SS=dsqrt(SS/I-S^2/I^2);
                   15534:                S=[deval(S/I),SS,I,M0,M1];
1.6       takayama 15535:        }
1.8       takayama 15536:        if(isint(N=getopt(sint))) S=sint(S,N);
                   15537:        return S;
1.6       takayama 15538: }
                   15539:
                   15540: def m2ll(M)
                   15541: {
                   15542:        for(R=[],I=size(M)[0]-1; I>=0; I--)
                   15543:                R=cons(vtol(M[I]),R);
                   15544:        return R;
                   15545: }
                   15546:
                   15547: def madjust(M,W)
                   15548: {
                   15549:        if(type(Null=getopt(null))<0) Null=0;
                   15550:        if(type(M)==4 && type(M[0])==4){
                   15551:                M=lv2m(M|null=Null);
                   15552:                return m2ll(madjust(M,W|null=Null));
                   15553:        }
                   15554:        S=size(M);
                   15555:        if(W<0){
                   15556:                W=-W;
                   15557:                T0=ceil(S[0]/W);
                   15558:                T1=S[1]*W;
                   15559:                N=newmat(T0,T1);
                   15560:                for(I=0; I<T0; I++){
                   15561:                        for(K=0; K<W; K++){
                   15562:                                II=K*T0+I;
                   15563:                                for(J=0; J<S[1]; J++)
                   15564:                                        N[I][S[1]*K+J]=(II<S[0])?M[II][J]:Null;
                   15565:                        }
                   15566:                }
                   15567:        }else{
                   15568:                T1=W;
                   15569:                T0=S[0]*(D=ceil(S[1]/T1));
                   15570:                N=newmat(T0,T1);
                   15571:                for(K=0; K<D; K++){
                   15572:                        for(J=0; J<W;J++){
                   15573:                                JJ=W*K+J;
                   15574:                                for(I=0; I<S[0]; I++)
                   15575:                                        N[S[0]*K+I][J]=(JJ<S[1])?M[I][JJ]:Null;
                   15576:                        }
                   15577:                }
                   15578:        }
                   15579:        return N;
                   15580: }
                   15581:
                   15582: def texcr(N)
                   15583: {
                   15584:        if(!isint(N) || N<0 || N>127) return N;
                   15585:        S=(iand(N,8))? "\\allowdisplaybreaks":"";
                   15586:        if(iand(N,2))  S=S+"\\\\";
                   15587:        if(iand(N,16)) S=S+"\\pause";
                   15588:        if(iand(N,1))  S=S+"\n";
                   15589:        if(iand(N,4))  S=S+"& ";
                   15590:        else if(!iand(N,1)) S=S+" ";
                   15591:        if(iand(N,64)) S=S+"=";
                   15592:        if(iand(N,32)) S=","+S;
                   15593:        return S;
                   15594: }
                   15595:
                   15596: def ltotex(L)
                   15597: {
                   15598:        /* extern TeXLim;       */
                   15599:
                   15600:        if(type(L)==5)
                   15601:                L = vtol(L);
                   15602:        if(type(L) != 4)
                   15603:                return my_tex_form(L);
                   15604:        Opt=getopt(opt);
                   15605:        Pre=getopt(pre);
                   15606:        if(type(Var=getopt(var))<1) Var=0;
                   15607:     Cr2="\n";
                   15608:        if(type(Cr=getopt(cr))==4){
                   15609:                Cr2=Cr[1];Cr=Cr[0];
                   15610:        }
                   15611:        if(isint(Cr)) Cr=texcr(Cr);
                   15612:        if(type(Cr)!=7) Cr="\\\\\n & "; /* Cr=7 */
                   15613:        if(type(Opt)==7) Opt=[Opt];
                   15614:        if(type(Opt)!=4)
                   15615:                Op = -1;
                   15616:        else{
                   15617:                Op=findin(Opt[0],["spt","GRS","Pfaff","Fuchs","vect","cr","text","spts","spts0",
                   15618:                        "dform","tab", "graph","coord"]);
                   15619:                Opt=cdr(Opt);
                   15620:        }
                   15621:        if(Op==0){      /* spt */
                   15622:                Out = str_tb("\\left\\{\n ",0);
                   15623:                for(CC=0; L!=[]; L=cdr(L), CC++){
                   15624:                        if(CC>0) str_tb(",\\, ",Out);
                   15625:                        TP=car(L);
                   15626:                        if(Op!=0)
                   15627:                                str_tb(my_tex_form(TP),Out);
                   15628:                        else if(TP[0]==1)
                   15629:                                str_tb(my_tex_form(TP[1]),Out);
                   15630:                        else
                   15631:                                str_tb(["[", my_tex_form(TP[1]), "]_", rtotex(TP[0])],Out);
                   15632:                }
                   15633:                str_tb("%\n\\right\\}\n",Out);
                   15634:        }else if(Op==1){ /* GRS */
                   15635:                Out = string_to_tb("\\begin{Bmatrix}\n");
                   15636:                if(type(Pre)==7) str_tb(Pre,Out);
                   15637:                MC=length(M=ltov(L));
                   15638:                for(ML=0, I=length(M); --I>=0; ){
                   15639:                        if(length(M[I]) > ML)  ML=length(M[I]);
                   15640:                }
                   15641:                for(I=0; I<ML; I++){
                   15642:                        for(CC=J=0; J<MC; J++, CC++){
                   15643:                                if(length(M[J]) <= I){
                   15644:                                        if(CC > 0) str_tb(" & ",Out);
                   15645:                                }else if(M[J][I][0] <= 1){
                   15646:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   15647:                                        else
                   15648:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   15649:                                }else
                   15650:                                        str_tb([((!CC)?" [":" & ["), my_tex_form(M[J][I][1]), "]_",
                   15651:                                         rtotex(M[J][I][0])], Out);
                   15652:                        }
                   15653:                        str_tb((I<ML-1)?"\\\\\n":"\n", Out);
                   15654:                }
                   15655:                str_tb("\\end{Bmatrix}",Out);
                   15656:        }else if(Op==2){ /* Pfaff */
                   15657:                V=monototex(Opt[0]);
                   15658:                Out = string_to_tb("d"+V+"= \\Biggl(");
                   15659:                Opt=cdr(Opt);
                   15660:                II=length(Opt);
                   15661:                for(I=0; I<II; I++){
                   15662:                         str_tb([(I>0)?" + ":" ",mtotex(L[I]),"\\frac{d",monototex(Opt[I]),"}{",
                   15663:                         my_tex_form(Opt[I]),(I==II-1)?"}\n":"}\n\\\\&\n"],Out);
                   15664:                }
                   15665:                str_tb(["\\Biggr)",V,"\n"],Out);
                   15666:        }else if(Op==3){ /* Fuchs */
                   15667:                Out = string_to_tb("\\frac{d");
                   15668:                V=my_tex_form(Opt[0]);
                   15669:                str_tb([V,"}{d",my_tex_form(Opt[1]),"}="] ,Out);
                   15670:                Opt=cdr(Opt); Opt=cdr(Opt);
                   15671:                II=length(Opt);
                   15672:                for(I=0; I<II; I++){
                   15673:                         str_tb([(I>0)?" +":"\\Biggl(", " \\frac{",
                   15674:                         my_tex_form(L[I]),"}{", my_tex_form(Opt[I]),"}\n"],Out);
                   15675:                }
                   15676:                str_tb(["\\Biggr)",V,"\n"],Out);
                   15677:        }else if(Op==4){        /* vect */
                   15678:                Out=str_tb(mtotex(matc(L)|lim=0,var=Var),0);
                   15679:        }else if(Op==5 || Op==6){       /* cr or text */
                   15680:                Out = str_tb(0,0);
                   15681:                if(type(Lim=getopt(lim))!=1) Lim=0;
                   15682:                else if(Lim<30&&Lim>0) Lim=TeXLim;
                   15683:                Str=getopt(str);
                   15684:                if(length(Opt)==1 && (car(Opt)=="spts" || car(Opt)=="spts0") && type(Str)!=1)
                   15685:                        Str=2;
                   15686:                for(K=I=0; L!=[]; I++, L=cdr(L)){
                   15687:                        LT=car(L);
                   15688:                        if((!Lim||Op==6)&&I>0) str_tb((Op==5)?Cr:"\n",Out);
                   15689:                        if(Op==6){
                   15690:                                if(type(LT)==7){
                   15691:                                        str_tb([LT," "],Out);
                   15692:                                        I=-1;
                   15693:                                        continue;
                   15694:                                }
                   15695:                                str_tb("$",Out);
                   15696:                        }
                   15697:                        KK=0;
                   15698:                        if(Str>0 && type(LT)==4 && Opt!=[])
                   15699:                                S=ltotex(LT|opt=car(Opt),lim=0,str=Str,cr=Cr2,var=Var);
                   15700:                        else if(type(LT)==6){
                   15701:                                if(Lim>0){
                   15702:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   15703:                                        KK=S[1];
                   15704:                                        S=S[0];
                   15705:                                }else S=mtotex(LT|var=Var,lim=0);
                   15706:                        }else if(type(LT)==3 || type(LT)==2)
                   15707:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   15708:                        else S=my_tex_form(LT);
                   15709:                        if(Op!=6&&I>0&&Lim){
                   15710:                                if(Lim<0){
                   15711:                                        if(I%(-Lim)==0)
                   15712:                                                str_tb((Op==5)?Cr:"\n",Out);
                   15713:                                }else if((K+=(KK=(KK)?KK:texlen(S)))>Lim){
                   15714:                                        str_tb((Op==5)?Cr:"\n",Out);
                   15715:                                        K=KK;
                   15716:                                }
                   15717:                        }
                   15718:                        str_tb(S,Out);
                   15719:                        if(Op==6) str_tb("$",Out);
                   15720:                }
                   15721:        }else if(Op==7||Op==8){ /* spts, spts0 */
                   15722:                if(type(Lim=getopt(lim))!=1 || (Lim<30 && Lim!=0))
                   15723:                        Lim=TeXLim;
                   15724:                Str=getopt(str);
                   15725:                Out = str_tb(0,0);
                   15726:                for(K=0; L!=[]; L=cdr(L)){
                   15727:                        LT=car(L);
                   15728:                        KK=0;
                   15729:                        if(type(LT)==7 && Str==1) S=LT;
                   15730:                        else if(type(LT)==3 || type(LT)==2)
                   15731:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   15732:                        else if(type(LT)==6){
                   15733:                                if(Lim){
                   15734:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   15735:                                        KK=S[1];
                   15736:                                        S=S[0];
                   15737:                                }else S=mtotex(LT|var=Var,lim=0);
                   15738:                        }else
                   15739:                                S=my_tex_form(LT);
                   15740:                        if(Lim!=0){
                   15741:                                if(!KK) KK=texlen(S);
                   15742:                                if(K>0 && K+KK>Lim){
                   15743:                                        str_tb(Cr,Out);
                   15744:                                        K=0;
                   15745:                                }
                   15746:                        }
                   15747:                        if(K>0){
                   15748:                                str_tb((Op==7)?"\\ ":" ",Out);
                   15749:                                if(type(LT)>3 && type(LT)<7)    str_tb("%\n",Out);
                   15750:                        }
                   15751:                        str_tb(S,Out);
                   15752:                        K+=KK;
                   15753:                        if(OP==7)       K++;
                   15754:                }
                   15755:        }else if(Op==9){        /* dform */
                   15756:                Out=str_tb(0,0);
                   15757:                for(I=0;L!=[];L=cdr(L),I++){
                   15758:                        for(J=0,LT=car(L); LT!=[]; LT=cdr(LT),J++){
                   15759:                                if(J==0){
                   15760:                                        if((V=car(LT))==0)      continue;
                   15761:                                        if(I>0){
                   15762:                                                if(type(V)==1){
                   15763:                                                        if(V<0){
                   15764:                                                                str_tb("-",Out);
                   15765:                                                                V=-V;
                   15766:                                                        }
                   15767:                                                        else    str_tb("+",Out);
                   15768:                                                        if(V==1 && length(LT)>1) continue;
                   15769:                                                        str_tb(monototex(V),Out);
                   15770:                                                        continue;
                   15771:                                                }
                   15772:                                                else    str_tb("+",Out);
                   15773:                                        }
                   15774:                                }else if(J>0)   str_tb((J>1)?"\\wedge d":"\\,d",Out);
                   15775:                                V=monototex(car(LT));
                   15776:                                if(V<"-" || V>=".")     str_tb(V,Out);
                   15777:                                else str_tb(["(",V,")"],Out);
                   15778:                        }
                   15779:                }
                   15780:        }else if(Op==10 && type(L)==4 && type(car(L))==4){      /* tab */
                   15781:                if(type(Null=getopt(null))<0) Null="";
                   15782:                if(getopt(vert)==1){
                   15783:                        M=lv2m(L|null=Null);
                   15784:                        L=m2ll(mtranspose(M));
                   15785:                }
                   15786:                if(type(W=getopt(width))==1)
                   15787:                        L=madjust(L,W|null=Null);
                   15788:                LV=ltov(L);
                   15789:                S=length(LV);
                   15790: #if 1
                   15791:                if(type(T=getopt(left))==4){
                   15792:                        T=str_times(T,S);
                   15793:                        for(L=[],I=0;I<S;I++){
                   15794:                                L=cons(cons(car(T),LV[I]),L);
                   15795:                                T=cdr(T);
                   15796:                        }
                   15797:                        LV=reverse(L);
                   15798:                }
                   15799:                if(type(T=getopt(right))==4){
                   15800:                        T=str_times(T,S);
                   15801:                        for(L=[],I=0;I<S;I++){
                   15802:                                L=cons(append(LV[I],[car(T)]),L);
                   15803:                                T=cdr(T);
                   15804:                        }
                   15805:                        LV=reverse(L);
                   15806:                }
                   15807:                for(I=CS=0; I<S; I++)
                   15808:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   15809:                if(type(T=getopt(top))==4){
                   15810:                        LV=cons(str_times(T,CS),vtol(LV));
                   15811:                        S++;
                   15812:                }
                   15813:                if(type(T=getopt(last))==4){
                   15814:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   15815:                        S++;
                   15816:                }
                   15817: #else
                   15818:                for(I=CS=0; I<S; I++)
                   15819:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   15820: #endif
                   15821:                if(type(Title=getopt(title))!=7) Title="";
                   15822:                if(type(Vline=getopt(vline))!=4) Vline=[0,CS];
                   15823:                else Vline=subst(Vline,z,CS);
                   15824:                for(VV=[],VT=Vline;VT!=[];VT=cdr(VT)){
                   15825:                        if(type(T=car(VT))==4 && T[1]>0){
                   15826:                                for(I=T[0];I<=CS;I+=T[1]) VV=cons(I,VV);
                   15827:                        }else VV=cons(T,VV);
                   15828:                }
                   15829:                Vline=qsort(VV);
                   15830:                Out=str_tb("\\begin{tabular}{",0);
                   15831:                if(type(Al=getopt(align))==7 && str_len(Al)>1){
                   15832:                        str_tb(Al,Out);
                   15833:                }else{
                   15834:                        if(type(Al)!=7 || str_len(Al)<1) Al="r";
                   15835:                        for(I=0;I<=CS;I++){
                   15836:                                if(I!=0) str_tb(Al,Out);
                   15837:                                while(Vline!=[] && car(Vline)==I){
                   15838:                                        str_tb("|",Out);
                   15839:                                        Vline=cdr(Vline);
                   15840:                                }
                   15841:                        }
                   15842:                }
                   15843:                str_tb("}",Out);
                   15844:                if(Title!="")
                   15845:                        str_tb("\n\\multicolumn{"+rtostr(CS)+"}{c}{"+Title+"}\\\\",Out);
                   15846:                if(type(Hline=getopt(hline))!=4) Hline=[0,S];
                   15847:                else Hline=subst(Hline,z,S);
                   15848:                for(VV=[],VT=Hline;VT!=[];VT=cdr(VT)){
                   15849:                        if(type(T=car(VT))==4 && T[1]>0){
1.14      takayama 15850:                                for(I=T[0];I<=S;I+=T[1]) VV=cons(I,VV);
1.6       takayama 15851:                        }else VV=cons(T,VV);
                   15852:                }
                   15853:                Hline=qsort(VV);
                   15854:                while(Hline!=[] && car(Hline)==0){
                   15855:                        str_tb(" \\hline\n",Out);
                   15856:                        Hline=cdr(Hline);
                   15857:                }
                   15858: /*
                   15859:                if(type(getopt(left))==4) CS++;
                   15860:                if(type(getopt(right))==4) CS++;
                   15861:                if(type(T=getopt(top))==4){
                   15862:                        LV=cons(str_times(T,CS),vtol(LV));
                   15863:                        S++;
                   15864:                }
                   15865:                if(type(T=getopt(last))==4){
                   15866:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   15867:                        S++;
                   15868:                }
                   15869:                if(type(T=getopt(left))==4){
                   15870:                        T=str_times(T,S);
                   15871:                        for(L=[],I=0;I<S;I++){
                   15872:                                L=cons(cons(car(T),LV[I]),L);
                   15873:                                T=cdr(T);
                   15874:                        }
                   15875:                        LV=reverse(L);
                   15876:                }
                   15877:                if(type(T=getopt(right))==4){
                   15878:                        T=str_times(T,S);
                   15879:                        for(L=[],I=0;I<S;I++){
                   15880:                                L=cons(append(LV[I],[car(T)]),L);
                   15881:                                T=cdr(T);
                   15882:                        }
                   15883:                        LV=reverse(L);
                   15884:                }
                   15885: */
                   15886:                for(I=0; I<S; I++){
                   15887:                        for(C=0,LT=LV[I];C<CS; C++){
                   15888:                                if(LT!=[]){
                   15889:                                        P=car(LT);
                   15890:                                        if(type(P)!=7) P="$"+my_tex_form(P)+"$";
                   15891:                                        if(P!="") str_tb(P,Out);
                   15892:                                        LT=cdr(LT);
                   15893:                                }
                   15894:                                if(C<CS-1) str_tb("& ",Out);
                   15895:                        }
                   15896:                        str_tb("\\\\",Out);
                   15897:                        while(Hline!=[] && car(Hline)==I+1){
                   15898:                                str_tb(" \\hline",Out);
                   15899:                                Hline=cdr(Hline);
                   15900:                        }
                   15901:                        str_tb("\n",Out);
                   15902:                }
                   15903:                str_tb("\\end{tabular}\n",Out);
                   15904:        }else if(Op==11){       /* graph */
1.10      takayama 15905:                if(type(Strip=getopt(strip))!=1) Strip=0;
                   15906:                if(type(MX=getopt(max))!=1)  MX=0;
                   15907:                if(type(ML=getopt(mult))!=1) ML=0;
                   15908:                if((REL=getopt(relative))!=1) REL=0;
                   15909:                CL=getopt(color);
                   15910:                OL=delopt(getopt(),["color","strip","mult"]);
                   15911:                if(ML==1&&type(CL)==4){
                   15912:                        LL=L[1];L=L[0];K=length(L);S=T="";
                   15913:                        if(!MX){
                   15914:                                MX=vector(length(L[0]));
                   15915:                                for(LT=L;LT!=[];LT=cdr(LT)){
                   15916:                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   15917:                                                if(REL==1) MX[I]+=car(LTT);
                   15918:                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   15919:                                        }
                   15920:                                }
                   15921:                                MX=lmax(MX);
                   15922:                                OL=cons(["max",MX],OL);
                   15923:                        }
                   15924:                        if(REL==1) MX=newvect(length(L[0]));
                   15925:                        for(I=0;I<K;I++){
                   15926:                                for(R=[],J=length(L[I]);--J>=0;){
                   15927:                                        if(REL==1){
                   15928:                                                R=cons([MX[J],V=MX[J]+L[I][J]],R);
                   15929:                                                MX[J]=V;
                   15930:                                        }else R=cons([(!I)?0:L[I-1][J],L[I][J]],R);
                   15931:                                }
                   15932:                                OP=cons(["color",CL[I]],OL);
                   15933:                                S+=ltotex([R,LL]|option_list=cons(["value",0],cons(["strip",(!I)?1:2],OP)));
                   15934:                                T+=ltotex([R,LL]|option_list=cons(["strip",3],OP));
                   15935:                        }
                   15936:                        return(!Strip)?xyproc(S+T):(S+T);
                   15937:                }else if(!TikZ) CL=0;
                   15938:                if(type(Line=getopt(line))!=1){
                   15939:                        if(type(Line)==4){
                   15940:                                if(type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   15941:                                        Opt=Line[1]; Line=Line[0];
                   15942:                                }else if(ML==1){
                   15943:                                        OL=delopt(OL,"line");
                   15944:                                        LL=L[1];L=L[0];K=length(L);S="";
                   15945:                                        if(!MX){
1.15      takayama 15946:                                                MX=newvect(length(L[0]));
1.10      takayama 15947:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   15948:                                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   15949:                                                                if(REL==1) MX[I]+=car(LTT);
                   15950:                                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   15951:                                                        }
                   15952:                                                }
                   15953:                                                MX=lmax(MX);
                   15954:                                                OL=cons(["max",MX],OL);
                   15955:                                        }
1.15      takayama 15956:                                        for(I=0;I<K;I++)
                   15957:                                                S+=ltotex([L[I],LL]|option_list
1.10      takayama 15958:                                                        =cons(["line",Line[I]],cons(["strip",(!I)?1:2],OL)));
                   15959:                                        return(!Strip)?xyproc(S):S;
                   15960:                                }
                   15961:                        }else Line=0;
                   15962:                }else Opt="@{-}";
                   15963:                Width=8; Hight=3; WRet=1/2; HMerg=(getopt(horiz)==1)?0.3:0.2;
1.6       takayama 15964:                if(!TikZ){
1.7       takayama 15965:                        Width*=10; Hight*=10; HMerg*=10;
1.6       takayama 15966:                }
1.10      takayama 15967:                VMerg=HMerg;
                   15968:                if(type(Shift=getopt(shift))!=1)
                   15969:                        Shift=0;
1.6       takayama 15970:                if(type(V=getopt(size))==4){
                   15971:                        Width=V[0];Hight=V[1];
                   15972:                        if(length(V)>2) WRet=V[2];
1.10      takayama 15973:                        if(length(V)>3) VMerg=VMerg=V[3];
                   15974:                        if(length(V)>4) HMerg=V[4];
1.6       takayama 15975:                }
                   15976:                Val=getopt(value);
                   15977:                if(!isint(Val)) Val=-1;
                   15978:                if(type(Line=getopt(line))!=1){
                   15979:                        if(type(Line)==4 && type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   15980:                                Opt=Line[1]; Line=Line[0];
                   15981:                        }else   Line=0;
                   15982:                }else Opt="@{-}";
                   15983:                if(type(car(L))==4){
                   15984:                        LL=L[1]; L=L[0];
                   15985:                }else LL=[];
                   15986:                if(Line==-1){
                   15987:                        for(Sum=0, LT=L; LT!=[]; LT=cdr(LT)){
                   15988:                                if((S=car(LT))<=0) return 0;
                   15989:                                Sum+=S;
                   15990:                        }
1.16      takayama 15991:                        for(R=[],LT=L;LT!=[];LT=cdr(LT)) R=cons(car(LT)/Sum,R);
1.6       takayama 15992:                        R=reverse(R);
                   15993:                        Opt0=Opt*2/3;
1.10      takayama 15994:                        Out=str_tb((Strip>0)?0:xyproc(1),0);
1.16      takayama 15995:                        if(type(CL)!=4) str_tb(xylines(ptpolygon(6,Opt)|close=1,curve=1),Out);
1.6       takayama 15996:                        for(S=0,RT=R,LT=LL;RT!=[];RT=cdr(RT)){
1.16      takayama 15997:                                SS=S+RT[0];
                   15998:                                if(type(CL)==4){
                   15999:                                        str_tb(xyang(Opt,[0,0],(0.25-SS)*6.2832,(0.25-S)*6.2832|ar=1,opt=car(CL)),Out);
                   16000:                                        if(length(CL)>0) CL=cdr(CL);
                   16001:                                }else str_tb(xyline([0,0],[Opt*dsin(S*6.2832),Opt*dcos(S*6.2832)]),Out);
                   16002:                                T=(S+SS)/2;
                   16003:                                S=SS;
1.6       takayama 16004:                                if(LT!=[]){
1.16      takayama 16005:                                        str_tb(xyput([Opt0*dsin(T*6.2832),Opt0*dcos(T*6.2832),car(LT)]),Out);
1.6       takayama 16006:                                        LT=cdr(LT);
                   16007:                                }
                   16008:                        }
1.10      takayama 16009:                        if(!Strip) str_tb(xyproc(0),Out);
1.6       takayama 16010:                        return str_tb(0,Out);
                   16011:                }
                   16012:                if(MX==0){
                   16013:                        for(MX=0,LT=L; LT!=[]; LT=cdr(LT))
                   16014:                                if(car(LT)>MX) MX=car(LT);
                   16015:                }
                   16016:                MX-=Shift;
                   16017:                S=length(L);
                   16018:                WStep=Width/S;
                   16019:                WWStep=WStep*WRet;
1.10      takayama 16020:                HStep=(Hight<0)?-Hight:Hight/MX;
1.7       takayama 16021:                if(LL!=[]&&length(LL)==S-1) WS2=WStep/2;
                   16022:                else WS2=0;
1.10      takayama 16023:                Out=str_tb((Strip>0)?0:xyproc(1),0);
                   16024:                Hori=getopt(horiz);
                   16025:                if(Strip<2){
                   16026:                        if(Hori==1)  str_tb(xyline([0,0],[0,Width-WStep+WWStep]),Out);
                   16027:                        else str_tb(xyline([0,0],[Width-WStep+WWStep,0]),Out);
                   16028:                }
1.6       takayama 16029:                for(I=0,LT=L;LT!=[]; LT=cdr(LT),I++){
1.10      takayama 16030:                        XP=WStep*I; XPM=XP+WWStep/2;
                   16031:                        if(type(LTT=car(LT))==4){
                   16032:                                YP0=(car(LTT)-Shift)*HStep;YP=(LTT[1]-Shift)*HStep;
                   16033:                                VL=LTT[1];
                   16034:                                if(REL) VL-=LTT[0];
                   16035:                        }else{
                   16036:                                YP0=0;YP=(LTT-Shift)*HStep;VL=LTT;
                   16037:                        }
                   16038:                        if(Hori==1){
                   16039:                                if(Line!=0){
                   16040:                                        if(I>0)
                   16041:                                                str_tb(xyarrow([XPM,YP],[XPM-WStep,YPP]|opt=Opt),Out);
                   16042:                                        if(Val!=0)
                   16043:                                                str_tb(xyput([YP+HMerg, XPM,car(LT)]),Out);
                   16044:                                        if(Line==2)
                   16045:                                                str_tb(xyput([YP,XPM,"$\\bullet$"]),Out);
                   16046:                                        YPP=YP;
                   16047:                                }else if(YP!=0 || Val==1){
                   16048:                                        if(Strip!=3){
                   16049:                                                if(CL) str_tb(xybox([[YP,XP+WWStep], [YP0,XP]]|color=CL),Out);
                   16050:                                                else str_tb(xybox([[YP,XP+WWStep],[YP0,XP]]),Out);
                   16051:                                        }
                   16052:                                        if(Val!=0) str_tb(xyput([(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),XPM,VL]),Out);
                   16053:                                }
                   16054:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([-VMerg,XPM+WS2,LL[I]]),Out);
                   16055:                        }else{
                   16056:                                if(Line!=0){
                   16057:                                        if(I>0)
                   16058:                                                str_tb(xyarrow([XPM-WStep,YPP],[XPM,YP]|opt=Opt),Out);
                   16059:                                        if(Val!=0)
                   16060:                                                str_tb(xyput([XPM,YP+HMerg,car(LT)]),Out);
                   16061:                                        if(Line==2)
                   16062:                                                str_tb(xyput([XPM,YP,"$\\bullet$"]),Out);
                   16063:                                        YPP=YP;
                   16064:                                }else if(YP!=0 || Val==1){
                   16065:                                        if(Strip!=3){
                   16066:                                                if(CL) str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]|color=CL),Out);
                   16067:                                                else str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]),Out);
                   16068:                                        }
                   16069:                                        if(Val!=0) str_tb(xyput([XPM,(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),VL]),Out);
1.6       takayama 16070:                                }
1.10      takayama 16071:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([XPM+WS2,-VMerg,LL[I]]),Out);
1.6       takayama 16072:                        }
                   16073:                }
1.10      takayama 16074:                if(!Strip)str_tb(xyproc(0),Out);
1.6       takayama 16075:        }else if(Op==12){       /* coord */
                   16076:                Out=str_tb("(",0);
                   16077:                for(LT=L;;){
                   16078:                        X=car(LT);
                   16079:                        if(type(X)>3 || imag(X)==0)     str_tb(my_tex_form(X),Out);
                   16080:                        else{
                   16081:                                XR=real(X);XI=imag(X);
                   16082:                                S=monototex(imag(X));
                   16083:                                if(S=="1") S="";
                   16084:                                else if(S=="- 1") S="-";
                   16085:                                if(getopt(cpx)==2) S=S+"\\sqrt{-1}";
                   16086:                                else S=S+"i";
                   16087:                                if(XR!=0){
                   16088:                                        if(str_char(S,0,"-")==0) S=monototex(XR)+S;
                   16089:                                        else S=monototex(XR)+"+"+S;
                   16090:                                }
                   16091:                                str_tb(S,Out);
                   16092:                        }
                   16093:                        if((LT=cdr(LT))==[]) break;
                   16094:                        else str_tb(",",Out);
                   16095:                }
                   16096:                str_tb(")",Out);
                   16097:        }
                   16098:        else    return my_tex_form(L);
                   16099:        S = str_tb(0,Out);
                   16100:        return (getopt(small)==1)?smallmattex(S):S;
                   16101: }
                   16102:
                   16103:
                   16104: def str_tb(L,TB)
                   16105: {
                   16106:        if(type(TB) == 0) TB = "";
                   16107:        if(L == 0)
                   16108:                return (type(TB) == 7)?string_to_tb(TB):tb_to_string(TB);
                   16109:        if(type(L) == 7)
                   16110:                L = [L];
                   16111:        else if(type(L) != 4){
                   16112:                erno(0);
                   16113:                return 0;
                   16114:        }
                   16115:        if(type(TB) <= 7)
                   16116:                 TB = string_to_tb((type(TB)==7)?TB:"");
                   16117:        for(; L != []; L = cdr(L))
                   16118:                write_to_tb(car(L), TB);
                   16119:        return TB;
                   16120: }
                   16121:
                   16122: /*
                   16123: def redgrs(M,T)
                   16124: {
                   16125:        L = [zzz];
                   16126:        for(I=S=0,Eq=[],MT=M; MT!=[]; I++, MT=cdr(MT)){
                   16127:                for(J=LS=0, N=car(MT); N!=[]; N=cdr(N)){
                   16128:                        X = makev([z,I,z,J]);
                   16129:                        L=cons(X,L);
                   16130:                        LS += X;
                   16131:                        S += car(N)[1]*X;
                   16132:                }
                   16133:                Eq = cons(LS-zzz,Eq);
                   16134:        }
                   16135:        Eq = cons(S-T,Eq);
                   16136:        Sol= lnsol(Eq,L);
                   16137:        for(LS=[],S=Sol; S!=[]; S=cdr(S)){
                   16138:                T=car(S);
                   16139:                if(type(S)!=4) return 0;
                   16140:                LS=cons(car(S)[0],LS);
                   16141:        }
                   16142: }
                   16143: */
                   16144:
                   16145: /* T=0 : all reduction
                   16146:                =1 : construction procedure
                   16147:                =2 : connection coefficient
                   16148:                =3 : operator
                   16149:                =4 : series expansion
                   16150:                =5 : expression by TeX
                   16151:                =6 : Fuchs relation
                   16152:                =7 : All
                   16153:                =8 : basic
                   16154:                =9 : ""
                   16155:                =10: irreducible
                   16156:                =11: recurrence */
                   16157: def getbygrs(M, TT)
                   16158: {
                   16159:        /* extern TeXEq;        */
                   16160:
                   16161:        if(type(M)==7) M=s2sp(M);
                   16162:        if(type(M) != 4 || TT =="help"){
                   16163:                mycat(
                   16164: ["getbygrs(m,t) or getbygrs(m,[t,s_1,s_2,...]|perm=?,var=?,pt=?,mat=?)\n",
                   16165: " m: generalized Riemann scheme or spectral type\n",
                   16166: " t: reduction, construct, connection, series, operator, TeX, Fuchs, irreducible, basic, recurrence,\n",
                   16167: "    All\n",
                   16168: " s: TeX dviout simplify short general operator irreducible top0 x1 x2 sft\n",
                   16169: "Ex: getbygrs(\"111,21,111\", [\"All\",\"dviout\",\"operator\",\"top0\"])\n"]);
                   16170:                return 0;
                   16171:        }
                   16172:        if(type(TT) == 4){
                   16173:                T  = TT[0];
                   16174:                T1 = cdr(TT);
                   16175:        }else{
                   16176:                T  = TT;
                   16177:                T1 = [];
                   16178:        }
                   16179:        if(type(T) == 7)
                   16180:                T = findin(T,["reduction","construct","connection", "operator", "series",
                   16181:                         "TeX", "Fuchs", "All", "basic", "", "irreducible", "recurrence"]);
                   16182:        TeX   = findin("TeX", T1);
                   16183:        Simp  = findin("simplify", T1);
                   16184:        Short = findin("short", T1);
                   16185:        Dviout= findin("dviout", T1);
                   16186:        General=findin("general", T1);
                   16187:        Op     =findin("operator", T1);
                   16188:        Irr    =findin("irreducible", T1);
                   16189:        Top0   =findin("top0",T1);
                   16190:        X1     =findin("x1",T1);
                   16191:        X2     =findin("x2",T1);
                   16192:        Sft    =findin("sft",T1);
                   16193:        Title = getopt(title);
                   16194:        Mat   = getopt(mat);
                   16195:        if(Mat!=1 || T<0 ||(T!=0&&T!=1&&T!=5&&T!=6&&T!=8&&T!=10&&T!=9)) Mat = 0;
                   16196:        if(findin("keep",T1) >= 0)
                   16197:                Keep = Dviout = 1;
                   16198:        else Keep = 0;
                   16199:        if(Dviout >= 0 || T == 5) TeX = 1;
                   16200:        for(J = 0, MM = M; J == 0 && MM != []; MM = cdr(MM)){
                   16201:                for(MI = car(MM); MI != []; MI = cdr(MI)){
                   16202:                        if(type(car(MI)) != 1 || car(MI) <= 0){
                   16203:                                J = 1; break;
                   16204:                        }
                   16205:                }
                   16206:        }
                   16207:
                   16208:        /* spectral type -> GRS */
                   16209:        if(J == 0){
                   16210:                for(R = [], S = J = 0, MM = M; MM != []; MM = cdr(MM), J++){
                   16211:                        MT = qsort(car(MM));
                   16212:                        R = cons(reverse(MT), R);
                   16213:                        if(J == 1){
                   16214:                                S = length(MT)-1;
                   16215:                                if(MT[S] > MT[0]) S = 0;
                   16216:                        }
                   16217:                }
                   16218:                M = reverse(R);
                   16219:                R = getopt(var);
                   16220:                if(type(R)<1){
                   16221:                        for(R = [], I = J-1; I >= 0; I--)
                   16222:                                R = cons(asciitostr([97+I]), R);
                   16223:                }
                   16224:                Sft=(Sft>=0)?1:0;
                   16225:                if(General < 0)
                   16226:                        Sft=-Sft-1;
                   16227:                M = sp2grs(M,R,Sft|mat=Mat);
                   16228:        }
                   16229:        for(M0=[],MM=M;MM!=[];MM=cdr(MM)){      /* change "?" -> z_z */
                   16230:                for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){
                   16231:                        Mt=car(Mm);
                   16232:                        if(type(Mt)==4 && Mt[1]=="?"){
                   16233:                                M1=cons([Mt[0],z_z],M1);
                   16234:                                continue;
                   16235:                        }else if(type(Mt)==7 && Mt=="?"){
                   16236:                                M1=cons(z_z,M1);
                   16237:                                continue;
                   16238:                        }
                   16239:                        M1=cons(Mt,M1);
                   16240:                }
                   16241:                M0=cons(reverse(M1),M0);
                   16242:        }
                   16243:        M = fspt(reverse(M0),5);  /* short -> long */
                   16244:        if(findin(z_z,vars(M))>=0)
                   16245:                M=subst(M,z_z,lsol(chkspt(M|mat=Mat)[3],z_z));  /* Fuchs relation */
                   16246:        NP = length(M);
                   16247:        Perm = getopt(perm);
                   16248:        if(type(Perm) == 4)
                   16249:                M = mperm(M,Perm,0);
                   16250:        if(T == 9){  /* "" */
                   16251:                if(Short >= 0)
                   16252:                        M = chkspt(M|opt=4,mat=Mat);
                   16253:                return M;
                   16254:        }
                   16255:        R = [0,M];
                   16256:        ALL = [R];
                   16257:
                   16258:        while(type(R = redgrs(R[1]|mat=Mat)) == 4)
                   16259:                ALL = cons(R, ALL);
                   16260:        if(R < 0)
                   16261:                return 0;
                   16262:
                   16263:        /* TeX */
                   16264:        if(TeX >= 0 && !chkfun("print_tex_form", "names.rr"))
                   16265:                return 0;
                   16266:        if(Dviout >= 0 && type(Title) == 7)
                   16267:                dviout(Title|keep=1);
                   16268:        if(T == 7 && Dviout >= 0){
                   16269:                S=["keep","simplify"];
                   16270:                if(Top0 >= 0)
                   16271:                        S = cons("top0",S);
                   16272:                getbygrs(M,cons(5,S)|title="\\noindent Riemann Scheme",mat=Mat);
                   16273:                Same = 0;
                   16274:                if(R > 0){
                   16275:                        MM = getbygrs(M,8|mat=Mat);    /* basic GRS */
                   16276:                        MS = chkspt(MM|opt=0,mat=Mat); /* spectral type */
                   16277:                        if(M != MM)
                   16278:                                 getbygrs(MM,cons(5,S)|title="Basic Riemann Scheme",mat=Mat);
                   16279:                        else{
                   16280:                                 dviout("This is a basic Riemann Scheme.\n\n\\noindent"|keep=1);
                   16281:                                 Same = 1;
                   16282:                        }
                   16283:                        dviout(MS|keep=1);
                   16284:                }
                   16285:                if(chkspt(ALL[0][1]|mat=Mat)[3] != 0)
                   16286:                        getbygrs(M,cons(6,S)|title="Fuchs condition",mat=Mat);
                   16287:                if(Same == 0){
                   16288:                        M1 = M[1];
                   16289:                        if(M1[length(M1)-1][0]==1 && Mat!=1){
                   16290:                                M1=M[2];
                   16291:                                if(M1[length(M1)-1][0] == 1){
                   16292:                                        getbygrs(M,cons(2,S)|title="Connection formula");
                   16293:                                        if(M1[length(M[0][0])-1][0] == 1 && R==0)
                   16294:                                                getbygrs(M,cons(11,S)|title="Recurrence relation shifting the last exponents at $\\infty$, 0, 1");
                   16295:                                }
                   16296:                                getbygrs(M,cons(1,S)|title="Integral representation");
                   16297:                                getbygrs(M,cons(4,S)|title="Series expansion");
                   16298:                        }
                   16299:                        if(Irr < 0){
                   16300:                                TI="Irreduciblity $\\Leftrightarrow$ any value of the following linear forms $\\notin\\mathbb Z$";
                   16301:                                if(R > 0)
                   16302:                                        TI += " + fundamental irreducibility";
                   16303:                                getbygrs(M,cons(10,S)|title=TI,mat=Mat);
                   16304:                                dviout("which coorespond to the decompositions"|keep=1);
                   16305:                                sproot(chkspt(M|opt=0),"pairs"|dviout=1,keep=1);
                   16306:                        }
                   16307:                }
                   16308:                if(Op >= 0 && Mat!=1) getbygrs(M,cons(3,S)|title="Operator");
                   16309:                dviout(" ");
                   16310:                return 1;
                   16311:        }
                   16312:        if(T == 0 && TeX >= 0){
                   16313:                T = 1; TeX = 16;
                   16314:        }
                   16315: /* Fuchs */
                   16316:        Fuc = chkspt(ALL[0][1]|Mat=mat)[3];
                   16317:        if(Fuc == 0) Simp = -1;
                   16318:        if(type(Fuc) == 1){
                   16319:                print("Violate Fuchs condition");
                   16320:                return 0;
                   16321:        }
                   16322:        if(T == 6){
                   16323:                if(Dviout >= 0) dviout(Fuc|eq=0,keep=Keep);
                   16324:                return (TeX >= 0)?my_tex_form(Fuc):Fuc;
                   16325:        }
                   16326:        Fuc = [Fuc];
                   16327: /* Generelized Riemann scheme */
                   16328:        if(T == 5){
                   16329:                M = ltov(M);
                   16330:                for(ML=0, I=0; I<NP; I++){
                   16331:                        L = length(M[I]);
                   16332:                        if(L > ML) ML = L;
                   16333:                }
                   16334:                Out = string_to_tb("P\\begin{Bmatrix}\nx=");
                   16335:                if(Top0 < 0)
                   16336:                        write_to_tb("\\infty & ",Out);
                   16337:                Pt = getopt(pt);
                   16338:                if(type(Pt) == 4){
                   16339:                        for(J = 3; J < NP; J++){
                   16340:                                str_tb(["& ",rtotex(car(Pt))],Out);
                   16341:                                Pt = cdr(Pt);
                   16342:                        }
                   16343:                }
                   16344:                else if(X2>=0)
                   16345:                        str_tb("0 & x_2",Out);
                   16346:                else
                   16347:                        str_tb((X1>=0)?"x_1 & x_2":"0 & 1",Out);
                   16348:                for(J = 3; J < NP; J++)
                   16349:                        str_tb(["& x_",rtotex(J)],Out);
                   16350:                if(Top0 >= 0)
                   16351:                        write_to_tb("& \\infty",Out);
                   16352:                write_to_tb("\\\\\n",Out);
                   16353:                for(I = 0; I < ML; I++){
                   16354:                        for(CC = 0, J = (Top0 >= 0)?1:0; ; J++, CC++){
                   16355:                                if(J == NP){
                   16356:                                        if(Top0 < 0) break;
                   16357:                                        J = 0;
                   16358:                                }
                   16359:                                if(length(M[J]) <= I){
                   16360:                                        if(CC > 0) write_to_tb(" & ",Out);
                   16361:                                }else if(M[J][I][0] <= 1){
                   16362:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   16363:                                        else
                   16364:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   16365:                                }else{
                   16366:                                        str_tb([((!CC)?"[":" & ["), my_tex_form(M[J][I][1]),
                   16367:                                                (Mat==1)?"]_{":"]_{("],Out);
                   16368:                                        str_tb([my_tex_form(M[J][I][0]),(Mat==1)?"}":")}"],Out);
                   16369:                                }
                   16370:                                if(Top0 >= 0 && J == 0)
                   16371:                                        break;
                   16372:                        }
                   16373:                        if(I == 0)
                   16374:                                str_tb("&\\!\\!;x",Out);
                   16375:                        str_tb("\\\\\n",Out);
                   16376:                }
                   16377:                str_tb("\\end{Bmatrix}",Out);
                   16378:                Out = str_tb(0,Out);
                   16379:                if(Dviout >= 0)
                   16380:                        dviout(Out|eq=0,keep=Keep);
                   16381:                return Out;
                   16382:        }
                   16383:
                   16384: /* Reduction */
                   16385:        if(T == 0){
                   16386:                if(Simp >= 0)
                   16387:                        ALL = simplify(ALL,Fuc,4);
                   16388:                return reverse(ALL);
                   16389:        }
                   16390:        LA = length(ALL) - 1;
                   16391:        NP = length(ALL[0][1]);
                   16392:
                   16393: /* irreducible */
                   16394:        if(T == 10){
                   16395:                for(IR=[], I = 0; I < LA; I++){
                   16396:                        AI = ALL[I]; AIT = AI[1];
                   16397:                        K = AI[0][0];
                   16398:                        P = -AIT[0][K][1];
                   16399:                        P -= cterm(P);
                   16400:                        IR = cons(P, IR);
                   16401:                        for(J = 0; J < NP; J++){
                   16402:                                K = AI[0][J];
                   16403:                                for(L = length(AIT[J]) - 1; L >= 0 ; L--){
                   16404:                                        if(L == K || AIT[J][L][0] <= AIT[J][K][0])
                   16405:                                                continue;
                   16406:                                        P = AIT[J][L][1] - AIT[J][K][1];
                   16407:                                        Q = cterm(P);
                   16408:                                        if(dn(Q)==1)
                   16409:                                                P -= Q;
                   16410:                                        IR = cons(P,IR);
                   16411:                                }
                   16412:                        }
                   16413:                }
                   16414:                P=Fuc[0];
                   16415:                Q=cterm(P);
                   16416:                if(type(Q)==1 && dn(Q)==1){
                   16417:                        for(F=0,V=vars(P);V!=[];V=cdr(V)){
                   16418:                                R=mycoef(P,1,car(V));
                   16419:                                if(type(R)!=1 || Q%R!=0){
                   16420:                                        F=1; break;
                   16421:                                }
                   16422:                        }
                   16423:                        if(F==0){
                   16424:                                P-=Q;
                   16425:                                Simp=0;
                   16426:                        }
                   16427:                }
                   16428:                if(Simp >= 0){
                   16429:                        IR=simplify(IR,[P],4);
                   16430:                        for(R=[]; IR!=[]; IR=cdr(IR)){
                   16431:                                P=car(IR);
                   16432:                                Q=cterm(P);
                   16433:                                if(dn(Q)==1) P-=Q;
                   16434:                                R=cons(P,R);
                   16435:                        }
                   16436:                        IR=R;
                   16437:                }
                   16438:                for(R=[]; IR!=[]; IR=cdr(IR)){
                   16439:                        P=car(IR);
                   16440:                        if(str_len(rtostr(P)) > str_len(rtostr(-P)))
                   16441:                                P = -P;
                   16442:                        R = cons(P,R);
                   16443:                }
                   16444:                R = ltov(R);
                   16445: #ifdef USEMODULE
                   16446:                R = qsort(R,os_md.cmpsimple);
                   16447: #else
                   16448:                R = qsort(R,cmpsimple);
                   16449: #endif
                   16450:                R = vtol(R);
                   16451:                if(TeX >= 0){
                   16452:                        Out = string_to_tb("");
                   16453:                        for(I=L=K=0; R!=[]; R=cdr(R),I++){
                   16454:                                K1 = K;
                   16455:                                RS = my_tex_form(car(R));
                   16456:                                K = nmono(car(R));
                   16457:                                L += K;
                   16458:                                if(I){
                   16459:                                        if(K1 == K && L < 30)
                   16460:                                                str_tb("\\quad ",Out);
                   16461:                                        else{
                   16462:                                                L = K;
                   16463:                                                str_tb((TeXEq==5)?["\\\\%\n &"]:["\\\\%\n "],Out);
                   16464:                                        }
                   16465:                                }
                   16466:                                str_tb(RS,Out);
                   16467:                        }
                   16468:                        R = Out;
                   16469:                        if(Dviout>=0){
                   16470:                                dviout(R|eq=0,keep=Keep);
                   16471:                                return 1;
                   16472:                        }
                   16473:                }
                   16474:                return R;
                   16475:        }
                   16476:
                   16477:        AL = []; SS = 0;
                   16478:        for(I = 0; I <= LA; I++){
                   16479:                AI = ALL[I]; AIT = AI[1];  /* AIT: GRS */
                   16480:                if(I > 0){
                   16481:                        for(S = J = 0; J < NP; J++){
                   16482:                                GE = AIT[J][AI0[J]][1];
                   16483:                                S += GE;
                   16484:                                if(J == 0)
                   16485:                                        SS = [];
                   16486:                                else
                   16487:                                        SS = cons(GE,SS);
                   16488:                        }
                   16489:                        SS = cons(1-Mat-S, reverse(SS));
                   16490:                }
                   16491:                AI0 = AI[0];
                   16492:                AL = cons([SS, cutgrs(AIT)], AL);
                   16493:        }
                   16494:        AL = reverse(AL);
                   16495:        AD = newvect(NP);
                   16496:        ALT = AL[0][1];
                   16497:        for(J = 1; J < NP; J++){
                   16498:                /* AD[J] = ALT[J][0][1];   [J][?][1] <- [J][?][0]: max */
                   16499:                for(MMX=0, K = KM = length(ALT[J])-1; K >= 0; K--){
                   16500:                        if(MMX <= ALT[J][K][0]){
                   16501:                                 if(J == 1 && MMX == ALT[J][K][0])
                   16502:                                         continue;
                   16503:                                 KM = K;
                   16504:                                 MMX = ALT[J][K][0];
                   16505:                        }
                   16506:                }
                   16507:                AD[J] = ALT[J][KM][1];
                   16508:        }
                   16509:        AL = cdr(AL);
                   16510:        AL = cons([vtol(AD), ALT], AL);
                   16511:        AL = cons([0, mcgrs(ALT, [vtol(-AD)]|mat=Mat)], AL);
                   16512:        if(Simp >= 0 && T != 3)
                   16513:                AL = simplify(AL,Fuc,4);
                   16514: /* Basic */
                   16515:        if(T == 8){
                   16516:                ALT = AL[0][1];
                   16517:                if(TeX >= 0){
                   16518:                        if(Dviout >= 0){
                   16519:                                return getbygrs(ALT,["TeX","dviout","keep"]);
                   16520:                        }
                   16521:                        return getbygrs(ALT,"TeX");
                   16522:                }
                   16523:                if(Short >= 0)
                   16524:                        ALT = chkspt(ALT|opt=4);
                   16525:                return ALT;
                   16526:        }
                   16527:
                   16528: /* Construct */
                   16529:        if(T == 1){
                   16530:                if(TeX >= 0){
                   16531:                        L = length(AL);
                   16532:                        I = Done = 0; Out0=Out1=""; NM = DN = [];
                   16533:                        if(TeX != 16){
                   16534:                                AL11=AL[L-1][1][1];
                   16535:                                AT = AL11[length(AL11)-1];
                   16536:                                if(type(AT) == 4){
                   16537:                                        PW = (AT[0] > 1)?"":AT[1];
                   16538:                                }else PW = AT;
                   16539:                        }
                   16540:                        Out = string_to_tb("");
                   16541:                        while(--L >= 0){
                   16542:                                if(TeX == 16){
                   16543:                                        if(Done)
                   16544:                                                write_to_tb(":\\ ", Out);
                   16545:                                        write_to_tb(getbygrs(AL[L][1],(Top0>=0)?["TeX", "top0"]:"TeX"|mat=Mat), Out);
                   16546:                                        Done = 1;
                   16547:                                        if(L != 0) write_to_tb((TeXEq==5)?
                   16548:                                                "\\\\%\n&\\leftarrow ":"\\\\%\n\\leftarrow ", Out);
                   16549:                                }
                   16550:                                ALT = AL[L][0];
                   16551:                                if(TeX != 16){
                   16552:                                        V1 = (I==0)?"x":V2;
                   16553:                                        V2 = /* (I==0 && L<=2)?"s": */
                   16554:                                                 "s_"+rtotex(I);
                   16555:                                }else V1=V2="x";
                   16556:                                JJ = (type(ALT) == 4)?length(ALT):0;
                   16557:                                if(I > 0 && L > 0)
                   16558:                                        write_to_tb("\n ", Out);
                   16559:                                for(Outt = "", J = 1; J < JJ; J++){
                   16560:                                        if(ALT[J] == 0) continue;
                   16561:                                        if(J == 1)      Outt += V1;
                   16562:                                        else if(J == 2) Outt += "(1-"+V1+")";
                   16563:                                        else            Outt += "(x_"+rtotex(J)+"-"+V1+")";
                   16564:                                        Outt += "^"+ rtotex(ALT[J]);
                   16565:                                }
                   16566:                                if(TeX != 16) write_to_tb(Outt, Out);
                   16567:                                else if(Outt != "")
                   16568:                                        str_tb(["\\mathrm{Ad}\\Bigl(",Outt,"\\Bigr)"], Out);
                   16569:                                if(JJ == 0){
                   16570:                                        if(I != 0)
                   16571:                                                Out1 = "ds_"+rtotex(I-1)+Out1;
                   16572:                                        continue;
                   16573:                                }
                   16574:                                if(ALT[0] == 0) continue;
                   16575:                                Out0 += "\\int_p^{"+V1+"}";
                   16576:                                if(TeX == 16)
                   16577:                                        str_tb(["mc_",rtotex(ALT[0])], Out);
                   16578:                                else{
                   16579:                                        str_tb(["(",V1,"-",V2,")^",rtotex(-1+ALT[0])], Out);
                   16580:                                        AL11=AL[L-1][1][1];
                   16581:                                        AT = AL11[length(AL11)-1];
                   16582:                                        if(type(AT) == 4) AT = AT[1];
                   16583:                                        DN = cons(ALT[0]+AT+1,DN);
                   16584:                                        NM = cons(AT+1,cons(ALT[0],NM));
                   16585:                                }
                   16586:                                if(L != 2) Out1 += "d"+V2;
                   16587:                                I++;
                   16588:                        }
                   16589:                        if(R){
                   16590:                                if(I == 0) Ov = "x";
                   16591:                                else Ov = "s_"+rtotex(I-1);
                   16592:                                Out1 = "u_B("+Ov+")"+Out1;
                   16593:                        }
                   16594:                        if(TeX != 16){
                   16595:                                Out0 = string_to_tb(Out0);
                   16596:                                str_tb([Out, Out1], Out0);
                   16597:                                Out = Out0;
                   16598:                                NM = simplify(NM, Fuc, 4);
                   16599:                                DN = simplify(DN, Fuc, 4);
                   16600:                                DNT = lsort(NM,DN,"reduce");
                   16601:                                NMT = DNT[0]; DNT = DNT[1];
                   16602:                                if(NMT != [] && PW != ""){
                   16603:                                        write_to_tb((TeXEq==5)?"\\\\\n &\\sim\\frac{\n"
                   16604:                                                :"\\\\\n \\sim\\frac{\n", Out);
                   16605:                                        for(PT = NMT; PT != []; PT = cdr(PT))
                   16606:                                                str_tb(["  \\Gamma(",my_tex_form(car(PT)), ")\n"], Out);
                   16607:                                        write_to_tb(" }{\n", Out);
                   16608:                                        for(PT = DNT; PT != []; PT = cdr(PT))
                   16609:                                                write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   16610:                                        write_to_tb(" }", Out);
                   16611:                                        if(R > 0) write_to_tb("C_0", Out);
                   16612:                                        write_to_tb("x^"+rtotex(PW) +"\\ \\ (p=0,\\ x\\to0)", Out);
                   16613:                                }
                   16614:                        }else
                   16615:                                Out = str_tb(0, Out);
                   16616:                        if(Dviout >= 0){
                   16617:                                dviout(Out|eq=0,keep=Keep);
                   16618:                                return 1;
                   16619:                        }
                   16620:                        return O;
                   16621:                }
                   16622:                if(Short >= 0){
                   16623:                        for(ALL = [] ; AL != []; AL = cdr(AL)){
                   16624:                                 AT = car(AL);
                   16625:                                 ALL = cons([AT[0], chkspt(AT[1]|opt=4)], ALL);
                   16626:                        }
                   16627:                        AL = reverse(ALL);
                   16628:                }
                   16629:                return AL;  /* AL[0][1] : reduced GRS, R==0 -> rigid */
                   16630:        }
                   16631:
                   16632:        if(T == 2 || T == 4 || T == 11){
                   16633:                for(I = (T==2)?2:1; I >= (T==11)?0:1; I--){
                   16634:                        ALT = M[I];
                   16635:                        if(ALT[length(ALT)-1][0] != 1){
                   16636:                                mycat(["multiplicity for",I,":",ALT[length(ALT)-1][1],
                   16637:                                        "should be 1"]);
                   16638:                                return;
                   16639:                        }
                   16640:                }
                   16641:        }
                   16642:        LA++;
                   16643:        NM = DN = [];
                   16644:
                   16645: /* Three term relation */
                   16646:        if(T == 11){
                   16647:                if(R > 0){
                   16648:                        print("This is not rigid\n");
                   16649:                        return 0;
                   16650:                }
                   16651:                for(I = 0; I <= LA; I++){
                   16652:                        if(I > 0){
                   16653:                                AI = AL[I][0];  /* operation */
                   16654:                                if(AI[0] != 0){
                   16655:                                        DN = cons(simplify(AI1+1,Fuc,4),DN);
                   16656:                                        NM = cons(simplify(AI1+AI[0]+1,Fuc,4),NM);
                   16657:                                }
                   16658:                        }
                   16659:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   16660:                }
                   16661:                DNT = lsort(NM,DN,"reduce");
                   16662:                if(TeX < 0) return DNT;
                   16663:                NMT = DNT[0]; DNT = DNT[1];
                   16664:                Out = str_tb("u_{0,0,0}-u_{+1,0,-1}=\\frac{","");
                   16665:                for(PT = NMT; PT != []; PT = cdr(PT))
                   16666:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   16667:                str_tb(["}\n{"],Out);
                   16668:                for(PT = DNT; PT != []; PT = cdr(PT))
                   16669:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   16670:                write_to_tb("}u_{0,+1,-1}",Out);
                   16671:                if(Dviout >= 0){
                   16672:                        dviout(Out|eq=0,keep=Keep);
                   16673:                        return 1;
                   16674:                }
                   16675:                return Out;
                   16676:        }
                   16677:
                   16678:        AD=newvect(NP);
                   16679:        for(I = 0; I <= LA; I++){
                   16680:                if(I > 0){
                   16681:                        AI = AL[I][0];  /* operation */
                   16682:                        if(T == 2 && AI[0] != 0){
                   16683:                                DN = cons(simplify(-AI2,Fuc,4), cons(simplify(AI1+1,Fuc,4),DN));
                   16684:                                NM = cons(simplify(-AI2-AI[0],Fuc,4), cons(simplify(AI1+AI[0]+1,Fuc,4),
                   16685:                                 NM));
                   16686:                        }
                   16687:                        for(J = 1; J < NP; J++)
                   16688:                                AD[J] += simplify(AI[J],Fuc,4);
                   16689:                }
                   16690:                if(T == 2){
                   16691:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   16692:                        ALT = AL[I][1][2]; AI2 = ALT[length(ALT)-1][1];
                   16693:                        if(I == 0){
                   16694:                                 C3 = AI1; C4 = AI2;
                   16695:                        }
                   16696:                }
                   16697:        }
                   16698:
                   16699: /* Connection */
                   16700:        if(T == 2){
                   16701:                DNT = lsort(NM,DN,"reduce");
                   16702:                NMT = DNT[0]; DNT = DNT[1];
                   16703:                if(TeX < 0) return [NMT,DNT,AD];
                   16704:                C0 = M[1][length(M[1])-1][1];
                   16705:                C1 = M[2][length(M[2])-1][1];
                   16706:                M =  AL[0][1];
                   16707:                C3 = M[1][length(M[1])-1][1];
                   16708:                C4 = M[2][length(M[2])-1][1];
                   16709:                Out = str_tb(["c(0\\!:\\!", my_tex_form(C0),
                   16710:                        " \\rightsquigarrow 1\\!:\\!", my_tex_form(C1),")"], "");
                   16711:                if(R > 0 && AMSTeX == 1 && (TeXEq == 4 || TeXEq == 5)){
                   16712:                        write_to_tb("\\\\\n", Out);
                   16713:                        if(TeXEq == 5) write_to_tb(" &", Out);
                   16714:                }
                   16715:                write_to_tb("=\\frac{\n",Out);
                   16716:                for(PT = NMT; PT != []; PT = cdr(PT))
                   16717:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   16718:                write_to_tb(" }{\n",Out);
                   16719:                for(PT = DNT; PT != []; PT = cdr(PT))
                   16720:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n",Out);
                   16721:                write_to_tb(" }", Out);
                   16722:                for(J = 3; J < length(AD); J++){
                   16723:                        if(AD[J] == 0) continue;
                   16724:                        str_tb(["\n (1-x_", rtotex(J), "^{-1})^", rtotex(AD[J])], Out);
                   16725:                }
                   16726:                if(R != 0)
                   16727:                        str_tb(["\n c_B(0\\!:\\!", my_tex_form(C3),
                   16728:                                " \\rightsquigarrow 1\\!:\\!", my_tex_form(C4), ")"], Out);
                   16729:                Out = tb_to_string(Out);
                   16730:                if(Dviout >= 0){
                   16731:                        dviout(Out|eq=0,keep=Keep);
                   16732:                        return 1;
                   16733:                }
                   16734:                return Out;
                   16735:        }
                   16736:
                   16737: /*  Series */
                   16738:        if(T == 4){
                   16739:                AL11 = AL[0][1][1];
                   16740:                V = AL11[length(AL11)-1][1];
                   16741:                S00 = -V; S01 = (R==0)?[]:[[0,0]];
                   16742:                S1 = S2 = [];
                   16743:                for(Ix = 1, ALL = cdr(AL); ALL != []; ){
                   16744:                        ALT = ALL[0][0];
                   16745:                        if(ALT[0] != 0){ /* mc */
                   16746:                                for(Sum = [], ST = S01; ST != []; ST = cdr(ST))
                   16747:                                        Sum = cons(car(ST)[0], Sum);
                   16748:                                S1 = cons(cons(S00+1,Sum), S1);
                   16749:                                S2 = cons(cons(S00+1+ALT[0],Sum),S2);
                   16750:                                S00 += ALT[0];
                   16751:                        }
                   16752:                        ALL = cdr(ALL);
                   16753:                        for(I = 1; I < length(ALT); I++){  /* addition */
                   16754:                                if(I == 1){
                   16755:                                        S00 += ALT[1];
                   16756:                                        if(ALL == [])
                   16757:                                                S00 = [S00];
                   16758:                                }else{
                   16759:                                        if(ALT[I] == 0)
                   16760:                                                continue;
                   16761:                                        if(ALL != []){
                   16762:                                                S1 = cons([-ALT[I],Ix],S1);
                   16763:                                                S2 = cons([1,Ix],S2);
                   16764:                                                S01= cons([Ix,I],S01);
                   16765:                                                Ix++;
                   16766:                                        }else
                   16767:                                                S00 = cons([ALT[I],I],S00);
                   16768:                                }
                   16769:                        }
                   16770:                }
                   16771:                S00 = reverse(S00);
                   16772:                S01 = qsort(S01); S1 = qsort(S1); S2 = qsort(S2);
                   16773:                if(Simp >= 0){
                   16774:                         S00 = simplify(S00,Fuc,4);
                   16775:                         S01 = simplify(S01,Fuc,4);
                   16776:                         S1  = simplify(S1,Fuc,4);
                   16777:                         S2  = simplify(S2,Fuc,4);
                   16778:                         SS  = lsort(S1,S2,"reduce");
                   16779:                         S1 = SS[0]; S2 = SS[1];
                   16780:                }
                   16781:
                   16782:                if(TeX >= 0){
                   16783:                                                 /* Top linear power */
                   16784:                        TOP = Ps = Sm = "";
                   16785:                        for(TOP = Ps = Sm = "", ST = cdr(S00); ST != []; ST = cdr(ST)){
                   16786:                                SP = car(ST);
                   16787:                                if(SP[0] != 0){
                   16788:                                        if(SP[1] == 2)
                   16789:                                                TOP += "(1-x)^"+rtotex(SP[0]);
                   16790:                                        else
                   16791:                                                TOP += "(1-x/x_"+rtotex(SP[1])+")^"+rtotex(SP[0]);
                   16792:                                }
                   16793:                        }
                   16794:                                                 /* Top power */
                   16795:                        PW = my_tex_form(car(S00));
                   16796:                        if(PW == "0")
                   16797:                                PW = "";
                   16798:                        NP = length(AL[0][1]);
                   16799:                        PWS = newvect(NP);
                   16800:                        for(I = 0; I < NP; I++)
                   16801:                                PWS[I] = "";
                   16802:                        for(S = S01, I = 0; S != []; S = cdr(S), I++){
                   16803:                                SI = rtotex(car(S)[0]);
                   16804:                                if(I > 0) Sm += ",\\ ";
                   16805:                                Sm += "n_"+SI+"\\ge0";
                   16806:                                if(PW != "")
                   16807:                                        PW += "+";
                   16808:                                PW += "n_"+SI;
                   16809:                                if(car(S)[1] > 2)
                   16810:                                        PWS[car(S)[1]] += "-n_"+rtotex(car(S)[0]);
                   16811:                                else if(car(S)[1] == 0)
                   16812:                                        Ps = "C_{n_0}"+Ps;
                   16813:                        }
                   16814:                        for(I = 3; I < NP; I++){
                   16815:                                if(PWS[I] != "")
                   16816:                                        Ps += "x_"+rtotex(I)+"^{"+PWS[I]+"}";
                   16817:                        }
                   16818:                        Out = str_tb([TOP, Ps, "x^{", PW, "}"], "");
                   16819:                                 /* Gamma factor */
                   16820:                        for(I = 0, SS = S1; I <= 1; I++, SS = S2){
                   16821:                                PW = string_to_tb("");
                   16822:                                for(PW1=""; SS != [] ; SS = cdr(SS)){
                   16823:                                        for(J = 0, SST = car(SS); SST != [];  SST = cdr(SST), J++){
                   16824:                                                if(J == 0){
                   16825:                                                        JJ = (car(SST) == 1)?((length(SST)==2)?(-1):0):1;
                   16826:                                                        if(JJ > 0)
                   16827:                                                                str_tb(["(", my_tex_form(car(SST)), ")_{"], PW);
                   16828:                                                        else if(JJ == 0)
                   16829:                                                                PW1 = "(";
                   16830:                                                }else{
                   16831:                                                        if(JJ > 0){
                   16832:                                                                if(J > 1) write_to_tb("+", PW);
                   16833:                                                                str_tb(["n_", rtotex(car(SST))], PW);
                   16834:                                                        }else{
                   16835:                                                                if(J > 1) PW1 += "+";
                   16836:                                                                PW1 += "n_"+rtotex(car(SST));
                   16837:                                                        }
                   16838:                                                }
                   16839:                                        }
                   16840:                                        if(JJ > 0) write_to_tb("}", PW);
                   16841:                                        else PW1 += (JJ == 0)?")!":"!";
                   16842:                                }
                   16843:                                if(I == 0)
                   16844:                                        Out0 = "\\frac";
                   16845:                                Out0 += "{"+tb_to_string(PW)+PW1+"}";
                   16846:                                PW = string_to_tb(""); PW1 = "";
                   16847:                        }
                   16848:                        if(Out0 == "\\frac{}{}")
                   16849:                                Out0 = "";
                   16850:                        Out = "\\sum_{"+Sm+"}"+Out0 + Top + tb_to_string(Out);
                   16851:                        if(length(S01) == 1){
                   16852:                                Out = str_subst(Out, "{n_"+SI+"}", "n");
                   16853:                                Out = str_subst(Out, "n_"+SI, "n");
                   16854:                        }
                   16855:                        if(Dviout >= 0)
                   16856:                                dviout(Out|eq=0,keep=Keep);
                   16857:                        return Out;
                   16858:                }
                   16859:                return [cons(S00, S01), S1, S2];
                   16860:        }
                   16861:
                   16862: /* Operator */
                   16863:        if(T==3){
                   16864:                Fuc0 = car(Fuc);
                   16865:                if(Fuc0 != 0){  /* Kill Fuchs relation */
                   16866:                        for(V = vars(Fuc0); V != []; V = cdr(V)){
                   16867:                                VT = car(V);
                   16868:                                if(deg(Fuc0,VT) == 1){
                   16869:                                        AL = mysubst(AL, [VT, -red(coef(Fuc0,0,VT)/coef(Fuc0,1,VT))]);
                   16870:                                        break;
                   16871:                                }
                   16872:                        }
                   16873:                        if(V == []){
                   16874:                                print("Fuchs condition has no variable with degree 1");
                   16875:                                return 0;
                   16876:                        }
                   16877:                }
                   16878:                L = newvect(NP);
                   16879:                Pt = getopt(pt);
                   16880:                for(I = NP-1; I >= 1; I--){
                   16881:                        if(type(Pt) == 4)
                   16882:                                L[I] = Pt[I-1];
                   16883:                        else if(I >= 3 || X1 >= 0 || (X2 >= 0 && I >= 2))
                   16884:                                L[I] = makev(["x_", I]);
                   16885:                        else L[I] = I-1;
                   16886:                }
                   16887:                if(R){  /* non-rigid basic */
                   16888:                        MM = AL[0][1];  /* Riemann scheme */
                   16889:                        for(OD = 0, MT = car(MM); MT != []; MT = cdr(MT))
                   16890:                                OD += car(MT)[0];
                   16891:                        for(V = DN = [], M = MM; M != []; M = cdr(M)){
                   16892:                                MT = car(M);  /* exponents */
                   16893:                                for(K = KM = 0, NT = []; ; K++){
                   16894:                                        for(J = 0, P = 1, MTT = MT; MTT != []; MTT = cdr(MTT)){
                   16895:                                                if(J == 0 && car(MTT)[1] == 0)
                   16896:                                                        KM = car(MTT)[0];
                   16897:                                                for(KK = car(MTT)[0] - K -1; KK >= 0;  KK--)
                   16898:                                                        P *= (dx-car(MTT)[1]-KK);
                   16899:                                        }
                   16900:                                        if(P == 1) break;
                   16901:                                        NT = cons(P,NT);
                   16902:                                }
                   16903:                                V = cons(reverse(NT), V);
                   16904:                                DN = cons(KM, DN);
                   16905:                        }
                   16906:                        V  = ltov(reverse(V));   /* conditions for GRS */
                   16907:                        DN = ltov(reverse(DN));  /* dims of local hol. sol. */
                   16908:                        for(J = OD; J >= 0; J--){
                   16909:                                for(I = Q = 1; I < NP; I++){
                   16910:                                        if(J > DN[I])
                   16911:                                                Q *= (x-L[I])^(J-DN[I]);
                   16912:                                }
                   16913:                                K = mydeg(Q,x);
                   16914:                                if(J == OD){
                   16915:                                        P = Q*dx^J;
                   16916:                                        DM = K;
                   16917:                                }else{
                   16918:                                        for(I = DM-OD+J-K; I >= 0; I--){
                   16919:                                                X = makev(["r",J,"_",I]);
                   16920:                                                P += Q*x^I*X*dx^J;
                   16921:                                        }
                   16922:                                }
                   16923:                        }
                   16924:                        for(R = [], I = 0; I < NP; I++){
                   16925:                                Q = toeul(P, [x,dx], (I==0)?"infty":L[I]);  /* Euler at I-th pt */
                   16926:                                for(VT = V[I], J=0; VT != [] ; VT = cdr(VT), J++){
                   16927:                                         if(car(VT) != 0)
                   16928:                                                 R = cons(rpdiv(coef(Q,J,x), car(VT), dx)[0], R); /* equations */
                   16929:                                }
                   16930:                        }
                   16931:                        for(RR = RRR = [], I = OD-1; I>=0; I--){
                   16932:                                 RR = [];
                   16933:                                 for(RT = R; RT != [] ; RT = cdr(RT)){
                   16934:                                         if( (VT = mycoef(car(RT), I, dx)) != 0)
                   16935:                                                 RR = cons(VT, RR);   /* real linear eqs */
                   16936:                                 }
                   16937:                                 J = mydeg(mycoef(P,I,dx),x);
                   16938:                                 for(S = 0, VVV = []; J >= 0; J--){
                   16939:                                         X = makev(["r",I,"_",J]);
                   16940:                                         VVV = cons(X, VVV);     /* unknowns */
                   16941:                                 }
                   16942:                                 RR = lsol(RR,VVV);
                   16943:                                 LN = length(RR);
                   16944:                                 for(K=0; K<LN; K++){
                   16945:                                         RRT = RR[K];
                   16946:                                         if(type(RRT) != 4) continue;
                   16947:                                         R = mysubst(R,RRT);
                   16948:                                         P = mysubst(P,RRT);
                   16949:                                 }
                   16950:                        }
                   16951:                }else  /* Rigid case */
                   16952:                        P = dx^(AL[0][1][0][0][0]);
                   16953:  /* additions and middle convolutions */
                   16954:                for(ALT = AL; ALT != []; ALT = cdr(ALT)){
                   16955:                        AI = car(ALT)[0];
                   16956:                        if(type(AI) != 4) continue;
                   16957:                        V = ltov(AI);
                   16958:                        if(V[0] != 0) P = mc(P,x,V[0]);
                   16959:                        for(I = 1; I < NP; I++){
                   16960:                                if(V[I] != 0)
                   16961:                                        P = sftexp(P,x,L[I],-V[I]);
                   16962:                        }
                   16963:                }
                   16964:                P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);
                   16965:                if(TeX >= 0){
                   16966:                        Val = 1;
                   16967:                        if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)
                   16968:                                Val = (TeXEq==5)?3:2;
                   16969:                        Out = fctrtos(P|var=[dx,"\\partial"],TeX=Val);
                   16970:                        if(Dviout < 0) return Out;
                   16971:                        dviout(Out|eq=0,keep=Keep);
                   16972:                        return 1;
                   16973:                }
                   16974:                return P;
                   16975:        }
                   16976:        return 0;
                   16977: }
                   16978:
                   16979: def mcop(P,M,S)
                   16980: {
                   16981:        for(V=[],ST=S;ST!=[];ST=cdr(ST))
                   16982:                if(isvar(VT=car(ST))) V=cons(vweyl(VT),V);
                   16983:        V=reverse(V);
                   16984:        N=length(V);
                   16985:        for(MT=M;MT!=[];MT=cdr(MT)){
                   16986:                T=car(MT);
                   16987:                if(T[0]!=0)
                   16988:                        P=mc(P,V[0],T[0]);
                   16989:                for(TT=cdr(T),ST=cdr(S);ST!=[];TT=cdr(TT),ST=cdr(ST))
                   16990:                        if(car(TT)!=0) P=sftpexp(P,V,S[0]-ST[0],-car(TT));
                   16991:        }
                   16992:        return P;
                   16993: }
                   16994:
                   16995: /* option: zero, all, raw */
                   16996: def shiftop(M,S)
                   16997: {
                   16998:        if(type(M)==7)  M=s2sp(M);
                   16999:        if(type(S)==7)  S=s2sp(S);
                   17000:        Zero=getopt(zero);
                   17001:        NP=length(M);
                   17002:        for(V=L=[],I=NP-1; I>=0; I--){
                   17003:                V=cons(strtov(asciitostr([97+I])),V);
                   17004:                if(I>2) L=cons(makev(["y_", I-1]),L);
                   17005:                else L=cons(I-1,L);
                   17006:        }
                   17007:        if(type(M[0][0])==4){
                   17008:                F=1;RS=M;SS=S;
                   17009:                R=chkspt(M);
                   17010:                if(R[2]!=2 || R[3]!=0){
                   17011:                        mycat("GRS is not valid!");return 0;
                   17012:                }
                   17013:                for(; S!=[]; S=cdr(S)){
                   17014:                        if(nmono(S[0][0])!=1) break;
                   17015:                        if(isint(S[0][1]-S[0][0])==0) break;
                   17016:                }
                   17017:                if(S!=[]){
                   17018:                        mycat("Error in shift!"); return 0;
                   17019:                }
                   17020:        }else{
                   17021:                F=0;
                   17022:                RS=sp2grs(M,V,[1,length(M[0]),1]);
                   17023:                for(SS=S0=[],I=0; I<NP; I++){
                   17024:                        for(J=F=0; J<length(M[I]); J++){
                   17025:                                if(I==0 && J==length(M[0])-1) break;
                   17026:                                if((U=S[I][J])!=0){
                   17027:                                        if(isint(U)!=1){
                   17028:                                                mycat("Error in shift!"); return 0;
                   17029:                                        }
                   17030:                                        VT=RS[I][J][1];
                   17031:                                        SS=cons([VT,VT+U],SS);
                   17032:                                }else if(I>0 && Zero==1 && F==0){
                   17033:                                        RS=mysubst(RS,[RS[I][J][1],0]);
                   17034:                                        F=J+1;
                   17035:                                }
                   17036:                        }
                   17037:                        if((F>0 && J==2) || (I==0 && J==1)){
                   17038:                                J=(I==0)?0:2-F; VT=RS[I][J][1];
                   17039:                                S0=cons([VT,strtov(asciitostr([strtoascii(rtostr(VT))[0]]))],S0);
                   17040:                        }
                   17041:                }
                   17042:        }
                   17043:        RS1=mysubst(RS,SS);
                   17044:        if(F==1){
                   17045:                R=chkspt(RS1);
                   17046:                if(R[2]!=2 || R[3]!=0){
                   17047:                        mycat("Error in shift!");
                   17048:                        return 0;
                   17049:                }
                   17050:        }
                   17051:        R=getbygrs(RS,1); R1=getbygrs(RS1,1);
                   17052:        RT=R[0][1][0];
                   17053:        if(length(RT)!=1 || RT[0][0]!=1){
                   17054:                mycat("Not rigid!");
                   17055:                return 0;
                   17056:        }
                   17057:        P=dx;Q=Q1=1;
                   17058:        for(RT = R, RT1=R1; RT != []; RT = cdr(RT), RT1=cdr(RT1)){
                   17059:                V=car(RT)[0]; V1=car(RT1)[0];
                   17060:                if(type(V) != 4) continue;
                   17061:
                   17062:                if(V[0] != 0){
                   17063:                        P = mc(P,x,V[0]);  /* middle convolution */
                   17064:                        QT = mc(Q,x,V[0]);
                   17065:                }else QT=Q;
                   17066:                D0=mydeg(Q,dx);D0T=mydeg(QT,dx);
                   17067:                C0=red(mycoef(Q,D0,dx)/mycoef(QT,D0T,dx));
                   17068:                if(C0!=1) QT=red(C0*QT);
                   17069:
                   17070:                if(V1[0] != 0) Q1T = mc(Q1,x,V1[0]);
                   17071:                else Q1T=Q1;
                   17072:                D1=mydeg(Q1,dx);D1T=mydeg(Q1T,dx);
                   17073:                C1=red(mycoef(Q1,D1,dx)/mycoef(Q1T,D1T,dx));
                   17074:                if(C1!=1) Q1T=red(C1*Q1T);
                   17075:                DD=(V[0]-V1[0])+(D0-D0T)-(D1-D1T);
                   17076:                if(DD>0){
                   17077:                        QT=muldo(dx^DD,QT,[x,dx]);
                   17078:                        D0T+=DD;
                   17079:                }else if(DD<0){
                   17080:                        Q1T=muldo(dx^(-DD),Q1T,[x,dx]);
                   17081:                        D1T-=DD;
                   17082:                }
                   17083:                C=mylcm(dn(QT),dn(Q1T),x);
                   17084:                if(C!=1){
                   17085:                        QT=red(C*QT); Q1T=red(C*Q1T);
                   17086:                }
                   17087:                Q=QT;Q1=Q1T;
                   17088:                for(I = 1; I < NP; I++){
                   17089:                        if(V[I]!=0){
                   17090:                                P = sftexp(P,x,L[I],-V[I]);  /* addition u -> (x-L[I])^V[I]u */
                   17091:                                QT = sftexp(QT,x,L[I],-V[I]);
                   17092:                        }
                   17093:                        if(V1[I]!=0)
                   17094:                                Q1T = sftexp(Q1T,x,L[I],-V1[I]);
                   17095:                }
                   17096:                C=red(mycoef(QT,D0T,dx)*mycoef(Q1,D1T,dx)/(mycoef(Q,D0T,dx)*mycoef(Q1T,D1T,dx)));
                   17097:                Q=red(dn(C)*QT);Q1=red(nm(C)*Q1T);
                   17098:                for(I = 1; I < NP; I++){
                   17099:                        if((J=V[I]-V1[I])!=0){
                   17100:                                if(J>0) Q1*=(x-L[I])^J;
                   17101:                                else Q*=(x-L[I])^(-J);
                   17102:                        }
                   17103:                        while((QT=tdiv(Q,x-L[I]))!=0){
                   17104:                                if((Q1T=tdiv(Q1,x-L[I]))!=0){
                   17105:                                        Q=QT;Q1=Q1T;
                   17106:                                }else break;
                   17107:                        }
                   17108:                }
                   17109:        }
                   17110:        P1=mysubst(P,SS);
                   17111:        if(type(S0)==4 && S0!=[]){
                   17112:                P=mysubst(P,S0); Q=mysubst(Q,S0);
                   17113:                P1=mysubst(P1,S0); Q1=mysubst(Q1,S0);
                   17114:                RS=mysubst(RS,S0); RS1=mysubst(RS1,S0);
                   17115:        }
                   17116:        R=mygcd(Q1,P1,[x,dx]);
                   17117:        if(findin(dx,vars(R[0]))>=0){
                   17118:                mycat("Some error!");
                   17119:                return 0;
                   17120:        }
                   17121:        Q=muldo(R[1]/R[0],Q,[x,dx]);
                   17122:        R=divdo(Q,P,[x,dx]);
                   17123:        Q=red(R[1]/R[2]);
                   17124:        R=fctr(nm(Q));
                   17125:        QQ=Q/R[0][0];
                   17126:        R1=fctr(dn(QQ));
                   17127:        for(RR=cdr(R1); RR!=[]; RR=cdr(RR)){
                   17128:                VT=vars(car(RR)[0]);
                   17129:                if(findin(x,VT)<0 && findin(dx,VT)<0){
                   17130:                        for(I=car(RR)[1];I>0;I--) QQ=red(QQ*car(RR)[0]);
                   17131:                }
                   17132:        }
                   17133:        Raw=getopt(raw);
                   17134:        Dviout=getopt(dviout);
                   17135:        if(Dviout==1) Raw=4;
                   17136:        if(Raw!=1){
                   17137:                for(RR=cdr(R); RR!=[]; RR=cdr(RR)){
                   17138:                        VT=vars(car(RR)[0]);
                   17139:                        if(findin(x,VT)<0 && findin(dx,VT)<0){
                   17140:                                for(I=car(RR)[1];I>0;I--) QQ=red(QQ/car(RR)[0]);
                   17141:                        }
                   17142:                }
                   17143:        }
                   17144:        if(Raw==2||Raw==3||Raw==4){
                   17145:                R=mygcd(QQ,P,[x,dx]);  /* R[0]=R[1]*QQ + R[2]*P */
                   17146:                Q1=red(R[0]/R[2]);
                   17147:                for(Q=1,RR=cdr(fctr(nm(Q1))); RR!=[]; RR=cdr(RR)){
                   17148:                        VT=vars(car(RR)[0]);
                   17149:                        if(findin(x,VT)<0){
                   17150:                                for(I=car(RR)[1];I>0;I--) Q*=car(RR)[0];
                   17151:                        }
                   17152:                }
                   17153:                if(Raw==3) QQ=[QQ,Q];
                   17154:                else if(Raw==4)    /* Q=Q*R[1]/R[0]*QQ+Q/R[0]*P */
                   17155:                        QQ=[QQ,Q,red(R[1]*Q/R[0])];
                   17156:                else QQ=Q;
                   17157:        }
                   17158:        F=getopt(all);
                   17159:        if(Dviout==1){
                   17160:                Pre = " x=\\infty & 0 & 1";
                   17161:                for(I=3; I<NP; I++) Pre = Pre+"& "+rtostr(L[I]);
                   17162:                Pre = Pre+"\\\\\n";
                   17163:                PW=str_tb(ltotex(RS|opt="GRS",pre=Pre),0);
                   17164:                str_tb(
                   17165: "=\\{u\\mid Pu=0\\}\\\\\n&\\underset{Q_2}{\\overset{Q_1}{\\rightleftarrows}}\n",PW);
                   17166:                str_tb([ltotex(RS1|opt="GRS",pre=Pre),"\\\\\n"],PW);
                   17167:                R=fctrtos(QQ[0]|TeX=3,var=[dx,"\\partial"]);
                   17168:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   17169:                str_tb(["Q_1&=",R,"\\\\\n"],PW);
                   17170:                R=fctrtos(QQ[2]|TeX=3,var=[dx,"\\partial"]);
                   17171:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   17172:                str_tb(["Q_2&=",R,"\\\\\n"],PW);
                   17173:                str_tb(["Q_2Q_1&\\equiv ",fctrtos(QQ[1]|TeX=3),"\\mod W(x)P"],PW);
                   17174:                if(F==1)
                   17175:                        str_tb(["\\\\\nP&=",fctrtos(P|TeX=3,var=[dx,"\\partial"])],PW);
                   17176:                dviout(str_tb(0,PW)|eq=0,title="Shift Operator");
                   17177:        }
                   17178:        if(F==1) return [QQ,P,RS,P1,RS1];
                   17179:        else if(F==0) return QQ;
                   17180:        return [QQ,P,RS];
                   17181: }
                   17182:
                   17183: def conf1sp(M)
                   17184: {
                   17185:        if(type(M)==7) M=s2sp(M);
                   17186:        L0 = length(M);
                   17187:        L1 = length(M[L0-1]);
                   17188:        X2 = getopt(x2);
                   17189:        Conf= getopt(conf);
                   17190:        if(Conf != 0)
                   17191:                Conf = -1;
                   17192:        if((X2==1 || X2==-1) && Conf != 0){
                   17193:                X1 = 0;
                   17194:                X = x_1;
                   17195:        }else{
                   17196:                X1 = 1;
                   17197:                X = x_2;
                   17198:        }
                   17199:        G = sp2grs(M,a,[L0,L1]);
                   17200:        for(I = 0; I < L0-1; I++){
                   17201:                V = makev([a,I-Conf,0]);
                   17202:                G = subst(G,V,0);
                   17203:        }
                   17204:        L2 = length(M[1]);
                   17205:        for(I=J=S0=S1=0; I < L2; I++){
                   17206:                S1 += G[1][I][0];
                   17207:                while(S0 < S1){
                   17208:                        S0 += G[0][J][0];
                   17209:                        if((V=G[0][J][1]) != 0)
                   17210:                                G = mysubst(G,[V,V-G[1][I][1]]);
                   17211:                        J++;
                   17212:                }
                   17213:                if(S0 > S1){
                   17214:                        print("Error in data!");
                   17215:                        return 0;
                   17216:                }
                   17217:        }
                   17218:        if(Conf==0){
                   17219:                for(L=[], I=L0-2; I>=0; I--)
                   17220:                        L=cons(I,L);
                   17221:                L=cons(L0-1,L);
                   17222:                P = getbygrs(G,["operator","x2"]|perm=L);
                   17223:        }else if(X1)
                   17224:                P = getbygrs(mperm(G,[[1,2]],[]), ["operator","x2"]);
                   17225:        else
                   17226:                P = getbygrs(G,["operator","x1"]);
                   17227:        if(Conf==0)
                   17228:                P=nm(mysubst(P,[X,c]));
                   17229:        else{
                   17230:                P = nm(mysubst(P,[X,1/c]));
                   17231:                if(X2==-1){
                   17232:                        for(I=2; I<L0; I++){
                   17233:                                V=makev(["x_",I]); VC=makev([c,I]);
                   17234:                                P = nm(mysubst(P,[V,1/VC]));
                   17235:                        }
                   17236:                }
                   17237:        }
                   17238:        for(I = 1; I < L2; I++){
                   17239:                X = G[1][I][1];
                   17240:                P = nm(mysubst(P,[X,X/c]));
                   17241:        }
                   17242:        VS = vars(P);
                   17243:        while(VS!=[]){
                   17244:                V = car(VS);
                   17245:                if(str_chr(rtostr(V),0,"r")==0){
                   17246:                        CV = mycoef(P,1,V);
                   17247:                        D = mymindeg(CV,c);
                   17248:                        if(D > 0) P = mysubst(P,[V,V/c^D]);
                   17249:                        CV = mycoef(P,1,V);
                   17250:                        DD = mydeg(CV,dx);
                   17251:                        CVV = mycoef(CV,DD,dx);
                   17252:                        CD1 = mydeg(CVV,x);
                   17253:                        CD  = (X==x1)?0:CD1;
                   17254:                        while(CD>=0 && CD<=CD1){
                   17255:                                CC = mycoef(CVV,CD,x);
                   17256:                                if(type(CC)==1){
                   17257:                                        VT = mycoef(mycoef(mycoef(P,DD,dx),CD,x),0,V)/CC;
                   17258:                                        if(VT != 0) P = mysubst(P,[V,V-VT]);
                   17259:                                        break;
                   17260:                                }
                   17261:                                if(X==x1) CD++;
                   17262:                                else CD--;
                   17263:                        }
                   17264:                        while(subst(P,c,0,V,0) == 0)
                   17265:                                P = red(mysubst(P,[V,c*V])/c);
                   17266:                }
                   17267:                VS =cdr(VS);
                   17268:        }
                   17269:        return P;
                   17270: }
                   17271:
1.36      takayama 17272: def partspt(S,T)
                   17273: {
1.40    ! takayama 17274:        if(length(S)>length(T)) return [];
1.38      takayama 17275:        if(type(Op=getopt(opt))!=1) Op=0;
1.40    ! takayama 17276:        else{
        !          17277:                VS=ltov(S);
        !          17278:                L=length(S)-1;
        !          17279:                VT=ltov(qsort(T));
        !          17280:        }
1.38      takayama 17281:        if(length(S)==length(T)){
1.40    ! takayama 17282:                if(S==T||qsort(S)==qsort(T)) R=S;
1.38      takayama 17283:                else return [];
1.40    ! takayama 17284:        }else if(getopt(sort)==1){
        !          17285:                S0=S1=[];
        !          17286:                for(;S!=[]&&car(S)==car(T);S=cdr(S),T=cdr(T))
        !          17287:                        S0=cons(car(S),S0);
        !          17288:                if(S!=[]&&car(S)<car(T)) return [];
        !          17289:                S0=reverse(S0);
        !          17290:                for(S=reverse(S),T=reverse(T);S!=[],car(S)==car(T);S=cdr(S),T=cdr(T))
        !          17291:                        S1=cons(car(S),S1);
        !          17292:                if(car(S)!=[]&&car(S)<cat(T)) return [];
        !          17293:                R=partspt(reverse(S),reverse(T));
        !          17294:                if(S1!=[]){
        !          17295:                        for(R0=[];R!=[];R=cdr(R))
        !          17296:                                R0=cons(append(car(R),S1),R0);
        !          17297:                        R=reverse(R0);
        !          17298:                }
        !          17299:                if(S0!=[]){
        !          17300:                        for(R0=[];R!=[];R=cdr(R))
        !          17301:                                R0=cons(append(S0,car(R)),R0);
        !          17302:                        R=reverse(R0);
        !          17303:                }
1.38      takayama 17304:        }else{
                   17305:          for(R=[];;){
                   17306:                for(I=J=P=0;I<L;I++){
                   17307:                        P=VS[I];
                   17308:                        X=100000;
                   17309:                        while((P-=(Y=VT[J++]))>0){
                   17310:                                if(X<Y) break;
                   17311:                                X=Y;
                   17312:                        }
                   17313:                        if(X<Y||P<0) break;
                   17314:                }
                   17315:                if(!P&&X>=Y) R=cons(vtol(VT),R);
                   17316:                if(!vnext(VT)) break;
                   17317:          }
1.36      takayama 17318:        }
1.38      takayama 17319:        if(Op){
                   17320:                for(W=[];R!=[];R=cdr(R)){
                   17321:                        for(I=0,S=VS[0],K=U=[],TR=car(R);TR!=[];TR=cdr(TR)){
                   17322:                                K=cons(car(TR),K);
                   17323:                                if(!(S-=car(K))){
                   17324:                                        U=cons([VS[I],reverse(K)],U);
                   17325:                                        K=[];
                   17326:                                        S=VS[++I];
                   17327:                                        if(I==L){
                   17328:                                                U=cons([S,cdr(TR)],U);
                   17329:                                                break;
                   17330:                                        }
                   17331:                                }
1.36      takayama 17332:                        }
1.38      takayama 17333:                        W=cons(reverse(U),W);
                   17334:                }
                   17335:                R=W;
                   17336:                if(iand(Op,1)){
1.40    ! takayama 17337:                        for(R=[];W!=[];W=cdr(W))
1.38      takayama 17338:                                R=cons(reverse(qsort(car(W))),R);
                   17339:                        R=lsort(R,[],1);
                   17340:                }
                   17341:                if(Op==3){
                   17342:                        for(W=[];R!=[];R=cdr(R)){
                   17343:                                for(S=[],TR=car(R);TR!=[];TR=cdr(TR))
                   17344:                                        S=append(S,car(TR)[1]);
                   17345:                                W=cons(S,W);
1.36      takayama 17346:                        }
1.38      takayama 17347:                        R=reverse(W);
1.36      takayama 17348:                }
                   17349:        }
1.38      takayama 17350:        return R;
1.36      takayama 17351: }
                   17352:
1.38      takayama 17353: #if 0
1.36      takayama 17354: def confspt(S,T)
                   17355: {
                   17356:        R=[];
                   17357:        LS=length(S);LT=length(T);
                   17358:        if(LS<LT)  return R;
                   17359:        if(LS==LT){
                   17360:                return(S==T)? return [[S,T]]:R;
                   17361:        }
                   17362:        R=[];
                   17363:        for(ST=S,S0=T0=[],TT=T;ST!=[];ST=cdr(ST),TT=cdr(TT)){
                   17364:                if(car(ST)>car(TT)) return R;
                   17365:                if(car(ST)==car(TT){
                   17366:                        S0=cons(car(ST));T0=cons(car(TT));
                   17367:                        LS--;LT--;continue;
                   17368:                }
                   17369:                V=car(TT);D=LS-LT;
                   17370:                for(P=[ST],DD=D;DD>0;){
                   17371:                        VD=V-car(car(ST));
                   17372:                }
                   17373:        }
                   17374: }
                   17375: #endif
                   17376:
                   17377:
1.34      takayama 17378: def confexp(S)
                   17379: {
1.35      takayama 17380:        if(type(S[0])==4){
                   17381:                for(E=[];S!=[];S=cdr(S))
                   17382:                        E=cons(confexp(car(S),E));
                   17383:                return reverse(E);
                   17384:        }
1.34      takayama 17385:        V=x;E=[];
                   17386:        for(P=0,Q=[],ST=S;ST!=[];ST=cdr(ST)){
                   17387:                Q=cons(car(ST)[0],Q);
                   17388:                P+=car(ST)[1]/(V-car(ST)[0]);
                   17389:                P=red(P);
                   17390:        }
                   17391:        P=red(P*polbyroot(Q,V));
                   17392:        Q=cdr(reverse(Q));
                   17393:        for(I=(length(W=Q));I>=0;I--){
                   17394:                C=mycoef(P,I,V);
                   17395:                P-=C*polbyroot(W,V);
                   17396:                W=cdr(W);
                   17397:                E=cons(red(C),E);
                   17398:        }
                   17399:        return reverse(E);
                   17400: }
                   17401:
1.6       takayama 17402: def pgen(L,VV)
                   17403: {
                   17404:        if(type(L[0])<4) L=[L];
                   17405:        if(type(L)==4) L=ltov(L);
                   17406:        K=length(L);
                   17407:        V=newvect(K);
                   17408:        if(type(Sum=getopt(sum))!=1) Sum=0;
                   17409:        if((Num=getopt(num))!=1) Num=0;
                   17410:        if((Sep=getopt(sep))!=1) Sep=0;
                   17411:        if(type(Shift=getopt(shift))!=1) Shift=0;
                   17412:        for(;;){
                   17413:                for(PP=1,R=[],II=K-1; II>=0; II--){
                   17414:                        R=cons(V[II]+Shift,R);
                   17415:                        if(II>0 && Sep==1) R=cons("_",R);
                   17416:                        PP*=L[II][0]^V[II];
                   17417:                }
                   17418:                P+=makev(cons(VV,R)|num=Num)*PP;
                   17419:                for(I=0;I<K;){
                   17420:                        if(++V[I]<=L[I][1]){
                   17421:                                if(Sum>0){
                   17422:                                         for(S=II=0;II<K;) S+=V[II++];
                   17423:                                         if(S>Sum){
                   17424:                                                 V[I++]=0;
                   17425:                                                 continue;
                   17426:                                         }
                   17427:                                }
                   17428:                        }else{
                   17429:                                V[I++]=0;
                   17430:                                continue;
                   17431:                        }
                   17432:                        break;
                   17433:                }
                   17434:                if(I>=K) return P;
                   17435:        }
                   17436: }
                   17437:
                   17438: def diagm(M,A)
                   17439: {
                   17440:        return mgen(M,0,A,1);
                   17441: }
                   17442:
                   17443: def mgen(M,N,A,S)
                   17444: {
                   17445:        if(M==0 && N==0){
                   17446:                mycat([
                   17447: "mgen(m,n,a,s|sep=1) : generate a matrix of size m x n\n",
                   17448: " n : a number or \"diagonal\", \"highdiag\", \"lowdiag\",\"skew\",\"symmetric\",\"perm\" = 0,-1,-2,..\n",
                   17449: " a : a symbol or list (ex. a, [a], [a,b,c], [1,2,3])\n",
                   17450: " s : 0 or 1 (shift of suffix)\n"
                   17451:                ]);
                   17452:                return 0;
                   17453:        }
                   17454:        if(type(N)==7) N=-findin(N,["diag","highdiag","lowdiag","skew","symmetric","perm"]);
                   17455:        Sep=(getopt(sep)==1)?1:0;
                   17456:        if(S < 0 || S > 2)
                   17457:                S = 0;
                   17458:        if(M+S > 30 || N+S > 30){
                   17459:                erno(1);
                   17460:                return;
                   17461:        }
                   17462:        if(N==-5){
                   17463:                NM=newmat(M,M);
                   17464:                for(I=0;I<M;I++,A=cdr(A)) NM[I][car(A)-S]=1;
                   17465:                return NM;
                   17466:        }
                   17467:        if(type(A) == 4)
                   17468:                L = length(A)-1;
                   17469:        else
                   17470:                L = -1;
                   17471:        if(N <= 0 && N >= -2){
                   17472:                MM = newmat(M,M);
                   17473:                J = K = 0;
                   17474:                if(N == -1){
                   17475:                        K = 1; M--;
                   17476:                }else if(N == -2){
                   17477:                        J = 1; M--;
                   17478:                }
                   17479:                for(I = 0; I < M; I++){
                   17480:                        if(L >= 0)
                   17481:                                MM[I+J][I+K] = A[(I > L)?L:I];
                   17482:                        else if(type(A)==7 || isvar(A))
                   17483:                                MM[I+J][I+K] = makev([A,S+I]|sep=Sep);
                   17484:                        else
                   17485:                                 MM[I+J][I+K] = A;
                   17486:                }
                   17487:                return MM;
                   17488:        }
                   17489:        K = N;
                   17490:        if(K < 0) N = M;
                   17491:        MM = newmat(M,N);
                   17492:        for(I = 0; I < M; I++){
                   17493:                if(L >= 0)
                   17494:                        AA = rtostr(A[(I > L)?L:I]);
                   17495:                else
                   17496:                        AA = rtostr(A)+rtostr(I+S);
                   17497:                if(AA>="0" && AA<=":"){
                   17498:                        erno(0); return;
                   17499:                }
                   17500:                for(J = 0; J < N; J++){
                   17501:                        if(K < 0){
                   17502:                                if(I > J) continue;
                   17503:                                if(K == -3 && I == J) continue;
                   17504:                        }
                   17505:                        MM[I][J] = makev([AA,J+S]|sep=Sep);
                   17506:                }
                   17507:        }
                   17508:        if(K < 0){
                   17509:                for(I = 0; I < M; I++){
                   17510:                        for(J = 0; J < I; J++)
                   17511:                                MM[I][J] = (K == -4)?MM[J][I]:-MM[J][I];
                   17512:                }
                   17513:        }
                   17514:        return MM;
                   17515: }
                   17516:
                   17517: def newbmat(M,N,R)
                   17518: {
                   17519:        S  = newvect(M);
                   17520:        T  = newvect(N);
                   17521:        IM = length(R);
                   17522:        for(I = 0; I < IM; I++){
                   17523:                RI = R[I];
                   17524:                JM = length(RI);
                   17525:                for(J = 0; J < JM; J++){
                   17526:                        RIJ = RI[J];
                   17527:                        if(type(RIJ) == 6){
                   17528:                                S[I] = size(RIJ)[0];
                   17529:                                T[J] = size(RIJ)[1];
                   17530:                        }
                   17531:                }
                   17532:        }
                   17533:        for(I = K = 0; I < M; I++){
                   17534:                if(S[I] == 0)
                   17535:                        S[I] = 1;
                   17536:                K += S[I];
                   17537:        }
                   17538:        for(J = L = 0; J < N; J++){
                   17539:                if(T[J] == 0)
                   17540:                        T[J] = 1;
                   17541:                L += T[J];
                   17542:        }
                   17543:        M = newmat(K,L);
                   17544:        if(type(Null=getopt(null))>0){
                   17545:                for(I=0;I<K;I++){
                   17546:                        for(J=0;J<L;J++) M[I][J]=Null;
                   17547:                }
                   17548:        }
                   17549:        for(I0 = II = 0; II < IM; I0 += S[II++]){
                   17550:                RI = R[II];
                   17551:                JM = length(RI);
                   17552:                for(J0 = JJ = 0; JJ < JM; J0 += T[JJ++]){
                   17553:                        if((RIJ = RI[JJ]) == 0)
                   17554:                                continue;
                   17555:                        Type = type(RIJ);
                   17556:                        for(I = 0; I < S[II]; I++){
                   17557:                                for(J = 0; J < T[JJ]; J++){
                   17558:                                        if(Type == 6)
                   17559:                                                M[I0+I][J0+J] = RIJ[I][J];
                   17560:                                        else if(Type == 4 || Type == 5)
                   17561:                                                M[I0+I][J0+J] = (I>0)?RIJ[I]:RIJ[J];
                   17562:                                        else
                   17563:                                                M[I0+I][J0+J] = RIJ;
                   17564:                                }
                   17565:                        }
                   17566:                }
                   17567:        }
                   17568:        return M;
                   17569: }
                   17570:
                   17571: def unim(S)
                   17572: {
                   17573:        if(!Rand++) random(currenttime());
                   17574:        if(!isint(Wt=getopt(wt))||Wt<0||Wt>10) Wt=2;
                   17575:        if(!isint(Xa=getopt(abs)) || Xa<1)
                   17576:                Xa=9;
                   17577:        if((Xaa=Xa)>10) Xaa=10;
                   17578:        if(Xaa%2) Xaa++;
                   17579:        Xh=Xaa/2;
                   17580:        if(type(S0=SS=S)==4){
                   17581:                Int=(getopt(int)==1)?1:0;
                   17582:                U=[1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4];
                   17583:                M=newmat(S[0],S[1]);
                   17584:                SS=cdr(S);SS=cdr(SS);
                   17585:                if(Rk=length(SS)) L=SS;
                   17586:                else{
                   17587:                        L=[0];
                   17588:                        I=(S[0]>S[1])?S[1]:S[0];
                   17589:                        if(I<=2) return 0;
                   17590:                        if(!isint(Rk=getopt(rank))||Rk<1||Rk>S[0]||Rk>S[1])
                   17591:                                Rk=random()%(I-1)+2;
                   17592:                        for(I=1;I<Rk;){
                   17593:                                P=random()%(S[1]+Wt)-Wt;
                   17594:                                if(P<=0) P=1;
                   17595:                                if(findin(P,L)!=0){
                   17596:                                        L=cons(P,L);
                   17597:                                        I++;
                   17598:                                }
                   17599:                        }
                   17600:                }
                   17601:                L=ltov(qsort(L));
                   17602:                M[0][L[0]]=1;
                   17603:                for(I=1;I<Rk;I++){
                   17604:                        P=Int?1:U[random()%length(U)];
                   17605:                        if(P>Xa) P=Xa;
                   17606:                        M[I][L[I]]=(random()%2)?P:(-P);
                   17607:                }
                   17608:                for(I=0;I<Rk;I++){
                   17609:                        if(I!=0&&abs(M[I][L[I]])>1) M[K=random()%I][KK=L[I]]=1;
                   17610:                        I0=(I==0)?1:L[I]+1;
                   17611:                        I1=(I==Rk-1)?S[1]:L[I+1];
                   17612:                        for(J=I0;J<I1;J++){
                   17613:                                for(K=1;K<=Xa;K++){
                   17614:                                        P=random()%(I+1);
                   17615:                                        if((random()%2)==1) M[P][J]++;
                   17616:                                        else M[P][J]--;
                   17617:                                }
                   17618:                        }
                   17619:                }
                   17620:                S=M;
                   17621:                Res=(getopt(res)==1)?dupmat(S):0;
                   17622:        }
                   17623:        Conj=0;
                   17624:        if(type(S)<2){
                   17625:                if(S<2||S>20) return 0;
                   17626:                if(getopt(conj)==1){
                   17627:                        M=S+Wt;
                   17628:                        if(M>15) M=10;
                   17629:                        M0=floor((M-1)/2);
                   17630:                        for(R=[],I=0;I<S;I++) R=cons(random()%M-M0,R);
                   17631:                        R=qsort(R);
                   17632:                        M=diagm(S,R);
                   17633:                        if(getopt(diag)!=1){
                   17634:                                for(I=1;I<S;I++)
                   17635:                                        if(M[I-1][I-1]==M[I][I] && random()%2) M[I-1][I]=1;
                   17636:                        }
                   17637:                        if(M[0][0]==M[S-1][S-1]){
                   17638:                                for(I=1;I<S;I++) if(M[I-1][I]==1) break;
                   17639:                                if(I==S){
                   17640:                                        if(M[0][0]>0) M[0][0]--;
                   17641:                                        else M[S-1][S-1]++;
                   17642:                                }
                   17643:                        }
                   17644:                        if(getopt(res)==1) RR=diagm(S,[1]);
                   17645:                        S1=S;
                   17646:                        Res=dupmat(S=M);
                   17647:                        if(isint(I=getopt(int))&&I>1&&random()%I==0){
                   17648:                                K=S[0][0];L=K+1;
                   17649:                                for(I=1;I<S1;I++){
                   17650:                                        if(S[I][I]>L && S[I-1][I]==0 && (I==S1-1||S[I][I+1]==0)){
                   17651:                                                L=S[I][I];
                   17652:                                                if(RR){
                   17653:                                                        RR[I][I]=L-K;RR[0][I]=1;
                   17654:                                                }
                   17655:                                                S[0][I]=1;
                   17656:                                                if(!(random()%3)) break;
                   17657:                                        }
                   17658:                                }
                   17659:                                if(random()%3==0){
                   17660:                                        for(I=0;I<S1-1;I++){
                   17661:                                                if(iand(S[I][I],1)&&S[I][I+1]==1){
                   17662:                                                        for(J=I+2;J<S1&&S[I][J]==0;J++);
                   17663:                                                        if(J<S1) continue;
                   17664:                                                        for(J=I-1;J>=0&&S[J][I]==0;J--);
                   17665:                                                        if(J>=0) continue;
                   17666:                                                        S[I][I+1]=2;
                   17667:                                                        for(J=0;J<S1;J++) RR[I][J]*=2;
                   17668:                                                        break;
                   17669:                                                }
                   17670:                                        }
                   17671:                                }
                   17672:                        }
                   17673:                }else{
                   17674:                        M=diagm(S,[1]);
                   17675:                        S1=S;
                   17676:                }
                   17677:        }
                   17678:        if(type(S)==6){
                   17679:                M=dupmat(S);
                   17680:                S=size(S);
                   17681:                S1=S[1];S=S[0];
                   17682:                Nt=1;
                   17683:                if(getopt(conj)==1&&S==S1) Conj=1;
                   17684:        }
                   17685:        if(!isint(Ct=getopt(time)))
                   17686:                Ct=(S>3||S1>3)?100:200;
                   17687:        if(getopt(both)==1){
                   17688:                OL=delopt(getopt(),"both");
                   17689:                M=unim(mtranspose(M)|option_list=OL);
                   17690:                M=mtranspose(M);
                   17691:        }
                   17692:        Mx=20;
                   17693:        for(I=K=LL=0;I<Ct+Mx;I++){
                   17694:                P=random()%S;Q=random()%S;
                   17695:                if(3*K>Ct) T=random()%Xaa-Xh;
                   17696:                else if(5*K<Ct) T=random()%2-1;
                   17697:                else T=random()%4-2;
                   17698:                if(T>=0) T++;
                   17699:                if(P==Q) continue;
                   17700:                for(G=0,J=S1-1;J>=0;J--){
                   17701:                        if((H=abs(M[Q][J]+M[P][J]*T))>Xa&&(!Conj||J!=P)) break;
                   17702:                        if(K<Mx&&!Conj) G=igcd(G,H);
                   17703:                }
                   17704:                if(K<Mx && G>1) J=1;
                   17705:                if(J>0) continue;
                   17706:                if(J<0&&Conj==1){
                   17707:                        for(J=S1-1;J>=0;J--)
                   17708:                                if(J!=Q&&abs(M[J][P]-M[J][Q]*T)>Xa) break;
                   17709:                        if(J<0&&abs(M[Q][P]-M[Q][Q]*T+M[P][P]*T-M[P][Q]*T^2)>Xa) J=1;
                   17710:                        if(J<0&&M[P][P]==M[Q][Q]){
                   17711:                                LF=0;
                   17712:                                for(L=S1-1;J>=0;J--) if(L!=Q&&M[J][Q]!=0) LF++;
                   17713:                                for(L=S1-1;J>=0;J--) if(L!=P&&M[P][J]!=0) LF++;
                   17714:                                        if(!LF) J=1;
                   17715:                        }
                   17716:                }
                   17717:                if(J<0){
                   17718:                        for(J=S1-1;J>=0;J--)
                   17719:                                M[Q][J]+=M[P][J]*T;
                   17720:                        if(Conj==1)
                   17721:                                for(J=S1-1;J>=0;J--) M[J][P]-=M[J][Q]*T;
                   17722:                        if(RR) for(J=S1-1;J>=0;J--) RR[Q][J]+=RR[P][J]*T;
                   17723:                        K++;
                   17724:                }
                   17725:                if(K%5==0){
                   17726:                        if(!Nt) M=mtranspose(M);
                   17727:                        else if(!Conj&&K%2==0){
                   17728:                                for(F=0;F<S;F++){
                   17729:                                        if((V=lgcd(M[F]))>1){
                   17730:                                                for(L=0;L<S1;L++) M[F][L]/=V;
                   17731:                                        }
                   17732:                                }
                   17733:                        }
                   17734:                }
                   17735:                if(I>Ct){
                   17736:                        for(L=S-1;L>=0;L--){
                   17737:                                for(F=0,J=S1-1;J>=0;J--)
                   17738:                                        if(M[L][J]!=0) F++;
                   17739:                                if(F<2){
                   17740:                                        F=-1;break;
                   17741:                                }
                   17742:                                else F=0;
                   17743:                        }
                   17744:                        if(F<0 && LL++<5){
                   17745:                                I=(CT-CT%2)/2;K=1;
                   17746:                        }
                   17747:                        if(I>Ct) break;
                   17748:                }
                   17749:        }
                   17750:        if(RR){
                   17751:                for(I=F=0;I<S1;I++){
                   17752:                        V=Res[I][I];
                   17753:                        for(J=I+1;J<S1;J++){
                   17754:                                if(Res[J][J]!=V) break;
                   17755:                                for(LP=0;LP<2;LP++){
                   17756:                                        if(J==S1-1||Res[J][J+1]==0){
                   17757:                                                if(I==0||Res[I-1][I]==0){
                   17758:                                                        for(VL=VS=[],K=0;K<S1;K++){
                   17759:                                                                VL=cons(RR[K][J],VL);VS=cons(RR[K][I],VS);
                   17760:                                                        }
                   17761:                                                        VR=ldev(VL,VS);
                   17762:                                                        if(VR[0]){
                   17763:                                                                for(K=S1-1,VN=VR[1];K>=0;K--,VN=cdr(VN))
                   17764:                                                                        RR[K][J]=car(VN);
                   17765:                                                                F=1;
                   17766:                                                        }
                   17767:                                                }
                   17768:                                        }
                   17769:                                        K=I;I=J;J=K;
                   17770:                                }
                   17771:                        }
                   17772:                        if(F&&I==S1-1){
                   17773:                                F=0;I=-1;
                   17774:                        }
                   17775:                }
                   17776:                if(getopt(int)==1){
                   17777:                        N=mtranspose(M);
                   17778:                        for(F=I=0;I<S1;I++) if(lgcd(M[I])>1||lgcd(N[I])>1) F++;
                   17779:                        if(F){
                   17780:                                for(F=I=0;I<S1;I++){
                   17781:                                        if(Res[I][I]==-1) F=ior(F,1);
                   17782:                                        else if(Res[I][I]==1) F=ior(F,2);
                   17783:                                }
                   17784:                                C=0;
                   17785:                                if(!iand(F,1)) C=1;
                   17786:                                else if(!iand(F,2)) C=-1;
                   17787:                                if(C){
                   17788:                                        for(I=0;I<S1;I++){
                   17789:                                                M[I][I]+=C;Res[I][I]+=C;
                   17790:                                        }
                   17791:                                }
                   17792:                        }
                   17793:                }
                   17794:                if(getopt(rep)!=1){
                   17795:                        for(Lp=0;Lp<5;Lp++){
                   17796:                                F=(M==Res||abs(lmax(RR))>Xa*10||abs(lmin(RR))>Xa*10)?1:0;
                   17797:                                for(I=0;!F&&I<S1&&Lp<4;I++){
                   17798:                                        for(K=L=J=0;J<S1;J++){
                   17799:                                                if(M[I][J]) K++;
                   17800:                                                if(M[J][I]) L++;
                   17801:                                        }
                   17802:                                        if(K<2||L<2) F=1;
                   17803:                                }
                   17804:                                if(!F) break;
                   17805:                                R=unim(S0|option_list=cons(["rep",1],getopt()));
                   17806:                                M=R[0];Res=R[1];RR=R[3];
                   17807:                        }
                   17808:                }
                   17809:        }
                   17810:        if(Res==0) return M;
                   17811:        if(RR){
                   17812:                for(I=K=V=0;I<S1;I++){
                   17813:                        for(J=0;J<S1;J++){
                   17814:                        if(RR[J][I]>0) V++;
                   17815:                                else if(RR[J][I]<0) V--;
                   17816:                        }
                   17817:                        if(I<S1-1&&Res[I][I+1]!=0) continue;
                   17818:                        if(V<0){
                   17819:                                for(;K<=I;K++) RR=colm(RR,K,-1);
                   17820:                        }
                   17821:                        K=I+1;V=0;
                   17822:                }
                   17823:        }
                   17824:        if(getopt(rep)!=1){
                   17825:                if((F=getopt(dviout))==1){
                   17826:                        if(getopt(conj)==1){
                   17827:                                if(RR) show([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   17828:                        }else{
                   17829:                                if(type(Lim=getopt(lim))==1)
                   17830:                                         mtoupper(M,0|step=1,opt=7,dviout=1,pages=1,lim=Lim);
                   17831:                                else mtoupper(M,0|step=1,opt=7,dviout=1,pages=1);
                   17832:                        }
                   17833:                }else if(F==-1){
                   17834:                        if(getopt(conj)==1){
                   17835:                                if(RR) return ltotex([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   17836:                        }else{
                   17837:                                if(type(Lim=getopt(lim))==1)
                   17838:                                         return mtoupper(M,0|step=1,opt=7,pages=1,lim=Lim,dviout=-1);
                   17839:                                else return mtoupper(M,0|step=1,opt=7,pages=1,dviout=-1);
                   17840:                        }
                   17841:                }
                   17842:        }
                   17843:        if(RR==0) return[M,Res];
                   17844:        return [M,Res,myinv(RR),RR];
                   17845: }
                   17846:
                   17847: def pfrac(F,X)
                   17848: {
                   17849:        F = red(F);
                   17850:        FN = nm(F);
                   17851:        FD = dn(F);
                   17852:        if(mydeg(FD,X) == 0)
                   17853:                return [[F,1,1]];
                   17854:        R = rpdiv(FN,FD,X);
                   17855:        FN = R[0]/R[1];
                   17856:        R0 = R[2]/R[1];
                   17857:        FC = fctr(FD);
                   17858:        RT=[];
                   17859:        if(getopt(root)==2){
                   17860:                for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){
                   17861:                        if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && pari(issquare,C=mycoef(P,4,X))){
                   17862:                                if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);
                   17863:                                if(mycoef(P,1,X)==0 && pari(issquare,C0=mycoef(P,0,X))){
                   17864:                                        C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);
                   17865:                                        if(C1>0){
                   17866:                                                FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   17867:                                                FE=cons([C*(X+S)^2+C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   17868:                                                RT=cons(C1,RT);
                   17869:                                                continue;
                   17870:                                        }
                   17871:                                }
                   17872:                        }
                   17873:                        FE=cons(car(FT),FE);
                   17874:                }
                   17875:                FC=reverse(FE);
                   17876:        }
                   17877:        N = Q = 0;
                   17878:        L = [];
                   17879:        for(I = length(FC)-1; I >= 0; I--){
                   17880:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   17881:                for(K=1; K<=FC[I][1]; K++){
                   17882:                        for(J=P=0; J < D; J++){
                   17883:                                V = makev(["zz_",++N]);
                   17884:                                P = P*X + V;
                   17885:                                L = cons(V,L);
                   17886:                        }
                   17887:                        Q += P/(FC[I][0]^K);
                   17888:                        Q = red(Q);
                   17889:                }
                   17890:        }
                   17891:        L=reverse(L);
                   17892:        Q = nm(red(red(Q*FD)-FN));
                   17893:        Q = ptol(Q,X);
                   17894:        S = lsol(Q,L);
                   17895:        R = (R0==0)?[]:[[R0,1,1]];
                   17896:        for(N=0,I=length(FC)-1; I >= 0; I--){
                   17897:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   17898:                for(K=1; K<=FC[I][1]; K++){
                   17899:                        for(P=J=0; J < D; N++,J++)
                   17900:                                P = P*X + S[N][1];
                   17901:                        if(P!=0) R = cons([P,FC[I][0],K],R);
                   17902:                }
                   17903:        }
                   17904:        for(;RT!=[];RT=cdr(RT)){
                   17905:                RTT=car(RT);
                   17906:                R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);
                   17907:        }
                   17908:        TeX=getopt(TeX);
                   17909:        if((Dvi=getopt(dviout))==1||TeX==1){
                   17910:                V=strtov("0");
                   17911:                for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){
                   17912:                        RT=car(RR);
                   17913:                        S+=(RT[0]/RT[1]^RT[2])*V^L;
                   17914:                }
                   17915:                if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);
                   17916:                else return fctrtos(S|var=[V,""],TeX=3);
                   17917:        }
                   17918:        return reverse(R);
                   17919: }
                   17920:
                   17921: def cfrac(X,N)
                   17922: {
                   17923:        F=[floor(X)];
                   17924:        if(N<0){
                   17925:                Max=N=-N;
                   17926:        }
                   17927:        X-=F[0];
                   17928:        if(Max!=1)
                   17929:                M=mat([F[0],1],[1,0]);
                   17930:        for(;N>0 && X!=0;N--){
                   17931:                X=1/X;
                   17932:                F=cons(Y=floor(X),F);
                   17933:                X-=Y;
                   17934:                if(Max){
                   17935:                        M0=M[0][0];M1=M[1][0];
                   17936:                        M=M*mat([Y,1],[1,0]);
                   17937:                        if(M[0][0]>Max) return M0/M1;
                   17938:                }
                   17939:        }
                   17940:        return (Max==0)?reverse(F):M[0][0]/M[1][0];
                   17941: }
                   17942:
                   17943: def sqrt2rat(X)
                   17944: {
                   17945:        if(type(X)>3) return X;
                   17946:        X=red(X);
                   17947:        if(getopt(mult)==1){
                   17948:                for(V=vars(X);V!=[];V=cdr(V)){
                   17949:                        T=funargs(F=car(V));
                   17950:                        if(type(T)==4&&length(T)>1){
                   17951:                                Y=T[1];
                   17952:                                Z=sqrt2rat(Y);
                   17953:                                if(Y!=Z){
                   17954:                                        if(length(T)==2){
                   17955:                                                T0=T[0];
                   17956:                                                X=subst(X,F,T0(Z));
                   17957:                                        }else if(T[0]==pow)
                   17958:                                                X=subst(X,F,Y^T[2]);
                   17959:                                }
                   17960:                        }
                   17961:                }
                   17962:        }
                   17963:        for(V=vars(X);V!=[];V=cdr(V)){  /* r(x)^(1/2+n) -> r(x)^n*r(x)^(1/2) */
                   17964:                T=args(Y=car(V));
                   17965:                if(functor(Y)==pow&&T[1]!=1/2&&isint(T2=2*T[1])){
                   17966:                        if(iand(T2,1)){
                   17967:                                R=(T[0])^(1/2);T2--;
                   17968:                        }else R=1;
                   17969:                        R*=T[0]^(T2/2);
                   17970:                        X=red(subst(X,Y,R));
                   17971:                }
                   17972:        }
                   17973:        D=dn(X);N=nm(X);
                   17974:        if(imag(D)!=0){
                   17975:                N*=conj(D);
                   17976:                D*=conj(D);
                   17977:                return sqrt2rat(N/D);
                   17978:        }
                   17979:        for(V=vars(N);V!=[];V=cdr(V)){  /* (r(x)^(n/m))^k */
                   17980:                T=args(Y=car(V));
                   17981:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   17982:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   17983:                        N=substblock(N,Y,Y^Dn,T[0]^Nm);
                   17984:                }
                   17985:        }
                   17986:        for(V=vars(D);V!=[];V=cdr(V)){
                   17987:                T=args(Y=car(V));
                   17988:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   17989:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   17990:                        D=substblock(D,Y,Y^Dn,T[0]^Nm);
                   17991:                }
                   17992:        }
                   17993:        for(V=vars(D);V!=[];V=cdr(V)){
                   17994:                T=args(Y=car(V));
                   17995:                if(functor(Y)==pow&&T[1]==1/2&&mydeg(D,Y)==1){
                   17996:                        N*=mycoef(D,0,Y)-mycoef(D,1,Y)*Y;
                   17997:                        N=mycoef(N,0,Y)+mycoef(N,1,Y)*Y+mycoef(N,2,Y)*T[0];
                   17998:                        D=mycoef(D,0,Y)^2-mycoef(D,1,Y)^2*T[0];
                   17999:                        X=red(N/D);
                   18000:                        D=dn(X);N=nm(X);
                   18001:                        break;
                   18002:                }
                   18003:        }
                   18004:        X=red(N/D);
                   18005:        D=dn(X);N=nm(X);
                   18006:        for(V=vars(D);V!=[];V=cdr(V)){
                   18007:                T=args(Y=car(V));
                   18008:                if(functor(Y)==pow&&T[1]==1/2)
                   18009:                        D=substblock(D,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   18010:        }
                   18011:        for(V=vars(N);V!=[];V=cdr(V)){
                   18012:                T=args(Y=car(V));
                   18013:                if(functor(Y)==pow&&T[1]==1/2)
                   18014:                        N=substblock(N,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   18015:        }
                   18016:        for(V=vars(N);V!=[];V=cdr(V)){
                   18017:                T=args(Y=car(V));
                   18018:                if(functor(Y)==pow&&T[1]==1/2){
                   18019:                        Ag=T[0];
                   18020:                        R=S=1;
                   18021:                        An=fctr(nm(Ag));
                   18022:                        CA=An[0][0];
                   18023:                        if(CA<0){
                   18024:                                CA=-CA;R=-1;
                   18025:                        }
                   18026:                        if(type(I=sqrtrat(CA))<2) S=I;
                   18027:                        else R*=CA;
                   18028:                        for(An=cdr(An);An!=[];An=cdr(An)){
                   18029:                                Pw=car(An)[1];I=iand(Pw,1);
                   18030:                                if(I) R*=car(An)[0];
                   18031:                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   18032:                        }
                   18033:                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   18034:                                Pw=car(An)[1];I=iand(Pw,1);
                   18035:                                if(I) R/=car(An)[0]^I;
                   18036:                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   18037:                        }
                   18038:                        if(S!=1) N=subst(N,Y,R^(1/2)*S);
                   18039:                }
                   18040:        }
                   18041:        for(V=vars(N);V!=[];V=cdr(V)){
                   18042:                T=args(Y=car(V));
                   18043:                if(functor(Y)==pow&&T[1]==1/2){
                   18044:                        C=mycoef(N,1,Y);
                   18045:                        for(VC=vars(C);VC!=[];VC=cdr(VC)){
                   18046:                                TC=args(YC=car(VC));
                   18047:                                if(functor(YC)==pow&&TC[1]==1/2){
                   18048:                                        Ag=red(T[0]*TC[0]);
                   18049:                                        R=S=1;
                   18050:                                        An=fctr(nm(Ag));
                   18051:                                        CA=An[0][0];
                   18052:                                        if(CA<0){
                   18053:                                                CA=-CA;R=-1;
                   18054:                                        }
                   18055:                                        if(type(I=sqrtrat(CA))<2) S=I;
                   18056:                                        else R*=CA;
                   18057:                                        for(An=cdr(An);An!=[];An=cdr(An)){
                   18058:                                                Pw=car(An)[1];I=iand(Pw,1);
                   18059:                                                if(I) R*=car(An)[0];
                   18060:                                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   18061:                                        }
                   18062:                                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   18063:                                                Pw=car(An)[1];I=iand(Pw,1);
                   18064:                                                if(I) R/=car(An)[0]^I;
                   18065:                                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   18066:                                        }
                   18067:                                        CC=mycoef(C,1,YC);
                   18068:                                        N=N-CC*YC*Y+CC*R^(1/2)*S;
                   18069:                                }
                   18070:                        }
                   18071:                }
                   18072:        }
                   18073:        return red(N/D);
                   18074: }
                   18075:
                   18076: def cfrac2n(X)
                   18077: {
                   18078:        if(type(L=getopt(loop))==1&&L>0)
                   18079:                C=x;
                   18080:        else{
                   18081:                C=0;L=0;
                   18082:        }
                   18083:        if(L>1){
                   18084:                for(Y=[];L>1;L--){
                   18085:                        Y=cons(car(X),Y);
                   18086:                        X=cdr(X);
                   18087:                }
                   18088:                if(X!=[]){
                   18089:                        P=cfrac2n(X|loop=1);
                   18090:                        for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))
                   18091:                                V=sqrt2rat(car(Y)+1/V);
                   18092:                        return V;
                   18093:                }else{
                   18094:                        C=0;X=reverse(Y);
                   18095:                }
                   18096:        }
                   18097:        for(V=C,X=reverse(X);X!=[];X=cdr(X)){
                   18098:                if(V!=0) V=1/V;
                   18099:                V+=car(X);
                   18100:        }
                   18101:        if(C!=0){
                   18102:                V=red(V);P=dn(V)*x-nm(V);
                   18103:                S=getroot(P,x|cpx=2);
                   18104:                T=map(eval,S);
                   18105:                V=(T[0]>0)?S[0]:S[1];
                   18106:        }
                   18107:        return V;
                   18108: }
                   18109:
                   18110: def s2sp(S)
                   18111: {
                   18112:        if(getopt(short)==1){
                   18113:                if(type(F=getopt(std))==1) S=s2sp(S|std=F);
                   18114:                if(type(S)!=7) S=s2sp(S);
                   18115:                L=strtoascii(S);
                   18116:                for(LS=[],F=C=0;L!=[];L=cdr(L)){
                   18117:                        if((G=car(L))!=F){
                   18118:                                LS=cons(G,LS);C=0;
                   18119:                        }else if(C<3){
                   18120:                                LS=cons(G,LS);
                   18121:                        }else if(C==3){
                   18122:                                LS=cdr(LS);LS=cdr(LS);
                   18123:                                LS=cons(94,LS);LS=cons(52,LS);
                   18124:                        }else if(C==9){
                   18125:                                LS=cdr(LS);LS=cons(97,LS);
                   18126:                        }else{
                   18127:                                K=car(LS);LS=cdr(LS);LS=cons(K+1,LS);
                   18128:                        }
                   18129:                        C++;F=G;
                   18130:                }
                   18131:                return asciitostr(reverse(LS));
                   18132:        }
                   18133:        if(type(F=getopt(std))==1){
                   18134:                F=(F>0)?1:-1;
                   18135:                if(type(S)==7) S=s2sp(S);
                   18136:                for(L=[];S!=[];S=cdr(S))
                   18137:                L=cons(os_md.msort(car(S),[-1,0]),L);
                   18138:                return os_md.msort(L,[F,2]);
                   18139:        }
                   18140:        if(type(S)==7){
                   18141:                S = strtoascii(S);
                   18142:                if(type(S) == 5) S = vtol(S);
                   18143:                for(N=0,R=TR=[]; S!=[]; S=cdr(S)){
                   18144:                        if(car(S)==45)      /* - */
                   18145:                                N=1;
                   18146:                        else if(car(S)==47) /* / */
                   18147:                                N=2;
                   18148:                        if(N>0){
                   18149:                                while(car(S)<48&&car(S)!=40) S=cdr(S);
                   18150:                        }
                   18151:                        if((T=car(S))>=48 && T<=57) TR=cons(T-48,TR);
                   18152:                        else if(T>=97) TR=cons(T-87,TR);
                   18153:                        else if(T>=65 && T<=90) TR=cons(T-29,TR);  /* A-Z */
                   18154:                        else if(T==44){
                   18155:                                R=cons(reverse(TR),R);
                   18156:                                TR=[];
                   18157:                        }else if(T==94){  /* ^ */
                   18158:                                S=cdr(S);
                   18159:                                if(car(S)==40){  /* ( */
                   18160:                                        S=cdr(S);
                   18161:                                        for(T=0; car(S)!=41 && S!=[]; S=cdr(S)){
                   18162:                                                V=car(S)-48;
                   18163:                                                if(V>=10) V-=39;
                   18164:                                                T=10*T+V;
                   18165:                                        }
                   18166:                                }else{
                   18167:                                        while(car(S)<48) S=cdr(S);
                   18168:                                        T=car(S)-48;
                   18169:                                        if(T>=10) T-=39;
                   18170:                                }
                   18171:                                while(--T>=1) TR=cons(car(TR),TR);
                   18172:                        }else if(T==40){   /* ( */
                   18173:                                S=cdr(S);
                   18174:                                if(N==1){
                   18175:                                        N=0; NN=1;
                   18176:                                }else NN=0;
                   18177:                                if(car(S)==45){  /* - */
                   18178:                                        S=cdr(S);
                   18179:                                        NN=1-NN;
                   18180:                                }
                   18181:                                for(I=0; I<2; I++){
                   18182:                                        for(V=0; (SS=car(S))!=41 && SS!=47 && S!=[]; S=cdr(S)){
                   18183:                                        T=SS-48;
                   18184:                                        if(T>=10) T-=39;
                   18185:                                                V=10*V+T;
                   18186:                                        }
                   18187:                                        if(NN==1){
                   18188:                                                V=-V; NN=0;
                   18189:                                        }
                   18190:                                        TR=cons(V,TR);
                   18191:                                        if(SS!=47) break;
                   18192:                                        else{
                   18193:                                                N=2; S=cdr(S);
                   18194:                                        }
                   18195:                                }
                   18196:                        }else if(T==60){
                   18197:                                for(V=[],S=cdr(S);S!=[]&&car(S)!=62;S=cdr(S))
                   18198:                                        V=cons(car(S),V);
                   18199:                                if(car(S)!=62) continue;
                   18200:                                TR=cons(eval_str(asciitostr(reverse(V))),TR);
                   18201:                        }else if(T<48) continue;
                   18202:                        if(N==1){
                   18203:                                T = car(TR);
                   18204:                                TR=cons(-T,cdr(TR));
                   18205:                                N=0;
                   18206:                        }else if(N==2){
                   18207:                                T=car(TR); TR=cdr(TR);
                   18208:                                TR=cons(car(TR)/T,cdr(TR));
                   18209:                                N=0;
                   18210:                        }
                   18211:                }
                   18212:                return reverse(cons(reverse(TR),R));
                   18213:        }else if(type(S)==4){
                   18214:                Num=getopt(num);
                   18215:                for(R=[]; ; ){
                   18216:                        if(type(TS=car(S))!=4) return;
                   18217:                        for(; TS!=[]; TS=cdr(TS)){
                   18218:                                V=car(TS);
                   18219:                                if(type(V)>1||(type(V)==1&&ntype(V)>0)){
                   18220:                                        V="<"+rtostr(V)+">";
                   18221:                                        R=append(reverse(strtoascii(V)),R);
                   18222:                                        continue;
                   18223:                                }
                   18224:                                if(dn(V)>1){
                   18225:                                        P=reverse(strtoascii(rtostr(V)));
                   18226:                                        R=append(P,cons(40,R));
                   18227:                                        R=cons(41,R);
                   18228:                                        continue;
                   18229:                                }
                   18230:                                if(V<0 && V>-10){
                   18231:                                        V=-V;
                   18232:                                        R=cons(45,R);
                   18233:                                }
                   18234:                                if(V<0 || V>35 || (V>9 && Num==1)){
                   18235:                                        P=reverse(strtoascii(rtostr(V)));
                   18236:                                        R=append(P,cons(40,R));
                   18237:                                        V=41;
                   18238:                                }else if(V<10) V+=48;
                   18239:                                else V+=87;
                   18240:                                R=cons(V,R);
                   18241:                        }
                   18242:                        if((S=cdr(S))==[]) break;
                   18243:                        R=cons(44,R);
                   18244:                }
                   18245:                return asciitostr(reverse(R));
                   18246:        }
                   18247:        return 0;
                   18248: }
                   18249:
                   18250: def sp2grs(M,A,L)
                   18251: {
                   18252:        MM = [];
                   18253:        T0 = 0;
                   18254:        Mat=getopt(mat);
                   18255:        if(Mat!=1) Mat=0;
                   18256:        if(type(M)==7) M=s2sp(M);
                   18257:        if((LM = length(M)) > 10 && type(A) < 4)
                   18258:                CK = 1;
                   18259:        Sft = (type(L)==1)?L:0;
                   18260:        if(type(L)==4 && length(L)>=3)
                   18261:                Sft = L[2];
                   18262:        if(Sft < 0){
                   18263:                T0 = 1;
                   18264:                Sft = -Sft-1;
                   18265:        }
                   18266:        for(I = LM-1; I >= 0; I--){
                   18267:                MI = M[I]; MN = [];
                   18268:                if(CK == 1 && length(MI) > 10){
                   18269:                        erno(1);
                   18270:                        return;
                   18271:                }
                   18272:                if(type(A) == 4)
                   18273:                        AA = rtostr(A[I]);
                   18274:                else
                   18275:                        AA = rtostr(A)+rtostr(I);
                   18276:                for(J = LM = length(MI)-1; J >= 0; J--){
                   18277:                        V = MI[J];
                   18278:                        if(type(V) > 3)
                   18279:                                V = V[0];
                   18280:                        if(T0 == 0 || I == 0)
                   18281:                                MN = cons([V, makev([AA,J+Sft])], MN);
                   18282:                        else{
                   18283:                                if(LM == 1)
                   18284:                                        MN = cons([V, (J==0)?0:makev([AA])], MN);
                   18285:                                else if(I == 1 && Mat == 0)
                   18286:                                        MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);
                   18287:                                else
                   18288:                                        MN = cons([V, (J==0)?0:makev([AA,J])], MN);
                   18289:                        }
                   18290:                }
                   18291:                MM = cons(MN, MM);
                   18292:        }
                   18293:        if(type(L) == 4 && length(L) >= 2){
                   18294:                R = chkspt(MM|mat=Mat); /* R[3]: Fuchs */
                   18295:                AA = var(MM[L[0]-1][L[1]-1][1]);
                   18296:                if(AA==0)  AA=var(R[3]);
                   18297:                if(AA!=0 && (P = mycoef(R[3],1,AA))!=0){
                   18298:                         P = -mycoef(R[3], 0, AA)/P;
                   18299:                         MM = mysubst(MM,[AA,P]);
                   18300:                }
                   18301:        }
                   18302:        return MM;
                   18303: }
                   18304:
                   18305: def intpoly(F,X)
                   18306: {
                   18307:        if((T=ptype(F,X))<4){
                   18308:                if(T<3){        /* polynomial */
                   18309:                        if(type(C=getopt(cos))>0){
                   18310:                                V=vars(F);
                   18311:                                Z=makenewv(V);
                   18312:                                W=makenewv(cons(Z,V));
                   18313:                                Q=intpoly(F,X|exp=Z);
                   18314:                                Q=(subst(Q,Z,@i*C)*(Z+@i*W)+subst(Q,Z,-@i*C)*(Z-@i*W))/2;
                   18315:                                return [mycoef(Q,1,Z),mycoef(Q,1,W)];
                   18316:                        }
                   18317:                        if(type(C=getopt(sin))>0){
                   18318:                                Q=intpoly(F,X|cos=C);
                   18319:                                return [-Q[1],Q[0]];
                   18320:                        }
                   18321:                        if(type(C=getopt(log))>0){
                   18322:                                Q=intpoly(F,X);
                   18323:                                if(C[0]==0) return [Q,0];
                   18324:                                if(length(C)<3) C=[C[0],C[1],1];
                   18325:                                Q-=subst(Q,X,-C[1]/C[0]);
                   18326:                                if(iscoef(Q,os_md.israt)) Q=red(Q);
                   18327:                                if(C[2]==0) return [Q];
                   18328:                                S=subst(-Q*C[0]*C[2],X,X-C[1]/C[0]);
                   18329:                                for(R=0,D=mydeg(S,X);D>0;D--) R+=mycoef(S,D,X)*X^(D-1);
                   18330:                                R=subst(R,X,X+C[1]/C[0]);
                   18331:                                return cons(Q,intpoly(R,X|log=[C[0],C[1],C[2]-1]));
                   18332:                        }
                   18333:                        if(type(C=getopt(exp))>0){
                   18334:                                D = mydeg(F,X);
                   18335:                                for(P=Q=F/C;D>=0;D--){
                   18336:                                        Q=-mydiff(Q,X)/C;
                   18337:                                        P+=Q;
                   18338:                                }
                   18339:                                return P;
                   18340:                        }
                   18341:                        for(P=0,I=mydeg(F,X);I >= 0;I--)
                   18342:                                P += mycoef(F,I,X)*X^(I+1)/(I+1);
                   18343:                        return P;
                   18344:                }
                   18345:                R=pfrac(F,X|root=2);    /* rational */
                   18346:                for(P=0;R!=[];R=cdr(R)){
                   18347:                        if(type(V=getopt(dumb))==5){
                   18348:                                for(PF=[],RR=R;RR!=[];RR=cdr(RR))
                   18349:                                        PF=cons(RR[0][0]/RR[0][1]^RR[0][2],PF);
                   18350:                                PF=[cons(X,reverse(PF))];
                   18351:                                if(P) PF=cons([1,P],PF);
                   18352:                                V[0]=cons(PF,V[0]);
                   18353:                        }
                   18354:                        RT=car(R);
                   18355:                        if(mydeg(RT[1],X)==0) P+=intpoly(RT[0]*RT[2],X);
                   18356:                        else if((Deg=mydeg(RT[1],X))==1){
                   18357:                                if(RT[2]>1) P+=RT[0]*RT[1]^(1-RT[2])/(1-RT[2])/mycoef(RT[1],1,X);
                   18358:                                else P+=RT[0]*log(RT[1])/mycoef(RT[1],1,X);
                   18359:                                P=red(P);
                   18360:                        }else if(Deg==2){
                   18361:                                D1=diff(RT[1],X);C1=mycoef(D1,1,X);
                   18362:                                B=2*C1*mycoef(RT[1],0,X)-mycoef(RT[1],1,X)^2;  /* ax^2+bx+c => B=4ac-b^2 */
                   18363:                                B=sqrt2rat(B);
                   18364:                                N=RT[0];
                   18365:                                for(I=RT[2];I>0&&N!=0;I--){
                   18366:                                        C0=mycoef(N,1,X)/C1;N-=C0*D1;
                   18367:                                        if(C0){
                   18368:                                                if(I>1) P-=C0/RT[1]^(I-1)/(I-1);
                   18369:                                                else P+=C0*log(RT[1]);
                   18370:                                        }
                   18371:                                        if(I>1){
                   18372:                                                BB=B/C1;
                   18373:                                                P+=N*X/RT[1]^(I-1)/(I-1)/BB;
                   18374:                                                N*=(2*I-3)/(I-1)/BB;
                   18375:                                        }else{
                   18376:                                                if(type(BR=sqrtrat(B))>3){
                   18377:                                                        mycat(["Cannot obtain sqare root of ",B]);
                   18378:                                                        return [];
                   18379:                                                }
                   18380:                                                if(real(nm(BR))!=0){
                   18381:                                                        P+=(2*N/BR)*atan(sqrt2rat(D1/BR|mult=1));
                   18382:                                                }else{
                   18383:                                                        BR*=@i;BRI=sqrt2rat(1/BR);
                   18384:                                                        R1=(-mycoef(RT[1],1,X)+BR)/C1;
                   18385:                                                        R2=(-mycoef(RT[1],1,X)-BR)/C1;
                   18386:                                                        P+=N*BRI*log( /* sqrt2rat */((x-R1)/(x-R2)));
                   18387:                                                }
                   18388:                                        }
                   18389:                                        P=red(P);
                   18390:                                }
                   18391:                                P=sqrt2rat(P);
                   18392:                        }else{
                   18393:                                mycat(["Cannot get an indefinite integral of ",F]);
                   18394:                                return [];
                   18395:                        }
                   18396:                }
                   18397:                Q=simplog(P,X);
                   18398:                if(type(V)==5&&nmono(P)!=nmono(Q)) V[0]=cons([[1,red(P)]],V[0]);
                   18399:                return red(Q);
                   18400:        }
                   18401:        return [];
                   18402: }
                   18403:
                   18404: def fshorter(P,X)
                   18405: {
                   18406:        Q=sqrt2rat(P);
                   18407:        R=trig2exp(Q,X|inv=1);
                   18408:        if(str_len(fctrtos(R))<str_len(fctrtos(Q))) Q=R;
                   18409:        Var=pfargs(Q,X|level=1);
                   18410:        for(C=F=0,R=1,V=Var;V!=[];V=cdr(V)){
                   18411:                if(findin(car(V)[1],[cos,sin,tan])>=0){
                   18412:                        if(!C){
                   18413:                                F=car(V)[2];
                   18414:                        }else{
                   18415:                                R=red(car(V)[2]/F);
                   18416:                                if(type(R)!=1) break;
                   18417:                                F/=dn(R);
                   18418:                        }
                   18419:                        C++;
                   18420:                }
                   18421:        }
                   18422:        if(getopt(period)==1) return F;
                   18423:        if(!isint(Log=getopt(log))) Log=0;
                   18424:        if(V==[]&&F!=0){
                   18425:                if(iand(Log,1)){
                   18426:                        H=append(cdr(fctr(nm(Q))),cdr(fctr(dn(Q))));
                   18427:                        for(L=0;H!=[];H=cdr(H))
                   18428:                                L+=str_len(rtostr(car(H)[0]));
                   18429:                }else L=str_len(fctrtos(Q));
                   18430:                S=trig2exp(P,X);
                   18431:                for(T=[sin(F),tan(F),cos(F),sin(F/2),cos(F/2),tan(F/2)];T!=[];T=cdr(T)){
                   18432:                        R=trig2exp(S,X|inv=car(T));
                   18433:                        if(iand(Log,1)){
                   18434:                                H=append(cdr(fctr(nm(R))),cdr(fctr(dn(R))));
                   18435:                                for(K=0;H!=[];H=cdr(H))
                   18436:                                        K+=str_len(rtostr(car(H)[0]));
                   18437:                        }else K=str_len(fctrtos(R));
                   18438:                        if(K<L){
                   18439:                                Q=R;L=K;
                   18440:                        }
                   18441:                }
                   18442:        }
                   18443:        return Q;
                   18444: }
                   18445:
                   18446: def isshortneg(P)
                   18447: {
                   18448:        return(str_len(rtostr(P))>str_len(rtostr(-P)))?1:0;
                   18449: }
                   18450:
                   18451: def simplog(R,X)
                   18452: {
                   18453:        for(V=[],Var=pfargs(R,X);Var!=[];Var=cdr(Var)){
                   18454:                VT=car(Var);
                   18455:                if(VT[1]==log && ptype(R,VT[0])==2 && mydeg(R,VT[0])==1)
                   18456:                        V=cons([VT[0],VT[2],mycoef(R,1,VT[0])],V);
                   18457:        }
                   18458:        for(;V!=[];V=cdr(V)){
                   18459:                VT=car(V);
                   18460:                for(V2=cdr(V);V2!=[];V2=cdr(V2)){
                   18461:                        Dn=1;
                   18462:                        if((C=red(car(V2)[2]/VT[2]))!=1&&C!=-1){
                   18463:                                if(getopt(mult)==1&&type(C)==1&&ntype(C)==0){
                   18464:                                        Dn=dn(C);C*=Dn;
                   18465:                                }else continue;
                   18466:                        }
                   18467:                        Log=red(VT[1]^Dn*car(V2)[1]^(Dn*C));
                   18468:                        L=str_len(rtostr(dn(Log)))-str_len(rtostr(nm(Log)));
                   18469:                        if(L>0 || (L==0&&isshortneg(VT[2])) ){
                   18470:                                Dn=-Dn;Log=1/Log;
                   18471:                        }
                   18472:                        R=mycoef(R,0,VT[0]);R=mycoef(R,0,car(V2)[0]);
                   18473:                        return(R+VT[2]*log(Log)/Dn);
                   18474:                }
                   18475:        }
                   18476:        return R;
                   18477: }
                   18478:
                   18479: def integrate(P,X)
                   18480: {
                   18481:        Dvi=getopt(dviout);
                   18482:        if(type(I=getopt(I))==4){
                   18483:                if((R=integrate(P,X))==[]) II="?";
                   18484:                else if(type(I[0])>3||type(I[1])>3){
                   18485:                        R=subst(R,X,x);
                   18486:                        V=flim(R,I[0]);VV=flim(R,I[1]);
                   18487:                        if(V==""||VV=="") II="?";
                   18488:                        else if(type(V)==7||type(VV)==7){
                   18489:                                if(V==VV) II="?";
                   18490:                                else II=(VV=="+"||V=="-")?"\\infty":"-\\infty";
                   18491:                        }else{
                   18492:                                II=VV-V;
                   18493:                                if(II>10^10) II="\\infty";
                   18494:                                else if(II<-10^10) II="-\\infty";
                   18495:                        }
                   18496:                }else{
                   18497:                        V=subst(R,X,I[1])-subst(R,X,I[0]);
                   18498:                        VV=myval(V);
                   18499:                        II=(type(VV)>=2||ntype(VV)<1)?VV:evalred(V);
                   18500:                }
                   18501:                if(type(Dvi)!=1) return II;
                   18502:                I=ltov(I);
                   18503:                for(J=0;J<2;J++){
                   18504:                        if(type(I[J])>3){
                   18505:                                if(type(I[J])==4&&length(I[J])>1) I[J]=I[J][1];
                   18506:                                else I[J]=(J==0)?"-\\infty":"\\infty";
                   18507:                        }
                   18508:                        if(type(I[J])<4) I[J]=my_tex_form(I[J]);
                   18509:                }
                   18510:                S=(type(II)==7)?II:my_tex_form(II);
                   18511:                S="\\int_{"+I[0]+"}^{"+I[1]+"}"+monototex(P)+"\\,d"+my_tex_form(X)+"&="+S;
                   18512:                if(Dvi==1) dviout(texbegin("align",S));
                   18513:                return S;
                   18514:        }
                   18515:        if(isint(Dvi)==1){
                   18516:                if(Dvi==2||getopt(dumb)==-1){
                   18517:                        V=newvect(1);V[0]=[];
                   18518:                }else V=0;
                   18519:                if((RR=integrate(P,X|dumb=V))==[]) return R;
                   18520:                S=fshorter(RR,X);
                   18521:                VV=[X];
                   18522:                if(V!=0){
                   18523:                        R=cons([[1,RR]],V[0]);
                   18524:                        if(S!=RR) R=cons([[1,RR=S]],R);
                   18525:                        for(V=FR=[];R!=[];R=cdr(R))
                   18526:                                if(car(R)!=FR) V=cons(FR=car(R),V);
1.21      takayama 18527:                        Var=varargs(V|all=2);
1.6       takayama 18528:                        for(S0=[x0,x1,x2,x3],S=[t,s,u,v,w];S0!=[]&&S!=[];){
                   18529:                                if(findin(car(S0),Var)<0){
                   18530:                                        S0=cdr(S0); continue;
                   18531:                                }
                   18532:                                if(findin(car(S),Var)>=0){
                   18533:                                        S=cdr(S); continue;
                   18534:                                }
                   18535:                                V=subst(V,[car(S0),car(S)]);S0=cdr(S0);S=cdr(S);
                   18536:                        }
                   18537:                        if(Dvi==-2) return V;
                   18538:                        S1="\\,dx&";
                   18539:                }else{
                   18540:                        V=[[],[[1,RR=S]]];
                   18541:                        S1="\\,dx";
                   18542:                }
                   18543:                if(type(P)>2){
                   18544:                        if(type(nm(P))<2){
                   18545:                                P=P*dx;S1=V?"&":"";
                   18546:                        }
                   18547:                        S=fctrtos(P|TeX=2,lim=0);SV0=my_tex_form(P);
                   18548:                        if(str_len(SV0)<str_len(S)) S=SV0;
                   18549:                }else S=monototex(P);
                   18550:                if(Dvi!=-2) S="\\int "+S+S1;
                   18551:                else S="";
                   18552:                for(L=[],V=cdr(V);V!=[];V=cdr(V)){
                   18553:                        CL=car(V);S0=["="];     /* a line */
                   18554:                        for(FL=0;CL!=[];CL=cdr(CL),FL++){
                   18555:                                CT=car(CL);                     /* a term */
                   18556:                                if((Y=CT[0])==0){       /* a variable */
                   18557:                                        CT=cdr(CT);
                   18558:                                        if(length(CT)>2) CT=cdr(CT);
                   18559:                                        S0=["\\qquad(",CT[0],"=",CT[1],")"];
                   18560:                                        break;
                   18561:                                }else{
                   18562:                                        for(FT=0,S2=[],CT=cdr(CT);CT!=[];CT=cdr(CT),FT++){
                   18563:                                        SV=fctrtos(car(CT)|TeX=2,lim=0);SV0=my_tex_form(car(CT));
                   18564:                                                if(str_len(SV0)<str_len(SV)) SV=SV0;
                   18565:                                                if(FL||FT||(F&&type(Y)<2)) SV=minustos(SV);
                   18566:                                                S2=append(["+",SV],S2);
                   18567:                                        }
                   18568:                                        S2=reverse(cdr(S2));
                   18569:                                        if(type(Y)>1){
                   18570:                                                if(length(S2)>1){
                   18571:                                                        S1="\\int\\left(";S3="\\right)\\,d";
                   18572:                                                }else{
                   18573:                                                        S1="\\int";S3="\\,d";
                   18574:                                                }
                   18575:                                                S2=cons(S1,append(S2,[S3,Y]));
                   18576:                                                if(findin(Y,VV)<0) VV=cons(Y,VV);
                   18577:                                        }
                   18578:                                        if(FL) S0=append(S0,cons("+",S2));
                   18579:                                        else S0=append(S0,S2);
                   18580:                                }
                   18581:                        }
                   18582:                        L=append([S0],L);
                   18583:                };
                   18584:                V=pfargs(RR,X|level=1);
                   18585:                for(Var=[];V!=[];V=cdr(V)) Var=cons(car(V)[0],Var);
                   18586:                Var=reverse(Var);
                   18587:                if(!isint(J=getopt(frac))) J=0;;
                   18588:                if(!iand(J,4)&&(!iand(J,2)||length(Var)==1)&&(iand(J,8)==8||ptype(RR,Var)==2)){
                   18589:                        F=1;
                   18590:                        if(iand(J,1)){
                   18591:                                K=str_len(fctrtos(RR));
                   18592:                                I=str_len(fctrtos(RR|var=Var));
                   18593:                                if(I>=K) F=0;
                   18594:                        }
                   18595:                        if(F){
                   18596:                                V=[fctrtos(RR|var=Var,TeX=2)];
                   18597:                                if(Dvi!=-2) V=cons("=",V);
                   18598:                                if(length(L)>0) L=cdr(L);
                   18599:                                L=append([V],L);
                   18600:                        }
                   18601:                }else if(ptype(RR,X)==2){
                   18602:                        L=cdr(L);
                   18603:                        V=[fctrtos(RR|var=X,TeX=2)];
                   18604:                        if(Dvi!=-2) V=cons("=",V);
                   18605:                        L=append([V],L);
                   18606:                }
                   18607:                S=texket(S+ltotex(reverse(L)|opt=["cr","spts0"],str=1));
                   18608:                if(getopt(log)!=1){
                   18609:                        for(V=[];VV!=[];VV=cdr(VV))
                   18610:                                V=cons(strtoascii(my_tex_form(car(VV))),V);
                   18611:                        S1=strtoascii("\\log");
                   18612:                        for(F=1;F;){    /* log(log(x)) */
                   18613:                                F=FT=0;
                   18614:                                S0=strtoascii(S);       /* log(x)  ->  log|x| */
                   18615:                                L=length(S0);
                   18616:                                S2=str_tb(0,0);
                   18617:                                for(I=0;;){
                   18618:                                        if(I>=L||(J=str_str(S0,S1|top=I+FT))<0){
                   18619:                                                S=str_tb(0,S2)+str_cut(S0,I,100000);
                   18620:                                                break;
                   18621:                                        }
                   18622:                                        if((K=str_str(S0,40|top=J+4))<0
                   18623:                                                ||(K!=J+4&&K!=J+9)||(N=str_pair(S0,K+1,40,41))<0){
                   18624:                                                FT=J-I+4;continue;
                   18625:                                        }
                   18626:                                        FT=0;
                   18627:                                        if(str_str(S0,V|top=K+1,end=N-1)[0]<0) S2=str_tb(str_cut(S0,I,N),S2);
                   18628:                                        else{
                   18629:                                        /* log(a) -> log(a) */
                   18630:                                                F=1;
                   18631:                                                if(N<L-1&&S0[N+1]==94){         /* log(x)^2 -> (log|x|)^2 */
                   18632:                                                        S2=str_tb([str_cut(S0,I,J-1),"\\left(",str_cut(S0,J,K-1),
                   18633:                                                        "|",str_cut(S0,K+1,N-1),"|\\right)"],S2);
                   18634:                                                }
                   18635:                                                else S2=str_tb([str_cut(S0,I,K-1),"|",str_cut(S0,K+1,N-1),"|"],S2);
                   18636:                                        }
                   18637:                                        I=N+1;
                   18638:                                }
                   18639:                        }
                   18640:                }
                   18641:                if(Dvi>0){
                   18642:                        dviout(texbegin("align*",S));
                   18643:                        return 1;
                   18644:                }
                   18645:                return S;
                   18646:        }       /* end of dviout */
                   18647:        SM=["Cannot integrate",P,"at present"];
                   18648:        P=sqrt2rat(P|mult=1);
                   18649:        Dumb2=1;Dumb3=0;W=newvect(1);W[0]=[];
                   18650:        if(type(Dumb=getopt(dumb))==5){
                   18651:                Dumb2=Dumb3=Dumb;D2=W;
                   18652:        }else if(!isint(Dumb)) Dumb=0;
                   18653:        if(Dumb==-1){
                   18654:                Dumb2=Dumb3=-1;
                   18655:        }
                   18656:        if(type(Dumb)!=5) D2=Dumb2;
                   18657:        if(!isint(Mul=getopt(mult))) Mul=0;
                   18658:        else Mul++;
                   18659:        if(type(VAR=getopt(var))!=4) VAR=[];
                   18660:        if(type(P)>4) return [];
                   18661:        if(iand(T=ptype(P=red(P),X),63)>3||Mul>4){
                   18662:                if(Dumb!=1) mycat(SM);
                   18663:                return [];
                   18664:        }
                   18665:        if(Dumb==-1) mycat(["integrate", P]);
                   18666:        else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   18667:        if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   18668:                if(Dumb==-1) mycat(["rational function",P]);
                   18669:                else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   18670:                return intpoly(P,X|dumb=Dumb);  /* rational function */
                   18671:        }
                   18672:        Var=pfargs(P,X);
                   18673:        for(F=0,VV=Var;VV!=[];VV=cdr(VV)){
                   18674:                        /* p(x)*log(x^2-1), @e^x,  a^x, f(x)^(m/n) etc.->simplify */
                   18675:                V=car(VV);
                   18676:                if(V[1]==log && (T=ptype(V[2],X))>1 && T<4){
                   18677:                        if(mydeg(dn(V[2]),X)>0||mydeg(nm(V[2]),X)>1){
                   18678:                                FC=pfctr(V[2],X);RV=1;
                   18679:                                if(length(FC)>2){
                   18680:                                        RR=0;RV=1;
                   18681:                                        if((F0=car(FC)[0])!=1){
                   18682:                                                if(type(F0)!=1 && F0<0){
                   18683:                                                        for(FT=cdr(FT);FT!=[];FT=cdr(FT)){
                   18684:                                                                if(iand(car(FT)[1],1)){
                   18685:                                                                        RV=-1;F0=-F0;break;
                   18686:                                                                }
                   18687:                                                        }
                   18688:                                                }
                   18689:                                        }
                   18690:                                        if(F0!=1) RR=log(F0);
                   18691:                                        for(FC=cdr(FC);FC!=[];FC=cdr(FC)){
                   18692:                                                if(RV==-1&&iand(car(FC)[1],1)==1){
                   18693:                                                        RR+=car(FC)[1]*log(-car(FC)[0]);
                   18694:                                                        RV=1;
                   18695:                                                }else
                   18696:                                                        RR+=car(FC)[1]*log(car(FC)[0]);
                   18697:                                        }
                   18698:                                        P=subst(P,V[0],RR);
                   18699:                                        F=1;
                   18700:                                }
                   18701:                        }
                   18702:                        F=1;
                   18703:                }else if(V[1]==pow){
                   18704:                        if(ptype(V[2],X)==1){
                   18705:                                F=1;
                   18706:                                if(V[2]==@e){   /* @e^(f(x)) */
                   18707:                                        P=subst(P,V[0],exp(V[3]));
                   18708:                                }else P=subst(P,V[0],exp(log(V[2])*V[3]));
                   18709:                        }else if(type(V[3])<=1 && ntype(V[3])==0){      /* r(x)^(m/n) */
                   18710:                                if((Pw=floor(V[3]))!=0){
                   18711:                                        R=V[2]^Pw;
                   18712:                                        if((PF=V[3]-Pw)!=0) R*=V[2]^PF;
                   18713:                                        P=subst(P,V[0],R);
                   18714:                                        F=1;
                   18715:                                        V=[V[2]^PF,V[1],V[2],PF];
                   18716:                                }
                   18717:                                if(ptype(nm(V[2]),X)<2&&V[3]>0){        /* (1/p(x))^(m/n) */
                   18718:                                        P=subst(P,V[0],V[2]*red(1/V[2])^(1-V[3]));
                   18719:                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   18720:                                }
                   18721:                                if(ptype(V[2],X)<4&&(K=dn(V[3]))>1){
                   18722:                                        V2=red(V[2]);
                   18723:                                        DN=mydeg(nm(V2),X);DD=mydeg(dn(V2),X);
                   18724:                                        if(DN+DD>1){
                   18725:                                                VF=pfctr(V2,X);
                   18726:                                                R=car(VF)[0]^(car(VF)[1]);RR=0;
                   18727:                                                for(VF=cdr(VF);VF!=[];VF=cdr(VF)){
                   18728:                                                        TV=car(VF);TM=TV[1];
                   18729:                                                        while(abs(TM)>=K){
                   18730:                                                                RR=1;
                   18731:                                                                if(TM>0){
                   18732:                                                                        TM-=K;
                   18733:                                                                        RR*=TV[0]^nm(V[3]);
                   18734:                                                                }else{
                   18735:                                                                        TM+=K;
                   18736:                                                                        RR/=TV[0]^nm(V[3]);
                   18737:                                                                }
                   18738:                                                        }
                   18739:                                                        if(TM!=0) R*=TV[0]^TM;
                   18740:                                                }
                   18741:                                                if(RR){
                   18742:                                                        P=subst(P,V[0],RR*red(R)^(V[3]));F=1;
                   18743:                                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   18744:                                                }
                   18745:                                        }
                   18746:                                }
                   18747:                        }
                   18748:                }
                   18749:        }
                   18750:        if(F){
                   18751:                P=sqrt2rat(P|mult=1);
                   18752:                Var=pfargs(P=red(P),X);T=ptype(P,X);
                   18753:                if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   18754:                        if(Dumb==-1) mycat(["rational function",P]);
                   18755:                        else if(type(Dumb)==5){
                   18756:                                Dumb[0]=cons([[X,P]],Dumb[0]);
                   18757:                                return intpoly(P,X|dumb=Dumb3);
                   18758:                        }
                   18759:                        return intpoly(P,X);    /* rational function */
                   18760:                }
                   18761:        }
                   18762: #if 1
                   18763:        for(P0=P,V=pfargs(P,X|level=1);V!=[];V=cdr(V))  /* P:tan(x) -> P0:sin(x)/cos(x) */
                   18764:                if(car(V)[1]==tan) P0=red(subst(P0,car(V)[0],sin(car(V)[2])/cos(car(V)[2])));
                   18765:        if(iand(ptype(P0,X),128)){                                              /* (log f)'=f'/f */
                   18766:                for(Df=cdr(fctr(dn(P0)));Df!=[];Df=cdr(Df)){
                   18767:                        if(!iand(ptype(car(Df)[0],X),64)) continue;
                   18768:                        Q=car(Df)[0]^(car(Df)[1]);QQ=red(dn(P0)/Q);
                   18769:                        DQ=red(diff(Q,X)*QQ);
                   18770:                        if(type(C=DQ/nm(P0))<2&&C!=0){
                   18771:                                PP=0;DN=[1];
                   18772:                        }else for(DN=cdr(fctr(DQ));DN!=[];DN=cdr(DN)){
                   18773:                                Y=car(DN)[0];
                   18774:                                if(!iand(ptype(Y,X),64)||(I=mydeg(nm(P0),Y))!=mydeg(DQ,Y)
                   18775:                                  || ptype((C=red(mycoef(nm(P0),I,Y)/mycoef(DQ,I,Y))),X)>1||C==0) continue;
                   18776:                                PP=red(P0-C*diff(Q,X)/Q);
                   18777:                                if(nmono(P0)>nmono(PP)) break;
                   18778:                        }
                   18779:                        if(DN!=[]){
                   18780:                                R=C*log(Q);
                   18781:                                if(PP==0){
                   18782:                                        if(P!=P0&&type(Dumb)==5) Dumb[0]=cons([[X,P0]],Dumb[0]);
                   18783:                                        return R;
                   18784:                                }
                   18785:                                W[0]=[];
                   18786:                                S=integrate(PP,X|dumb=D2);
                   18787:                                if(S!=[]){
                   18788:                                        if(type(Dumb)==5){
                   18789:                                                Dumb[0]=cons([[X,red(P0-PP),PP]],Dumb[0]);
                   18790:                                                TD=W[0];
                   18791:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   18792:                                                        if(car(TD)[0][0]){
                   18793:                                                                WL=cons([1,R],car(TD));
                   18794:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   18795:                                                        }
                   18796:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   18797:                                                }
                   18798:                                        }
                   18799:                                        return red(R+S);
                   18800:                                }
                   18801:                        }
                   18802:                }
                   18803:        }
                   18804: #endif
                   18805:        if((length(Var)==1||getopt(exe)==1) &&  /* p(x)*atan(q(x))^m+r(x), etc */
                   18806:          findin((VT=car(Var))[1],[atan,asin,acos,log])>=0 && ptype(P,VT[0])==2 &&
                   18807:                (VT[1]!=log||(T!=65&&T!=66)||mydeg(VT[2],X)!=1)){ /* exclude x*log(x+1)^2 */
                   18808:                for(R=0,D=mydeg(P,VT[0]);D>=0;D--){
                   18809:                        Q=S=mycoef(P,D,VT[0]);
                   18810:                        if(S){
                   18811:                                if(D>0){
                   18812:                                        if((Q=integrate(S,X|mult=Mul))==[]) return Q;
                   18813:                                }else{
                   18814:                                        W[0]=[];
                   18815:                                        if((Q=integrate(S,X|dumb=D2,var=VAR,mult=Mul))==[]) return Q;
                   18816:                                        if(type(Dumb)==5){
                   18817:                                                TD=W[0];
                   18818:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   18819:                                                        if(car(TD)[0][0]){
                   18820:                                                                WL=cons([1,R],car(TD));
                   18821:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   18822:                                                        }
                   18823:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   18824:                                                }
                   18825:                                                if(car(Dumb[0])!=[[1,R],[1,Q]])
                   18826:                                                        Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   18827:                                        }
                   18828:                                        return red(R+Q);
                   18829:                                }
                   18830:                        }else if(D>0) continue;
                   18831:                        if(D==0){
                   18832:                                if(Q!=0&&type(Dumb)==5) Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   18833:                                return red(Q+R);
                   18834:                        }
                   18835:                        R0=Q*VT[0]^D;
                   18836:                        P=(P0=P)-S*VT[0]^D-Q*diff(VT[0]^D,X);
                   18837:                        if(mydeg(P,VT[0])>=D){          /* (x+1)*log(x)/x^2 */
                   18838:                                if(mydeg(P,VT[0])==D &&
                   18839:                                  ptype(C=red(mycoef(P,D,VT[0])/diff(VT[0],X)),VT[0])<2){
                   18840:                                        P=P0-(S*VT[0]^D+Q*diff(VT[0]^D,X)+C*diff(VT[0]^(D+1),X)/(D+1));
                   18841:                                        R0+=C*VT[0]^(D+1)/(D+1);
                   18842:                                }else{
                   18843:                                        P=P0;
                   18844:                                        if(Dumb!=1) mycat(SM);
                   18845:                                        return [];
                   18846:                                }
                   18847:                        }
                   18848:                        if(type(Dumb)==5){
                   18849:                                if(P) Dumb[0]=cons([R?[1,R,R0]:[1,R0],[X,P]],Dumb[0]);
                   18850:                                else if(R!=0) Dumb[0]=cons([[1,R,R0]],Dumb[0]);
                   18851:                        }
                   18852:                        R+=R0;
                   18853:                }
                   18854:        }
                   18855:        if(length(Var)==1 && (VT=car(Var))[1]==pow && mydeg(P,VT[0])==1 && (PT=ptype(VT[2],X))<4){
                   18856:                PR=mycoef(P,0,VT[0]);
                   18857:                if(RR!=0){
                   18858:                        RR=integrate(RR,X|dumb=Dumb3,var=Var);
                   18859:                        if(RR==[]) return RR;
                   18860:                }
                   18861:                PW=VT[3];
                   18862:                if((D=mydeg(nm(V2=VT[2]),X))==2&&PT==2){        /* f(x)*(ax^2+bx+c)^(m/2)+r(x) */
                   18863:                        if(isint(2*PW)){
                   18864:                                C2=mycoef(V20=V2,2,X);F=1;
                   18865:                                if((C21=sqrtrat(C2))==[]) return [];
                   18866:                                if(imag(C21)!=0){
                   18867:                                        if(real(C21)!=0) return [];
                   18868:                                        C21=C21/@i;F=-1;
                   18869:                                }
                   18870:                                if(type(C21)>3) return [];
                   18871:                                P=subst(P,X,X/C21);VT=mysubst(VT,[X,X/C21]);V2=VT[2];
                   18872:                                C1=mycoef(V2,1,X)/F/2;
                   18873:                                if(C1!=0){
                   18874:                                        P=subst(P,X,X-C1);VT=mysubst(VT,[X,X-C1]);V2=VT[2];
                   18875:                                }
                   18876:                                C0=mycoef(V2,0,X);
                   18877:                                if((C01=sqrtrat(C0))==[]) return [];
                   18878:                                if(imag(nm(C01))!=0){
                   18879:                                        if(real(nm(C01))!=0) return [];
                   18880:                                        C01=C01/@i;G=-1;
                   18881:                                }else G=1;
                   18882:                                if(type(C01)>3||(F==-1&&G==-1)) return [];
                   18883:                                Y=makenewv([P,VAR]|var=x);
                   18884:                                if(F==-1){                              /* (c^2-x^2)^(1/2) */
                   18885:                                        Q=subst(P,VT[0],(C01*cos(Y))^(2*PW),X,YX=C01*sin(Y))
                   18886:                                                *C01*cos(Y)/C21;
                   18887:                                        SY=(C21*X+C1);CY=V20;YY=asin(sqrt2rat((C21*X+C1)/C01|mult=1));
                   18888:                                }else if(G==-1){                /* (x^2-c^2)^(1/2) */
                   18889:                                        Q=subst(P,VT[0],(C01*sin(Y)/cos(Y))^(2*PW),X,YX=C01/cos(Y))
                   18890:                                                *C01*sin(Y)/cos(Y)^2/C21;
                   18891:                                        SY=V20;CY=1/(C21*X+C1);YY=acos(sqrt2rat(C01*(C21*X+C1)|mult=1));
                   18892:                                }else{  /* (x^2+c^2)^(1/2) */
                   18893:                                        Q=subst(P,VT[0],(C01/cos(Y))^(2*PW),X,YX=C01*sin(Y)/cos(Y))
                   18894:                                                *C01/cos(Y)^2/C21;
                   18895:                                        CY=V20; YY=atan(sqrt2rat((C21*X+C1)/C01|mult=1));
                   18896:                                }
                   18897:                                if(Dumb==-1) mycat([C21*X+C1,"=",YX]);
                   18898:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,C21*X+C1,YX]],Dumb[0]);
                   18899:                                Q=sqrt2rat(Q);
                   18900:                                QQ=red(substblock(nm(Q),sin(Y),sin(Y)^2,1-cos(Y)^2)
                   18901:                                        /substblock(dn(Q),sin(Y),sin(Y)^2,1-cos(Y)^2));
                   18902:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   18903:                                QQ=red(substblock(nm(Q),cos(Y),cos(Y)^2,1-sin(Y)^2)
                   18904:                                        /substblock(dn(Q),cos(Y),cos(Y)^2,1-sin(Y)^2));
                   18905:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   18906:                                if((Q=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var)))==[]) return [];
                   18907:                                Q=trig2exp(Q,Y|inv=cos(Y));
                   18908:                                for(V=vars(Q);V!=[];V=cdr(V)){
                   18909:                                        FA=funargs(car(V));
                   18910:                                        if(type(FA)==4&&FA[0]==log){
                   18911:                                                QQ=trig2exp(FA[1],Y|inv=cos(Y));
                   18912:                                                Q=mycoef(Q,0,car(V))+mycoef(Q,1,car(V))*log(QQ);
                   18913:                                        }
                   18914:                                }
                   18915:                                if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18916:                                if(F==-1) Q=subst(Q,sin(Y),SY/C01,cos(Y),CY^(1/2)/C01,Y,YY);
                   18917:                                else if(G==-1){
                   18918:                                        Q=red(subst(Q,sin(Y),SY^(1/2)*cos(Y)/C01));
                   18919:                                        Q=red(subst(Q,cos(Y),C01*CY,Y,YY));
                   18920:                                }else{
                   18921:                                        Q=red(subst(Q,sin(Y),(C21*X+C1)*cos(Y)/C01));
                   18922:                                        Nm=substblock(nm(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   18923:                                        Nm=subst(Nm,cos(Y),C01/CY^(1/2));
                   18924:                                        Dn=substblock(dn(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   18925:                                        Dn=subst(Dn,cos(Y),C01/CY^(1/2));
                   18926:                                        Q=red(subst(Nm/Dn,Y,YY));
                   18927:                                }
                   18928:                                if(findin(Y,vars(Q))>=0) return [];
                   18929:                                for(R=[],Var=vars(Q);Var!=[];Var=cdr(Var)){
                   18930:                                        VT=funargs(V=car(Var));
                   18931:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60&&mydeg(Q,V)==1)
                   18932:                                                R=cons([mycoef(Q,1,V),V],R);
                   18933:                                }
                   18934:                                if(length(R)==2 && (R[0][0]==R[1][0]||R[0][0]+R[1][0]==0)){
                   18935:                                        R0=args(R[0][1])[0];R1=args(R[1][1])[0];
                   18936:                                        if(R[0][0]==R[1][0]) S=R0*R1;
                   18937:                                        else S=R1/R0;
                   18938:                                        Q=mycoef(Q,0,R[0][1]);Q=mycoef(Q,0,R[1][1]);
                   18939:                                        Q+=R[1][0]*log(red(S));
                   18940:                                }
                   18941:                                for(Var=vars(Q);Var!=[];Var=cdr(Var)){
                   18942:                                        VT=funargs(car(Var));
                   18943:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60){
                   18944:                                                S=trig2exp(VT[1],X|inv=cos(X),arc=1);
                   18945:                                                if(ptype(dn(S),X)<2 && mydeg(Q,car(Var))==1
                   18946:                                                  && ptype(mycoef(Q,1,car(Var)),X)<2){
                   18947:                                                        S=nm(S);
                   18948:                                                        SF=fctr(S);
                   18949:                                                        S/=SF[0][0];
                   18950:                                                }
                   18951:                                                if(cmpsimple(S,-S)>0) S=-S;
                   18952:                                                Q=subst(Q,car(Var),log(S));
                   18953:                                        }
                   18954:                                }                                       /*  x/(1-x^2)^(1/2)  */
                   18955:                                if(type(Q=red(Q+RR))==2&&type(Dumb)!=5) Q-=cterm(Q);
                   18956:                                if(Dumb==-1) mycat(["->",Q]);
                   18957:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18958:                                return Q;
                   18959:                        }
                   18960:                }else if(D==1 && mydeg(Dn=dn(V2),X)<2 && type(PW)==1 && ntype(PW)==0 &&
                   18961:                  (V2!=X||ptype(mycoef(P,1,VT[0]),X)>2)){  /* p(x)((ax+b)/(cx+d))^(m/n) */
                   18962:                        PN=nm(PW);PD=dn(PW);
                   18963:                        Y=makenewv([P,VAR]|var=x);Q=Y^PD*Dn-nm(V2);F=-mycoef(Q,0,X)/mycoef(Q,1,X);
                   18964:                        Q=red(subst(P,VT[0],Y^PN,X,F)*diff(F,Y));
                   18965:                        if(Dumb==-1) mycat([Y,"=",V2^(1/PD)]);
                   18966:                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,V2^(1/PD)]],Dumb[0]);
                   18967:                        if((Q=integrate(Q,Y|dumb=Dumb3,var=cons(X,Var)))==[]) return [];
                   18968:                        Q=red(Q);
                   18969:                        QN=subst(substblock(nm(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   18970:                        QD=subst(substblock(dn(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   18971:                        Q=red(QN/QD+RR);
                   18972:                        if(Dumb==-1) mycat(["->",Q]);
                   18973:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18974:                        return Q;
                   18975:                }
                   18976:        }else if(length(Var)==2 &&              /* r(x,(ax+b)^(1/2),(cx+d)^(1/2)) */
                   18977:                (VT=car(Var))[1]==pow && ptype(VT[2],X)==1 && mydeg(VT[2],X)==1 && VT[3]==1/2 &&
                   18978:          (VS=car(car(Var)))[1]==pow && ptype(VS[2],X)==1 && mydeg(VS[2],X)==1 && VS[3]==1/2){
                   18979:                Y=makenewv([P,VAR]|var=x);R=(Y^2-myceof(VS[0],0,X))/(C=mycoef(VS[0],1,X));
                   18980:                if(Dumb==-1) mycat([Y,"=",VS[0]]);
                   18981:                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,VD[0]]],Dumb[0]);
                   18982:                R=integrate(subst(P,VS[0],Y,X,R)*2*Y/C,Y|dumb=Dumb3,var=cons(X,Var));
                   18983:                if(R!=[]){
                   18984:                        R=subst(substblock(R,Y,VS[0],Y^2),Y,VS[0]);
                   18985:                        if(Dumb==-1) mycat(["->",R]);
                   18986:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   18987:                }
                   18988:                return R;
                   18989:        }
                   18990:        if(T==65||T==66){       /* polynomial including sin, exp etc */
                   18991:                for(F=0,VT=Var;VT!=[];VT=cdr(VT)){
                   18992:                        VTT=car(VT);
                   18993:                        if(ptype(VTT[2],X)>2||mydeg(VTT[2],X)>1) F=ior(F,256); /* compos. or rat. or nonlin. */
                   18994:                        K=findin(VTT[1],[cos,sin,tan,exp,log,pow]);
                   18995:                        F=ior(F,2^(K+1)); /* 1:other,2:cos,4:sin,8:tan,16:exp,32:log,64:pow */
                   18996:                        if((Deg=mydeg(P,VTT[0]))>1&&K!=4) F=ior(F,1024);        /* nonlinear */
                   18997:                        if(K==5 && (ptype(VTT[3],X)!=0 || VTT[2]!=x||Deg>1)) F=ior(F,8192); /* pow */
                   18998:                        for(;Deg>0;Deg--){ /* coef */
                   18999:                                if(ptype(mycoef(P,Deg,VTT[0]),X)>2){
                   19000:                                        if(K==4||K==5) F=ior(F,2048);  /* exp, log */
                   19001:                                        else F=ior(F,4096);
                   19002:                                }
                   19003:                        }
                   19004:                }
                   19005:                if(!iand(F,1+8+64+256+512+2048+8192)){  /* cos,sin,exp,log^n,x^c */
                   19006:                        if(iand(F,1024+4096)&&!iand(F,32+64)){ /* cos,sin,exp */
                   19007:                                if(type(Dumb)==5){
                   19008:                                        S=trig2exp(P,X|inv=1);
                   19009:                                        if(P!=S) Dumb[0]=cons([[X,S]],Dumb[0]);
                   19010:                                }
                   19011:                                R=integrate(trig2exp(P,X),X);
                   19012:                                if(R!=[]) S=trig2exp(R,X|inv=1);
                   19013:                                R=fshorter(S,X);
                   19014:                                if(type(Dumb)==5&&R!=S){
                   19015:                                        Dumb[0]=cons([[1,S]],Dumb[0]);
                   19016:                                }
                   19017:                                return R;
                   19018:                        }
                   19019:                        for(R=0,VT=Var;VT!=[];VT=cdr(VT)){
                   19020:                                CV=car(VT);
                   19021:                                C0=mycoef(CV[2],0,X);C1=mycoef(CV[2],1,X);
                   19022:                                Q=mycoef(P,1,CV[0]);
                   19023:                                if(CV[1]==sin||CV[1]==cos){
                   19024:                                        TR=(CV[1]==sin)?intpoly(Q,X|sin=C1):intpoly(Q,X|cos=C1);
                   19025:                                        R+=TR[0]*cos(CV[2])+TR[1]*sin(CV[2]);
                   19026:                                }else if(CV[1]==exp){
                   19027:                                        QT=exp(CV[2]);
                   19028:                                        for(V2=vars(C1);V2!=[];V2=cdr(V2)){  /* exp(2*log(a)*x) => a^(2*x) */
                   19029:                                                if(vtype(VA=car(V2))==2&&functor(VA)==log){
                   19030:                                                        if(ptype(C1,VA)!=2||mydeg(C1,VA)==1&&mycoef(C1,0,VA)==0){
                   19031:                                                                QT=args(VA)[0]^(red(C1/VA)*X);
                   19032:                                                                if(C0!=0) QT*=exp(C0);
                   19033:                                                                break;
                   19034:                                                        }
                   19035:                                                }
                   19036:                                        }
                   19037:                                        R+=intpoly(Q,X|exp=C1)*QT;
                   19038:                                }else if(CV[1]==pow)
                   19039:                                        R+=intpoly(Q,X|pow=CV[2])*x^CV[2];
                   19040:                                else if(CV[1]==log){
                   19041:                                        for(Deg=mydeg(P,CV[0]);Deg>0; Deg--){
                   19042:                                                Q=mycoef(P,Deg,CV[0]);
                   19043:                                                TR=intpoly(Q,X|log=[C1,C0,Deg]);
                   19044:                                                for(I=0;TR!=[];I++,TR=cdr(TR)){
                   19045:                                                        if(I==Deg) R+=car(TR)-subst(car(TR),X,0);
                   19046:                                                        else R+=car(TR)*CV[0]^(Deg-I);
                   19047:                                                }
                   19048:                                        }
                   19049:                                }
                   19050:                                P=mycoef(P,0,CV[0]);
                   19051:                        }
                   19052:                        R+=intpoly(P,X);
                   19053:                        return R;
                   19054:                }
                   19055:        }
                   19056:        for(K=0,VX=[],VT=Var;VT!=[];VT=cdr(VT)){                /*  contain only both pow and trig */
                   19057:                VTT=car(VT);
                   19058:                if(findin(VTT[1],[cos,sin,tan])>=0){
                   19059:                        if(ptype(VTT[2],X)!=2||mydeg(VTT[2],X)!=1) break;
                   19060:                        VX=cons(VTT,VX);
                   19061:                }else if(VTT[1]==pow) K=1;
                   19062:                else break;
                   19063:        }
                   19064:        if(VT==[]&&K==1&&VX!=[]){
                   19065:                D=VX[0][2];
                   19066:                if(VX[0][1]==tan) D*=2;
                   19067:                for(VT=cdr(VX);VT!=[];VT=cdr(VT)){
                   19068:                        K=VT[0][2]/D;
                   19069:                        if(VT[0][1]==tan) K*=2;
                   19070:                        if(type(K)!=1||ntype(K)!=0) break;
                   19071:                        D/=dn(K);
                   19072:                }
                   19073:                if(VT==[]){
                   19074:                        Y=makenewv([P,VAR]|var=x);
                   19075:                        for(Q=P,VT=VX;VT!=[];VT=cdr(VT)){
                   19076:                                VTT=car(VT);
                   19077:                                if(VTT[1]==cos||VTT[1]==sin){
                   19078:                                        VV=trig2exp(VTT[0],X|inv=cos(D));
                   19079:                                        VV=subst(VV,cos(D),(1-Y^2)/(1+Y^2),sin(D),2*Y/(Y^2+1));
                   19080:                                }else if(VTT[1]==tan){
                   19081:                                        VV=trig2exp(VTT[0],X|inv=tan(D/2));
                   19082:                                        VV=subst(VV,tan(D),Y);
                   19083:                                }
                   19084:                                Q=subst(Q,VTT[0],VV);
                   19085:                        }
                   19086:                        Q*=2/(Y^2+1);
                   19087:                        if(diff(Q,X)==0){
                   19088:                                if(Dumb==-1) mycat([Y,"=",tan(D/2)]);
                   19089:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,tan(D/2)]],Dumb[0]);
                   19090:                                R=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var));
                   19091:                                if(R!=[]){
                   19092:                                        if(Dumb==-1) mycat(["->",R]);
                   19093:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   19094:                                        return sqrt2rat(subst(R,Y,tan(D/2))|mult=1);
                   19095:                                }
                   19096:                        }
                   19097:                }
                   19098:        }
                   19099:        if(T>65||iand(F,8)){    /* rational for functions or tan */
                   19100:                if(findin(X,vars(P))<0){
                   19101:                        for(XV=XE=0,VT=Var;VT!=[];VT=cdr(VT)){
                   19102:                                VTT=car(VT);
                   19103:                                if(mydeg(VTT[2],X)!=1) break;
                   19104:                                if(VTT[1]==cos||VTT[1]==sin||VTT[1]==tan){
                   19105:                                        K=red(VTT[2]/X);
                   19106:                                        if(type(K)>1||ntype(K)>0) break;
                   19107:                                        if(XV==0) XV=K;
                   19108:                                        else XV/=dn(K/XV);
                   19109:                                        if(VTT[1]==tan) P=red(subst(P,VTT[0],sin(VTT[2])/cos(VTT[2])));
                   19110:                                }else if(VTT[1]==exp){
                   19111:                                        K=red(VTT[2]/X);
                   19112:                                        if(type(K)>1||ntype(K)>0) break;
                   19113:                                        if(XE==0) XE=K;
                   19114:                                        else XE/=dn(K/XE);
                   19115:                                }else break;
                   19116:                        }
                   19117:                        if(VT==[]&&XE*XV==0){
                   19118:                                if(XE){
                   19119:                                        if(XE<0) XE=-XE;
                   19120:                                        Y=makenewv([P,VAR]|var=x);
                   19121:                                        for(F=0,VT=Var;VT!=[];VT=cdr(VT),F++){
                   19122:                                                VTT=car(VT);C=red(VTT[2]/X/XE);
                   19123:                                                P=subst(P,VTT[0],Y^C);
                   19124:                                                if(!F){
                   19125:                                                        if(Dumb==-1) mycat([Y^C,"=",VTT[0]]);
                   19126:                                                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y^C,VTT[0]]],Dumb[0]);
                   19127:                                                }
                   19128:                                        }
                   19129:                                        P/=XE*Y;
                   19130:                                        Q=integrate(P,Y|dumb=Dumb3,var=cons(X,VAR));
                   19131:                                        if(Q==[]) return [];
                   19132:                                        Q=subst(Q,Y,exp(XE*X));
                   19133:                                        Q=trig2exp(Q,X);
                   19134:                                        if(Dumb==-1) mycat(["->",Q]);
                   19135:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   19136:                                        return Q;
                   19137:                                }
                   19138:                                P=trig2exp(nm(P),X|inv=cos(XV*X))/trig2exp(dn(P),X|inv=cos(XV*X));
                   19139:                                Y=makenewv([P,VAR]|var=x);
                   19140:                                Q=red(subst(P,sin(XV*X),Y*cos(XV*X)));
                   19141:                                Q=substblock(nm(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))/
                   19142:                                  (substblock(dn(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))*(Y^2+1));
                   19143:                                Q=red(Q);
                   19144:                                if(ptype(Q,X)<2){
                   19145:                                        XV*=2;P=Q;
                   19146:                                }else{
                   19147:                                        P=subst(P,cos(XV*X),(1-Y^2)/(1+Y^2),sin(XV*X),2*Y/(1+Y^2))*2/K/(1+Y^2);
                   19148:                                        P=red(P);
                   19149:                                }
                   19150:                                if(Dumb==-1){
                   19151:                                        mycat([Y,"=",tan(XV*X/2)]);
                   19152:                                        mycat(["integrate",P]);
                   19153:                                }else if(type(Dumb)==5) Dumb[0]=cons([[Y,P]],cons([[0,Y,tan(XV*X/2)]],Dumb[0]));
                   19154:                                R=intpoly(P,Y|dumb=Dumb);
                   19155:                                if(R==[]) return R;
                   19156:                                if(Dumb==-1) mycat(["->",R]);
                   19157:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   19158:                                for(Log=1,K=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   19159:                                        VTT=car(Var);
                   19160:                                        if(VTT[1]==log){
                   19161:                                                C=mycoef(R,1,VTT[0]);
                   19162:                                                VT2=VTT[2];
                   19163:                                                if(K==0){
                   19164:                                                        K=C;Log=VT2;
                   19165:                                                        if(K<0){
                   19166:                                                                K=-K;Log=1/Log;
                   19167:                                                        }
                   19168:                                                }else{
                   19169:                                                        if((V=red(C/K))<0){
                   19170:                                                                VT2=1/VT2;V=-V;
                   19171:                                                        }
                   19172:                                                        if(type(V)>1||ntype(V)>0){
                   19173:                                                                Log=1;break;
                   19174:                                                        }
                   19175:                                                        if(isint(V)) Log*=VT2^V;
                   19176:                                                        else{
                   19177:                                                                D=dn(V);K/=D;
                   19178:                                                                Log=Log^D*VT2^nm(V);
                   19179:                                                        }
                   19180:                                                }
                   19181:                                                RR=mycoef(RR,0,VTT[0]);
                   19182:                                        }
                   19183:                                }
                   19184:                                if(Log!=1){
                   19185:                                        R=RR;
                   19186:                                        if(type(Dumb)==5){
                   19187:                                                if(RR) Dumb[0]=cons([[1,K*log(Log),RR]],Dumb[0]);
                   19188:                                                else Dumb[0]=cons([[1,K*log(Log)]],Dumb[0]);
                   19189:                                        }
                   19190:                                        Log=red(subst(red(Log),Y,sin(XV*X/2)/cos(XV*X/2)));
                   19191:                                        Log=fshorter(Log,X|log=1);      /* log(cos(2*x)+1)=-2*log(cos(x)) */
                   19192:                                        Nm=fctr(nm(Log));
                   19193:                                        for(T=[];Nm!=[];Nm=cdr(Nm)){
                   19194:                                                if(ptype(car(Nm)[0],X)>1) T=cons(car(Nm),T);
                   19195:                                        }
                   19196:                                        Nm=fctr(dn(Log));
                   19197:                                        for(;Nm!=[];Nm=cdr(Nm)){
                   19198:                                                if(ptype(car(Nm)[0],X)>1) T=cons([car(Nm)[0],-car(Nm)[1]],T);
                   19199:                                        }
                   19200:                                        for(I=0,Nm=T;T!=[];T=cdr(T)){
                   19201:                                                if(I=0) I=abs(car(T)[1]);
                   19202:                                                else I=igcd(I,car(T)[1]);
                   19203:                                        }
                   19204:                                        for(Log=1;Nm!=[];Nm=cdr(Nm)) Log*=car(Nm)[0]^(car(Nm)[1]/I);
                   19205:                                        K*=I;
                   19206:                                        if(cmpsimple(nm(Log),dn(Log))<0){
                   19207:                                                K=-K;Log=red(1/Log);
                   19208:                                        }
                   19209:                                        Log=K*log(Log);
                   19210:                                        if(type(Dumb)==5){
                   19211:                                                if(RR) Dumb[0]=cons([[1,Log,RR]],Dumb[0]);
                   19212:                                                else Dumb[0]=cons([[1,Log]],Dumb[0]);
                   19213:                                        }
                   19214:                                }else Log=0;
                   19215:                                for(Atan=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   19216:                                        VTT=car(Var);
                   19217:                                        if(VTT[1]==atan){
                   19218:                                                W=subst(VTT[2],Y,sin(XV*X/2)/cos(XV*X/2));
                   19219:                                                W=trig2exp(W,X|inv=1);
                   19220:                                                V2=funargs(dn(W));
                   19221:                                                if(type(V2)==4&&length(V2)==2){
                   19222:                                                        V3=V2[1]*mycoef(R,1,VTT[0]);
                   19223:                                                        Z=0;
                   19224:                                                        if(V2[0]==cos)
                   19225:                                                                Z=red(W*cos(V2[1])/sin(V2[1]));
                   19226:                                                        else if(V2[0]==sin){
                   19227:                                                                Z=red(W*sin(V2[1])/cos(V2[1]));
                   19228:                                                                V3=-V3;
                   19229:                                                        }
                   19230:                                                        if(Z==1){
                   19231:                                                                Atan+=V3;W=0;
                   19232:                                                        }else if(Z==-1){
                   19233:                                                                Atan-=V3;W=0;
                   19234:                                                        }
                   19235:                                                }
                   19236:                                                R0=mycoef(R,0,VTT[0]);
                   19237:                                                if(W!=0) Atan+=subst(R-R0,VTT[0],atan(W));      /* atan(W); */
                   19238:                                                R=R0;
                   19239:                                        }
                   19240:                                }
                   19241:                                if(R!=0){
                   19242:                                        R=subst(R,Y,sin(XV*X/2)/cos(XV*X/2));
                   19243:                                        R=red(R);
                   19244:                                        R=trig2exp(nm(R),X|inv=1)/trig2exp(dn(R),X|inv=1);
                   19245:                                }
                   19246:                                if(type(Dumb)==5){
                   19247:                                        F=0;WL=[];
                   19248:                                        if(R){
                   19249:                                                WL=cons(R,WL);
                   19250:                                                F++;
                   19251:                                        }
                   19252:                                        if(Atan){
                   19253:                                                WL=cons(Atan,WL);
                   19254:                                                F++;
                   19255:                                        }
                   19256:                                        if(Log){
                   19257:                                                WL=cons(Log,WL);
                   19258:                                                F++;
                   19259:                                        }
                   19260:                                        WL=cons(1,WL);
                   19261:                                        if(F>1) Dumb[0]=cons([WL],Dumb[0]);
                   19262:                                }
                   19263:                                R=red(R+Log+Atan);
                   19264:                                if(Dumb==-1) mycat(["->",R]);
                   19265:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   19266:                                return fshorter(R,X);
                   19267:                        }
                   19268:                }
                   19269:        }
                   19270:        VT=pfargs(Q=P,X|level=1);
                   19271:        V=(iand(ptype(P,X),7)<3)?[X]:[];
                   19272:        for(;VT!=[];VT=cdr(VT))
                   19273:                if(ptype(P,car(VT)[0])<3) V=cons(car(VT)[0],V);
                   19274:        if(length(V)>0){                /* 1/x+tan(x)+... etc.: sums */
                   19275:                for(R=0;V!=[];V=cdr(V)){
                   19276:                        T=mycoef(Q,0,car(V));
                   19277:                        W[0]=[];
                   19278:                        S=integrate(TD=red(Q-T),X|dumb=D2,mult=Mul,exe=1);
                   19279:                        if(S==[]) continue;
                   19280:                        if(type(Dumb)==5){
                   19281:                                WL=0;
                   19282:                                if(T!=0) WL=[[X,TD,T]];
                   19283:                                if(R!=0) WL=cons([1,R],WL);
                   19284:                                if(WL) Dumb[0]=cons(WL,Dumb[0]);
                   19285:                                TD=W[0];
                   19286:                                if(R!=0||T!=0){
                   19287:                                        for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   19288:                                                if(car(TD)[0][0]){
                   19289:                                                        WL=(!T)?[]:[[X,T]];
                   19290:                                                        WL=append(car(TD),WL);
                   19291:                                                        if(R!=0) WL=cons([1,R],WL);
                   19292:                                                }else WL=car(TD);
                   19293:                                                Dumb[0]=cons(WL,Dumb[0]);
                   19294:                                        }
                   19295:                                }else Dumb[0]=append(TD,Dumb[0]);
                   19296:                        }
                   19297:                        R+=S;Q=T;
                   19298:                        if(!Q) return red(R);
                   19299:                }
                   19300:                W[0]=[];
                   19301:                if(P!=Q&&type(S=integrate(Q,X|dumb=D2,mult=Mul))<4){
                   19302:                        RR=red(R+S);
                   19303:                        if(type(Dumb)==5){
                   19304:                                TD=W[0];
                   19305:                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   19306:                                        if(car(TD)[0][0]){
                   19307:                                                WL=cons([1,R],car(TD));
                   19308:                                                Dumb[0]=cons(WL,Dumb[0]);
                   19309:                                        }
                   19310:                                        else Dumb[0]=append(TD,Dumb[0]);
                   19311:                                }
                   19312:                                if(nmono(R)+nmono(S)!=nmono(RR)) Dumb[0]=cons([[1,R,S]],Dumb[0]);
                   19313:                        }
                   19314:                        return RR;
                   19315:                }
                   19316:        }
                   19317:        if(Dumb!=1) mycat(SM);
                   19318:        return [];
                   19319: }
                   19320:
                   19321: def fimag(P)
                   19322: {
                   19323:        for(V=vars(P);V!=[];V=cdr(V)){
                   19324:                Q=[];
                   19325:                if(vtype(VF=car(V))==2){
                   19326:                        VAA=args(VF);
                   19327:                        if(VAA==[]) continue;
                   19328:                        VA=sqrt2rat(VAA[0]);
                   19329:                        if(functor(VF)==exp){
                   19330:                                if(imag(VA)!=0){
                   19331:                                        R=(real(VA)!=0)?exp(real(VA)):1;
                   19332:                                        Q=subst(P,VF,R*(cos(imag(VA))+sin(imag(VA))*@i));
                   19333:                                }
                   19334:                        }else if(functor(VF)==pow){
                   19335:                                VA=sqrt2rat(VAA[1]);
                   19336:                                if(imag(VA)!=0){
                   19337:                                        R=(real(VA)!=0)?VAA[0]^(real(VA)):1;
                   19338:                                        L=(VAA[0]!=@e)?log(VAA[0]):1;
                   19339:                                        Q=subst(P,VAA[0]^(VAA[1]),R*(cos(L*imag(VA))+sin(L*imag(VA))*@i));
                   19340:                                }else if(VAA[1]!=(V0=fimag(VA)))
                   19341:                                        Q=subst(P,VAA[0]^(VAA[1]),VAA[0]^(V0));
                   19342:                        }
                   19343:                        V0=VA;
                   19344:                        if(length(VAA)==1&&(VAA[0]!=V0||VA!=(V0=fimag(VA))))
                   19345:                                Q=subst(P,VF,subst(VF,VAA[0],V0));
                   19346:                }
                   19347:                if(Q!=[]&&P!=Q){
                   19348:                        P=Q;V=cons(0,vars(P));
                   19349:                }
                   19350:        }
                   19351:        return P;
                   19352: }
                   19353:
                   19354:
                   19355: def trig2exp(P,X)
                   19356: {
                   19357:        if(iand(ptype(P,X),128)){
                   19358:                OL=getopt();
                   19359:                Nm=trig2exp(nm(P),X|option_list=OL);
                   19360:                Dn=trig2exp(dn(P),X|option_list=OL);
                   19361:                R=red(Nm/Dn);
                   19362:                if(getopt(arc)==1) return sqrt2rat(R);
                   19363:        }
                   19364:        if((Inv=getopt(inv))==1||type(Inv)==2){
                   19365:                for(VT=T=vars(P);T!=[];T=cdr(T)){
                   19366:                        if(findin(functor(car(T)),[cos,sin,tan])>=0){
                   19367:                                P=trig2exp(P,X);VT=vars(P);break;
                   19368:                        }
                   19369:                }
                   19370:                for(;VT!=[];VT=cdr(VT)){
                   19371:                        if(functor(CT=car(VT))==exp){
                   19372:                                if((Re=real(args(CT)[0]))!=0){
                   19373:                                        if(isint(Re)) S=@e^Re;
                   19374:                                        else S=exp(Re);
                   19375:                                }else S=1;
                   19376:                                if((Im=imag(args(CT)[0]))!=0){
                   19377:                                        Q=nm(Im);Q=mycoef(Q,mydeg(Q,X),X);
                   19378:                                        if(-Q>Q) S*=cos(-Im)-@i*sin(-Im);
                   19379:                                        else S*=cos(Im)+@i*sin(Im);
                   19380:                                }
                   19381:                                P=subst(P,CT,S);
                   19382:                        }
                   19383:                }
                   19384:                P=red(P);
                   19385:                U=vars(Inv);
                   19386:                if(length(U)!=1||((F=functor(car(U)))!=sin&&F!=cos&&F!=tan)) return P;
                   19387:                XX=args(car(U))[0];
                   19388:                if(mydeg(XX,X)!=1) return P;
                   19389:                if(!isvar(XX)) P=subst(P,X,(X-mycoef(XX,0,X))/mycoef(XX,1,X));
                   19390:                for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   19391:                        if(vtype(CT=car(VT))<2) continue;
                   19392:                        TX=args(CT)[0];
                   19393:                        if(mydeg(TX,X)!=1) continue;
                   19394:                        if(!isint(C1=mycoef(TX,1,X))) continue;
                   19395:                        if((C0=mycoef(TX,0,X))==0){
                   19396:                                CC=1;CS=0;
                   19397:                        }else if(vars(C0)==[@pi]){
                   19398:                                CC=myval(cos(C0));
                   19399:                                if(CC!=0&&type(CC)==1&&ntype(CC)!=0){
                   19400:                                        CC=cos(C0);CS=sin(C0);
                   19401:                                }else CS=myval(sin(C0));
                   19402:                        }else{
                   19403:                                CC=cos(C0);CS=sin(C0);
                   19404:                        }
                   19405:                        K=C1;
                   19406:                        if(K<0) K=-K;
                   19407:                        for(CC1=0,I=K;I>=0;I-=2) CC1+=(-1)^((K-I)/2)*binom(K,I)*cos(X)^I*sin(X)^(K-I);
                   19408:                        for(CS1=0,I=K-1;I>=0;I-=2) CS1+=(-1)^((K-I-1)/2)*binom(K,I)*cos(X)^I*sin(X)^(K-I);
                   19409:                        if(C1<0) CS1=-CS1;
                   19410:                        if((TF=functor(CT))==cos) P=subst(P,cos(TX),CC1*CC-CS1*CS);
                   19411:                        else if(TF==sin) P=subst(P,sin(TX),CS1*CC+CC1*CS);
                   19412:                }
                   19413:                if(F==sin)
                   19414:                        P=substblock(P,cos(X),cos(X)^2,1-sin(X)^2);
                   19415:                else{
                   19416:                        P=substblock(P,sin(X),sin(X)^2,1-cos(X)^2);
                   19417:                        if(F==tan){
                   19418:                                P=subst(P,sin(X),cos(X)*tan(X));
                   19419:                                P=substblock(P,cos(X),cos(X)^2,1/(tan(X)^2+1));
                   19420:                        }
                   19421:                }
                   19422:                if(!isvar(XX)) P=subst(P,X,XX);
                   19423:
                   19424:                if(getopt(arc)==1){
                   19425:                        for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   19426:                                FA=funargs(car(VT));
                   19427:                                if(type(FA)==4&&(FA[0]==cos||FA[0]==sin)&&ptype(FA[1],X)>60){
                   19428:                                        VTT=vars(FA[1]);
                   19429:                                        if(type(FA[1])!=2||length(VTT)!=1) break;
                   19430:                                        FB=funargs(VTT[0]);
                   19431:                                        if(type(FB)!=4||(FF=findin(FB[0],[asin,acos,atan]))<0) break;
                   19432:                                        if(!isint(2*(C=mycoef(FA[1],1,VTT[0])))||mycoef(FA[1],0,VTT[0])!=0) break;
                   19433:                                        if(C==1/2){
                   19434:                                                if(FF==1){
                   19435:                                                        U=(FA[0]==cos)?(1+FB[1])/2:(1-FB[1])/2;
                   19436:                                                        P=subst(P,car(VT),red(U)^(1/2));
                   19437:                                                }else if(FF==2){
                   19438:                                                        if(FA[0]==sin){
                   19439:                                                                FB1=red(FB[1]);
                   19440:                                                                Nm=nm(FB1);CC=fctr(Nm)[0][0];Dn=dn(FB1);
                   19441:                                                                if(CC<0) CC=-CC;
                   19442:                                                                Nm/=CC;Dn/=CC;
                   19443:                                                                NN=Nm^2+Dn^2;
                   19444:                                                                P=subst(P,car(VT),((NN)^(1/2)-Dn)/Nm*cos(FA[1]));
                   19445:                                                        }
                   19446:                                                }
                   19447:                                                P=red(P);
                   19448:                                        }else if(C==1){
                   19449:                                                if(FF==1){
                   19450:                                                        if(FA[0]==cos) P=subst(P,car(VT),FB[1]);
                   19451:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   19452:                                                }else if(FF==0){
                   19453:                                                        if(FA[0]==sin) P=subst(P,car(VT),FB[1]);
                   19454:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   19455:                                                }
                   19456:                                                P=red(P);
                   19457:                                        }
                   19458:                                }
                   19459:                        }
                   19460:                        P=sqrt2rat(P);
                   19461:                }
                   19462:                return red(P);
                   19463:        }
                   19464:        Var=pfargs(P,X);
                   19465:        for(VT=Var;VT!=[];VT=cdr(VT)){
                   19466:                CT=car(VT);
                   19467:                if(CT[1]==cos)
                   19468:                        P=subst(P,CT[0],exp(CT[2]*@i)/2+exp(-CT[2]*@i)/2);
                   19469:                else if(CT[1]==sin)
                   19470:                        P=subst(P,CT[0],exp(-CT[2]*@i)*@i/2-exp(CT[2]*@i)*@i/2);
                   19471:                else if (CT[1]==tan)
                   19472:                        P=subst(P,CT[0],(exp(-CT[2]*@i)*@i-exp(CT[2]*@i)*@i)/(exp(CT[2]*@i)+exp(-CT[2]*@i)));
                   19473:                else if(CT[1]==pow){
                   19474:                        if(ptype(CT[2],X)>1) continue;
                   19475:                        if(CT[2]==@e) P=subst(P,CT[0],exp(CT[3]));
                   19476:                        else P=subst(P,CT[0],exp(log(CT[2])*exp(CT[3])));
                   19477:                }
                   19478:        }
                   19479:        P=red(P);
                   19480:        for(PP=1,Lp=(dn(P)==1)?1:0;Lp<2;Lp++){
                   19481:                PP=1/PP;
                   19482:                U=(Lp==0)?dn(P):nm(P);
                   19483:                if(U==1) continue;
                   19484:                Var=vars(U);
                   19485:                for(R=[],VT=Var;VT!=[];VT=cdr(VT))
                   19486:                        if(functor(car(VT))==exp) R=cons(car(VT),R);
                   19487:                RR=os_md.terms(U,R);
                   19488:                for(Q=0,RRT=RR;RRT!=[];RRT=cdr(RRT)){
                   19489:                        for(S=0,CT=cdr(car(RRT)),CR=R,UT=U;CR!=[];CR=cdr(CR),CT=cdr(CT)){
                   19490:                                UT=mycoef(UT,car(CT),car(CR));S+=car(CT)*args(car(CR))[0];
                   19491:                        }
                   19492:                        if(S==0) Q+=UT;
                   19493:                        else Q+=UT*exp(S);
                   19494:                }
                   19495:                PP*=Q;
                   19496:        }
                   19497:        return PP;
                   19498: }
                   19499:
                   19500: def powsum(N)
                   19501: {
                   19502:        if (N < 0) return 0;
                   19503:        if (N == 0) return x;
                   19504:        P = intpoly(N*powsum(N-1),x);
                   19505:        C = subst(P,x,1);
                   19506:        return P+(1-C)*x;
                   19507: }
                   19508:
                   19509: def bernoulli(N)
                   19510: {
                   19511:        return mydiff(powsum(N),x) - N*x^(N-1);
                   19512: }
                   19513:
                   19514: /* linfrac01([x,y]) */
                   19515: /* linfrac01(newvect(10,[0,1,2,3,4,5,6,7,8,9]) */
                   19516: /* 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
                   19517:         10:y_2=0, 11:y_2=x, 12:y_2=y, 13: y_2=1,   14: y_2=\infty
                   19518:         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
                   19519:         X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
                   19520:         X[3],X[1],X[12],X[4],X[6]
                   19521:
                   19522:        T=0   (x_2,x_1,x_3,x_4,...)
                   19523:        T=-j  (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)
                   19524:        T=1   (1-x_1,1-x_2,1-x_3,1-x_4,...)
                   19525:        T=2   (1/x_1,1/x_2,1/x_3,1/x_4,...)
                   19526:        T=3   (x_1,x_1/x_2,x_1/x_3,x_1/x_4,...)
                   19527: */
                   19528:
                   19529: def lft01(X,T)
                   19530: {
                   19531:        MX=getopt();
                   19532:        if(type(X)==4){
                   19533:                K=length(X);
                   19534:                if(K>=1) D=1;
                   19535:        }
                   19536:        if(type(X)==5){
                   19537:                K=length(X);
                   19538:                for(J=5, F=K-10; F>0; F-=J++);
                   19539:                if(F==0) D=2;
                   19540:        }
                   19541:        if(D==0) return 0;
                   19542:        if(T==0){  /* x <-> y */
                   19543:                if(D==1){
                   19544:                        R=cdr(X); R=cdr(R);
                   19545:                        R=cons(X[0],R);
                   19546:                        return cons(X[1],R);
                   19547:                }
                   19548:                R=newvect(K,[X[3],X[1],X[4],X[0],X[2],X[6],X[5]]);
                   19549:                for(I=7;I<K;I++) R[I]=X[I];
                   19550:                for(I=11,J=5; I<K; I+=J++){
                   19551:                        R[I]=X[I+1]; R[I+1]=X[I];
                   19552:                }
                   19553:                return R;
                   19554:        }
                   19555:        if(T==1){
                   19556:                if(D==1){
                   19557:                        for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);
                   19558:                        return reverse(R);
                   19559:                }
                   19560:                R=newvect(K,[X[2],X[1],X[0],X[4],X[3],X[5],X[6],X[8],X[7],X[9]]);
                   19561:                for(I=11;I<K;I++) R[I]=X[I];
                   19562:                for(I=10, J=5; I<K; I+=J++){
                   19563:                        R[I]=X[I+J-2]; R[I+J-2]=X[I];
                   19564:                }
                   19565:                return R;
                   19566:        }
                   19567:        if(T==2){
                   19568:                if(D==1){
                   19569:                        for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);
                   19570:                        return reverse(R);
                   19571:                }
                   19572:                R=newvect(K,[X[5],X[1],X[2],X[6],X[4],X[0],X[3],X[9],X[8],X[7]]);
                   19573:                for(I=11;I<K;I++) R[I]=X[I];
                   19574:                for(I=10,J=5; I<K; I+=J++){
                   19575:                        R[I]=X[I+J-1]; R[I+J-1]=X[I];
                   19576:                }
                   19577:                return R;
                   19578:        }
                   19579:        if(T==3){
                   19580:                if(D==1){
                   19581:                        T=car(X);
                   19582:                        for(R=[T],X=cdr(X); X!=[]; X=cdr(X))
                   19583:                                R=cons(red(T/car(X)),R);
                   19584:                        return reverse(R);
                   19585:                }
                   19586:                R=newvect(K,[X[7],X[4],X[2],X[6],X[1],X[9],X[3],X[0],X[8],X[5]]);
                   19587:                for(I=10,J=5; I<K; I+=J++){
                   19588:                        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];
                   19589:                }
                   19590:                return R;
                   19591:        }
                   19592:        if(T==-1){
                   19593:                if(D==1){
                   19594:                        return append([X[1],X[2],X[0]],cdr(cdr(cdr(X))));
                   19595:                }
                   19596:                R=newvect(K,[X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
                   19597:                         X[3],X[1],X[12],X[4],X[6]]);
                   19598:                for(I=11;I<K;I++) R[I]=X[I];
                   19599:                for(I=17,J=5; I<K; I+=J++){
                   19600:                        R[I]=X[I+1]; R[I+1]=X[I];
                   19601:                }
                   19602:                return R;
                   19603:        }
                   19604:        if(T<0){
                   19605:                if(D==1){
                   19606:                        for(R=[],I=0; X!=[]; X=cdr(X),I--){
                   19607:                                if(I==T){
                   19608:                                        R=cons(X[1],R);
                   19609:                                        R=cons(X[0],R);
                   19610:                                        X=cdr(X);
                   19611:                                }
                   19612:                                else R=cons(car(X),R);
                   19613:                        }
                   19614:                        return reverse(R);
                   19615:                }
                   19616:                T=3-T;
                   19617:                R=newvect(K);
                   19618:                for(I=0;I<K;I++) R[I]=X[I];
                   19619:                for(I=10,J=5;J<T;I+=J++);
                   19620:                for(II=0; II<J-2; II++){
                   19621:                        R[I]=X[I+J]; R[I+J]=R[I];
                   19622:                }
                   19623:                for( ; II<J; II++){
                   19624:                        R[I]=X[I+J+1]; R[I+J+1]=X[I];
                   19625:                }
                   19626:                return R;
                   19627:        }
                   19628:        return 0;
                   19629: }
                   19630:
                   19631: def linfrac01(X)
                   19632: {
                   19633:        if(type(X)==4) K=length(X)-2;
                   19634:        else if(type(X)==5){
                   19635:                L=length(X);
                   19636:                for(K=0,I=10,J=5; I<L; K++,I+=J++);
                   19637:                if(I!=L) return 0;
                   19638:        }
                   19639:        if(K>3 && getopt(over)!=1) return(-1);
                   19640:        II=(K==-1)?3:4;
                   19641:        for(CC=C=1,L=[X]; C!=0; CC+=C){
                   19642:                for(F=C,C=0,R=L; F>0; R=cdr(R), F--){
                   19643:                        P=car(R);
                   19644:                        for(I=-K; I<II; I++){
                   19645:                                S=lft01(P,I);
                   19646:                                if(findin(S,L) < 0){
                   19647:                                        C++; L=cons(S,L);
                   19648:                                }
                   19649:                        }
                   19650:                }
                   19651:        }
                   19652:        return L;
                   19653: }
                   19654:
                   19655:
                   19656: def varargs(P)
                   19657: {
1.21      takayama 19658:        if((All=getopt(all))!=1&&All!=2) All=0;
1.6       takayama 19659:        V=vars(P);
                   19660:        for(Arg=FC=[];V!=[];V=cdr(V)){
1.21      takayama 19661:                if(vtype(CV=car(V))==0&&All!=0){
1.6       takayama 19662:                        Arg=lsort([CV],Arg,0);
                   19663:                }
                   19664:                if(vtype(CV)!=2) continue;
                   19665:                if(findin(F=functor(CV),FC)<0) FC=cons(F,FC);
                   19666:                for(AT=vars(args(CV));AT!=[];AT=cdr(AT)){
                   19667:                        if(vtype(X=car(AT))<2){
                   19668:                                if(findin(X,Arg)<0) Arg=cons(X,Arg);
                   19669:                        }else if(vtype(X)==2){
                   19670:                                R=varargs(X);
                   19671:                                if(R[1]!=[]){
                   19672:                                        Arg=lsort(R[1],Arg,0);
                   19673:                                        FC=lsort(R[0],FC,0);
                   19674:                                }
                   19675:                        }
                   19676:                }
                   19677:        }
1.21      takayama 19678:        Arg=reverse(Arg);
                   19679:        return (All==2)?Arg:[reverse(FC),Arg];
1.6       takayama 19680: }
                   19681:
                   19682: def pfargs(P,X)
                   19683: {
                   19684:        if(type(L=getopt(level))!=1) L=0;
                   19685:        for(Var=[],V=vars(P);V!=[];V=cdr(V)){
                   19686:                if(vtype(car(V))==2){
                   19687:                        VT=funargs(car(V));
                   19688:                        if(length(VT)>1){
                   19689:                                if(L<2 &&(ptype(VT[1],X)>1 || (length(VT)>2 && ptype(VT[2],X)>1)))
                   19690:                                        Var=cons(cons(car(V),VT),Var);
                   19691:                                if(L!=1 && (R=pfargs(VT[1],X|level=L-1))!=[]) Var=append(R,Var);
                   19692:                        }
                   19693:                }
                   19694:        }
                   19695:        return reverse(Var);
                   19696: }
                   19697:
                   19698: def ptype(P,L)
                   19699: {
                   19700:        if((T=type(P))<2 || T>3) return T;
                   19701:        if(type(L)!=4)  L=[L];
                   19702:        F=0;
                   19703:        if(lsort(L,varargs(dn(P))[1],2)!=[]) F=128;
                   19704:        if(lsort(L,varargs(nm(P))[1],2)!=[]) F+=64;
                   19705:        if(lsort(L,vars(dn(P)),2)!=[]) return F+3;
                   19706:        return (lsort(L,vars(nm(P)),2)==[])?(F+1):(F+2);
                   19707: }
                   19708:
                   19709: def nthmodp(X,N,P)
                   19710: {
                   19711:        X=X%P;
                   19712:        for(Z=1;;){
                   19713:                if((W=iand(N,1))==1)    Z=(Z*X)%P;
                   19714:                if((N=(N-W)/2)<=0)      return Z;
                   19715:                X=irem(X*X,P);
                   19716:        }
                   19717: }
                   19718:
                   19719: def issquaremodp(X,P)
                   19720: {
                   19721:        N=getopt(power);
                   19722:        if(!isint(N)) N=2;
                   19723:        if(P<=1 || !isint(P) || !pari(ispsp,P) || !isint(X) || !isint(N) || N<1){
                   19724:                errno(0);
                   19725:                return -2;
                   19726:        }
                   19727:        M=(P-1)/igcd(N,P-1);
                   19728:        if((X%=P) == 0) return 0;
                   19729:     if(X==1 || M==P-1) return 1;
                   19730:        return (nthmodp(X,M,P)==1)?1:-1;
                   19731: }
                   19732:
                   19733: def iscoef(P,F)
                   19734: {
                   19735:        if(P==0) return 1;
                   19736:        if(type(P)==1) return F(P);
                   19737:        if(type(P)==2) {
                   19738:                X=var(P);
                   19739:                for(I=deg(P,X); I>=0; I--){
                   19740:                        if(!iscoef(mycoef(P,I,X),F)) return 0;
                   19741:                }
                   19742:        }else if(type(P)==3){
                   19743:                if(!iscoef(nm(P),F)||!iscoef(dn(P),F)) return 0;
                   19744:        }else if(type(P)==4){
                   19745:                for(;P!=[];P=cdr(P)) if(!iscoef(P,F)) return 0;
                   19746:        }else if(type(P)>4 && type(P)<7) return iscoef(m2l(PP),F);
                   19747:        else return 0;
                   19748:        return 1;
                   19749: }
                   19750:
                   19751: def rootmodp(X,P)
                   19752: {
                   19753:        X%=P;
                   19754:        if(X==0)        return [0];
                   19755:        N=getopt(power);
                   19756:        PP=pari(factor,P);
                   19757:        P0=PP[0][0]; P1=PP[0][1];
                   19758:        P2=pari(phi,P);
                   19759:        if(!isint(N)) N=2;
                   19760:        N%=P2;
                   19761:        if(P0==2 || size(PP)[0]>1){
                   19762:                for(I=1,R=[]; I<P2; I++)
                   19763:                        if(nthmodp(I,N,P)==X)   R=cons(I,R);
                   19764:                return qsort(R);
                   19765:        }
                   19766:        Y=primroot(P);
                   19767:        if(Y==0) return 0;
                   19768:        Z=nthmodp(Y,N,P);
                   19769:        G=igcd(N,P2);
                   19770:        P3=P2/G;
                   19771:        for(I=0, W=1; I<P3;I++){
                   19772:                if(W==X)        break;
                   19773:                W=(W*Z)%P;
                   19774:        }
                   19775:        if(I==P3) return [];
                   19776:        W=nthmodp(Y,I,P);
                   19777:        Z=nthmodp(Y,P3,P);
                   19778:        for(I=0,R=[];;){
                   19779:                R=cons(W,R);
                   19780:                if(++I>=G) break;
                   19781:                W=(W*Z)%P;
                   19782:        }
                   19783:        return qsort(R);
                   19784: }
                   19785:
                   19786: def primroot(P)
                   19787: {
                   19788:        PP=pari(factor,P);
                   19789:        P0=PP[0][0]; P1=PP[0][1];
                   19790:        S=size(PP);
                   19791:        if(S[0]>1 || !isint(P) || P0<=2){
                   19792:                print("Not odd prime(power)!");
                   19793:                return 0;
                   19794:        }
                   19795:        if(isint(Ind=getopt(ind))){
                   19796:                Ind %= P;
                   19797:                if(Ind<=0 || igcd(Ind,P)!=1 || (Z=primroot(P))==0){
                   19798:                        print("Not exist!");
                   19799:                        return 0;
                   19800:                }
                   19801:                P2=P0^(P1-1)*(P0-1);
                   19802:                for(I=1,S=1; I<P2; I++)
                   19803:                        if((S = (S*Z)%P) == Ind)        return I;
                   19804:                return 0;
                   19805:        }
                   19806:        if(getopt(all)==1){
                   19807:                I=primroot(P);
                   19808:                P2=P0^(P1-1)*(P0-1);
                   19809:                for(L=[],J=1; J<P2; J++){
                   19810:                        if(P1>1 && igcd(P0,J)!=1) continue;
                   19811:                        if(igcd(P0-1,J)!=1) continue;
                   19812:                        L=cons(nthmodp(I,J,P),L);
                   19813:                }
                   19814:                return qsort(L);
                   19815:        }
                   19816:        if(PP[0][1]>1){
                   19817:                I=primroot(P0);
                   19818:                P2=P0^(P1-2)*(P0-1);
                   19819:                if(nthmodp(I,P2,P)==1)  I+=P0;
                   19820:                return I;
                   19821:        }
                   19822:        F=pari(factor,P-1);
                   19823:        SF=size(F)[0];
                   19824:        for(I=2; I<P; I++){
                   19825:                for(J=0; J<SF; J++)
                   19826:                        if(nthmodp(I,(P-1)/F[J][0],P)==1) break;
                   19827:                if(J==SF) return I;
                   19828:        }
                   19829: }
                   19830:
                   19831: def rabin(P,X)
                   19832: {
                   19833:        for(M=0,Q=P-1;iand(Q,1)==0;M++,Q/=2);
                   19834:        Z=nthmodp(X,Q,P);
                   19835:        for(N=M;M>0&&Z!=1&&Z!=P-1;M--,Z=(Z*Z)%P);
                   19836:        return (M<N&&(M==0||Z==1))?0:1;
                   19837: }
                   19838:
                   19839: def powprimroot(P,N)
                   19840: {
                   19841:        if(P<3) P=3;
                   19842:        FE=getopt(exp);
                   19843:        if(FE!=1) FE=0;
                   19844:        if((Log=getopt(log))==1||Log==2) FE=-1;
                   19845:        else if(Log==3){
                   19846:                FE=-2;
                   19847:                for(PP=1, L0=["$r$","$p/a$"];;){
                   19848:                        PP=pari(nextprime,PP+1);
                   19849:                        if(PP>=P) break;
                   19850:                        L0=cons(PP, L0);
                   19851:                }
                   19852:                L0=reverse(L0);
                   19853:        }
                   19854:        if(FE==0) All=getopt(all);
                   19855:        for(I=0, PP=P, LL=[]; I<N; I++,PP++){
                   19856:                PP=pari(nextprime,PP);
                   19857:                if(All==1){
                   19858:                        PR=primroot(PP|all=1);
                   19859:                        LL=cons(cons(PP,PR),LL);
                   19860:                        continue;
                   19861:                }
                   19862:                PR=primroot(PP);
                   19863:                if(FE==-2){                                     /* log=3 */
                   19864:                        LT=cdr(L0);LT=cdr(L0);
                   19865:                        for(L=[PP];LT!=[];LT=cdr(LT))
                   19866:                                L=cons(primroot(PP|ind=car(LT)),L);
                   19867:                        LL=cons(reverse(L),LL);
                   19868:                        if(I<N-1) L0=append(L0,[PP]);
                   19869:                }else if(FE){
                   19870:                        for(J=1, L=[PP], K=1; J<PP; J++){
                   19871:                                if(FE==-1){                     /* log=1,2 */
                   19872:                                        K=primroot(PP|ind=J);
                   19873:                                        if(K==0 && Log==2) K=PP-1;
                   19874:                                }
                   19875:                                else K=(K*PR)%PP;       /* exp=1 */
                   19876:                                L=cons(K,L);
                   19877:                        }
                   19878:                        LL=cons(reverse(L),LL);
                   19879:                }else
                   19880:                        LL=cons([PP,PR],LL);    /* default */
                   19881:        }
                   19882:        LL=reverse(LL);
                   19883:        if(!FE) return LL;
                   19884:        PP--;
                   19885:        if(FE==-2)      return append(LL,[L0]);
                   19886:        for(I=1,L=["$p$"];I<PP; I++)    L=cons(I,L);
                   19887:        return cons(reverse(L),LL);
                   19888: }
                   19889:
                   19890: def ntable(F,II,D)
                   19891: {
                   19892:        F=f2df(F|opt=-1);
                   19893:        Df=getopt(dif);
1.16      takayama 19894:        Str=getopt(str);
1.6       takayama 19895:        if(Df!=1) Df=0;
1.16      takayama 19896:        L=[];
                   19897:        if(type(D)==4){
                   19898:                if(type(II[0])==4){
                   19899:                        T1=II[0][1]-II[0][0];T2=II[1][1]-II[1][0];
                   19900:                        for(L0=[],I=0;I<D[0];I++){
                   19901:                                for(R=[],J=0;J<D[1];J++)
                   19902:                                        R=cons(myf2eval(F,II[0][0]+I*T1/D[0],II[1][0]+J*T2/D[1]),R);
                   19903:                                L=cons(reverse(R),L);L0=cons(II[0][0]+I*T1/D[0],L0);
                   19904:                        }
                   19905:                }else{
                   19906:                        for(T=II[1]-II[0],L0=[],I=0;I<D[0];I++){
                   19907:                                for(R=[],J=0;J<D[1];J++)
                   19908:                                        R=cons(myfdeval(F,II[0]+I*T/D[0]+J*T/D[0]/D[1]),R);
                   19909:                                L=cons(reverse(R),L);L0=cons(II[0]+I*T/D[0],L0);
                   19910:                        }
                   19911:                }
                   19912:                L=reverse(L);L0=reverse(L0);
                   19913:                if(type(Str)==4){
                   19914:                        L0=mtransbys(os_md.sint,L0,[Str[0]]|str=1,zero=0);
                   19915:                        L=mtransbys(os_md.sint,L,[Str[1]]|str=1,zero=0);
                   19916:                        if(Df==1){
                   19917:                                for(DT=[],RT=L,I=0;RT!=[];){
                   19918:                                        for(LT=[],TT=car(RT);TT!=[];TT=cdr(TT)){
                   19919:                                                VV=car(TT);
                   19920:                                                if((J=str_char(VV,0,"."))>=0){
                   19921:                                                        if(J==0) VV=str_cut(VV,1,10000);
                   19922:                                                        else VV=str_cut(VV,0,J-1)+str_cut(VV,J+1,10000);
                   19923:                                                }
                   19924:                                                V1=eval_str(VV);
                   19925:                                                if(I++) LT=cons(V1-V0,LT);
                   19926:                                                V0=V1;
                   19927:                                        }
                   19928:                                        DT=cons(LT,DT);
                   19929:                                        if((RT=cdr(RT))==[]){
                   19930:                                                VE=rint(myfdeval(F,II[1])*10^Str[1]);
                   19931:                                                DT=cons([VE-V0],DT);
                   19932:                                        }
                   19933:                                }
                   19934:                                for(I=0,D=[],TT=DT;TT!=[];TT=cdr(TT)){
                   19935:                                        if(!I++) V=car(TT)[0];
                   19936:                                        else{
                   19937:                                                T1=reverse(cons(V,car(TT)));
                   19938:                                                V=car(T1);
                   19939:                                                if(length(TT)>1) T1=cdr(T1);
                   19940:                                                D=cons(T1,D);
                   19941:                                        }
                   19942:                                }
                   19943:                                for(DD=[],TT=D;TT!=[];TT=cdr(TT))
                   19944:                                DD=cons([os_md.lmin(car(TT)),os_md.lmax(car(TT))],DD);
                   19945:                                DD=reverse(DD);
                   19946:                                L=lsort(L,DD,"append");
                   19947:                        }
                   19948:                }
                   19949:                L=lsort(L,L0,"cons");
                   19950:                if(type(Top=getopt(top))==4||getopt(TeX)==1){
                   19951:                        if(type(Top)==4){
                   19952:                                K=length(L[0])-length(Top);
                   19953:                                if(K>0&&K<4){
                   19954:                                        if(K>1){
                   19955:                                                Top=append(Top,["",""]);
                   19956:                                                K-=2;
                   19957:                                        }
                   19958:                                        if(K) Top=cons("",Top);
                   19959:                                }
                   19960:                                L=cons(Top,L);
                   19961:                        }
                   19962:                        if(type(H=getopt(hline))!=4) H=[0,1,z];
                   19963:                        if(type(V=getopt(vline))!=4) V=[0,1,(DF)?z-2:z];
                   19964:                        if(type(T=getopt(title))!=7) Out=ltotex(L|opt="tab",hline=H,vline=V);
                   19965:                        else Out=ltotex(L|opt="tab",hline=H,vline=V,title=T);
                   19966:                        if(Df) Out=str_subst(Out,"\\hline","\\cline{1-"+rtostr(length(L[0])-2)+"}");
                   19967:                        return Out;
                   19968:                }
                   19969:                return L;
                   19970:        }
1.6       takayama 19971:        for(L=[],I=0;I<=D;I++){
                   19972:                X=II[0]+I*T/D;
                   19973:                L=cons([X,myfdeval(F,X)],L);
                   19974:        }
                   19975:        if(Df==1){
                   19976:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   19977:                        if(LD==[]) LD=cons([car(LL)[0],car(LL)[1],0],LD);
                   19978:                        else LD=cons([car(LL)[0],car(LL)[1],abs(car(LL)[1]-car(LD)[1])],LD);
                   19979:                }
                   19980:                L=reverse(LD);
                   19981:        }
1.16      takayama 19982:        if(type(Str)==4){
1.6       takayama 19983:                if(length(Str)==1) Str=[Str[0],Str[0]];
1.16      takayama 19984:                if(Df==1 && length(Str)==2) Str=[Str[0],Str[1],Str[1]];
1.6       takayama 19985:                for(S=Str,Str=[];S!=[];S=cdr(S)){
                   19986:                        if(type(car(S))!=4) Str=cons([car(S),3],Str);
                   19987:                        else Str=cons(car(S),Str);
                   19988:                }
                   19989:                Str=reverse(Str);
                   19990:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   19991:                        for(K=[],J=length(Str); --J>=0; )
                   19992:                                K=cons(sint(car(LL)[J],Str[J][0]|str=Str[J][1]),K);
                   19993:                        LD=cons(K,LD);
                   19994:                }
                   19995:                L=LD;
                   19996:        }else
                   19997:                L=reverse(L);
                   19998:        if(type(M=getopt(mult))==1){
                   19999:                Opt=[["opt","tab"],["vline",[[0,2+Df]]],["width",-M]];
                   20000:                if(type(T=getopt(title))==7)
                   20001:                        Opt=cons(["title",T],Opt);
                   20002:                if(type(Tp=getopt(top))==4)
                   20003:                        Opt=cons(["top",Tp],Opt);
                   20004:                L=ltotex(L|option_list=Opt);
                   20005:        }
                   20006:        return L;
                   20007: }
                   20008:
                   20009: def distpoint(L)
                   20010: {
                   20011:        L=m2l(L|flat=1);
                   20012:        if(getopt(div)==5) Div=5;
                   20013:        else Div=10;
                   20014:        V=newvect(100/Div);
                   20015:     for(LT=L,LL=[],N=0; LT!=[]; LT=cdr(LT)){
                   20016:                if(type(K=car(LT))>1||K<0){
                   20017:                        N++; continue;
                   20018:                }
                   20019:                LL=cons(K,LL);
                   20020:                T=idiv(K,Div);
                   20021:                if(Div==10 && T>=9) T=9;
                   20022:                else if(Div==5 && T>=19) T=19;
                   20023:                V[T]++;
                   20024:        }
                   20025:        V=vtol(V);
                   20026:        if((Opt=getopt(opt))=="data") return V;
                   20027:        Title=getopt(title);
                   20028:        OpList=[["opt","tab"]];
                   20029:        if(type(Title=getopt(title)) == 7)
                   20030:                        OpList=cons(["title",Title],OpList);
                   20031:        if(Opt=="average"){
                   20032:                T=isMs()?["平均点","標準偏差","最低点","最高点","受験人数"]:
                   20033:                ["average","deviation","min","max","examinees"];
                   20034:                L=average(LL);
                   20035:                L=[sint(L[0],1),sint(L[1],1),L[3],L[4],L[2]];
                   20036:                if(N>0){
                   20037:                        T=append(T,[isMs()?"欠席者":"absentees"]);L=append(L,[N]);
                   20038:                }
                   20039:                OpList=cons(["align","c"],OpList);
                   20040:                return ltotex([T,L]|option_list=OpList);
                   20041:        }
                   20042:
                   20043:        if(getopt(opt)=="graph"){
                   20044:                Mul=getopt(size);
                   20045:                if(Div==5){
                   20046:                        V0=["00","05","10","15","20","25","30","35","40","45","50","55",
                   20047:                        "60","65","70","75","80","85","90","95"];
                   20048:                        if(type(Mul)!=4){
                   20049:                                Size = (TikZ)?[12,3,1/2,0.2]:[120,30,1/2,2];
                   20050:                        }
                   20051:                }else{
                   20052:                        V0=["00-","10-","20-","30-","40-","50-","60-","70-","80-","90-"];
                   20053:                        if(type(Mul)!=4){
                   20054:                                Size = (TikZ)?[8,3,1/2,0.2]:[80,30,1/2,2];
                   20055:                        }
                   20056:                }
                   20057:                return ltotex([V,V0]|opt="graph",size=Size);
                   20058:        }
                   20059:        if(Div==5)
                   20060:                V0=["00--04","05--09","10--14","15--19", "20--24", "25--29", "30--34", "35-39",
                   20061:                "40--44", "45--49","50--54", "55--59","60--64", "65--69",
                   20062:                "70--74", "75--79","80--84", "85--89","90--94", "95--100"];
                   20063:        else
                   20064:                V0=["00--09","10--19","20--29","30--39","40--49","50--59","60--69",
                   20065:                "70--79","80--89","90--100"];
                   20066:        Title=getopt(title);
                   20067:        return ltotex([V0,V]|option_list=OpList);
                   20068: }
                   20069:
                   20070: def keyin(S)
                   20071: {
                   20072:        print(S,2);
                   20073:        purge_stdin();
                   20074:        S=get_line();
                   20075:        L=length(S=strtoascii(S));
                   20076:        if(L==0) return "";
                   20077:        return str_cut(S,0,L-2);
                   20078: }
                   20079:
                   20080: def init() {
1.16      takayama 20081:        LS=["DIROUT","DVIOUTA","DVIOUTB","DVIOUTH","DVIOUTL","TeXLim","TeXEq","TikZ",
1.6       takayama 20082:                "XYPrec","XYcm","Canvas"];
                   20083:        if(!access(get_rootdir()+"/help/os_muldif.dvi")||!access(get_rootdir()+"/help/os_muldif.pdf"))
                   20084:                mycat(["Put os_muldif.dvi and os_muldif.pdf in", get_rootdir()+(isMs()?"\\help.":"/help.")]);
                   20085:        if(!isMs()){
                   20086:                DIROUT="%HOME%/asir/tex";
                   20087:                DVIOUTA=str_subst(DVIOUTA,[["\\","/"],[".bat",".sh"]],0);
                   20088:                DVIOUTB=str_subst(DVIOUTB,[["\\","/"],[".bat",".sh"]],0);
                   20089:                DVIOUTL=str_subst(DVIOUTL,[["\\","/"],[".bat",".sh"]],0);
                   20090:                DVIOUTH="%ASIRROOT%/help/os_muldif.pdf";
                   20091:        }
                   20092:        Home=getenv("HOME");
                   20093:        if(type(Home)!=7)       Home="";
                   20094:        for(Id=-7, F=Home; Id<-1;){
                   20095:                G = F+"/.muldif";
                   20096:                if(access(G)) Id = open_file(G);
                   20097:                else Id++;
                   20098:                if(Id==-6)              F+="/asir";
                   20099:                else if(Id==-5) F=get_rootdir();
                   20100:                else if(Id==-4) F+="/bin";
                   20101:                else if(Id==-3) F=get_rootdir()+"/lib-asir-contrib";
                   20102:        }
                   20103:        if(Id>=0){
                   20104:                while((S=get_line(Id))!=0){
1.18      takayama 20105:                        if(type(P=str_str(S,LS))==4 && (P0=str_char(S,P[1]+4,"="))>0){
1.6       takayama 20106:                                if(P[0]<5){
                   20107:                                        P0=str_chr(S,P0+1,"\"");
                   20108:                                        if(P0>0){
                   20109:                                                for(P1=P0;(P2=str_char(S,P1+1,"\""))>0; P1=P2);
                   20110:                                                if(P1>P0+1){
                   20111:                                                        SS=str_cut(S,P0+1,P1-1);
                   20112:                                                        SS=str_subst(SS,["\\\\","\\\""],["\\","\""]);
                   20113:                                                        if(P[0]==0)                     DIROUT=SS;
                   20114:                                                        else if(P[0]==1)        DVIOUTA=SS;
                   20115:                                                        else if(P[0]==2)        DVIOUTB=SS;
                   20116:                                                        else if(P[0]==3)        DVIOUTH=SS;
                   20117:                                                        else if(P[0]==4)        DVIOUTL=SS;
                   20118:                                                }
                   20119:                                        }
                   20120:                                        if(P0<0 || P1<P0+2) mycat(["Error!  Definiton of", LS[P[0]],
                   20121:                                                "in .muldif"]);
                   20122:                                }else{
                   20123:                                        SV=eval_str(str_cut(S,P0+1,str_len(S)-1));
1.16      takayama 20124:                                        if(P[0]==5)                     TeXLim=SV;
                   20125:                                        else if(P[0]==6)        TeXEq=SV;
                   20126:                                        else if(P[0]==7)        TikZ=SV;
                   20127:                                        else if(P[0]==8)        XYPrec=SV;
                   20128:                                        else if(P[0]==9)        XYcm=SV;
1.18      takayama 20129:                                        else if(P[0]==10)       Canvas=SV;
1.6       takayama 20130:                                }
                   20131:                        }
                   20132:                }
                   20133:                close_file(Id);
                   20134:        }
                   20135:        chkfun(1,0);
                   20136: }
                   20137:
                   20138: #ifdef USEMODULE
                   20139: endmodule;
                   20140: os_md.init()$
                   20141: #else
                   20142: init()$
                   20143: #endif
                   20144:
                   20145: end$

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