[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.34

1.34    ! takayama    1: /* $OpenXM: OpenXM/src/asir-contrib/packages/src/os_muldif.rr,v 1.33 2018/08/30 00:52:44 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.31      takayama    9:  *          Toshio Oshima (Nov. 2007 - Jun. 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$
                    305: localf anal2sp$
                    306: localf delopt$
                    307: localf str_char$
                    308: localf str_pair$
                    309: localf str_cut$
                    310: localf str_str$
                    311: localf str_subst$
                    312: localf str_times$
                    313: localf str_tb$
                    314: localf strip$
                    315: localf i2hex$
                    316: localf sjis2jis$
                    317: localf jis2sjis$
                    318: localf s2os$
                    319: localf l2os$
                    320: localf r2os$
                    321: localf s2euc$
                    322: localf s2sjis$
                    323: localf r2ma$
                    324: localf evalma$
                    325: localf ssubgrs$
                    326: localf verb_tex_form$
                    327: localf tex_cuteq$
                    328: localf my_tex_form$
                    329: localf texket$
                    330: localf smallmattex$
                    331: localf divmattex$
                    332: localf dviout0$
                    333: localf myhelp$
                    334: localf isMs$
                    335: localf showbyshell$
                    336: localf readcsv$
                    337: localf tocsv$
                    338: localf getbyshell$
                    339: localf show$
                    340: localf dviout$
                    341: localf rtotex$
                    342: localf mtotex$
                    343: localf ltotex$
                    344: localf texbegin$
                    345: localf texcr$
                    346: localf texsp$
                    347: localf getbygrs$
                    348: localf mcop$
                    349: localf shiftop$
                    350: localf conf1sp$
1.34    ! takayama  351: localf confexp$
1.6       takayama  352: localf pgen$
                    353: localf diagm$
                    354: localf mgen$
                    355: localf madj$
                    356: localf newbmat$
                    357: localf unim$
                    358: localf pfrac$
                    359: localf cfrac$
                    360: localf cfrac2n$
                    361: localf sqrt2rat$
                    362: localf s2sp$
                    363: localf sp2grs$
                    364: localf fimag$
                    365: localf trig2exp$
                    366: localf intpoly$
                    367: localf integrate$
1.22      takayama  368: localf rungeKutta$
1.6       takayama  369: localf simplog$
                    370: localf fshorter$
                    371: localf isshortneg$
                    372: localf intrat$
                    373: localf powsum$
                    374: localf bernoulli$
                    375: localf lft01$
                    376: localf linfrac01$
                    377: localf nthmodp$
                    378: localf issquaremodp$
                    379: localf rootmodp$
                    380: localf rabin$
                    381: localf primroot$
                    382: localf varargs$
                    383: localf ptype$
                    384: localf pfargs$
                    385: localf average$
1.23      takayama  386: localf tobig$
1.6       takayama  387: localf sint$
                    388: localf frac2n$
                    389: localf xyproc$
                    390: localf xypos$
                    391: localf xyput$
                    392: localf xybox$
                    393: localf xyline$
                    394: localf xylines$
                    395: localf xycirc$
                    396: localf xybezier$
                    397: localf lbezier$
                    398: localf draw_bezier$
                    399: localf tobezier$
                    400: localf velbezier$
                    401: localf ptbezier$
                    402: localf cutf$
                    403: localf fsum$
                    404: localf fint$
                    405: localf periodicf$
                    406: localf cmpf$
                    407: localf areabezier$
                    408: localf saveproc$
                    409: localf xygraph$
                    410: localf xy2graph$
1.22      takayama  411: localf addIL$
1.19      takayama  412: localf xy2curve$
1.18      takayama  413: localf xygrid$
1.6       takayama  414: localf xyarrow$
                    415: localf xyarrows$
                    416: localf xyang$
                    417: localf xyoval$
1.33      takayama  418: localf xypoch$
1.6       takayama  419: localf ptcommon$
                    420: localf ptcopy$
                    421: localf ptaffine$
                    422: localf ptlattice$
                    423: localf ptpolygon$
                    424: localf ptwindow$
                    425: localf ptbbox$
                    426: localf lninbox$
                    427: localf ptcombezier$
                    428: localf ptcombz$
                    429: localf lchange$
                    430: localf init$
                    431: localf powprimroot$
                    432: localf distpoint$
                    433: localf ntable$
                    434: localf keyin$
                    435: localf mqsub$
                    436: localf msort$
                    437: #else
                    438: extern Muldif.rr$
                    439: extern TeXEq$
                    440: extern TeXLim$
                    441: extern DIROUT$
1.16      takayama  442: extern DIROUTD$
1.6       takayama  443: extern DVIOUTL$
                    444: extern DVIOUTA$
                    445: extern DVIOUTB$
                    446: extern DVIOUTH$
                    447: extern DVIOUTF$
                    448: static LCOPT$
                    449: static COLOPT$
                    450: static LPOPT$
                    451: static LFOPT$
                    452: extern TikZ$
                    453: extern ErMsg$
                    454: extern FLIST$
                    455: extern IsYes$
                    456: extern XYPrec$
                    457: extern XYcm$
                    458: extern TikZ$
                    459: extern XYLim$
                    460: extern Canvas$
                    461: extern ID_PLOT$
                    462: extern Rand$
                    463: extern LQS$
                    464: #endif
                    465: static S_Fc,S_Dc,S_Ic,S_Ec,S_EC,S_Lc$
1.16      takayama  466: static S_FDot$
1.6       takayama  467: extern AMSTeX$
1.34    ! takayama  468: Muldif.rr="00180921"$
1.6       takayama  469: AMSTeX=1$
                    470: TeXEq=5$
                    471: TeXLim=80$
                    472: TikZ=0$
                    473: XYcm=0$
                    474: XYPrec=3$
                    475: XYLim=4$
                    476: Rand=0$
                    477: DIROUT="%HOME%\\tex"$
                    478: DVIOUTL="%ASIRROOT%\\bin\\risatex0.bat"$
                    479: DVIOUTA="%ASIRROOT%\\bin\\risatex.bat"$
                    480: DVIOUTB="%ASIRROOT%\\bin\\risatex1%TikZ%.bat"$
                    481: DVIOUTH="start dviout -2 -hyper=0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #%LABEL%"$
                    482: DVIOUTF=0$
                    483: LCOPT=["red","green","blue","yellow","cyan","magenta","black","white","gray"]$
                    484: COLOPT=[0xff,0xff00,0xff0000,0xffff,0xffff00,0xff00ff,0,0xffffff,0xc0c0c0]$
                    485: LPOPT=["above","below","left","right"]$
                    486: LFOPT=["very thin","thin","dotted","dashed"]$
                    487: Canvas=[400,400]$
                    488: LQS=[[1,0]]$
                    489:
                    490: ErMsg = newvect(3,[
                    491:  "irregal argument", /* 0 */
                    492:  "too big size",     /* 1 */
                    493:  "irregal option"    /* 2 */
                    494: ])$
                    495: FLIST=0$
                    496: IsYes=[]$
                    497: ID_PLOT=-1$
                    498:
                    499: def erno(N)
                    500: {
                    501:        /* extern ErMsg; */
                    502:        print(ErMsg[N]);
                    503: }
                    504:
                    505: def chkfun(Fu, Fi)
                    506: {
                    507:        /* extern FLIST; */
                    508:        /* extern Muldif.rr; */
                    509:
                    510:        if(type(Fu) <= 1){
                    511:                if(Fu==1)
                    512:                        mycat(["Loaded os_muldif Ver.", Muldif.rr, "(Toshio Oshima)"]);
                    513:                else
                    514:                        mycat(["Risa/Asir Ver.", version()]);
                    515:                return 1;
                    516:        }
                    517:        if(type(FLIST) < 4)
                    518:                FLIST = flist();
                    519:        if(type(Fu) == 4){
                    520:                for(; Fu != [] ;Fu = cdr(Fu))
                    521:                        if(chkfun(car(Fu),Fi) == 0) return 0;
                    522:                return 1;
                    523:        }
                    524:        if(findin(Fu, FLIST) >= 0)
                    525:                return 1;
                    526:        FLIST = flist();
                    527:        if(findin(Fu, FLIST) >= 0)
                    528:                return 1;
                    529:        if(type(Fi)==7){
                    530:                mycat0(["load(\"", Fi,"\") -> try again!\n"],1);
                    531:                load(Fi);
                    532:        }
                    533:        return 0;
                    534: /*
                    535:        if(type(Fi) == 7)
                    536:                Fi = [Fi];
                    537:        for( ; Fi != []; Fi = cdr(Fi))
                    538:                load(car(Fi));
                    539:        FLIST = flist();
                    540:        return (findin(Fu,FLIST)>=0)?1:0;
                    541: */
                    542: }
                    543:
                    544: def makev(L)
                    545: {
                    546:        S = "";
                    547:        Num=getopt(num);
                    548:        while(length(L) > 0){
                    549:                VL = car(L); L = cdr(L);
                    550:                if(type(VL) == 7)
                    551:                        S = S+VL;
                    552:                else if(type(VL) == 2 || VL < 10)
                    553:                        S = S+rtostr(VL);
                    554:                else if(VL<46 && Num!=1)
                    555:                        S = S+asciitostr([VL+87]);
                    556:                else
                    557:                        S = S+rtostr(VL);
                    558:        }
                    559:        return strtov(S);
                    560: }
                    561:
                    562: def makenewv(L)
                    563: {
                    564:        if((V=getopt(var))<2) V="z_";
                    565:        else if(isvar(V)) V=rtostr(V);
                    566:        if(type(N=getopt(num))!=1) N=0;
1.21      takayama  567:        Var=varargs(L|all=2);
1.6       takayama  568:        for(XX=[],I=J=0;;I++){
                    569:                X=strtov(V+rtostr(I));
                    570:                if(findin(X,Var)<0){
                    571:                        XX=cons(X,XX);
                    572:                        if(++J>N) return X;
                    573:                        else if(J==N)  return reverse(XX);
                    574:                }
                    575:        }
                    576: }
                    577:
                    578: def shortv(P,L)
                    579: {
                    580:        V=vars(P);
                    581:        if(type(T=getopt(top))==2) T=strtoascii(rtostr(T))[0]-87;
                    582:        else T=10;
                    583:        for(;L!=[];L=cdr(L)){
                    584:                for(J=0;J<36;J++){
                    585:                        if(findin(X=makev([car(L),J]|num=1),V)>=0){
                    586:                                while(findin(Y=makev([T]),V)>=0) T++;
                    587:                                if(T>35) return P;
                    588:                                P=subst(P,X,Y);
                    589:                                T++;
                    590:                        }else if(J>0) break;
                    591:                }
                    592:        }
                    593:        return P;
                    594: }
                    595:
                    596: def vweyl(L)
                    597: {
                    598:        if(type(L) == 4){
                    599:                if(length(L) == 2)
                    600:                        return L;
                    601:                else
                    602:                        return [L[0],makev(["d",L[0]])];
                    603:        }
                    604:        /* else if(type(L)<2) return L; */
                    605:        return [L,makev(["d", L])];
                    606: }
                    607:
                    608: def mycat(L)
                    609: {
                    610:        if(type(L) != 4){
                    611:                print(L);
                    612:                return;
                    613:        }
                    614:        Opt = getopt(delim);
                    615:        Del = (type(Opt) >= 0)?Opt:" ";
                    616:        Opt = getopt(cr);
                    617:        CR = (type(Opt) >= 0)?0:1;
                    618:        while(L != []){
                    619:                if(Do==1)
                    620:                        print(Del,0);
                    621:                print(car(L),0);
                    622:                L=cdr(L);
                    623:                Do = 1;
                    624:        }
                    625:        if(CR) print("");
                    626: }
                    627:
1.9       takayama  628: def fcat(S,X)
                    629: {
                    630:        if(type(S)!=7){
1.18      takayama  631:                if(type(DIROUTD)!=7){
                    632:                        DIROUTD=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],
                    633:                                [getenv("HOME"),get_rootdir(),"/"])+"/";
                    634:                        if(isMs()) DIROUTD=str_subst(DIROUTD,"/","\\"|sjis=1);
                    635:                }
                    636:                if(S==-1) return;
1.16      takayama  637:                T="fcat";
                    638:                if(S>=2&&S<=9) T+=rtostr(S);
                    639:                T=DIROUTD+T+".txt";
                    640:                if(S==-1) return T;
                    641:                if(S!=0&&access(T)) remove_file(T);
                    642:                S=T;
1.9       takayama  643:        }
1.19      takayama  644:        R=output(S);
1.9       takayama  645:        print(X);
                    646:        output();
1.16      takayama  647:        if(getopt(exe)==1) shell("\""+S+"\"");
1.19      takayama  648:        return R;
1.9       takayama  649: }
                    650:
1.6       takayama  651: def mycat0(L,T)
                    652: {
                    653:        Opt = getopt(delim);
                    654:        Del = (type(Opt) >= 0)?Opt:"";
1.20      takayama  655:        if(type(L)!=4) L=[L];
1.6       takayama  656:        while(L != []){
                    657:                if(Do==1)
                    658:                        print(Del,0);
                    659:                print(car(L),0);
                    660:                L=cdr(L);
                    661:                Do = 1;
                    662:        }
                    663:        if(T) print("");
                    664: }
                    665:
                    666: def findin(M,L)
                    667: {
                    668:        if(type(L)==4){
                    669:                for(I = 0; L != []; L = cdr(L), I++)
                    670:                        if(car(L) == M) return I;
                    671:        }else if(type(L)==5){
                    672:                K=length(L);
                    673:                for(I = 0; I < K; I++)
                    674:                        if(L[I] == M) return I;
                    675:        }else return -2;
                    676:        return -1;
                    677: }
                    678:
                    679: def countin(S,M,L)
                    680: {
1.10      takayama  681:        Step=getopt(step);
                    682:        if(type(Step)==1){
                    683:                N=(Step>0)?Step:-Step;
1.7       takayama  684:                if(type(L)==5) L=vtol(L);
                    685:                L=qsort(L);
                    686:                while(car(L)<S&&L!=[]) L=cdr(L);
                    687:                S+=M;
1.10      takayama  688:                for(R=[],C=I=0;L!=[];){
                    689:                        if(car(L)<S||(Step>0&&car(L)==S)){
1.7       takayama  690:                                C++;
                    691:                                L=cdr(L);
                    692:                        }else{
                    693:                                R=cons(C,R);C=0;S+=M;
1.10      takayama  694:                                if(N>1&&++I>=N) break;
1.7       takayama  695:                        }
                    696:                }
                    697:                if(C>0) R=cons(C,R);
1.10      takayama  698:                if(N>1&&(N-=length(R))>0) while(N-->0) R=cons(0,R);
1.7       takayama  699:                return reverse(R);
                    700:        }
1.6       takayama  701:        if(type(L)==4){
                    702:                for(N=0; L!=[]; L=cdr(L))
                    703:                        if(car(L)>=S && car(L)<=M) N++;
                    704:        }else if(type(L)==5){
                    705:                K=length(L);
                    706:                for(I = 0; I < K; I++)
                    707:                        if(L[I]>=S && L[I]<=M) N++;
                    708:        }else return -2;
                    709:        return N;
                    710: }
                    711:
                    712: def mycoef(P,N,X)
                    713: {
                    714:        if(type(P)<3 && type(N)<3)
                    715:                return coef(P,N,X);
                    716:        if(type(P) >= 4)
                    717: #ifdef USEMODULE
                    718:                return map(os_md.mycoef,P,N,X);
                    719: #else
                    720:                return map(mycoef,P,N,X);
                    721: #endif
                    722:        if(type(N)==4){
                    723:                for(;N!=[];N=cdr(N),X=cdr(X))
                    724:                        P=mycoef(P,car(N),car(X));
                    725:                return P;
                    726:        }
                    727:        if(deg(dn(P), X) > 0){
                    728:                P = red(P);
                    729:                if(deg(dn(P), X) > 0)
                    730:                        return 0;
                    731:        }
                    732:        return red(coef(nm(P),N,X)/dn(P));
                    733: }
                    734:
                    735: def mydiff(P,X)
                    736: {
                    737:        if(X == 0)
                    738:                return 0;
                    739:        if(type(P)<3 && type(X)<3)
                    740:                return diff(P,X);
                    741:        if(type(P) >= 4)
                    742: #ifdef USEMODULE
                    743:                return map(os_md.mydiff,P,X);
                    744: #else
                    745:                return map(mydiff,P,X);
                    746: #endif
                    747:        if(type(X)==4){
                    748:                for(;X!=[];X=cdr(X)) P=mydiff(P,car(X));
                    749:                return P;
                    750:        }
1.19      takayama  751:        if(ptype(dn(P),X)<2)
1.6       takayama  752:                return red(diff(nm(P),X)/dn(P));
                    753:        return red(diff(P,X));
                    754: }
                    755:
                    756: def myediff(P,X)
                    757: {
                    758:        if(X == 0)
                    759:                return 0;
                    760:        if(type(P) < 3)
                    761:                 return ediff(P,X);
                    762:        if(type(P) >= 4)
                    763: #ifdef USEMODULE
                    764:                return map(os_md.myediff,P,X);
                    765: #else
                    766:                return map(myediff,P,X);
                    767: #endif
                    768:        if(deg(dn(P),X) == 0)
                    769:                return red(ediff(nm(P),X)/dn(P));
                    770:        return red(X*diff(P,X));
                    771: }
                    772:
                    773: def m2l(M)
                    774: {
                    775:        if(type(M) < 4)
                    776:                return [M];
                    777:        if(type(M) == 4){
                    778:                if(type(car(M))==4 && getopt(flat)==1){
                    779:                        for(MM = []; M!=[]; M=cdr(M))
                    780:                                MM = append(MM,car(M));
                    781:                        return MM;
                    782:                }
                    783:                return M;
                    784:        }
                    785:        if(type(M) == 5)
                    786:                return vtol(M);
                    787:        S = size(M);
                    788:        for(MM = [], I = S[0]-1; I >= 0; I--)
                    789:                MM = append(vtol(M[I]), MM);
                    790:        return MM;
                    791: }
                    792:
                    793: def mydeg(P,X)
                    794: {
                    795:        if(type(P) < 3)
                    796:                return deg(P,X);
                    797:        II = -1;
                    798:        Opt = getopt(opt);
                    799:        if(type(P) >= 4){
                    800:                S=(type(P) == 6)?size(P)[0]:0;
                    801:                P = m2l(P);
                    802:                for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
                    803:                        if( (DT = mydeg(car(P),X)) == -2)
                    804:                                return -2;
                    805:                        if(DT > Deg){
                    806:                                Deg = DT;
                    807:                                II = I;
                    808:                        }
                    809:                }
                    810:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    811:        }
                    812:        P = red(P);
                    813:        if(deg(dn(P),X) == 0)
                    814:                return deg(nm(P),X);
                    815:        return -2;
                    816: }
                    817:
                    818: def pfctr(P,X)
                    819: {
                    820:        P=red(P);
                    821:        if((T=ptype(P,X))>3) return [];
                    822:        if(T==3){
                    823:                G=pfctr(dn(P),X);
                    824:                F=pfctr(nm(P),X);
                    825:                R=[[car(F)[0]/car(G)[0],1]];
                    826:                for(F=cdr(F);F!=[];F=cdr(F)) R=cons(car(F),R);
                    827:                for(G=cdr(G);G!=[];G=cdr(G)) R=cons([car(G)[0],-car(G)[1]],R);
                    828:                return reverse(R);
                    829:        }
                    830:        F=fctr(nm(P));
                    831:        for(R=[],C=1/dn(P);F!=[];F=cdr(F))
                    832:                if(mydeg(car(F)[0],X)>0) R=cons(car(F),R);
                    833:        else C*=car(F)[0]^car(F)[1];
                    834:        return cons([C,1],reverse(R));
                    835: }
                    836:
                    837: def mymindeg(P,X)
                    838: {
                    839:        if(type(P) < 3)
                    840:                return mindeg(P,X);
                    841:        II = -1;T=60;
                    842:        Opt = getopt(opt);
                    843:        if(type(P) >= 4){
                    844:                S=(type(P) == 6)?size(P)[0]:0;
                    845:                P = m2l(P);
                    846:                for(I = 0, Deg = -3; P != []; P = cdr(P), I++){
                    847:                        if(car(P) == 0)
                    848:                                continue;
                    849:                        if( (DT = mydeg(car(P),X)) == -2)
                    850:                                return -2;
                    851:                        if(DT < Deg || Deg == -3){
                    852:                                if(DT==0){
                    853:                                        if(type(car(P))>=T) continue;
                    854:                                        T=type(car(P));
                    855:                                }
                    856:                                Deg = DT;
                    857:                                II = I;
                    858:                        }
                    859:                }
                    860:                return (Opt==1)?([Deg,(S==0)?II:[idiv(II,S),irem(II,S)]]):Deg;
                    861:        }
                    862:        P = red(P);
                    863:        if(deg(dn(P),X) == 0)
                    864:                return mindeg(nm(P),X);
                    865:        return -2;
                    866: }
                    867:
                    868: def m1div(M,N,L)
                    869: {
                    870:        L = (type(L) <= 3)?[0,L]:vweyl[L];
                    871:        DX = L[1]; X = L[0];
                    872:        if(mydeg(N,DX) != 0)
                    873:                return 0;
                    874:        DD = mydeg(M,DX);
                    875:        MM = M;
                    876:        while( (Deg=mydeg(MM,DX)) > 0){
                    877:                MC = mycoef(MM,Deg,DX)*DX^(Deg-1);
                    878:                MS = radd(MC, MS);
                    879:                MM = radd(MM, muldo(MC,radd(-DX,N),L));
                    880:  }
                    881:  return [MM, MS];
                    882: }
                    883:
                    884:
                    885: def mulsubst(F,L)
                    886: {
                    887:        N = length(L);
                    888:        if(N == 0)
                    889:                return F;
                    890:        if(type(L[0])!=4)       L=[L];
                    891:        if(getopt(inv)==1){
                    892:                for(R=[];L!=[];L=cdr(L)) R=cons([car(L)[1],car(L)[0]],R);
                    893:                L=reverse(R);
                    894:        }
                    895:        if(length(L)==1)        return mysubst(F,L);
                    896:        L1 = newvect(N);
                    897:        for(J = 0; J < N ; J++)
                    898:                L1[J] = uc();
                    899:        L2 = newvect(N);
                    900:        for(J = 0; J < N; J++){
                    901:                S = L[J][1];
                    902:                for(I = 0; I < N; I++)
                    903:                        S = mysubst(S,[L[I][0],L1[I]]);
                    904:                L2[J] = S;
                    905:        }
                    906:        for(J = 0; J < N; J++)
                    907:                F = mysubst(F, [L[J][0],L2[J]]);
                    908:        for(J = 0; J < N; J++)
                    909:                F = mysubst(F, [L1[J],L[J][0]]);
                    910:        return F;
                    911: }
                    912:
                    913: def cmpsimple(P,Q)
                    914: {
                    915:        T = getopt(comp);
                    916:        if(P == Q)
                    917:                return 0;
                    918:        D = 0;
                    919:        if(type(T) < 0)
                    920:                T = 7;
                    921:        if(iand(T,1))
                    922:                D = length(vars(P)) - length(vars(Q));
                    923:        if(!D && iand(T,2))
                    924:                D = nmono(P) - nmono(Q);
                    925:        if(!D && iand(T,4))
                    926:                D = str_len(rtostr(P)) - str_len(rtostr(Q));
                    927:        if(!D){
                    928:                 if(P > Q) D++;
                    929:                 else D--;
                    930:        }
                    931:        return D;
                    932: }
                    933:
                    934: def simplify(P,L,T)
                    935: {
                    936:        if(type(P) > 3)
                    937: #ifdef USEMODULE
                    938:                return map(os_md.simplify,P,L,T);
                    939: #else
                    940:                return map(simplify,P,L,T);
                    941: #endif
                    942:        if(type(L[0]) == 4){
                    943:                if(length(L[0]) > 1)
                    944: #if USEMODULE
                    945:                        return fmult(os_md.simplify,P,L,[T]);
                    946: #else
                    947:                        return fmult(simplify,P,L,[T]);
                    948: #endif
                    949:                L = L[0];
                    950:        }
                    951:        if(type(Var=getopt(var)) == 4 && Var!=[]){
                    952:                if(type(P) == 3)
                    953:                        return simplify(nm(P),P,L,T|var=Var)/simplify(dn(P),P,L,T|var=Var);
                    954:                V = car(Var);
                    955:                if((I = mydeg(P,V)) > 0){
                    956:                        Var = cdr(Var);
                    957:                        for(Q=0; I>=0 ; I--)
                    958:                                Q += simplify(mycoef(P,I,V), L, T|var=Var)*V^I;
                    959:                        return Q;
                    960:                }
                    961:        }
                    962:        if(length(L) == 1){
                    963:                L = car(L);
                    964:                for(V = vars(L); V != []; V = cdr(V)){
                    965:                        VT = car(V);
                    966:                        if(deg(L,VT) != 1) continue;
                    967:                        P = simplify(P, [VT, -red(coef(L,0,VT)/coef(L,1,VT))], T);
                    968:                }
                    969:                return P;
                    970:        }
                    971:        Q = mysubst(P,[L[0],L[1]]);
                    972:        return (cmpsimple(P,Q|comp=T) <= 0)?P:Q;
                    973: }
                    974:
                    975: def monotos(P)
                    976: {
                    977:        if(nmono(P) <= 1)
                    978:                return rtostr(P);
                    979:        return "("+rtostr(P)+")";
                    980: }
                    981:
                    982:
                    983: def monototex(P)
                    984: {
                    985:        Q=my_tex_form(P);
                    986:        if(nmono(P)<2 && (getopt(minus)!=1 || str_str(Q,"-"|top=0,end=0)<0))
                    987:                return Q;
                    988:        return "("+Q+")";
                    989: }
                    990:
                    991: def minustos(S)
                    992: {
                    993:        if(str_str(S,"-"|top=0,end=0)<0) return S;
                    994:        return "("+S+")";
                    995: }
                    996:
                    997: def vnext(V)
                    998: {
                    999:        S = length(V);
                   1000:        for(I = S-1; I > 0; I--){
                   1001:                if(V[I-1] < V[I]){
                   1002:                        V0 = V[I-1];
                   1003:                        for(J = I+1; J < S; J++)
                   1004:                                if(V0 >= V[J]) break;
                   1005:                        V[I-1] = V[--J];
                   1006:                        V[J] = V0;
                   1007:                        for(J = S-1; I < J; I++, J--){
                   1008:                                V0 = V[I];
                   1009:                                V[I] = V[J];
                   1010:                                V[J] = V0;
                   1011:                        }
                   1012:                        return 1;
                   1013:                }
                   1014:        }
                   1015:        return 0;
                   1016: }
                   1017:
                   1018: def ldict(N, M)
                   1019: {
                   1020:        Opt = getopt(opt);
                   1021:        R = S = [];
                   1022:        for(I = 2; N > 0; I++){
                   1023:                R = cons(irem(N,I), R);
                   1024:                N = idiv(N,I);
                   1025:        }
                   1026:        L = LL = length(R);
                   1027:        T=newvect(LL+1);
                   1028:        while(L-- > 0){
                   1029:                V = car(R); R = cdr(R);
                   1030:                for(I = J = 0; J <= V ; I++){
                   1031:                        if(T[I] == 0)
                   1032:                                J++;
                   1033:                }
                   1034:                T[I-1] = 1;
                   1035:                S = cons(LL-I+1, S);
                   1036:        }
                   1037:        for(I = 0; I <= LL; I++){
                   1038:                if(T[I] == 0){
                   1039:                        S = cons(LL-I, S);
                   1040:                        break;
                   1041:                }
                   1042:        }
                   1043:        if(M == 0)
                   1044:                return S;
                   1045:        if(M <= LL){
                   1046:                print("too small size");
                   1047:                return 0;
                   1048:        }
                   1049:        T = [];
                   1050:        for(I = --M; I > LL; I--)
                   1051:                T = cons(I,T);
                   1052:        S = append(S,T);
                   1053:        if(Opt == 2 || Opt == 3)
                   1054:                S = reverse(S);
                   1055:        if(Opt != 1 && Opt != 3)
                   1056:                return S;
                   1057:        for(T = []; S != []; S = cdr(S))
                   1058:                T = cons(M-car(S),T);
                   1059:        return T;
                   1060: }
                   1061:
                   1062: def ndict(L)
                   1063: {
                   1064:        Opt = getopt(opt);
                   1065:        R = [];
                   1066:        if(Opt != 1 && Opt != 2)
                   1067:                L = reverse(L);
                   1068:        T = (Opt == 1 || Opt == 3)?1:0;
                   1069:        for( ; L != []; L = cdr(L)){
                   1070:                for(I = 0, V = car(L), LT = cdr(L); LT != []; LT = cdr(LT))
                   1071:                        if(T == 0){
                   1072:                                if(V < car(LT)) I++;
                   1073:                        }else if (V > car(LT)) I++;
                   1074:                R = cons(I, R);
                   1075:        }
                   1076:        R = reverse(R);
                   1077:        for(V = 0, I = length(R); I > 0; R = cdr(R), I--)
                   1078:                V = V*I + car(R);
                   1079:        return V;
                   1080: }
                   1081:
                   1082: def nextsub(L,N)
                   1083: {
                   1084:        if(type(L) == 1){
                   1085:                for(LL = [], I = L-1; I >= 0; I--)
                   1086:                        LL = cons(I,LL);
                   1087:                return LL;
                   1088:        }
                   1089:        M = length(L = ltov(L));
                   1090:        K = N-M;
                   1091:        for(I = M-1; I >= 0; I--)
                   1092:                if(L[I] < I+K) break;
                   1093:        if(I < 0)
                   1094:                return 0;
                   1095:        for(J = L[I]+1; I < M; I++, J++)
                   1096:                L[I] = J;
                   1097:        return vtol(L);
                   1098: }
                   1099:
                   1100: def nextpart(L)
                   1101: {
                   1102:        if(car(L) <= 1)
                   1103:                return 0;
                   1104:        for(I = 0, L = reverse(L); car(L) == 1; L=cdr(L))
                   1105:                I++;
                   1106:        I += (K = car(L));
                   1107:        R = irem(I,--K);
                   1108:        R = (R==0)?[]:[R];
                   1109:        for(J = idiv(I,K); J > 0; J--)
                   1110:                R = cons(K,R);
                   1111:        L = cdr(L);
                   1112:        while(L!=[]){
                   1113:                R = cons(car(L), R);
                   1114:                L = cdr(L);
                   1115:        }
                   1116:        return R;
                   1117: }
                   1118:
                   1119: def transpart(L)
                   1120: {
                   1121:        L = reverse(L);
                   1122:        for(I=1, R=[]; L!= []; I++){
                   1123:                R = cons(length(L), R);
                   1124:                while(L != [] && car(L) <= I)
                   1125:                        L = cdr(L);
                   1126:        }
                   1127:        return reverse(R);
                   1128: }
                   1129:
                   1130: def trpos(A,B,N)
                   1131: {
                   1132:        S = newvect(N);
                   1133:        for(I = 0; I < N; I++)
                   1134:                S[I]=(I==A)?B:((I==B)?A:I);
                   1135:        return S;
                   1136: }
                   1137:
                   1138: def sprod(S,T)
                   1139: {
                   1140:        L = length(S);
                   1141:        V = newvect(L);
                   1142:        while(--L >= 0)
                   1143:                V[L] = S[T[L]];
                   1144:        return V;
                   1145: }
                   1146:
                   1147: def sinv(S)
                   1148: {
                   1149:        L = length(S);
                   1150:        V = newvect(L);
                   1151:        while(--L >= 0)
                   1152:                V[S[L]] = L;
                   1153:        return V;
                   1154: }
                   1155:
                   1156: def slen(S)
                   1157: {
                   1158:        L = length(S);
                   1159:        for(V = 0, J = 2; J < L; i++){
                   1160:                for(I = 0; I < J; I++)
                   1161:                        if(S[I] > S[J]) V++;
                   1162:        }
                   1163:        return V;
                   1164: }
                   1165:
                   1166: def sord(W,V)
                   1167: {
                   1168:        L = length(W);
                   1169:        W0 = nevect(L);
                   1170:        V0 = newvect(L);
                   1171:        for(I = F = C = 0; I < L; I++){
                   1172:                C = 0;
                   1173:                if( (W1 = W[I]) > (V1 = V[I]) ){
                   1174:                        if(F < 0) C = 1;
                   1175:                        else if(F==0) F = 1;
                   1176:                }else if(W1 < V1){
                   1177:                        if(F > 0) C = 1;
                   1178:                        else if(F==0) F = -1;
                   1179:                }
                   1180:                for(J = I;--J >= 0 && W0[J] > W1; ) W0[J+1] = W0[J];
                   1181:                W0[J+1] = W1;
                   1182:                for(J = I;--J >= 0 && V0[J] > V1; ) V0[J+1] = V0[J];
                   1183:                V0[J+1] = V1;
                   1184:                if(C){
                   1185:                        for(J = I; J >= 0; J--){
                   1186:                                if((W1=W0[J]) == (V1=V0[J])) continue;
                   1187:                                if(W1 > V1){
                   1188:                                        if(F < 0) return 2;
                   1189:                                }
                   1190:                                else if(F > 0) return 2;
                   1191:                        }
                   1192:                }
                   1193:        }
                   1194:        return F;
                   1195: }
                   1196:
                   1197: def vprod(V1,V2)
                   1198: {
                   1199:        for(R = 0, I = length(V1)-1; I >= 0; I--)
                   1200:                R = radd(R, rmul(V1[I], V2[I]));
                   1201:        return R;
                   1202: }
                   1203:
                   1204: def dnorm(V)
                   1205: {
                   1206:        if(type(V)<2) return dabs(V);
                   1207:        R=0;
                   1208:        if(type(V)!=4)
                   1209:                for (I = length(V)-1; I >= 0; I--) R+= V[I]^2;
                   1210:        else{
                   1211:                if(type(V[0])>3){
                   1212:                        V=ltov(V[0])-ltov(V[1]);
                   1213:                        return dnorm(V);
                   1214:                }
                   1215:                for(;V!=[]; V=cdr(V))   R+=car(V)^2;
                   1216:        }
                   1217:        return dsqrt(R);
                   1218: }
                   1219:
                   1220: def dvprod(V1,V2)
                   1221: {
                   1222:        if(type(V1)<2) return V1*V2;
                   1223:        R=0;
                   1224:        if(type(V1)!=4)
                   1225:                for(I = length(V1)-1; I >= 0; I--)
                   1226:                        R += V1[I]*V2[I];
                   1227:        else{
                   1228:                for(; V1!=[]; V1=cdr(V1),V2=cdr(V2))
                   1229:                        R+=car(V1)*car(V2);
                   1230:        }
                   1231:        return R;
                   1232: }
                   1233:
                   1234: def dvangle(V1,V2)
                   1235: {
                   1236:        if(V2==0 && type(V1)==4 && length(V1)==3 &&
                   1237:          (type(V1[0])==4 || type(V1[0])==5 || type(V1[1])==4 || type(V1[1])==5 ||
                   1238:           type(V1[2])==4 || type(V1[2])==5) ){
                   1239:                if(V1[0]==0 || V1[1]==0 || V1[2]==0) return 1;
                   1240:                PV2=V1[1];
                   1241:                if(type(PV2)==4){
                   1242:                        PV2=ltov(PV2);
                   1243:                        return dvangle(PV2-ltov(V1[0]),ltov(V1[2])-PV2);
                   1244:                }else
                   1245:                        return dvangle(PV2-V1[0],V1[2]-PV2);
                   1246:        }
                   1247:        if((L1=dnorm(V1))==0 || (L2=dnorm(V2))==0) return 1;
                   1248:        return dvprod(V1,V2)/(L1*L2);
                   1249: }
                   1250:
                   1251: def mulseries(V1,V2)
                   1252: {
                   1253:        L = length(V1);
                   1254:        if(size(V2) < L)
                   1255:                L = size(V2);
                   1256:        VV = newvect(L);
                   1257:        for(J = 0; J < L; J++){
                   1258:                for(K = R = 0; K <= J; K++)
                   1259:                        R = radd(R,rmul(V1[K],V2[J-K]));
                   1260:                VV[J] = R;
                   1261:        }
                   1262:        return VV;
                   1263: }
                   1264:
1.13      takayama 1265: def scale(L)
                   1266: {
1.23      takayama 1267:        T=F=0;LS=1;
1.18      takayama 1268:        Pr=getopt(prec);
1.23      takayama 1269:        Inv=getopt(inv);
                   1270:        Log10=dlog(10);
                   1271:        if(type(L)==7){
                   1272:                V=findin(L,["CI","DI","CIF","CIF'","DIF","DIF'","SI","TI1","TI2","STI"]);
                   1273:                if(V>=0){
                   1274:                        L=["C","D","CF","CF'","DF","DF'","S","T1","T2","ST"];
                   1275:                        Inv=1;L=L[V];
                   1276:                }
                   1277:                V=findin(L,["C","A","K","CF","CF'","S","T1","T2","ST","LL0","LL1","LL2","LL3","LL00",
                   1278:                        "LL01","LL02","LL03"])+1;
                   1279:                if(V==0) V=findin(L,["D","B","K","DF","DF'"])+1;
                   1280:                if(V>0) L=V;
                   1281:        }
                   1282:        if(type(OL=L)!=4){
1.15      takayama 1283:                if(L==2){
1.23      takayama 1284:                        L=(Pr==0)?
1.18      takayama 1285:                          [[[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 1286:                   [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5]],
1.18      takayama 1287:                   [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10]]]:
                   1288:                           [[[1,2,1/50],[2,5,1/20],[5,10,1/10], [10,20,1/5],[20,50,1/2],[50,100,1]],
                   1289:                                [[1,5,1/10],[5,10,1/2], [10,20,1],[50,100,5]],
                   1290:                                [[1,5,1/2],[5,10,1], [10,50,5],[50,100,10]]];
1.23      takayama 1291:                        LS=2;M2=[[1,10,1],[10,100,10]];
1.15      takayama 1292:                }else if(L==3){
1.23      takayama 1293:                        L=(Pr==0)?
1.18      takayama 1294:                          [[[1,2,1/20],[2,5,1/10],[5,10,1/5], [10,20,1/2],[20,50,1],[50,100,2],
                   1295:                   [100,200,5],[200,500,10],[500,1000,20]],
1.15      takayama 1296:                        [[1,2,1/10],[2,5,1/2], [10,20,1],[20,50,5], [100,200,10],[200,500,50]],
1.18      takayama 1297:                        [[1,2,1/2],[2,10,1], [10,20,5],[20,100,10], [100,200,50],[200,1000,100]]]:
                   1298:                          [[[1,2,1/50],[2,5,1/20],[5,10,1/10],[10,20,1/5],[20,50,1/2],[50,100,1],
                   1299:                              [100,200,2],[200,500,5],[500,1000,10]],
                   1300:                                [[1,5,1/10],[5,10,1/2], [10,50,1],[50,100,5], [100,500,10],[500,1000,50]],
1.23      takayama 1301:                                [[1,5,1/2],[5,10,1],[10,50,5],[50,100,10], [100,500,50],[500,1000,100]]];
                   1302:                        LS=3;M2=[[1,5,1],[10,50,10],[100,500,100],[500,1000,500]];
                   1303:                }else if(L>9&&L<18){
1.26      takayama 1304:                        if(L<18){       /* LL0 - LL3, LL00 - LL03 */
1.23      takayama 1305:                                if(L==10){
                   1306:                                        L=[ [[1.001,1.002,0.00001],[1.002,1.005,0.00002],[1.005,1.0105,0.00005]],
                   1307:                                                [[1.001,1.002,0.00005],[1.002,1.005,0.0001], [1.005,1.0105,0.0001]],
                   1308:                                                [[1.001,1.002,0.0001],[1.002,1.005,0.0005], [1.005,1.0105,0.0005]]];
                   1309:                                        M2=[1.001,1.0015,1.002,1.003,1.004,1.005,1.006,1.007,1.008,1.009,1.01];
                   1310:                                }
                   1311:                                if(L==11){
                   1312:                                        L=[ [[1.01,1.02,0.0001],[1.02,1.05,0.0002],[1.05,1.105,0.0005]],
                   1313:                                                [[1.01,1.02,0.0005],[1.02,1.05,0.001], [1.05,1.105,0.001]],
                   1314:                                                [[1.01,1.02,0.001],[1.02,1.05,0.005], [1.05,1.105,0.005]]];
                   1315:                                        M2=[1.01,1.015,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10];
                   1316:                                }else if(L==12){
                   1317:                                        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],
                   1318:                                              [2.5,2.72,0.02]],
                   1319:                                                [[1.105,1.2,0.005],[1.2,1.4,0.01],[1.4,1.8,0.01],[1.8,2.5,0.05],
                   1320:                                              [2.5,2.72,0.1]],
                   1321:                                                [[1.105,1.2,0.01],[1.2,1.4,0.05],[1.4,1.8,0.05],[1.8,2.5,0.1],
                   1322:                                              [2.5,2.72,0.1]]];
1.26      takayama 1323:                                        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 1324:                                }else if(L==13){
                   1325:                                        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],
                   1326:                                                 [50,100,2],[100,200,5],[200,400,10],[400,500,20],[500,1000,50],
                   1327:                                                 [1000,2000,100],[2000,5000,200],[5000,10000,500],[10000,22000,1000]],
                   1328:                                                [[2.7,4,0.1],[4,6,0.1],[6,10,0.5],[10,15,1],[15,30,1],[30,50,5],
                   1329:                                                 [50,100,10],[100,200,10],[200,400,50],[400,500,100],[500,1000,100],
                   1330:                                                 [1000,2000,500],[2000,5000,1000],[5000,10000,1000],[10000,22000,5000]],
                   1331:                                                [[3,4,0.5],[4,6,0.5],[6,10,1],[10,15,5],[15,30,5],[30,50,10],
                   1332:                                                 [50,100,50],[100,200,50],[200,400,100],[400,500,100],[500,1000,500],
                   1333:                                                 [1000,2000,1000],[2000,5000,3000],[5000,10000,5000],[10000,22000,10000]]];
                   1334:                                        M2=[3,4,5,6,7,8,9,10,15,20,30,40,50,100,200,500,1000,2000,5000,10000,20000];
                   1335:                                }else if(L==14){
1.26      takayama 1336:                                        L=[ [[0.998,0.999,0.00001],[0.995,0.998,0.00002],[0.99,0.995,0.00005]],
                   1337:                                                [[0.998,0.999,0.00005],[0.995,0.998,0.0001],[0.99,0.995,0.0001]],
                   1338:                                                [[0.998,0.999,0.0001],[0.995,0.998,0.0005],[0.99,0.995,0.0005]]];
1.23      takayama 1339:                                        M2=[0.999,0.9985,0.998,0.997,0.996,0.995,0.994,0.993,0.992,0.991,0.99];
                   1340:                                }else if(L==15){
1.26      takayama 1341:                                        L=[ [[0.98,0.9901,0.0001],[0.95,0.98,0.0002],[0.905,0.95,0.0005]],
                   1342:                                                [[0.98,0.99,0.0005],[0.95,0.98,0.001], [0.905,0.95,0.001]],
1.23      takayama 1343:                                                [[0.98,0.99,0.001],[0.95,0.98,0.005], [0.91,0.95,0.005]]];
                   1344:                                        M2=[0.99,0.985,0.98,0.97,0.96,0.95,0.94,0.93,0.92,0.91];
                   1345:                                }else if(L==16){
1.26      takayama 1346:                                        L=[ [[0.8,0.906,0.001],[0.6,0.8,0.002],[0.37,0.6,0.005]],
                   1347:                                                [[0.8,0.906,0.005],[0.6,0.8,0.01],[0.37,0.6,0.01]],
                   1348:                                                [[0.8,0.9,0.01],[0.6,0.8,0.05],[0.4,0.6,0.05]]];
                   1349:                                        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 1350:                                }else{
1.26      takayama 1351:                                        L=[ [[0.05,0.37,0.002],[0.02,0.05,0.001],[0.01,0.02,0.0005],
                   1352:                                                 [0.005,0.01,0.0002],[0.001,0.005,0.0001],
                   1353:                                                 [0.0005,0.001,0.00002],[0.0001,0.0005,0.00001],[0.00005,0.0001,0.000002]],
                   1354:                                                [[0.05,0.37,0.01],[0.02,0.05,0.002],[0.01,0.02,0.001],
                   1355:                                                 [0.005,0.01,0.001],[0.001,0.005,0.0002],
                   1356:                                                 [0.0005,0.001,0.0001],[0.0001,0.0005,0.00002],[0.00005,0.0001,0.00001]],
                   1357:                                                [[0.05,0.37,0.05],[0.02,0.05,0.01],[0.01,0.02,0.005],
                   1358:                                                 [0.005,0.01,0.005],[0.002,0.005,0.001],
                   1359:                                                 [0.0005,0.001,0.0005],[0.0001,0.0005,0.0001],[0.00005,0.0001,0.00005]]];
                   1360:                                        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 1361:                                }
                   1362:                        }
1.15      takayama 1363:                }else{
1.23      takayama 1364:                        if(L==6){       /* S */
                   1365:                                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]],
                   1366:                                        [[6-1/6,15,1/6],[15,30,1/2],[30,70,1],[70,80,5],[80,90,10]],
                   1367:                                        [[6,15,1/2],[15,30,1],[30,70,5],[70,90,10]] ];
                   1368:                                M2=[6,7,8,9,10,15,20,30,40,50,60,70,90];
                   1369:                        }else if(L==7){ /* T1 */
                   1370:                                F=log(tan(x*3.1416/180))/Log10+1;
                   1371:                                L=[ [[6-1/3,15,1/12],[15,45,1/6]],
                   1372:                                        [[6-1/3,15,1/6],[15,45,1/2]],
                   1373:                                        [[6,45,1]] ];
                   1374:                                M2=[6,7,8,9,10,15,20,30,40,45];
                   1375:                        }else if(L==8){ /* T2 */
                   1376:                                L=[ [[45,75,1/6],[75,84+1/6,1/12]],
                   1377:                                        [[45,75,1],[75,84+1/6,1/6]],
                   1378:                                        [[45,84,1]] ];
                   1379:                                M2=[45,50,60,70,75,80,81,82,83,84];
                   1380:                        }else if(L==9){ /* ST */
                   1381:                                L=[ [[35/60,1,1/120],[1,2,1/60],[2,5+9/12,1/30]],
                   1382:                                        [[35/60,1,1/60],[1,2,1/6],[2,5+9/12,1/6]],
                   1383:                                        [[40/60,1,1/6],[1,2,1/2],[2,5+9/12,1]] ];
                   1384:                                M2=[1,2,3,4,5];
                   1385:                        }else{
                   1386:                                M2=(L==4||L==5)?[[1,2,1/2],[2,9,1]]:[[1,2,1/2],[2,10,1]];
                   1387:                                L=(Pr==0)?
                   1388:                                [ [[1,2,1/50],[2,5,1/20],[5,10,1/10]],
                   1389:                                  [[1,5,1/10],[5,10,1/2]],
                   1390:                                  [[1,5,1/2],[5,10,1]] ]:
                   1391:                                [[[1,2,1/100],[2,5,1/50],[5,10,1/20]],
                   1392:                              [[1,2,1/20],[2,10,1/10]],
                   1393:                              [[1,2,1/10],[2,10,1/2]] ];
                   1394:                        }
1.15      takayama 1395:                }
                   1396:        }else if(type(L[0])!=4){
                   1397:                L=[L];
                   1398:                if(length(L)!=3||L[0]+L[2]>L[1]) T=L;
1.13      takayama 1399:        }
1.15      takayama 1400:        if(T==0){
                   1401:                if(type(L[0][0])!=4) L=[L];
                   1402:                for(R=[];L!=[];L=cdr(L)){
                   1403:                        for(RR=[],LT=car(L);LT!=[];LT=cdr(LT))
                   1404:                                for(I=car(LT)[0];I<=car(LT)[1];I+=car(LT)[2]) RR=cons(I,RR);
                   1405:                RR=lsort(RR,[],1);
                   1406:                        R=cons(RR,R);
                   1407:                }
                   1408:                R=reverse(R);
                   1409:                for(T=[];R!=[];R=cdr(R)){
                   1410:                        if(length(R)>1) T=cons(lsort(R[0],R[1],"setminus"),T);
                   1411:                        else T=cons(R[0],T);
                   1412:                }
1.13      takayama 1413:        }
                   1414:        V0=dlog(10);
                   1415:        S0=S1=1;D0=D1=0;
                   1416:        SC=getopt(scale);
                   1417:        if(type(SC)==4){
                   1418:                S0=SC[0];S1=SC[1];
1.18      takayama 1419:        }else if(type(SC)==1){
                   1420:                S0=SC;S1=0;
1.13      takayama 1421:        }else return T;
                   1422:        if(type(D=getopt(shift))==4){
                   1423:                D0=D[0];D1=D[1];
1.31      takayama 1424:        }else if(type(D)<2&&type(D)>=0){
1.23      takayama 1425:                D0=0;D1=D;
1.31      takayama 1426:        };
1.23      takayama 1427:        if(Inv==1){
                   1428:                D0+=S0;S0=-S0;
1.13      takayama 1429:        }
1.23      takayama 1430:        if(type(TF=getopt(f))>1) F=TF;
                   1431:        if(F) F=f2df(F);
                   1432:        if(type(I=getopt(ol))==1&&OL>3) OL=I;
1.18      takayama 1433:        for(M=M0=[],I=length(T);T!=[];T=cdr(T),I--){
1.13      takayama 1434:                for(S=car(T);S!=[];S=cdr(S)){
1.23      takayama 1435:                        VS=car(S);
                   1436:                        if(F) V=myfdeval(F,car(S));
                   1437:                        else if(OL==4) V=frac(dlog(VS)/Log10+0.5);
                   1438:                        else if(OL==5) V=frac(dlog(VS*3.1416)/Log10);
                   1439:                        else if(OL>5&&OL<10){
                   1440:                                VS=VS*3.1416/180;
                   1441:                                if(OL==6) V=dlog(dsin(VS))/Log10+1;
                   1442:                                else if(OL==9) V=dlog(VS)/Log10+2;
                   1443:                                else V=dlog(dtan(VS))/Log10+8-OL;
                   1444:                        }
                   1445:                        else if(OL>9&&OL<14) V=dlog(dlog(VS))/Log10+13-OL;
                   1446:                        else if(OL>13&&OL<18) V=dlog(-dlog(VS))/Log10+17-OL;
                   1447:                        else V=dlog(VS)/Log10/LS;
                   1448:                        V*=S0;
1.13      takayama 1449:                        if(S1!=0){
                   1450:                                M=cons([V+D0,D1],M);
1.23      takayama 1451:                                M=cons([V+D0,((length(SC)>2)?SC[I]:(I*S1))+D1],M);
1.13      takayama 1452:                                M=cons(0,M);
1.18      takayama 1453:                        }else M0=cons(V+D0,M0);
1.13      takayama 1454:                }
1.18      takayama 1455:                if(S1==0) M=cons(reverse(M0),M);
1.13      takayama 1456:        }
                   1457:        if(S1!=0) M=cdr(M);
1.18      takayama 1458:        if(S1==0||getopt(TeX)!=1) return M;
1.13      takayama 1459:        M=reverse(M);
1.23      takayama 1460:        if(type(U=getopt(line))==4){
                   1461:                if(Inv==1) U=[U[0]+S0,U[1]+S0];
1.18      takayama 1462:                M=cons([U[0]+D0,D1],cons([U[1]+D0,D1],cons(0,M)));
1.23      takayama 1463:        }
                   1464:        if((VT=getopt(vert))==1){
                   1465:                for(N=[];M!=[];M=cdr(M)){
                   1466:                        if(type(TM=car(M))==4) N=cons([TM[1],TM[0]],N);
                   1467:                        else N=cons(TM,N);
                   1468:                }
                   1469:                M=reverse(N);
                   1470:        }
1.18      takayama 1471:        if(type(Col=getopt(col))<1) S=xylines(M);
                   1472:        else S=xylines(M|opt=Col);
                   1473:        if(type(Mes=getopt(mes))==4){
1.23      takayama 1474:                if(length(Mes)==1&&type(M2)==4) Mes=cons(car(Mes),M2);
1.18      takayama 1475:                S3=car(Mes);
                   1476:                if(type(S3)==4){
                   1477:                        Col=S3[1];
                   1478:                        S3=car(S3);
                   1479:                }else Col=0;
                   1480:                V=car(scale(cdr(Mes)));
1.23      takayama 1481:                if(!F) Mes=scale(cdr(Mes)|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
1.18      takayama 1482:                else Mes=scale(cdr(Mes)|f=F,scale=[S0,0],shift=[D0,D1]);
                   1483:                for(M=car(Mes);M!=[];M=cdr(M),V=cdr(V)){
1.23      takayama 1484:                        TV=deval(car(V));
                   1485:                        if(Col!=0) TV=[Col,TV];
                   1486:                        S+=(VT==1)?xyput([S3+D1,car(M),TV]):xyput([car(M),S3+D1,TV]);
                   1487:                }
                   1488:        }
                   1489:        if(type(Mes=getopt(mes2))==4){
                   1490:                if(type(car(Mes))!=4) Mes=[Mes];
                   1491:                for(;Mes!=[];Mes=cdr(Mes)){
                   1492:                        TM=car(Mes);
                   1493:                        if(!F) V=scale([car(TM)]|scale=[S0/LS,0],shift=[D0,D1],ol=OL);
                   1494:                        else V=scale([car(TM)]|f=F,scale=[S0,0],shift=[D0,D1]);
                   1495:                        V=car(car(V));
                   1496:                        TM=cdr(TM);
                   1497:                        if(type(Col=car(TM))==4){
                   1498:                                C0=Col[0];C1=Col[1];
                   1499:                                if(length(Col)==3){
                   1500:                                        S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]|opt=Col[2])
                   1501:                                                :xyline([V,D1+C0],[V,D1+C1]|opt=Col[2]);
                   1502:                                }else S+=(VT==1)?xyline([D1+C0,V],[D1+C1,V]):xyline([V,D1+C0],[V,D1+C1]);
                   1503:                        }
                   1504:                        if(type(TM[1]<2)){
                   1505:                                TM=cdr(TM);
                   1506:                                S3=car(TM);
                   1507:                        }
                   1508:                        S+=(VT==1)?xyput([S3+D1,V,TM[1]]):xyput([V,S3+D1,TM[1]]);
1.13      takayama 1509:                }
                   1510:        }
1.18      takayama 1511:        return S;
1.13      takayama 1512: }
                   1513:
1.6       takayama 1514: def pluspower(P,V,N,M)
                   1515: {
                   1516:        RR = 1;
                   1517:        for(K = R = 1; K < M-1; I++){
                   1518:                R = R*(N-K+1)*P/K;
                   1519:                RR = radd(RR,R);
                   1520:        }
                   1521:        VV = newvect(M);
                   1522:        for(K = 0; K < M-1; K++)
                   1523:                VV[K] = red(mycoef(RR,K,V));
                   1524: }
                   1525:
                   1526: def vtozv(V)
                   1527: {
                   1528:        if(type(V)<4) V=newvect(1,[V]);
                   1529:        S = length(V);
                   1530:        VV = newvect(S);
                   1531:        Lcm = 1;
                   1532:        for(K = 0; K < S; K++){
                   1533:                VV[K] = red(V[K]);
                   1534:                Lcm = lcm(Lcm,dn(VV[K]));
                   1535:                C = ptozp(nm(VV[K])|factor=0);
                   1536:                if(K == 0){
                   1537:                        Dn  = dn(C[1]);
                   1538:                        Nm  = nm(C[1]);
                   1539:                        PNm = nm(C[0]);
                   1540:                }else{
                   1541:                        Dn  = ilcm(Dn,dn(C[1]));
                   1542:                        Nm  = igcd(Nm,nm(C[1]));
                   1543:                        PNm = gcd(PNm,nm(C[0]));
                   1544:                }
                   1545:        }
                   1546:        if(!(M=Nm*PNm)) return [VV,0];
                   1547:        Mul = (Lcm*Dn)/M;
                   1548:        for(K = 0; K < S; K++)
                   1549:                VV[K] = rmul(VV[K],Mul);
                   1550:        return [VV,Mul];
                   1551: }
                   1552:
                   1553: def dupmat(M)
                   1554: {
                   1555:        if(type(M) == 6){
                   1556:                Size = size(M);
                   1557:                MM = newmat(Size[0],Size[1]);
                   1558:                for(I = 0; I < Size[0]; I++){
                   1559:                        for(J = 0; J < Size[1]; J++)
                   1560:                                MM[I][J] = M[I][J];
                   1561:                }
                   1562:                return MM;
                   1563:        }
                   1564:        if(type(M) == 5)
                   1565:                return ltov(vtol(M));
                   1566:        return M;
                   1567: }
                   1568:
                   1569: def matrtop(M)
                   1570: {
                   1571:        S = size(M);
                   1572:        MM = dupmat(M);
                   1573:        Lcm = newvect(S[0]);
                   1574:        for(J = 0; J < S[0]; J++){
                   1575:                U = vtozv(M[J]);
                   1576:                for(K = -1, I = 0; I < S[1]; I++)
                   1577:                        MM[J][I] = U[0][I];
                   1578:                Lcm[J] = U[1];
                   1579:        }
                   1580:        return [MM,Lcm];
                   1581: }
                   1582:
                   1583: def mytrace(M)
                   1584: {
                   1585:        S=size(M);
                   1586:        if(S[0]!=S[1]) return 0;
                   1587:        for(I=V=0; I<S[0]; I++){
                   1588:                V+=M[I][I];
                   1589:        }
                   1590:        return V;
                   1591: }
                   1592:
                   1593: def mydet(M)
                   1594: {
                   1595:        MM = matrtop(M);
                   1596:        if(type(MM[0]) == 6){
                   1597:                S = size(M);
                   1598:                for(Dn = 1, I = 0; I < S[0]; I++)
                   1599:                        Dn *= MM[1][I];
                   1600:                return (!Dn)?0:red(det(MM[0])/Dn);
                   1601:        }
                   1602: }
                   1603:
                   1604: def mperm(M,P,Q)
                   1605: {
                   1606:        if(type(M) == 6){
                   1607:                S = size(M);
                   1608:                if(type(P) <= 1)
                   1609:                        P=(P==1)?Q:trpos(0,0,S[0]);
                   1610:                if(type(P) > 3 && type(P[0]) >= 4)
                   1611:                        P = trpos(P[0][0],P[0][1],S[0]);
                   1612:                else if(type(P) == 4){
                   1613:                        if(length(P)==2 && type(P[1])==4){
                   1614:                                P0=P[0];P1=car(P[1]);P=newvect(P1);
                   1615:                                for(I=0;I<P1;I++) P[I]=P0+I;
                   1616:                        }else P = ltov(P);
                   1617:                }
                   1618:                if(type(Q) <= 1)
                   1619:                        Q=(Q==1)?P:trpos(0,0,S[1]);
                   1620:                if(type(Q) > 3 && type(Q[0]) >= 4)
                   1621:                        Q = trpos(Q[0][0],Q[0][1],S[1]);
                   1622:                if(type(Q) == 4){
                   1623:                        if(length(Q)==2 && type(Q[1])==4){
                   1624:                                P0=Q[0];P1=car(Q[1]);Q=newvect(P1);
                   1625:                                for(I=0;I<P1;I++) Q[I]=P0+I;
                   1626:                        }else Q = ltov(Q);
                   1627:                }
                   1628:                MM = newmat(S0=length(P),S1=length(Q));
                   1629:                for(I = 0; I < S0; I++){
                   1630:                        MMI = MM[I]; MPI = M[P[I]];
                   1631:                        for(J = 0; J < S1; J++)
                   1632:                                MMI[J] = MPI[Q[J]];
                   1633:                }
                   1634:                return MM;
                   1635:        }
                   1636:        if((type(M) == 5 || type(M) == 4) && type(P) >= 4){
                   1637:                if(length(P) == 1 && type(car(P)) == 4)
                   1638:                        P = trpos(car(P)[0],car(P)[1],length(M));
                   1639:                MM = newvect(S = length(P));
                   1640:                for(I = 0; I < S; I++)
                   1641:                        MM[I] = M[P[I]];
                   1642:                if(type(M) == 4)
                   1643:                        MM = vtol(MM);
                   1644:                return MM;
                   1645:        }
                   1646:        return M;
                   1647: }
                   1648:
                   1649: def mtranspose(M)
                   1650: {
                   1651:        if(type(M)==4){
                   1652:                MV=ltov(M);
                   1653:                II=length(MV);
                   1654:                for(I=L=0; I<II; I++){
                   1655:                        if(type(MV[I])!=4)      return M;
                   1656:                        MV[I]=ltov(MV[I]);
                   1657:                }
                   1658:                for(R=[],J=0; ;J++){
                   1659:                        for(T=[],I=F=0; I<II; I++){
                   1660:                                if(length(MV[I])>J){
                   1661:                                        F=1;
                   1662:                                        T=cons(MV[I][J],T);
                   1663:                                }
                   1664:                        }
                   1665:                        if(F==0)        return reverse(R);
                   1666:                        if(F==1)        R=cons(reverse(T),R);
                   1667:                }
                   1668:        }
                   1669:        if(type(M) != 6)
                   1670:                return M;
                   1671:        S = size(M);
                   1672:        MM = newmat(S[1],S[0]);
                   1673:        for(I = 0; I < S[0]; I++){
                   1674:                for(J = 0; J < S[1]; J++)
                   1675:                        MM[J][I] = M[I][J];
                   1676:        }
                   1677:        return MM;
                   1678: }
                   1679:
                   1680: def mtoupper(MM, F)
                   1681: {
                   1682:        TeXs=["\\ -=\\ ","\\ +=\\ "];
                   1683:        Lins=[" -= line"," += line"];
                   1684:        Assume=["If","Assume"];
                   1685:        if(type(St = getopt(step))!=1) St=0;
                   1686:        Opt = getopt(opt);
                   1687:        if(type(Opt)!=1) Opt=0;
                   1688:        TeX=getopt(dviout);
                   1689:        if(type(Tab=getopt(tab))!=1 && Tab!=0) Tab=2;
                   1690:        Line="\\text{line}";
                   1691:        if(type(TeX)!=1 || !St) TeX=0;
                   1692:        Size = size(MM);
                   1693:        if(F==-1){
                   1694:                M = newmat(Size[0], Size[1]+1);
                   1695:                for(I = 0; I < Size[0]; I++){
                   1696:                        for(J = 0; J < Size[1]; J++)
                   1697:                                M[I][J] = MM[I][J];
                   1698:                        M[I][Size[1]] = zz^I;
                   1699:                }
                   1700:                Size = size(M);
                   1701:                F = 1;
                   1702:        }else if(F<0){
                   1703:                F=Size[0];
                   1704:                M = newbmat(1,2,[[MM,mgen(F,0,[1],0)]]);
                   1705:                Size=[Size[0],F+Size[1]];
                   1706:        }else
                   1707:                M = dupmat(MM);
                   1708:        if(St){
                   1709:                if(TeX) Lout=[[dupmat(M)]];
                   1710:                else mycat0([M,"\n\n"],0);
                   1711:        }
                   1712:        Top="";
                   1713:        if(Opt>3){
                   1714:                for(I=Opt; I>4; I--)
                   1715:                        Top+=(TeX)?"\\ ":" ";
                   1716:        }
                   1717:        PC=IF=1;
                   1718:        for(K = JJ = 0; K < Size[1] - F; K++){
                   1719:                for(J = JJ; J < Size[0]; J++){
                   1720:                        if(M[J][K] != 0){               /* search simpler element */
                   1721:                                if(Opt>2 && (Mul=M[J][K])!=1){
                   1722:                                        for(FF=0,JT=J; JT<Size[0]; JT++){
                   1723:                                                if((Val=M[JT][K])==1){  /* 1 */
                   1724:                                                        Mul=1;J=JT; break;
                   1725:                                                }
                   1726:                                                if(Val==0 || type(Val)>type(Mul)) continue;
                   1727:                                                if(type(Val)<type(Mul) || (Val==-1 && Mul!=-1)){
                   1728:                                                        Mul=Val; J=JT;          /* smaller type */
                   1729:                                                }
                   1730:                                                else if(Opt>3){
                   1731:                                                        if(isint(Val)==1){      /* integer elememt */
                   1732:                                                                if(isint(Mul)!=1){
                   1733:                                                                        Mul=Val; J=JT;  /* integer */
                   1734:                                                                }
                   1735:                                                                if(FF<3||(FF==3&&Val>0)){
                   1736:                                                                        for(JK=K+1;;){
                   1737:                                                                                if(JK>=Size[1]-F){
                   1738:                                                                                        J=JT;
                   1739:                                                                                        FF=((Mul=Val)>0)?4:3;
                   1740:                                                                                        break;  /* divisible int => 4: pos_int 3: neg_int */
                   1741:                                                                                }
                   1742:                                                                                if(isint(M[JT][JK++]/Val)!=1) break;
                   1743:                                                                        }
                   1744:                                                                }
                   1745:                                                        }else if(!FF){
                   1746:                                                                for(JK=K+1; JK<Size[1]-F; JK++){
                   1747:                                                                        if(isint(M[JT][JK]/Val)!=1) break;
                   1748:                                                                        J=JT; FF=1;             /* divisible => 1: non integer */
                   1749:                                                                }
                   1750:                                                        }
                   1751:                                                }
                   1752:                                        }
                   1753:                                        if(FF==0 && Opt>3 && Mul!=1 && Mul!=-1){        /* FF > 0 => divisible */
                   1754:                                                for(FF=0,J0=J; J0<Size[0]-1 && FF!=9; J0++){
                   1755:                                                        VV0=M[J0][K];
                   1756:                                                        if(VV0==0 || isint(VV0)==0) continue;
                   1757:                                                        for(J1=J0+1;J1<Size[0] && FF!=9; J1++){
                   1758:                                                                VV1=M[J1][K];
                   1759:                                                                if(VV1==0 || isint(VV1)==0) continue;
                   1760:                                                                for(C=FT=0,V0=VV0,V1=VV1; C<2 && FF!=10; C++,V1=V0,V0=VV1){
                   1761:                                                                        for(CC=0,RC=ceil(V0/V1);CC<2;CC++,RC--){
                   1762:                                                                                if((CD=V0-RC*V1)==0 && (RC==1 || RC==-1)){
                   1763:                                                                                        FT=1; FF=10;            /* 10: vanish by +- */
                   1764:                                                                                }else if(CD==1){
                   1765:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1766:                                                                                        if((RC==1 || RC==-1) && FF<8+FV){
                   1767:                                                                                                FT=1; FF=8+FV;  /* 8/9: 1 by +- */
                   1768:                                                                                        }else if(FF<6+VF){
                   1769:                                                                                                FT=1; FF=6+FV;  /* 6/7: 1 by times */
                   1770:                                                                                        }
                   1771:                                                                                }else if(CD==-1){
                   1772:                                                                                        FV=(vars(M[J0])==[]&&vars(M[J1])==[])?1:0;
                   1773:                                                                                        if((RC==1 || RC==-1) && FF<4+FV){
                   1774:                                                                                                FT=1; FF=4+FV;  /* 4/5: 1 by +- */
                   1775:                                                                                        }else if(FF<2+VF){
                   1776:                                                                                                FT=1; FF=2+FV;  /* 2/3: 1 by times */
                   1777:                                                                                        }
                   1778:                                                                                }
                   1779:                                                                                if(FT==1){
                   1780:                                                                                        FT=0; KRC=RC;
                   1781:                                                                                        if(C==0){
                   1782:                                                                                                KJ0=J0; KJ1=J1;
                   1783:                                                                                        }else{
                   1784:                                                                                                KJ0=J1; KJ1=J0;
                   1785:                                                                                        }
                   1786:                                                                                }
                   1787:                                                                        }
                   1788:                                                                }
                   1789:                                                        }
                   1790:                                                }
                   1791:                                                if(FF>0){
                   1792:                                                        for(I=K;I<Size[1];I++)
                   1793:                                                                M[KJ0][I]=radd(M[KJ0][I],rmul(M[KJ1][I],-KRC));
                   1794:                                                        if(KRC<0){
                   1795:                                                                KRC=-KRC;Sgn=1;
                   1796:                                                        }else
                   1797:                                                                Sgn=0;
                   1798:                                                        if(St){
                   1799:                                                                if(TeX){
                   1800:                                                                        if(KRC==1)
                   1801:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1802:                                                                                        Line,KJ1+1,"}",dupmat(M)],Lout);
                   1803:                                                                        else
                   1804:                                                                                Lout=cons([Top+"\\xrightarrow{", Line,KJ0+1,TeXs[Sgn],
                   1805:                                                                                        Line,KJ1+1,"\\times\\left(",KRC,"\\right)}",
                   1806:                                                                                        dupmat(M)],Lout);
                   1807:
                   1808:                                                                }else{
                   1809:                                                                        if(KRC==1)
                   1810:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1,"\n",M,"\n"]);                                                                          else
                   1811:                                                                                mycat([Top+"line",KJ0+1,Lins[Sgn],KJ1+1," * (",KRC,")\n",M,"\n"]);
                   1812:                                                                }
                   1813:                                                        }
                   1814:                                                        Mul=M[KJ0][K]; J=KJ0;
                   1815:                                                        if(FF==10){
                   1816:                                                                J--; continue;
                   1817:                                                        }
                   1818:                                                }
                   1819:                                        }
                   1820:                                }
                   1821:                        /* a parameter Var */
                   1822:                                Var=0;
                   1823:                                if(St && Opt>4 && length(Var=vars(nm(M[J][K])))==1){
                   1824:                                        J0=J;Jv=mydeg(nm(M[J0][K]),car(Var));
                   1825:                                        for(I=JJ;I<Size[0]; I++){
                   1826:                                                if((MIK=M[I][K])==0) continue;
                   1827:                                                if((T=vars(MIK=nm(MIK)))==[]){  /* 1/poly */
                   1828:                                                        J=I;Var=[]; break;
                   1829:                                                }
                   1830:                                                if(length(T)>1) continue;
                   1831:                                                if(mydeg(MIK,T[0])<Jv){
                   1832:                                                        J0=I;Jv=mydeg(MIK);Var=T;       /* search minimal degree */
                   1833:                                                }
                   1834:                                        }
                   1835:                                        if(length(Var)==1){
                   1836:                                                Var=car(Var);
                   1837:                                                Q=nm(M[J0][K]);
                   1838:                                                for(I=JJ; I<Size[0]; I++){
                   1839:                                                        if(I==J0 || mydeg(nm(M[I][K]),Var)<0) continue;
                   1840:                                                        T=rpdiv(nm(M[I][K]),Q,Var);
                   1841:                                                        if(T[0]!=0 && (vars(T)==[] || vars(T)==[Var])) break;   /* dec. deg */
                   1842:                                                }
                   1843:                                        }
                   1844:                                }
                   1845:                                if(type(Var)==2){ /* 1 variable */
                   1846:                                        if(I==Size[0]){
                   1847:                                                for(QF=0,Q0=1,QR=getroot(Q,Var|mult=1);QR!=[];QR=cdr(QR)){
                   1848:                                                        if(deg(T=QR[0][1],Var)>0){
                   1849:                                                                QF=1;Q0*=T; continue;
                   1850:                                                        }
                   1851:                                                        if(subst(PC,Var,T)==0) continue;
                   1852:                                                        Q0*=(Var-(T=QR[0][1]));
                   1853:                                                        if(type(T)<2){
                   1854:                                                                M0=subst(M,Var,T);
                   1855:                                                                if(TeX){
                   1856:                                                                        Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   1857:                                                                                Var,"=",T,","] ,Lout);
                   1858:                                                                        Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),Lout);
                   1859:                                                                }else{
                   1860:                                                                        mycat([str_times(" ",St-1)+"If",Var,"=",T,","]);
                   1861:                                                                        mtoupper(M0,F|step=St+1,opt=Opt);
                   1862:                                                                }
                   1863:                                                        }
                   1864:                                                }
                   1865:                                                if(Q0!=1){
                   1866:                                                        if(TeX)
                   1867:                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[QF]+" }",
                   1868:                                                                        Q0/=fctr(Q0)[0][0],"\\ne0,"],Lout);
                   1869:                                                        else
                   1870:                                                                mycat([str_times(" ",St-1)+Assume[QF],Q0,"!=0,"]);
                   1871:                                                        PC*=Q0;
                   1872:                                                }
                   1873:                                                IF=0;St++;
                   1874:                                        }else{
                   1875:                                                KRC=-red((T[2]*dn(M[J0][K]))/(T[1]*dn(M[I][K])));
                   1876:                                                for(II=K;II<Size[1];II++)
                   1877:                                                        M[I][II]=radd(M[I][II],rmul(M[J0][II],KRC));
                   1878:                                                if(TeX)
                   1879:                                                        Lout=cons([Top+"\\xrightarrow{", Line,I+1,"\\ +=\\ ",Line,
                   1880:                                                                J0+1,"\\times\\left(",KRC,"\\right)}",dupmat(M)],Lout);
                   1881:                                                else
                   1882:                                                        mycat([Top+"line",I+1,"+=",Line,J0+1," * (",KRC,")\n",M,"\n"]);
                   1883:                                                J=JJ-1;
                   1884:                                                continue;
                   1885:                                        }
                   1886:                                }
                   1887:                                if(J != JJ){
                   1888:                                        for(I = K; I < Size[1]; I++){
                   1889:                                                Temp = M[JJ][I];
                   1890:                                                M[JJ][I] = M[J][I];
                   1891:                                                M[J][I] = (Opt>=2)?Temp:-Temp;
                   1892:                                        }
                   1893:                                        if(St){
                   1894:                                                if(TeX)
                   1895:                                                        Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,"\\ \\leftrightarrow\\ ",
                   1896:                                                                Line,J+1,"}",dupmat(M)],Lout);
                   1897:                                                else
                   1898:                                                        mycat0([Top+"line",JJ+1," <-> line",J+1,"\n",M,"\n\n"],0);
                   1899:                                        }
                   1900:                                }
                   1901:                                /* Assume PC != 0 */
                   1902:                                if(Opt>1){
                   1903:                                        Mul = M[JJ][K];
                   1904:                                        if(Opt > 5 && St && IF && (Var=vars(MIK=nm(Mul)))!=[]){
                   1905:                                                TF=fctr(MIK);
                   1906:                                                for(FF=0,Q0=1,TP=cdr(TF);TP!=[];TP=cdr(TP)){
                   1907:                                                        if(type(dn(red(PC/(TP0=car(car(TP))))))<2) continue; /* divisible */
                   1908:                                                        Q0*=TP0;
                   1909:                                                        for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   1910:                                                                if(mydeg(TP0,X=car(Var))==1 && type(dn(red(PC/mycoef(TP0,1,X))))<2){
                   1911:                                                                        /* TP0=A*X+B with non-vanishing A */
                   1912:                                                                        T=red(-mycoef(TP0,0,X)/mycoef(TP0,1,X));
                   1913:                                                                        M0=mysubst(M,[X,T]);
                   1914:                                                                        if(TeX){
                   1915:                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   1916:                                                                                        X,"=",T,","] ,Lout);
                   1917:                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),
                   1918:                                                                                        Lout);
                   1919:                                                                        }else{
                   1920:                                                                                mycat([str_times(" ",St-1)+"If",X,"=",T,","]);
                   1921:                                                                                mtoupper(M0,F|step=St+1,opt=Opt);
                   1922:                                                                        }
                   1923:                                                                        break;
                   1924:                                                                }
                   1925:                                                        }
                   1926:                                                        if(Var==[] && Opt>6){
                   1927:                                                                for(Var=vars(TP0);Var!=[];Var=cdr(Var)){
                   1928:                                                                        if(mydeg(TP0,X=car(Var))==1){
                   1929:                                                                                /* TP0=A*X+B, A is a poly of X0 with rational funct */
                   1930:                                                                                T=nm(mycoef(TP0,1,X));
                   1931:                                                                                for(Var0=vars(T);Var0!=[]; Var0=cdr(Var0)){
                   1932:                                                                                        X0=car(Var0);
                   1933:                                                                                        if(type(dn(red(PC/type(mycoef(T,mydeg(T,X0),X0)))))>1) continue;
                   1934:                                                                                        TR=getroot(T,X0|mult=1);
                   1935:                                                                                        if(findin(X0,vars(TR))<0) break;
                   1936:                                                                                }
                   1937:                                                                                if(Var0==[]) continue;
                   1938:                                                                                for(;TR!=[0];TR=cdr(TR)){
                   1939:                                                                                        if(TR==[]){
                   1940:                                                                                                TR=[0,0];
                   1941:                                                                                                T0=-mycoef(TP0,0,X)/mycoef(TP0,1,X);
                   1942:                                                                                                X0=X;
                   1943:                                                                                        }else T0=car(TR)[1];
                   1944:                                                                                        M0=mysubst(M,[X0,T0]);
                   1945:                                                                                        if(TeX){
                   1946:                                                                                                Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{If }",
                   1947:                                                                                                        X0,"=",T0,","] ,Lout);
                   1948:                                                                                                Lout=append(mtoupper(M0,F|step=St+1,opt=Opt,dviout=-2,tab=Tab),
                   1949:                                                                                                        Lout);
                   1950:                                                                                        }else{
                   1951:                                                                                                mycat([str_times(" ",St-1)+"If",X0,"=",T0,","]);
                   1952:                                                                                                mtoupper(M0,F|step=St+1,opt=Opt);
                   1953:                                                                                        }
                   1954:                                                                                }
                   1955:
                   1956:                                                                        }
                   1957:                                                                        break;
                   1958:                                                                }
                   1959:                                                        }
                   1960:                                                        if(Var==[]){
                   1961:                                                                FF=1;
                   1962:                                                        }
                   1963:                                                }
                   1964:                                                if(Q0!=1){
                   1965:                                                        if(FF) FF=1;
                   1966:                                                        if(TeX) Lout=cons(["\\hspace{",Tab*(St-3)-1,"mm}\\text{"+Assume[FF]+" }",Q0/=fctr(Q0)[0][0],"\\ne0,"],
                   1967:                                                                Lout);
                   1968:                                                        else mycat([str_times(" ",St-1)+Assume[FF],Q0,"!=0,"]);
                   1969:                                                        PC*=Q0;St++;
                   1970:                                                }
                   1971:                                        }
                   1972:                                        IF=M[JJ][K]=1;
                   1973:                                        if(Mul!=1){
                   1974:                                                for(L=K+1; L<Size[1]; L++)
                   1975:                                                        M[JJ][L]=red(M[JJ][L]/Mul);
                   1976:                                                if(St){
                   1977:                                                        if(TeX)
                   1978:                                                                Lout=cons([Top+"\\xrightarrow{",Line,JJ+1,
                   1979:                                                                        "\\ \\times=\\ \\left(",red(1/Mul),"\\right)}",
                   1980:                                                                        dupmat(M)],Lout);
                   1981:                                                        else
                   1982:                                                                mycat0([Top+"line",JJ+1, " *= (",red(1/Mul), ")\n",M,"\n\n"],0);
                   1983:                                                }
                   1984:                                        }
                   1985:
                   1986:                                }
                   1987:                                for(J = (Opt>0)?0:(JJ+1); J < Size[0]; J++){
                   1988:                                        if(J == JJ)
                   1989:                                                continue;
                   1990:                                        Mul = -M[J][K];
                   1991:                                        if(Mul!=0){
                   1992:                                                if(Opt!=2)      Mul=rmul(Mul,1/M[JJ][K]);
                   1993:                                                for(I = K+1; I < Size[1]; I++)
                   1994:                                                        M[J][I] = radd(M[J][I],rmul(M[JJ][I],Mul));
                   1995:                                                M[J][K] = 0;
                   1996:                                                if(St){
                   1997:                                                        if(Mul<0){
                   1998:                                                                Mul=-Mul;Sgn=0;
                   1999:                                                        }else   Sgn=1;
                   2000:                                                        if(TeX){
                   2001:                                                                if(Mul==1)
                   2002:                                                                        Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2003:                                                                                "}",dupmat(M)],Lout);
                   2004:                                                                else Lout=cons([Top+"\\xrightarrow{", Line,J+1,TeXs[Sgn],Line,JJ+1,
                   2005:                                                                                "\\times\\left(",Mul,"\\right)}",dupmat(M)],Lout);
                   2006:                                                        }else{
                   2007:                                                                if(Mul==1)
                   2008:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1,"\n",M,"\n\n"],0);
                   2009:                                                                else
                   2010:                                                                        mycat0([Top+"line",J+1, Lins[Sgn],JJ+1," * (",Mul,")\n",M,"\n\n"],0);
                   2011:                                                        }
                   2012:                                                }
                   2013:                                        }
                   2014:                                }
                   2015:                                JJ++;
                   2016:                        }
                   2017:                }
                   2018:        }
                   2019:        if(TeX){
                   2020:                if(TeX==-2) return Lout;
                   2021:                Lout=reverse(Lout);
                   2022:                Br="\\allowdisplaybreaks";
                   2023:                Cr="\\\\\n &";
                   2024:                if(getopt(pages)==1) Cr=Br+Cr;
                   2025:                if(type(S=getopt(cr))==7) Cr=S;
                   2026:                if(type(Lim=getopt(lim))==1){
                   2027:                        if(Lim>0){
                   2028:                                if(Lim<30) Lim=TeXLim;
                   2029:                                Lim*=2;
                   2030:                        }
                   2031:                }else Lim=0;
                   2032:                Out = ltotex(Lout|opt=["cr","spts0"],str=1,cr=Cr,lim=Lim);
                   2033:                if(TeX<0) return Out;
                   2034:                dviout(Out|eq=(str_str(Cr,Br)>=0)?6:5,keep=(TeX==1)?0:1);
                   2035:        }
                   2036:        return M;
                   2037: }
                   2038:
                   2039: def mydet2(M)
                   2040: {
                   2041:        S = size(M);
                   2042:        Det = 1;
                   2043:        MM = mtoupper(M,0);
                   2044:        for(I = 0; I < S[0]; I++)
                   2045:                Det = rmul(Det,MM[I][I]);
                   2046:        return Det;
                   2047: }
                   2048:
                   2049: def myrank(MM)
                   2050: {
                   2051:        S = size(MM);
                   2052:        M = dupmat(MM);
                   2053:        M = mtoupper(M,0);
                   2054:        C = 0;
                   2055:        for(I = K = 0; I < S[0]; I++){
                   2056:                for(J = K; J < S[1]; J++){
                   2057:                        if(M[I][J] != 0){
                   2058:                         C++; K++;
                   2059:                         break;
                   2060:                        }
                   2061:                }
                   2062:        }
                   2063:        return C;
                   2064: }
                   2065:
                   2066: def meigen(M)
                   2067: {
                   2068:        F = getopt(mult);
                   2069:        if(type(M)==4 || type(M)==5){
                   2070:                II=length(M);
                   2071:                for(R=[],I=II-1; I>=0; I--){
                   2072:                        if(F==1)
                   2073:                                R=cons(meigen(M[I]|mult=1),R);
                   2074:                        else
                   2075:                                R=cons(meigen(M[I]),R);
                   2076:                }
                   2077:                return R;
                   2078:        }
                   2079:        S = size(M)[0];
                   2080:        P = mydet2(mgen(S,0,[zz],0)-M);
                   2081:        return (F==1)?getroot(P,zz|mult=1):getroot(P,zz);
                   2082: }
                   2083:
                   2084: def transm(M)
                   2085: {
                   2086:        if(type(M)!=6) M=s2m(M);
                   2087:        if(type(M)!=6){
                   2088:                errno(0);
                   2089:                return 0;
                   2090:        }
                   2091:        L=[M];TeX="";
                   2092:        Line=["\\text{line}","\\text{col}"];
                   2093:        if((DVI=getopt(dviout)) !=1) DVI=0;
                   2094:        else dviout(M);
                   2095:        for(;;){
                   2096:                print(L0=dupmat(car(L)));
                   2097:                Sz=size(L0);
                   2098:                S=keyin("? ");
                   2099:                N=0;
                   2100:                if(str_len(S)<=1){
                   2101:                        if(S=="q") return L;
                   2102:                        if(S=="t"){
                   2103:                                N=mtranspose(L0);
                   2104:                                TeX=["\\text{transpose}"];
                   2105:                        }
                   2106:                        else if(S=="f"){
                   2107:                                if(length(L)>1){
                   2108:                                        if(LF!=0) TeX="";
                   2109:                                        L=cdr(L);LF=L0;
                   2110:                                        if(DVI){
                   2111:                                                dviout0(-1);
                   2112:                                                dviout(" ");
                   2113:                                        }
                   2114:                                }
                   2115:                        }else if(S=="g"){
                   2116:                                if(LF!=0) N=LF;
                   2117:                        }else if(S=="0"){
                   2118:                                N=M;L=[];TeX=[];
                   2119:                        }else if(S=="a"||S=="A"){
                   2120:                                if(DVI&&S=="A") mtoupper(L0,0|step=1,opt=10,dviout=1);
                   2121:                                else mtoupper(L0,0|step=1,opt=10);
                   2122:                        }else{
                   2123:                                mycat0([
                   2124:        "2,5    : line2 <-> line5",
                   2125:        "2,5,-2 ; line2 += (-2)*line5",
                   2126:        "2,2,-2 : line2 *= -2",
                   2127:        "2,5,0  : line2 += (?)*line5 for reduction",
                   2128:        "r,2,5  : raw2 <-> raw5 (r,2,5,-2  etc.)",
                   2129:        "s,x,2  : subst(*,x,2)",
                   2130:        "t      : transpose",
                   2131:        "0      : first matrix",
                   2132:        "f      : previous matrix",
                   2133:        "g      : next matrix (only after f)",
                   2134:        "A      : auto (a : without TeX)",
                   2135:        "q      : quit"
                   2136:                                ],1|delim="\n");
                   2137:                        }
                   2138:                }else{
                   2139:                        FR=0;
                   2140:                        S=evals(S|del=",");
                   2141:                        if(S[0]==r){
                   2142:                                FR=1; S=cdr(S);
                   2143:                        }
                   2144:                        if((LL=length(S))>=2){
                   2145:                                S0=S[0]-1;S1=S[1]-1;
                   2146:                                if(S[0]==s){
                   2147:                                        if(length(S)==3) N=subst(L0,S[1],S[2]);
                   2148:                                        if(DVI) TeX=[S[1],"\\mapsto",S[2]];
                   2149:                                }else if(FR==0){
                   2150:                                        if(S0<0 || S0>=Sz[0] || S1<0 || S1>=Sz[0]) continue;
                   2151:                                        if(LL==2){
                   2152:                                                N=rowx(L0,S0,S1);
                   2153:                                                if(DVI) TeX=[Line[0],S[0],"\\ \\leftrightarrow\\ ",Line[0],S[1]];
                   2154:                                        }else{
                   2155:                                                S2=S[2];
                   2156:                                                if(S0==S1){
                   2157:                                                        N=rowm(L0,S0,S2);
                   2158:                                                        if(DVI) TeX=[Line[0],S[0],"\\ \\times=\\ ",S2];
                   2159:                                                }else{
                   2160:                                                        if(S2==0){
                   2161:                                                                for(J=0;J<Sz[1] && L0[S1][J]==0;J++);
                   2162:                                                                if(J<Sz[1]) S2=-L0[S0][J]/L0[S1][J];
                   2163:                                                        }
                   2164:                                                        if(S2!=0){
                   2165:                                                                N=rowa(L0,S0,S1,S2);
                   2166:                                                                if(DVI) TeX=[Line[0],S[0],"\\ +=\\ ",Line[0],
                   2167:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2168:                                                        }
                   2169:                                                }
                   2170:                                        }
                   2171:                                }else{
                   2172:                                        if(S0<0 || S0>=Sz[1] || S1<0 && S1>=Sz[1]) continue;
                   2173:                                        if(LL==2){
                   2174:                                                N=colx(L0,S0,S1);
                   2175:                                                if(DVI) TeX=[Line[1],S[0],"\\ \\leftrightarrow\\ ",Line[1],S[1]];
                   2176:                                        }else{
                   2177:                                                S2=S[2];
                   2178:                                                if(S0==S1){
                   2179:                                                        N=colm(L0,S0,S2);
                   2180:                                                        if(DVI) TeX=[Line[1],S[0],"\\ \\times=\\ ",S[2]];
                   2181:                                                }else{
                   2182:                                                        if(S2!=0){
                   2183:                                                                for(J=0; I1<Sz[0] && L0[I1][J]==0; J++);
                   2184:                                                                if(J<Sz[0]) S2=-L0[J][S0]/L0[J][S1];
                   2185:                                                        }if(S2!=0){
                   2186:                                                                N=cola(L0,S0,S1,S2);
                   2187:                                                                if(DVI) TeX=[Line[1],S[0],"\\ +=\\ ",Line[1],
                   2188:                                                                        S[1],"\\ \\times\\ (",S2,")"];
                   2189:                                                        }
                   2190:                                                }
                   2191:                                        }
                   2192:                                }
                   2193:                        }
                   2194:                }
                   2195:                if(N!=0){
                   2196:                        LF=0;L=cons(N,L);
                   2197:                        if(DVI) dviout("\\xrightarrow{"+ltotex(TeX|opt="spts0",str=1)+"}"+mtotex(N)|eq=8);
                   2198:                }
                   2199:        }
                   2200: }
                   2201:
                   2202: def vgen(V,W,S)
                   2203: {
                   2204:        IM=length(V);
                   2205:        I=(getopt(opt)==0)?IM:0;
                   2206:        for(SS=0; I<IM && (SS==0 || V[I]<=W[I]); I++)
                   2207:                SS += W[I];
                   2208:        if(I<IM){
                   2209:                W[I]++;
                   2210:                SS--;
                   2211:        }else
                   2212:                SS=S;
                   2213:        for(J=0;J<I;J++){
                   2214:                 W[J] = (SS<=V[J])?SS:V[J];
                   2215:                 SS -= W[J];
                   2216:        }
                   2217:        if(SS>0)
                   2218:                return -1;
                   2219:        return(I==IM)?0:I;
                   2220: }
                   2221:
                   2222: def mmc(M,X)
                   2223: {
                   2224:        Mt=getopt(mult);
                   2225:        if(type(M)==7) M=os_md.s2sp(M);
                   2226:        if(type(M)!=4||type(M[0])!=6) return 0;
                   2227:        if(type(M[0])!=6){                      /* spectre type -> GRS */
                   2228:                G=s2sp(M|std=1);
                   2229:                L=length(G);
                   2230:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   2231:                V=cons(makev([L+9]),V);
                   2232:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   2233:                if(getopt(short)!=0){
                   2234:                        V=append(cdr(V),[V[0]]);
                   2235:                        G=shortv(G,V);
                   2236:                }
                   2237:                R=chkspt(G|mat=1);
                   2238:                if(Mt!=1) Mt=0;
                   2239:                if(R[2]!=2 || R[3]!=0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   2240:                MZ=newmat(1,1);
                   2241:                SS=length(G);
                   2242:                if(Mt==1) SS=SS*(SS-1)/2;
                   2243:                for(M=[],I=0;I<SS;I++) M=cons(MZ,M);
                   2244:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   2245:                        RT=car(RR)[0];
                   2246:                        if(type(RT)==4){
                   2247:                                if(RT[0]!=0) M=mmc(M,[RT[0]]|simplify=Simp);
                   2248:                                M=mmc(M,[cdr(RT)]);
                   2249:                        }
                   2250:                }
                   2251: /*             for(R=cdr(R);R!=[];R=cdr(R)) M=mmc(M,[car(R)[0]]|mult=Mt); */
                   2252:        }
                   2253:        if(X==0) return M;
                   2254:        L=length(M);
                   2255:        if((L>=6 && Mt!=0)||(L==3&&Mt==1)){
                   2256:                for(SS=2,I=3; I<L; I+=(++SS));
                   2257:                if(I!=L) return -1;
                   2258:                Mt=1;
                   2259:        }else{
                   2260:                SS=L;Mt=0;
                   2261:        }
                   2262:        if(length(X)==SS+1){
                   2263:                if(car(X)!=0&&(M=mmc(M,[car(X)]|mult=Mt))==0) return M;
                   2264:                return mmc(M,cdr(X)|mult=Mt);
                   2265:        }
                   2266:        for(I=X;I!=[];I=cdr(I)) if(I[0]!=0) break;
                   2267:        if(I==[]) return M;
                   2268:        Simp=getopt(simplify);
                   2269:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   2270:        N=newvect(L);
                   2271:        for(I=0;I<L;I++) N[I]=dupmat(M[I]);
                   2272:        S=size(N[0])[0];
                   2273:        if(type(X)==4&&length(X)>SS){   /* addition */
                   2274:                for(I=0;I<SS;I++,X=cdr(X)) if(X[I] != 0) N[I] = radd(N[I],car(X));
                   2275:        }
                   2276:        if(length(X)!=1) return 0;
                   2277:        X=X[0];
                   2278:        MZ = newmat(S,S);
                   2279:        MM = newvect(L);
                   2280:        for(M1=J=0; J<SS; J++){
                   2281:                for(R=[],I=SS-1; I>=0; I--){
                   2282:                        if(I==J){
                   2283:                                for(RR=[],K=SS-1; K>=0; K--)
                   2284:                                        RR=cons((K==I)?N[K]+diagm(S,[X]):N[K],RR);
                   2285:                                R=cons(RR,R);
                   2286:                        }else R=cons([MZ],R);
                   2287:                }
                   2288:                MM[J]=newbmat(SS,SS,R);
                   2289:                if(J==0) M1=MM[0];
                   2290:                else M1=radd(M1,MM[J]);
                   2291:        }
                   2292:        /* middle convolution */
                   2293:        for(P=0,Q=1;J<L;J++){   /* A_{P,Q} */
                   2294:                for(R=[],I=SS-1; I>=0; I--){
                   2295:                        for(RR=[],K=SS-1;K>=0;K--){
                   2296:                                MT=MZ;
                   2297:                                if(I==K){
                   2298:                                        MT=N[J];
                   2299:                                        if(I==P) MT-=N[Q];
                   2300:                                        else if(I==Q) MT-=N[P];
                   2301:                                }else if(I==P && K==Q) MT=N[Q];
                   2302:                                 else if(I==Q && K==P) MT=N[P];
                   2303:                                RR=cons(MT,RR);
                   2304:                        }
                   2305:                        R=cons(RR,R);
                   2306:                }
                   2307:                MM[J]=newbmat(SS,SS,R);
                   2308:                if(++Q==SS){
                   2309:                        P++;Q=P+1;
                   2310:                }
                   2311:        }
                   2312:        for(R=[],I=SS-1; I>=0; I--){
                   2313:                for(RR=[N[I]],J=0; J<I; J++) RR=cons(MZ,RR);
                   2314:                R=cons(RR,R);
                   2315:        }
                   2316:        M0 = newbmat(SS,SS,R);
                   2317:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   2318:        if(length(KE) == 0) return MM;
                   2319:        KK = mtoupper(lv2m(KE),0);
                   2320:        for(I=0;I<L;I++) MM[I] = mmod(MM[I],KK);
                   2321:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   2322:        return MM;
                   2323: }
                   2324:
                   2325: def lpgcd(L)
                   2326: {
                   2327:        for(F=[]; L!=[]; L=cdr(L)){
                   2328:                if((P=car(L))==0) continue;
                   2329:                        if(F==[]){
                   2330:                                F=fctr(P);
                   2331:                                S=length(F);
                   2332:                                S--;
                   2333:                                V=newvect(S);
                   2334:                                M=newvect(S);
                   2335:                                for(I=0; I<S; I++){
                   2336:                                        M[I] = F[I+1][1];
                   2337:                                        V[I] = F[I+1][0];
                   2338:                                }
                   2339:                                N=nm(ptozp(P|factor=1)[1]);
                   2340:                                continue;
                   2341:                 }
                   2342:                 N=igcd(ptozp(P|factor=1)[1],N);
                   2343:                 for(I=0; I<S; I++){
                   2344:                         for(Q=P,CT=0; CT<M[I]; CT++)
                   2345:                                 if((Q=tdiv(Q,V[I])) == 0) break;
                   2346:                         if(CT<M[I]) M[I]=CT;
                   2347:                 }
                   2348:        }
                   2349:        if(F==[]) return 0;
                   2350:        for(Q=N,I=0;I<S; I++){
                   2351:                while(M[I]>0){
                   2352:                        Q *= V[I];
                   2353:                        M[I]--;
                   2354:                }
                   2355:        }
                   2356:        return Q;
                   2357: }
                   2358:
                   2359: def mdivisor(M,X)
                   2360: {
                   2361:        S=size(M=dupmat(M));
                   2362:        XX=(type(X)==4||X==0)?X:[0,X];
                   2363:        S0=S[0]; S1=S[1];
                   2364:        if((Tr=getopt(trans))==1||Tr==2){
                   2365:                Tr0=1;
                   2366:                GR=mgen(S0,0,1,0); GC=mgen(S1,0,1,0);
                   2367:        }else Tr=Tr0=0;
                   2368:         /* 0,a,b       : (a,b)->(1,1)
                   2369:                1               : (1,1) invertible
                   2370:                2,i,M   : line 0,i by M
                   2371:                3,j,M   : col  0,j by M
                   2372:                4,j             : col  1 += col j
                   2373:                5,j,T   : line j by T
                   2374:                6,j,T   : col  1 += col j by T (non-com)
                   2375:                7,j             : line 2<->j  (non-com)
                   2376:         */
                   2377:        if(type(V=getopt(dviout))==1){
                   2378:                if(type(XX)==4 && type(XX[0])>1) Var=[XX[1],"\\partial"];
                   2379:                else    Var=0;
                   2380:                Tr=(abs(V)==3)?0:1;
                   2381:                MM=dupmat(M);
                   2382:                II=((S[0]>S[1])?S[1]:S[0])+1;
                   2383:                if(abs(V)>1){
                   2384:                        Is1=Js1=S[0]+S[1];
                   2385:                        Is=Js=[0,[Is1]];
                   2386:                }else{
                   2387:                        Is=[0,[Is1=S[0]]];Js=[0,[Js1=S[1]]];
                   2388:                }
                   2389:                VV=V;
                   2390:                V=newvect(II);
                   2391:                for(I=0;I<II;I++) V[I]=[];
                   2392:                N=newbmat(2,2,[[M,mgen(S[0],0,[1],0)],[mgen(S[1],0,[1],0)]]);
                   2393:                mdivisor(M,X|step=1,dviout=V);
                   2394:                L=S[0]+S[1];
                   2395:                if(Tr){
                   2396:                        NN=mperm(N,Is1,Js1);
                   2397:                        for(K=S[0];K<Is1;K++){
                   2398:                                for(L=S[1];L<Js1;L++)
                   2399:                                        NN[K][L]=" ";
                   2400:                        }
                   2401:                        Out=[[mperm(NN,Is,Js)]];
                   2402:                }
                   2403:                for(I=1;I<II;I++){
                   2404:                        I0=I-1;
                   2405:                        if(V[I]==[]) continue;
                   2406:                        for(T=reverse(V[I]);T!=[];T=cdr(T)){
                   2407:                                St=[];
                   2408:                                C=car(R=car(T));
                   2409:                                if(C==0){
                   2410:                                        N=mperm(N,(R[1]==0)?0:[[R[1]+I0,I0]],(R[2]==0)?0:[[R[2]+I0,I0]]);
                   2411:
                   2412:                                        if(Tr){
                   2413:                                                if(R[2]!=0) St=append(["C",I,"\\leftrightarrow C",R[2]+I],St);
                   2414:                                                if(R[1]!=0){
                   2415:                                                        if(R[2]!=0) St=cons(",\\ ",St);
                   2416:                                                        St=append(["L",I,"\\leftrightarrow L",R[1]+I],St);
                   2417:                                                }
                   2418:                                                Out=cons(St,Out);
                   2419:                                        }
                   2420:                                }else if(C==1){
                   2421:                                        P=1/N[I0][I0];N[I0][I0]=1;
                   2422:                                        if(P!=1){
                   2423:                                                for(J=I;J<L;J++)
                   2424:                                                        N[I0][J]=muldo(P,N[I0][J],XX);
                   2425:
                   2426:                                                if(Tr){
                   2427:                                                        St=append(["L",I,"\\leftarrow(",P,")","\\times L",I],St);
                   2428:                                                        Out=cons(St,Out);
                   2429:                                                        NN=mperm(N,Is1,Js1);
                   2430:                                                        for(K=S[0];K<Is1;K++){
                   2431:                                                                for(L=S[1];L<Js1;L++)
                   2432:                                                                        NN[K][L]=" ";
                   2433:                                                        }
                   2434:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2435:                                                }
                   2436:                                        }
                   2437:                                        for(F=0,J=I;J<S[0];J++){
                   2438:                                                if((P=N[J][I0])==0) continue;
                   2439:                                                F++;
                   2440:                                                N[J][I0]=0;
                   2441:                                                for(K=I;K<L;K++)
                   2442:                                                        N[J][K]=red(N[J][K]-muldo(P,N[I0][K],XX));
                   2443:
                   2444:                                        }
                   2445:                                        if(F){
                   2446:                                                if(Tr){
                   2447:                                                        Out=cons(["Li\\ -\\!=\\ \\circ\\times L",I,"\\quad(i>",I,")"],Out);
                   2448:                                                        NN=mperm(N,Is1,Js1);
                   2449:                                                        for(K=S[0];K<Is1;K++){
                   2450:                                                                for(L=S[1];L<Js1;L++)
                   2451:                                                                        NN[K][L]=" ";
                   2452:                                                        }
                   2453:                                                        Out=cons(["\\to",mperm(NN,Is,Js)],Out);
                   2454:                                                }
                   2455:                                        }
                   2456:                                        for(F=0,J=I;J<S[1];J++){
                   2457:                                                if((P=N[I0][J])==0) continue;
                   2458:                                                F++;
                   2459:                                                N[I0][J]=0;
                   2460:                                                for(K=I;K<L;K++)
                   2461:                                                        N[K][J]=red(N[K][J]-muldo(N[K][I0],P,XX));
                   2462:                                        }
                   2463:                                        if(F&&Tr) Out=cons(["Cj\\ -\\!=\\ C",I,"\\times\\circ\\quad(j>",I,")"],Out);
                   2464:                                        else continue;
                   2465:                                }else if(C==2){
                   2466:                                        C=mat(N[I0],N[R[1]+I0]);C=muldo(R[2],C,XX);
                   2467:                                        for(J=0;J<L;J++){
                   2468:                                                N[I0][J]=C[0][J];N[R[1]+I0][J]=C[1][J];
                   2469:                                        }
                   2470:                                        if(Tr) Out=cons([dupmat(R[2]),"\\begin{pmatrix}L",I,"\\\\L",R[1]+I,
                   2471:                                                "\\end{pmatrix}"],Out);
                   2472:                                }else if(C==3){
                   2473:                                        C=newmat(L,2);
                   2474:                                        for(J=0;J<L;J++){
                   2475:                                                C[J][0]=N[J][I0];C[J][1]=N[J][R[1]+I0];
                   2476:                                        }
                   2477:                                        C=muldo(C,R[2],XX);
                   2478:                                        for(J=0;J<L;J++){
                   2479:                                                N[J][I0]=C[J][0];N[J][R[1]+I0]=C[J][1];
                   2480:                                        }
                   2481:                                        if(Tr) Out=cons(["\\begin{pmatrix}C",I,"&C",R[1]+I,"\\end{pmatrix}",
                   2482:                                                dupmat(R[2])],Out);
                   2483:                                }else if(C==4){
                   2484:                                        for(J=0;J<L;J++)
                   2485:                                                N[J][I0]=red(N[J][I0]+N[J][R[1]+I0]);
                   2486:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",R[1]+I],Out);
                   2487:                                }else if(C==5){
                   2488:                                        for(J=0;J<L;J++)
                   2489:                                                N[I0+R[1]][J]=red(R[2]*N[I0+R[1]][J]);
                   2490:                                        if(Tr) Out=cons(["L",I+R[1],"\\leftarrow(", R[2],")\\times L",I+R[1]],
                   2491:                                                Out);
                   2492:                                }else if(C==6){
                   2493:                                        for(J=0;J<L;J++)
                   2494:                                                N[J][I0]=N[J][I0]+muldo(N[J][I0+R[1]],R[2],XX);
                   2495:                                        if(Tr) Out=cons(["C",I,"\\ +\\!=\\ C",I+R[1],"\\times(", R[2],")"],
                   2496:                                                Out);
                   2497:                                }else if(C==7){
                   2498:                                        mycat(["line",I+1,"\\leftrightarrow",R[1]+I]);
                   2499:                                        for(J=0;J<L;J++){
                   2500:                                                C=N[I][J];N[I][J]=N[R[1]+I0][J];N[R[1]+I0][J]=C;
                   2501:                                        }
                   2502:                                        if(Tr) Out=cons(["L",I+1,"\\leftrightarrow L",R[1]+I],Out);
                   2503:                                }
                   2504:                                if(Tr){
                   2505:                                        NN=mperm(N,Is,Js);
                   2506:                                        for(K=S[0];K<Is1;K++){
                   2507:                                                for(L=S[1];L<Js1;L++)
                   2508:                                                        NN[K][L]=" ";
                   2509:                                        }
                   2510:                                        Out=cons(["\\to",NN],Out);
                   2511:                                }
                   2512:                        }
                   2513:                }
                   2514:                if(!Tr){
                   2515:                        NN=mperm(N,Is,Js);
                   2516:                        Out=[];
                   2517:                }
                   2518:                if(S[0]+S[1]==Is1){
                   2519:                        N1=mperm(NN,[0,[S[0]]],[S[1],[S[0]]]);
                   2520:                        N2=mperm(NN,[S[0],[S[1]]],[0,[S[1]]]);
                   2521:                        N3=mperm(NN,[0,[S[0]]],[0,[S[1]]]);
                   2522:                        R1=mdivisor(N1,X|trans=1)[1];
                   2523:                        R2=mdivisor(N2,X|trans=1)[1];
                   2524:                        if(Tr){
                   2525:                                Out=cons(["\\text{As a result,}"],Out);
                   2526:                                Out=cons([N3,"=",N1,MM,N2],Out);
                   2527:                                if(S[0]==S[1] && N3==mgen(S[0],0,1,0)){
                   2528:                                        Out=cons(["=",muldo(N2,N1,XX),MM,"."],Out);
                   2529:                                }else{
                   2530:                                        Out=cons([N1,"^{-1}=",R1,","],Out);
                   2531:                                        Out=cons([N2,"^{-1}=",R2,"."],Out);
                   2532:                                }
                   2533:                        }else{
                   2534:                                Out=cons([N3,"=P",MM,"Q,"],Out);
                   2535:                                Out=cons(["P=",N1,"=",R1,"^{-1},"],Out);
                   2536:                                Out=cons(["Q=",N2,"=",R2,"^{-1}."],Out);
                   2537:                        }
                   2538:                }
                   2539:                Out = ltotex(reverse(Out)|opt=["cr","spts0"],str=1,cr=15,var=Var);
                   2540:                if(S[0]+S[1]==Is1)
                   2541:                        Out=str_subst(Out,"\\texttt{ }","");
                   2542:                if(VV>0){
                   2543:                        dviout(Out|eq=6);
                   2544:                        return NN;
                   2545:                }
                   2546:                return Out;
                   2547:        }else if(type(V)!=5) V=0;
                   2548:
                   2549:        if(type(St=getopt(step))!=1) St=0;
                   2550:        for(FF=": start";;){
                   2551:                if(St && V==0){
                   2552:                        if(Tr){
                   2553:                                mycat0([St,FF,"\n"],0);
                   2554:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2555:                        }
                   2556:                        else    mycat0([St,FF,"\n",M,"\n"],0);
                   2557:                }
                   2558:                if(X==0||X==[0,0]){ /* search minimal non-zero element */
                   2559:                        for(K=F=I=0; I<S0; I++){
                   2560:                                for(J=0; J<S1; J++){
                   2561:                                        if((P=abs(M[I][J]))!=0 && (K>P || K==0)){
                   2562:                                                K=P; R=[I,J];
                   2563:                                        }
                   2564:                                }
                   2565:                        }
                   2566:                        R=cons(K-1,[R]);
                   2567:                }
                   2568:                else R=mymindeg(M,XX[1]|opt=1);
                   2569:                if(R[0]<0){             /*zero matrix */
                   2570:                        if(Tr) return [[],mgen(S0,0,1,0),mgen(S1,0,1,0)];
                   2571:                        return [];
                   2572:                }
                   2573:                R0=R[1][0];R1=R[1][1];
                   2574:                if(R0!=0){
                   2575:                        M=rowx(M,0,R0);
                   2576:                        if(Tr) GR=rowx(GR,0,R0);
                   2577:                }
                   2578:                if(R1!=0){
                   2579:                        M=colx(M,0,R1);
                   2580:                        if(Tr) GC=colx(GC,0,R1);
                   2581:                }
                   2582:                if(St>0 && (R0!=0 || R1!=0))
                   2583:                        if(type(V)==5) V[St]=cons([0,R0,R1],V[St]);
                   2584:                        else if(Tr){
                   2585:                                mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n"],0);
                   2586:                                mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2587:                        }else mycat0([St,": (",R0+1,",",R1+1,") -> (1,1)\n",M,"\n"],0);
                   2588:                if(R[0]==0){            /* (1,1) : invertible */
                   2589:                        if(type(V)==5) V[St]=cons([1],V[St]);
                   2590:                        P=M[0][0]; M[0][0]=1;
                   2591:                        for(J=0;J<S1;J++){      /* (1,1) -> 1 */
                   2592:                                if(J>0) M[0][J]= red(M[0][J]/P);
                   2593:                                if(Tr) GR[0][J]=red(GR[0][J]/P);
                   2594:                        }
                   2595:                        if(S0>1 && S1>1) N=newmat(S0-1,S1-1);
                   2596:                        else N=0;
                   2597:                        for(I=1;I<S0;I++){
                   2598:                                P=M[I][0]; M[I][0]=0;
                   2599:                                for(J=1;J<S1;J++)
                   2600:                                        N[I-1][J-1]=M[I][J]=red(M[I][J] - muldo(P,M[0][J],XX));
                   2601:                                if(Tr){
                   2602:                                        for(J=0;J<S0;J++)
                   2603:                                                GR[I][J] = red(GR[I][J] -muldo(P,GR[0][J],XX));
                   2604:                                }
                   2605:                        }
                   2606:                        if(Tr){
                   2607:                                for(J=1;J<S1; J++){
                   2608:                                        for(I=0;I<S1;I++) GC[I][J]=red(GC[I][J]-muldo(GC[I][0],M[0][J],XX));
                   2609:                                        M[0][J]=0;
                   2610:                                }
                   2611:                        }
                   2612:                        if(St>0 && V==0){
                   2613:                                if(Tr){
                   2614:                                        mycat0([St,": unit\n"],0);
                   2615:                                        mycat([GR,"\n"]);mycat([M,"\n"]);mycat([GC,"\n"]);
                   2616:                                }
                   2617:                                else mycat0([St,": unit\n",M,"\n"],0);
                   2618:                        }
                   2619:                        if(N==0){
                   2620:                                if(!Tr) return [1];
                   2621:                                if(Tr==2){
                   2622:                                        GR0=mdivisor(GR,X|trans=1)[1];
                   2623:                                        GC0=mdivisor(GC,X|trans=1)[1];
                   2624:                                        return [[1],GR,GC,GR0,GC0];
                   2625:                                }
                   2626:                                return [[1],GR,GC];
                   2627:                        }
                   2628:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2629:                        if(!Tr) return cons(1,R);
                   2630:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2631:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2632:                        if(S0==S1 && countin(1,1,R[0])==S0-1){
                   2633:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2634:                        }
                   2635:                        if(Tr==2){
                   2636:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2637:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2638:                                return [cons(1,R[0]),GR,GC,GR0,GC0];
                   2639:                        }
                   2640:                        return [cons(1,R[0]),GR,GC];
                   2641:                }
                   2642:                for(I=1;I<S0;I++){
                   2643:                        if(M[I][0]!=0){
                   2644: /* Error! when mygcd(A,B,0) with A<=0 or B<=0 */
                   2645:                                R=mygcd(M[I][0],M[0][0],XX);    /* R[0]=R[1]*M[I][0]+R[2]*M[0][0] */
                   2646:                                M[0][0]=R[0]; M[I][0]=0;        /*    0=R[3]*M[I][0]+R[4]*M[0][0] */
                   2647:                                for(J=1;J<S1;J++){
                   2648:                                        T=red(muldo(R[1],M[I][J],XX)+muldo(R[2],M[0][J],XX));
                   2649:                                        M[I][J]=red(muldo(R[3],M[I][J],XX)+muldo(R[4],M[0][J],XX));
                   2650:                                        M[0][J]=T;
                   2651:                                }
                   2652:                                if(Tr){
                   2653:                                        for(J=0;J<S0;J++){
                   2654:                                                T=red(muldo(R[1],GR[I][J],XX)+muldo(R[2],GR[0][J],XX));
                   2655:                                                GR[I][J]=red(muldo(R[3],GR[I][J],XX)+muldo(R[4],GR[0][J],XX));
                   2656:                                                GR[0][J]=T;
                   2657:                                        }
                   2658:                                }
                   2659:                                if(St && V==0){
                   2660:                                        mycat([" [",R[2],R[1],"]*"]);
                   2661:                                        mycat([" [",R[4],R[3],"]"]);
                   2662:                                }
                   2663:                                if(type(V)==5) V[St]=cons([2,I,mat([R[2],R[1]],[R[4],R[3]])],V[St]);
                   2664:                                FF=": line 1 & "+rtostr(I+1); I=S0;
                   2665:                        }
                   2666:                }
                   2667:                if(I>S0) continue;
                   2668:                for(J=1;J<S1;J++){
                   2669:                        if(M[0][J]!=0){
                   2670:                                R=mygcd(M[0][J],M[0][0],XX|rev=1); /* R[0]=M[0][J]*R[1]+M[0][0]*R[2] */
                   2671:                                M[0][0]=R[0]; M[0][J]=0;                 /*    0=M[0][J]*R[3]+M[0][0]*R[4] */
                   2672:                                for(I=1;I<S0;I++){
                   2673:                                        T=red(muldo(M[I][J],R[1],XX)+muldo(M[I][0],R[2],XX));
                   2674:                                        M[I][J]=red(muldo(M[I][J],R[3],XX)+muldo(M[I][0],R[4],XX));
                   2675:                                        M[I][0]=T;
                   2676:                                }
                   2677:                                if(Tr){
                   2678:                                        for(I=0;I<S1;I++){
                   2679:                                                T=red(muldo(GC[I][J],R[1],XX)+muldo(GC[I][0],R[2],XX));
                   2680:                                                GC[I][J]=red(muldo(GC[I][J],R[3],XX)+muldo(GC[I][0],R[4],XX));
                   2681:                                                GC[I][0]=T;
                   2682:                                        }
                   2683:                                }
                   2684:                                if(type(V)==5) V[St]=cons([3,J,mat([R[2],R[4]],[R[1],R[3]])],V[St]);
                   2685:                                FF=": column 1 & "+rtostr(J+1);J=S1;
                   2686:                                if(St && V==0){
                   2687:                                        mycat([" *[",R[2],R[4],"]"]);
                   2688:                                        mycat(["  [",R[1],R[3],"]"]);
                   2689:                                }
                   2690:                        }
                   2691:                }
                   2692:                if(J>S1) continue;
                   2693:                if(S0==1 || S1==1){
                   2694:                        P=M[0][0];
                   2695:                        if(X==0){
                   2696:                                if(P<0){
                   2697:                                        P=-P;
                   2698:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2699:                                        if(type(V)==5) V[St]=cons([5,0,-1],V[St]);
                   2700:                                }
                   2701:                        }else{
                   2702:                                P=nm(P);
                   2703:                                if((R=fctr(P)[0][0])!=1){
                   2704:                                        P/=R;
                   2705:                                        if(Tr) for(J=0;J<S0;J++) GR[0][J]/=R;
                   2706:                                        if(type(V)==5) V[St]=cons([5,0,1/R],V[St]);
                   2707:                                }
                   2708:                        }
                   2709:                        if(!Tr) return [P];
                   2710:                        if(Tr==2){
                   2711:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2712:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2713:                                return [[P],GR,GC,GR0,GC0];
                   2714:                        }
                   2715:                        return [[P],GR,GC];
                   2716:                }
                   2717:                if(XX==0 || (type(XX)==4 && XX[0]==0)){                 /* commutative case */
                   2718:                        P=M[0][0];
                   2719:                        for(I=1; I<S0; I++){
                   2720:                                for(J=1; J<S1; J++)
                   2721:                                        if(divdo(M[I][J],P,XX)[1]!=0) break;
                   2722:                                if(J<S1){
                   2723:                                        if(type(V)==5) V[St]=cons([4,J],V[St]);
                   2724:                                        FF=": column 1 += col"+rtostr(J+1);
                   2725:                                        for(I=1;I<S0;I++) M[I][0]=M[I][J];
                   2726:                                        if(Tr) for(I=0;I<S1;I++) GC[I][0]=red(GC[I][0]+GC[I][J]);
                   2727:                                        break;
                   2728:                                }
                   2729:                        }
                   2730:                        if(J<S1) continue;
                   2731:                        N=newmat(S0-1,S1-1);
                   2732:                        for(I=1;I<S0;I++)
                   2733:                                for(J=1;J<S1;J++) N[I-1][J-1]=red(M[I][J]/P);
                   2734:                        if(X==0){
                   2735:                                if(P<0) P=-P;
                   2736:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]=-GR[0][J];
                   2737:                        }else{
                   2738:                                P=M[0][0];
                   2739:                                P=nm(P);
                   2740:                                P/=fctr(P)[0][0];
                   2741:                                if(Tr) for(J=0;J<S0;J++) GR[0][J]/=fctr(P)[0][0];
                   2742:                        }
                   2743:                        R=mdivisor(N,XX|dviout=V,trans=Tr0,step=(St>0)?St+1:St);
                   2744:                        RT=(Tr)?R[0]:R;
                   2745:                        for(RR=[],L=reverse(RT);L!=[];L=cdr(L))
                   2746:                                RR=cons(red(P*car(L)),RR);
                   2747:                        RR=cons(P,RR);
                   2748:                        if(!Tr) return RR;
                   2749:                        GR=muldo(newbmat(2,2,[[1],[0,R[1]]]),GR,XX);
                   2750:                        GC=muldo(GC,newbmat(2,2,[[1],[0,R[2]]]),XX);
                   2751:                        if(S0==S1 && countin(1,1,RR)==S0){
                   2752:                                GR=muldo(GC,GR,XX); GC=mgen(S0,0,1,0);
                   2753:                        }
                   2754:                        if(Tr==2){
                   2755:                                GR0=mdivisor(GR,X|trans=1)[1];
                   2756:                                GC0=mdivisor(GC,X|trans=1)[1];
                   2757:                                return [RR,GR,GC,GR0,GC0];
                   2758:                        }
                   2759:                        return [RR,GR,GC];
                   2760:                }  /* End of commutative case */
                   2761:                for(I=1; I<S0; I++){
                   2762:                        for(J=1; J<S1; J++){
                   2763:                                if(M[I][J] != 0){
                   2764:                                        for(T=1;I<S0;T*=XX[0]){
                   2765:                                                R=divdo(muldo(M[I][J],T,XX),M[0][0],XX);
                   2766:                                                if(R[1]!=0){
                   2767:                                                        if(type(V)==5) V[St]=cons([6,J,T],V[St]);
                   2768:                                                        FF=": column 1 += col"+rtostr((J+1)*T);
                   2769:                                                        if(I>1){
                   2770:                                                                M=rowx(M,1,I);
                   2771:                                                                if(Tr) GR=rowx(GR,1,I);
                   2772:                                                                if(type(V)==5) V[St]=cons([7,I],V[St]);
                   2773:                                                                FF+=", line 2<->"+rtostr(I+1);
                   2774:                                                        }
                   2775:                                                        for(I=1;I<S0;I++)   M[I][0]=muldo(M[I][J],T,XX);
                   2776:                                                        if(Tr)
                   2777:                                                                for(I=1;I<S1;I++) GC[I][0]=red(GC[I][0]+muldo(GC[I][J],T,XX));
                   2778:                                                        I=S0+1; J=S1;
                   2779:                                                        break;
                   2780:                                                }
                   2781:                                        }
                   2782:                                }
                   2783:                        }
                   2784:                        if(I>S0) break;
                   2785:                }
                   2786:                if(I==S0) return [];  /* zero matrix : never happen */
                   2787:        }
                   2788: }
                   2789:
                   2790: def mdsimplify(L)
                   2791: {
                   2792:        T=getopt(type);
                   2793:        SS=0;
                   2794:        if(type(L)==6){
                   2795:                L=[L]; SS=1;
                   2796:        }
                   2797:        if(type(L)==5){
                   2798:                SS=2;
                   2799:                L = vtol(L);
                   2800:        }
                   2801:        M=car(L);
                   2802:        S=size(M)[0];
                   2803: #if 0
                   2804:        MN=newmat(S,S);
                   2805:        MD=newmat(S,S);
                   2806:        for(I=0;I<S;I++){
                   2807:                for(J=0;J<S;J++){
                   2808:                        TN=0;TD=1;
                   2809:                        for(PL=L;PL!=[];PL=cdr(PL)){
                   2810:                                TM=red(car(PL)[I][J]);
                   2811:                                TN=lgcd([TN,nm(TM)]|pol=1);
                   2812:                                TD=llcm([TD,dn(TM)]|pol=1);
                   2813:                        }
                   2814:                        MN[I][J]=TM;
                   2815:                        MD[I][J]=TN;
                   2816:                }
                   2817:        }
                   2818:        for(I=0;I<S;I++){
                   2819:                for(J=0;J<S;J++){
                   2820:                        if(I==J||type(TD[I][J])<2||type(TN[J][I])<2) continue;
                   2821:                        for(FC=cdr(fctr(TD[I][J]));FC!=[];){
                   2822:                                TFC=car(FC);
                   2823:                                if(type(red(TN[J][I]/TFC[0]))>2) continue;
                   2824:                        }
                   2825:                }
                   2826:        }
                   2827: #endif
                   2828:        DD=newvect(S);
                   2829:        for(I=0; I<S; I++){
                   2830:                LN=RN=[];
                   2831:                LD=RD=1;
                   2832:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   2833:                        M = car(LL);
                   2834:                        for(J=0; J<S; J++){
                   2835:                                if(J==I) continue;
                   2836:                                if((MM=M[I][J]) != 0){
                   2837:                                        LN = cons(nm(MM),LN);
                   2838:                                        if(type(MM)==3 && tdiv(LD,P=dn(MM))==0)
                   2839:                                                LD=tdiv(LD*P,gcd(LD,P));
                   2840:                                }
                   2841:                                if((MM=M[J][I]) != 0){
                   2842:                                        RN = cons(nm(MM),RN);
                   2843:                                        if(type(MM)==3 && tdiv(RD,P=dn(MM))==0)
                   2844:                                                RD=tdiv(RD*P,gcd(RD,P));
                   2845:                                }
                   2846:                        }
                   2847:                }
                   2848:                if(T==1 || T==3) LQ=RD;
                   2849:                else{
                   2850:                        P=lpgcd(LN);
                   2851:                        LQ=gcd(P,RD);
                   2852:                        if(P!=0) LQ *= nm(fctr(P)[0][0]);
                   2853:                }
                   2854:                if(T==1 || T==2) RQ=LD;
                   2855:                else{
                   2856:                        P=lpgcd(RN);
                   2857:                        RQ=gcd(P,LD);
                   2858:                        if(P!=0) RQ *= nm(fctr(P)[0][0]);
                   2859:                }
                   2860:                if((P=gcdz(LQ,RQ))!=1){
                   2861:                        LQ = red(LQ/P); RQ=red(RQ/P);
                   2862:                }
                   2863:                DD[I]=red(LQ/RQ);
                   2864:                if(LQ!=1 || RQ!=1){
                   2865:                        for(LA=[],LL=L; LL!=[]; LL=cdr(LL)){
                   2866:                                M = car(LL);
                   2867:                                for(J=0; J<S; J++){
                   2868:                                        if(I!=J){
                   2869:                                                if(LQ!=1){
                   2870:                                                        M[I][J] = red(M[I][J]/LQ);
                   2871:                                                        M[J][I] = red(M[J][I]*LQ);
                   2872:                                                }
                   2873:                                                if(RQ!=1){
                   2874:                                                        M[J][I] = red(M[J][I]/RQ);
                   2875:                                                        M[I][J] = red(M[I][J]*RQ);
                   2876:                                                }
                   2877:                                        }
                   2878:                                }
                   2879:                        }
                   2880:                }
                   2881:        }
                   2882:        if(SS==2) L=ltov(L);
                   2883:        if(SS==1) L=L[0];
                   2884:        if(getopt(show)==1) L=[L,DD];
                   2885:        return L;
                   2886: }
                   2887:
                   2888: def m2mc(M,X)
                   2889: {
                   2890:        if(type(M)<2){
                   2891:        mycat([
                   2892: "m2mc(m,t) or m2mc(m,[t,s])\t Calculation of Pfaff system of two variables\n",
                   2893: " m : list of 5 residue mat. or GRS/spc for rigid 4 singular points\n",
                   2894: " t : [a0,ay,a1,c], swap, GRS, GRSC, sp, irreducible, pair, pairs, Pfaff, All\n",
                   2895: " s : TeX, dviout, GRSC\n",
                   2896: " option : swap, small, simplify, operator, int\n",
                   2897: " Ex: m2mc(\"21,21,21,21\",\"All\")\n"
                   2898: ]);
                   2899:                return 0;
                   2900:        }
                   2901:        if(type(M)==7) M=s2sp(M);
                   2902:        if(type(X)==7) X=[X];
                   2903:        Simp=getopt(simplify);
                   2904:        if(Simp!=0 && type(Simp)!=1) Simp=2;
                   2905:        Small=(getopt(small)==1)?1:0;
                   2906:        if(type(M[0])==4){
                   2907:                if(type(M[0][0])==1){ /* spectral type */
                   2908:                        XX=getopt(dep);
                   2909:                        if(type(XX)!=4 || type(XX[0])>1) XX=[1,length(M[0])];
                   2910:                        M=sp2grs(M,[d,a,b,c],[XX[0],XX[1],-2]|mat=1);
                   2911:                        if(XX[0]>1 && XX[1]<2) XX=[XX[0],2];
                   2912:                        if(getopt(int)!=0){
                   2913:                                T=M[XX[0]-1][XX[1]-1][1];
                   2914:                                for(V=vars(T);V!=[];V=cdr(V)){
                   2915:                                        F=coef(T,1,car(V));
                   2916:                                        if(type(F)==1 && dn(F)>1)
                   2917:                                         M = subst(M,car(V),dn(F)*car(V));
                   2918:                                }
                   2919:                        }
                   2920:                        V=vars(M);
                   2921:                        if(findin(d1,V)>=0 && findin(d2,V)<0 && findin(d3,V)<0)
                   2922:                                M=subst(M,d1,d);
                   2923:                }
                   2924:                RC=chkspt(M|mat=1);
                   2925:                if(RC[2] != 2 || RC[3] != 0){ /* rigidity idx and Fuchs cond */
                   2926:                        erno(0);return 0;
                   2927:                }
                   2928:                R=getbygrs(M,1|mat=1);
                   2929:                if(getopt(anal)==1) return R;   /* called by mc2grs() */
                   2930:                Z=newmat(1,1,[[0]]);
                   2931:                N=[Z,Z,Z,Z,Z];
                   2932:                for(RR=R; RR!=[]; RR=cdr(RR)){
                   2933:                        RT=car(RR)[0];
                   2934:                        if(type(RT)==4){
                   2935:                                if(RT[0]!=0) N=m2mc(N,RT[0]|simplify=Simp);
                   2936:                                N=m2mc(N,[RT[1],RT[2],RT[3]]|simplify=Simp);
                   2937:                        }
                   2938:                }
                   2939:                if(type(X)==4 && type(X[0])==7)
                   2940:                        return m2mc(N,X|keep=Keep,small=Small);
                   2941:                return N;
                   2942:        }
                   2943:        if(type(X)==4 && type(X[0])==7){
                   2944:                Keep=(getopt(keep)==1)?1:0;
                   2945:                if(X[0]=="All"){
                   2946:                        dviout("Riemann scheme"|keep=1);
                   2947:                        m2mc(M,[(findin("GRSC",X)>=0)?"GRSC":"GRS","dviout"]|keep=1);
                   2948:                        dviout("Spectral types : "|keep=1);
                   2949:                        m2mc(M,["sp","dviout"]|keep=1);
                   2950:                        dviout("\\\\\nBy the decompositions"|keep=1);
                   2951:                        R=m2mc(M,["pairs","dviout"]|keep=1);
                   2952:                        for(R0=R1=[],I=1; R!=[]; I++, R=cdr(R)){
                   2953:                                for(S=0,RR=car(R)[1][0];RR!=[]; RR=cdr(RR)) S+=RR[0];
                   2954:                                if(S==0) R0=cons(I,R0);
                   2955:                                else if(S<0) R1=cons(I,R1);
                   2956:                        }
                   2957:                        S="irreducibility\\ $"+((length(R0)==0)?"\\Leftrightarrow":"\\Leftarrow")
                   2958:                                +"\\ \\emptyset=\\mathbb Z\\cap$";
                   2959:                        dviout(S|keep=1);
                   2960:                        m2mc(M,["irreducible","dviout"]|keep=1);
                   2961:                        if(R0!=[])
                   2962:                                dviout(ltotex(reverse(R0))|eq=0,keep=1,
                   2963:                                 title="The following conditions may not be necessary for the irreducibility.");
                   2964:                        if(R1!=[])
                   2965:                                dviout(ltotex(reverse(R1))|eq=0,keep=1,title="The following conditions can be omitted.");
                   2966:                        if(getopt(operator)!=0){
                   2967:                                dviout("The equation in a Pfaff form is"|keep=1);
                   2968:                                m2mc(M,["Pfaff","dviout"]|keep=Keep,small=Small);
                   2969:                        }
                   2970:                        else if(Keep!=1) dviout(" ");
                   2971:                        return M;
                   2972:                }
                   2973:                Show=0;
                   2974:                if(length(X)>1){
                   2975:                        if(X[1]=="dviout") Show=2;
                   2976:                        if(X[1]=="TeX") Show=1;
                   2977:                }
                   2978:                if(X[0]=="GRS"||X[0]=="GRSC"||X[0]=="sp"){
                   2979:                        Y=radd(-M[0],-M[1]-M[2]);
                   2980:                        if(X[0]!="GRSC"){
                   2981:                                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);
                   2982:                                if(X[0]=="sp"){
                   2983:                                        L=chkspt(L|opt="sp");
                   2984:                                        V=[L[1],L[0],L[2],L[5]]; W=[L[1],L[3],L[4],L[6]];
                   2985:                                        if(Show==2) dviout(s2sp(V)+" : "+s2sp(W)|keep=Keep);
                   2986:                                        return [V,W];
                   2987:                                }
                   2988:                                S="x=0&x=y&x=1&y=0&y=1&x=\\infty&y=\\infty&x=y=\\infty\\\\\n";
                   2989:                        }else{
                   2990:                                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]),
                   2991:                                        radd(M[0],M[1]+M[3]),radd(M[1],M[2]+M[4])]|mult=1);
                   2992:                                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";
                   2993:                        }
                   2994:                        T=ltotex(L|opt="GRS",pre=S,small=Small);
                   2995:                        if(Show==2) dviout(T|eq=0,keep=Keep);
                   2996:                        if(Show==1) L=T;
                   2997:                        return L;
                   2998:                }
                   2999:                if(X[0]=="Pfaff"){
                   3000:                        S=ltotex(M|opt=["Pfaff",u,x,x-y,x-1,y,y-1],small=Small);
                   3001:                        if(Show==2) dviout(S|eq=0,keep=Keep);
                   3002:                        return S;
                   3003:                }
                   3004:                if(X[0]=="irreducible"){
                   3005:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3006:                        S=getbygrs(L,10|mat=1);
                   3007:                        if(Show==2) dviout(ltotex(S)|eq=0,keep=Keep);
                   3008:                        return S;
                   3009:                }
                   3010:                if(X[0]=="pairs"||X[0]=="pair"){
                   3011:                        L=meigen([M[0],M[1],M[2],radd(-M[0],-M[1]-M[2])]|mult=1);
                   3012:                        S=chkspt(L|opt=0);
                   3013:                        V=(Show==2)?1:0;
                   3014:                        S=sproot(L,X[0]|dviout=V,keep=Keep);
                   3015:                        return S;
                   3016:                }
                   3017:                if(X[0]=="swap"){
                   3018:                        Swap=getopt(swap);
                   3019:                        if(type(Swap)<1 || Swap==1)
                   3020:                                return newvect(5,[M[3],M[1],M[4],M[0],M[2]]);
                   3021:                        if(Swap==2)
                   3022:                                return newvect(5,[radd(M[0],M[1]+M[3]),M[4],M[2],radd(-M[1],-M[3]-M[4]),M[1]]);
                   3023:                        if(type(Swap)==4 && length(Swap)==3){
                   3024:                                MX=radd(-M[0],-M[1]-M[2]); MY=radd(-M[3],-M[1]-M[4]);
                   3025:                                if(Swap[0]==1){
                   3026:                                        MX0=M[2];MY0=M[4];
                   3027:                                }
                   3028:                                else if(Swap[0]==2){
                   3029:                                        MX0=MX;MY0=MY;
                   3030:                                }else{
                   3031:                                        MX0=M[0];MY0=M[3];
                   3032:                                }
                   3033:                                if(Swap[1]==1){
                   3034:                                        MX1=M[2];MY1=M[4];
                   3035:                                }
                   3036:                                else if(Swap[1]==2){
                   3037:                                        MX1=MX;MY1=MY;
                   3038:                                }else{
                   3039:                                        MX1=M[0];MY1=M[3];
                   3040:                                }
                   3041:                                return newvect(5,MX0,M[1],MX1,MY0,MY1);
                   3042:                        }
                   3043:                }
                   3044:                return 0;
                   3045:        }
                   3046:        if(getopt(swap)==1)
                   3047:                 return m2mc(m2mc(m2mc(M,"swap"),X),"swap");
                   3048:        N=newvect(5);
                   3049:        for(I=0;I<5;I++)
                   3050:                N[I]=M[I];
                   3051:        S=size(N[0])[0];
                   3052:        if(type(X)==4){
                   3053:                 for(I=0;I<3;I++){
                   3054:                         if(X[I] != 0)
                   3055:                                        N[I] = radd(N[I],X[I]);
                   3056:                 }
                   3057:                 if(length(X)==3) return N;
                   3058:                 X=X[3];
                   3059:        }
                   3060:        MZ = newmat(S,S);
                   3061:        ME = mgen(S,0,[X],0);
                   3062:        MM = newvect(5);
                   3063:        MM[0] = newbmat(3,3, [[N[0]+ME,N[1],N[2]], [MZ], [MZ]]);
                   3064:        MM[1] = newbmat(3,3, [[MZ], [N[0],N[1]+ME,N[2]], [MZ]]);
                   3065:        MM[2] = newbmat(3,3, [[MZ], [MZ], [N[0],N[1],N[2]+ME]]);
                   3066:        MM[3] = newbmat(3,3, [[N[3]+N[1],-N[1]], [-N[0],radd(N[0],N[3])], [MZ,MZ,N[3]]]);
                   3067:        MM[4] = newbmat(3,3, [[N[4]], [MZ,N[4]+N[2],-N[2]], [MZ,-N[1],radd(N[4],N[1])]]);
                   3068:        M0 = newbmat(3,3, [[N[0]], [MZ,N[1]], [MZ,MZ,N[2]]]);
                   3069:        M1 = radd(MM[0],MM[1]+MM[2]);
                   3070:        KE = append(mykernel(M0|opt=1),mykernel(M1|opt=1));
                   3071:        if(length(KE) == 0) return MM;
                   3072:        KK = mtoupper(lv2m(KE),0);
                   3073:        for(I=0;I<5;I++)
                   3074:                MM[I] = mmod(MM[I],KK);
                   3075:        if(Simp!=0) MM = mdsimplify(MM|type=Simp);
                   3076:        return MM;
                   3077: }
                   3078:
                   3079: def easierpol(P,X)
                   3080: {
                   3081:        if(type(X) == 4){
                   3082:                for( Y = [] ; X != []; X = cdr(X) )
                   3083:                        Y = cons([0,car(X)], Y);
                   3084:        }else
                   3085:                Y = [0,X];
                   3086:        return rede(P,Y);
                   3087: }
                   3088:
                   3089: def l2p(L,V)
                   3090: {
                   3091:        if(type(L)==4){
                   3092:                for(S=I=0;L!=[];L=cdr(L),I++)
                   3093:                        S+=car(L)*V^I;
                   3094:                return S;
                   3095:        }else if(type(L)==5){
                   3096:                for(S=0,I=size(L)-1;I>=0;I--)
                   3097:                        S+=L[I]*V^I;
                   3098:                return S;
                   3099:        }else{
                   3100:                if(type(D=getopt(size))==1) D--;
                   3101:                else D=mydeg(L,V);
                   3102:                for(S=[];D>=0;D--)
                   3103:                        S=cons(mycoef(L,D,V),S);
                   3104:                return S;
                   3105:        }
                   3106: }
                   3107:
                   3108: def paracmpl(L,V)
                   3109: {
                   3110:        if(type(L)==4) L=ltov(L);
                   3111:        S=length(L);
                   3112:        Lim=getopt(lim);Low=getopt(low);
                   3113:        if((F=type(L[0]))>3){
                   3114:                SV=length(L[0]);
                   3115:                V0=makenewv(L);
                   3116:                for(LL=[];S>0;S--)
                   3117:                        LL=cons(l2p(L[S-1],V0),LL);
                   3118:                G=paracmpl(LL,V|option_list=getopt());
                   3119:                H=(Lim==1)?G:G[0];
                   3120:                for(HH=[];H!=[];H=cdr(H)){
                   3121:                        HT=l2p(car(H),V0|size=SV);
                   3122:                        if(F==5) HT=ltov(HT);
                   3123:                        HH=cons(HT,HH);
                   3124:                }
                   3125:                H=reverse(HH);
                   3126:                return (Lim==1)?H:[H,G[1]];
                   3127:        }
                   3128:        H=newvect(S);D=newvect(S);
                   3129:        for(Dn=1,I=0;I<S;I++){
                   3130:                P=dn(L[I]=red(L[I]));
                   3131:                Dn=red(Dn*P/gcd(Dn,P));
                   3132:        }
                   3133:        if(Dn!=1){
                   3134:                for(I=0;I<S;I++) L[I]=red(Dn*L[I]);
                   3135:        }
                   3136:        G=diagm(S,[1]);
                   3137:        if(type(V)<4) V=[V];
                   3138:        VV=lsort(vars(L),V,1);
                   3139:        V=car(V);
                   3140:        for(I=0;I<S;I++){
                   3141:                P=L[I];
                   3142:                for(J=0,C=P;J<I;J++){
                   3143:                        if(D[J]!=[]){
                   3144:                                C=mycoef(C,DT,VV);
                   3145:                                P-=C*H[J];
                   3146:                                G=cola(G,I,J,-C);
                   3147:                        }
                   3148:                }
                   3149:                if(P==0){
                   3150:                        D[I]=[];continue;
                   3151:                }
                   3152:                P0=nm(red(P));
                   3153:                K=mymindeg(P0,V);
                   3154:                C=mycoef(P0,K,V);
                   3155:                if(K>0){
                   3156:                        P=red(P/V^K);
                   3157:                        G=colm(G,I,1/V^K);
                   3158:                }
                   3159:                for(DT=[],VT=VV;VT!=[];VT=cdr(VT)){
                   3160:                        K=(Low==1)?mymindeg(C,car(VT)):mydeg(C,car(VT));
                   3161:                        C=mycoef(C,K,car(VT));
                   3162:                        DT=cons(K,DT);
                   3163:                }
                   3164:                D[I]=DT=reverse(DT);
                   3165:                for(C=P,VT=VV;VT!=[];VT=cdr(VT),DT=cdr(DT))
                   3166:                        C=mycoef(C,car(DT),car(VT));
                   3167:                H[I]=P=red(P/C);
                   3168:                G=colm(G,I,1/C);
                   3169:        }
                   3170:        if(Dn!=1){
                   3171:                for(I=0;I<S;I++){
                   3172:                        TH=red(H[I]/Dn);
                   3173:                        F=fctr(dn(TH));F=cdr(F);
                   3174:                        if(Lim!=1||subst(Dn,V,0)==0){
                   3175:                                for(;F!=[];F=cdr(F)){
                   3176:                                        if(lsort(vars(car(F)[0]),VV,2)==[]){
                   3177:                                                C=car(F)[0]^car(F)[1];
                   3178:                                                TH=red(TH*C);
                   3179:                                                G=colm(G,I,C);
                   3180:                                        }
                   3181:                                }
                   3182:                        }
                   3183:                        H[I]=TH;
                   3184:                }
                   3185:        }
                   3186:        H=vtol(H);
                   3187:        if(Lim==1){
                   3188:                H=subst(H,V,0);
                   3189:                return map(red,H);
                   3190:        }
                   3191:        return [H,map(red,G)];
                   3192: }
                   3193:
                   3194: def mykernel(M)
                   3195: {
                   3196:        if(getopt(opt) == 1)
                   3197:                M = mtranspose(M);
                   3198:        S = size(M);
                   3199:        R = [];
                   3200:        MM = mtoupper(M,-1);
                   3201:        for(I = S[0]-1; I >= 0; I--){
                   3202:                for(J = S[1]-1; J >= 0; J--){
                   3203:                        if(MM[I][J] != 0)
                   3204:                                return R;
                   3205:                }
                   3206:                P = easierpol(MM[I][S[1]],zz);
                   3207:                RR = newvect(S[0]);
                   3208:                for(J = 0; J < S[0]; J++)
                   3209:                        RR[J] = mycoef(P,J,zz);
                   3210:                R = cons(RR,R);
                   3211:        }
                   3212:        return R;
                   3213: }
                   3214:
                   3215: def myimage(M)
                   3216: {
                   3217:        if(getopt(opt) == 1)
                   3218:                M = mtranspose(M);
                   3219:        S = size(M);
                   3220:        V = [];
                   3221:        M0 = newvect(S[1]);
                   3222:        M = mtoupper(M,0|opt=1);
                   3223:        for(I = S[0]-1; I >= 0; I--)
                   3224:                if(M0 != M[I])
                   3225:                        V = cons(vtozv(M[I])[0], V);
                   3226:        return V;
                   3227: }
                   3228:
                   3229: def mymod(V,L)
                   3230: {
                   3231:        Opt = getopt(opt);
                   3232:        S = length(V);
                   3233:        VP = newvect(S);
                   3234:        if(type(L)==6)
                   3235:                L=m2lv(L);
                   3236:        CT = length(L);
                   3237:        for(LT = L; LT != []; LT = cdr(LT)){
                   3238:                for(VT = car(LT), I = 0; I < S; I++)
                   3239:                        if(VT[I] != 0) break;
                   3240:                if(I >= S){
                   3241:                        CT--;
                   3242:                        continue;
                   3243:                }
                   3244:                VP[I] = 1;
                   3245:                MI = -red(V[I]/VT[I]);
                   3246:                if(MI != 0)
                   3247:                        V = radd(V,rmul(MI,VT));
                   3248:        }
                   3249:        if(Opt==1){
                   3250:                for(I = 0; I < S; I++)
                   3251:                        if(V[I] != 0)
                   3252:                                return 1;
                   3253:                return 0;
                   3254:        }
                   3255:        if(Opt==2){
                   3256:                W=newvect(S-CT);
                   3257:                for(CC = I = 0; I < S; I++){
                   3258:                        if(VP[I]==0) W[CC++] =V[I];
                   3259:                }
                   3260:                return W;
                   3261:        }
                   3262:        return V;
                   3263: }
                   3264:
                   3265: def mmod(M,L)
                   3266: {
                   3267:        S=size(M)[1];
                   3268:        MM=mtranspose(M);
                   3269:        VP = newvect(S);
                   3270:        if(type(L)==6)
                   3271:                L=m2lv(L);
                   3272:        for(CT = 0, LT = L; LT != []; LT = cdr(LT)){
                   3273:                for(VT = car(LT), I = 0; I < S; I++){
                   3274:                        if(VT[I] != 0){
                   3275:                                VP[I] = 1;
                   3276:                                break;
                   3277:                        }
                   3278:                }
                   3279:        }
                   3280:        if(getopt(opt)==1)
                   3281:                NE=1;
                   3282:        for(D=I=0; I<S; I++){
                   3283:                if(NE != 1 && VP[I] == 1) continue;
                   3284:                T = mymod(MM[I],L|opt=2);
                   3285:                if(D==0){
                   3286:                        K=length(T);
                   3287:                        MN=newmat((NE==1)?S:K,K);
                   3288:                }
                   3289:                for(J=0;J<K;J++)
                   3290:                        MN[J][D]=T[J];
                   3291:                D++;
                   3292:        }
                   3293:        return MN;
                   3294: }
                   3295:
                   3296: def llsize(V)
                   3297: {
                   3298:        for(I=J=0;V!=[];V=cdr(V),I++)
                   3299:                if(length(car(V))>J) J=length(car(V));
                   3300:        return [I,J];
                   3301: }
                   3302:
                   3303: def llbase(VV,L)
                   3304: {
                   3305:        S = length(VV);
                   3306:        V = dupmat(VV);
                   3307:        if(type(V) == 4)
                   3308:                V = ltov(V);
                   3309:        T = length(L);
                   3310:        for(I = 0; I < S; I++)
                   3311:                V[I] = nm(red(V[I]));
                   3312:        LV = 0;
                   3313:        for(J = 0; J < T; J++){
                   3314:                X = var(L[J]); N = deg(L[J],X);
                   3315:                for(I = LV; I < S; I++){
                   3316:                        if((C2=coef(V[I],N,X)) != 0){
                   3317:                                if(I > LV){
                   3318:                                        Temp = V[I];
                   3319:                                        V[I] = V[LV];
                   3320:                                        V[LV] = Temp;
                   3321:                                }
                   3322:                                for(I = 0; I < S; I++){
                   3323:                                        if(I == LV || (C1 = coef(V[I],N,X)) == 0)
                   3324:                                                continue;
                   3325:                                        Gcd = gcd(C1,C2);
                   3326:                                        V[I] = V[I]*tdiv(C2,Gcd)-V[LV]*tdiv(C1,Gcd);
                   3327:                                }
                   3328:                                LV++;
                   3329:                        }
                   3330:                }
                   3331:        }
                   3332:        return V;
                   3333: }
                   3334:
                   3335: def lsort(L1,L2,T)
                   3336: {
1.10      takayama 3337:        C1=getopt(c1);C2=getopt(c2);
1.8       takayama 3338:        if(type(T)==4){
                   3339:                K=T;
1.10      takayama 3340:                if(length(T)>0){
                   3341:                        T=K[0];
                   3342:                        K=cdr(K);
1.12      takayama 3343:                }else T=0;
1.8       takayama 3344:        }else K=0;
1.10      takayama 3345:        if(type(TT=T)==7)
                   3346:                T = findin(T,["cup","setminus","cap","reduce","sum","subst"]);
                   3347:        if(type(L2)==7&&T<0)
                   3348:                T=findin(TT,["put","get","sub"]);
                   3349:        if(K){           /* [[..],..] */
                   3350:                if(K!=[]) KN=K[0];
                   3351:                if(L2==[]||L2=="sort"){ /* sort or deduce duplication */
                   3352:                        if((T!=0&&T!=3)||length(K)!=1) return L1;
1.8       takayama 3353:                        if(KN<0){
                   3354:                                KN=-KN-1;
                   3355:                                F=-1;
                   3356:                        }else F=1;
                   3357:                        L1=msort(L1,[F,0,KN]);
1.10      takayama 3358:                        if(T==3){
1.8       takayama 3359:                                R=[car(L1)];L1=cdr(L1);
                   3360:                                for(;L1!=[];L1=cdr(L1)){
                   3361:                                        if(car(L1)[KN]!=car(R)[KN]) R=cons(car(L1),R);
                   3362:                                }
                   3363:                                L1=reverse(R);
                   3364:                        }
                   3365:                        return L1;
1.10      takayama 3366:                }else if((L2==0||L2=="col")&&type(C1)==4){
1.8       takayama 3367:                        if(T==0||T==1){ /* extract or delete columns */
                   3368:                                for(R=[];L1!=[];L1=cdr(L1)){
1.10      takayama 3369:                                        if(T==1&&C1==[0]){      /* delete top column */
1.8       takayama 3370:                                                R=cons(cdr(car(L1)),R);
                   3371:                                                continue;
                   3372:                                        }
1.10      takayama 3373:                                        LT=car(L1);RT=[];
1.8       takayama 3374:                                        if(T==0){
1.10      takayama 3375:                                                for(CT=C1;CT!=[];CT=cdr(CT)) RT=cons(LT[car(CT)],RT);
1.8       takayama 3376:                                        }else{
1.10      takayama 3377:                                                for(I=0;LT!=[];I++,LT=cdr(LT))
1.8       takayama 3378:                                                        if(findin(I,C1)<0) RT=cons(car(LT),RT);
                   3379:                                                RT=reverse(RT);
                   3380:                                        }
                   3381:                                        R=cons(RT,R);
                   3382:                                }
                   3383:                                return reverse(R);
                   3384:                        }
1.10      takayama 3385:                }else if(type(L2)==1||type(L2)==7){
                   3386:                        if(L2==1||L2=="num"){
                   3387:                                if(T==4) T=3;
                   3388:                                I=(length(K)<2)?(-1):K[1];
                   3389:                                if(T==0||T==1||T==2||T==3){
                   3390:                                        S=F=CT=0;R=[];
                   3391:                                        if(K==[] || type((S=K[0]))==1 || S==0){
                   3392:                                                if(T==0||T==1||T==2){
                   3393:                                                        for(J;L1!=[];L1=cdr(L1),J++){
                   3394:                                                                if(T==0) R=cons(cons(J+S,car(L1)),R);
                   3395:                                                                else if(T==1){
                   3396:                                                                        for( ;C1!=[]; C1=cdr(C1))
                   3397:                                                                                R=cons(L1[car(C1)],R);
                   3398:                                                                }else{
                   3399:                                                                        if(findin(J,C1)<0) R=cons(car(L1),R);
                   3400:                                                                }
                   3401:                                                        }
                   3402:                                                        return reverse(R);
                   3403:                                                }else if(T==3) return length(L1);
                   3404:                                        }else{
                   3405:                                                if(type(S)==2&&vtype(S)>2) F=1;
                   3406:                                                else if(type(S)==4) F=2;
                   3407:                                                else if(S=="+") F=3;
                   3408:                                                else return L1;
                   3409:                                        }
                   3410:                                        for(R=[];L1!=[];L1=cdr(L1)){
                   3411:                                                L1T=car(L1);
                   3412:                                                if(F==1) V=call(S,(I<0)?L1T:L1T[I]);
                   3413:                                                else if(F==2) V=calc((I<0)?L1T:L1T[I],S);
                   3414:                                                else if(F==3){
                   3415:                                                        for(C=C1,V=0;C!=[];C=cdr(C))
                   3416:                                                                if(type(X=L1T[car(C)])==1) V+=X;
                   3417:                                                }
                   3418:                                                if(T==0) R=cons(cons(V,L1T),R);
                   3419:                                                else if(T==1){
                   3420:                                                        if(V) R=cons(L1T,R);
                   3421:                                                }else if(T==2){
                   3422:                                                        if(!V) R=cons(L1T,R);
                   3423:                                                }else if(T==3){
                   3424:                                                        if(F==3) CT+=V;
                   3425:                                                        else if(V) CT++;
                   3426:                                                }
                   3427:                                        }
                   3428:                                        return (T==3)?CT:reverse(R);
                   3429:                                }else if(TT=="col"){
                   3430:                                        J=(length(K)>0)?car(K):0;
                   3431:                                        I=length(car(L1))+J;
                   3432:                                        for(V=[];I>J;)
                   3433:                                                V=cons(--I,V);
                   3434:                                        return cons(V,L1);
                   3435:                                }
                   3436:                        }else if(L2=="transpose") return mtranspose(L1);
1.12      takayama 3437:                        else if(L2=="subst"||L2=="adjust"){
                   3438:                                Null=(!K)?"":car(K);
1.17      takayama 3439:                                if(L2=="adjust") C1=[];
1.12      takayama 3440:                                R=lv2m(L1|null="");
1.10      takayama 3441:                                for(;C1!=[];C1=cdr(C1)) R[car(C1)[0]][car(C1)[1]]=car(C1)[2];
                   3442:                                return m2ll(R);
                   3443:                        }
                   3444:                        return L1;
                   3445:                }else{           /* [[..],..], [[..],..] */
                   3446:                        if(type(L2[0])<4){
                   3447:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3448:                                L2=reverse(R);
                   3449:                        }
                   3450:                        if(TT=="sum")  T=3;
                   3451:                        if(TT=="over") T=4;
                   3452:                        if(findin(T,[0,1,2,3,4,5])<0) return L1;
                   3453:                        if(T==4||T==5){
                   3454:                                if(type(C1)<2) C1=[C1];
                   3455:                                if(type(C2)<2) C2=[C2];
                   3456:                        }
1.8       takayama 3457:                        if(type(car(L2))!=4){
                   3458:                                for(R=[];L2!=[];L2=cdr(L2)) R=cons([car(L2)],R);
                   3459:                                R=reverse(R);
                   3460:                                if(length(K)==1) K=[K[0],0];
                   3461:                                C2=0;
                   3462:                        }
1.10      takayama 3463:                        L1=lsort(L1,"num",["put",0]);           /* insert number */
                   3464:                        K0=(length(K)>0)?K[0]+1:1;
                   3465:                        K1=(length(K)>1)?K1=K[1]:0;
                   3466:                        L1=lsort(L1,"sort",[0,K0]);
                   3467:                        if(T<4&&type(C2)==4&&length(L2[0])>1){
                   3468:                                L2=lsort(L2,"col",["put"]|c1=cons(K1,C2)); /* add key and extract columns */
                   3469:                                C2=0;K1=0;
                   3470:                        }
                   3471:                        L2=lsort(L2,"sort",[0,K1]);
                   3472:                        for(R0=[],S=S1=length(L1[0]);S>0;S--) R0=cons("",R0);
                   3473:                        for(R1=[],S=length(L2[0]);S>0;S--) R1=cons("",R1);
                   3474:                        if(!K1&&T!=3) R1=cdr(R1);
                   3475:                        for(R=[];L1!=[];L1=cdr(L1)){
                   3476:                                while(L2!=[]&&car(L1)[K0]>car(L2)[K1]){
                   3477:                                        if(T==3) R=cons(append(R0,car(L2)),R);
                   3478:                                        L2=cdr(L2);
                   3479:                                }
                   3480:                                if(L2==[]||car(L1)[K0]<car(L2)[K1]){
                   3481:                                        if(T!=2) R=cons((T==1||T>3||R1==[])?car(L1):append(car(L1),R1),R);
                   3482:                                }else if(T==0||T==2||T==3){
                   3483:                                        if(R0==[]) R=append(car(L1),R);
                   3484:                                        else R=cons(append(car(L1),(!K1&&T!=3)?cdr(car(L2)):car(L2)),R);
                   3485:                                        L2=cdr(L2);
                   3486:                                }else if(T==4||T==5){
                   3487:                                        V1=ltov(car(L1));V2=ltov(car(L2));
                   3488:                                        for(D1=C1,D2=C2;D1!=[];D1=cdr(D1),D2=cdr(D2))
                   3489:                                                if((I=V2[car(D2)])!=""||T==4) V1[car(D1)+1]=I;
                   3490:                                        R=cons(vtol(V1),R);
                   3491:                                }
                   3492:                        }
                   3493:                        if(T==3){
                   3494:                                while(L2!=[]){
                   3495:                                        R=cons(append(R0,car(L2)),R);
                   3496:                                        L2=cdr(L2);
                   3497:                                }
                   3498:                        }
                   3499:                        R=lsort(R,"sort",["put",0]);    /* original order */
                   3500:                        D=(((T==0||T==2)&&!K1)||T==3)?[0]:[0,S1+K1];
                   3501:                        R=lsort(R,0,[1]|c1=D); /* delete */
                   3502:                        if(type(C1)!=4||T==1||T==4||T==5) return R;
                   3503:                        C=[];S0=size(L1[0]);
                   3504:                        for(;C1!=[];C1=cdr(C1)) C=cons(car(C1),C);
                   3505:                        for(I=0;I<S0-S1;I++) C=cons(I+S1,C);
1.8       takayama 3506:                        C=reverse(C);
1.10      takayama 3507:                        return lsort(R,"col",[1]|c1=C);
1.8       takayama 3508:                }
                   3509:        }
1.10      takayama 3510:        if(L2 == []){           /* [...] */
                   3511:                if(T==8||TT=="count") return [length(L1),length(lsort(L1,[],1))];
                   3512:                if(T==7||TT=="cut"){
                   3513:                        K=length(L1);
                   3514:                        if(C1<0) C1=K+C1;
                   3515:                        for(R=[],I=0;I<C1&&L1!=[];I++,L1=cdr(L1))
                   3516:                                R=cons(car(L1),R);
                   3517:                        for(S=[];L1!=[];L1=cdr(L1))
                   3518:                                S=cons(car(L1),S);
                   3519:                        return [reverse(R),reverse(S)];
                   3520:                }
                   3521:                if(T==2) return L2;
                   3522:                if(T==3) return [L1,L2];
1.6       takayama 3523:                L1 = ltov(L1); qsort(L1);
                   3524:                if(T != 1)
                   3525:                        return vtol(L1);
                   3526:                L3 = [];
                   3527:                for(I = length(L1)-1; I >= 0; I--){
                   3528:                        if(I > 0 && L1[I] == L1[I-1])
                   3529:                                continue;
                   3530:                        L3 = cons(L1[I], L3);
                   3531:                }
                   3532:                return L3;
                   3533:        }
1.10      takayama 3534:        if(T==8||TT=="count"){
                   3535:                K=length(lsort(L1,L2,3)[0]);
                   3536:                R=[length(L2),length(L1)];
                   3537:                L1 = lsort(L1,[],1);
                   3538:                L2 = lsort(L2,[],1);
                   3539:                R=append([length(L2),length(L1)],R);
                   3540:                R=cons(length(lsort(L1,L2,2)),R);
                   3541:                return reverse(cons(K,R));
                   3542:        }
1.12      takayama 3543:        if((T==9||TT=="cons")&&type(car(L1))==4){
                   3544:                if(type(L2)!=4) L2=[L2];
                   3545:                for(R=[];L1!=[];L1=cdr(L1)){
                   3546:                        R=cons(cons(car(L2),car(L1)),R);
                   3547:                        if(length(L2)>1) L2=cdr(L2);
                   3548:                }
                   3549:                return reverse(R);
                   3550:        }
1.13      takayama 3551:        if(T==10||TT=="cmp"){
                   3552:                if(length(L1)!=length(L2)){
                   3553:                        mycat("Different length!");
                   3554:                        return 1;
                   3555:                }
                   3556:                R=[];
                   3557:                if(type(car(L1))==4){
                   3558:                        for(U=[],I=0;L1!=[];I++,L1=cdr(L1),L2=cdr(L2)){
                   3559:                                if(length(S=car(L1))!=length(T=car(L2))){
                   3560:                                        mycat(["Different size : line ",I]);
                   3561:                                        return 0;
                   3562:                                }
                   3563:                                for(J=0;S!=[];S=cdr(S),T=cdr(T),J++)
                   3564:                                        if(car(S)!=car(T)) U=cons([[I,J],car(S),car(T)],U);
                   3565:                        }
                   3566:                        if(U!=[]) R=cons(reverse(U),R);
                   3567:                }else{
                   3568:                        for(I=0;L1!=[];L1=cdr(L1),L2=cdr(L2),I++)
                   3569:                                if(car(L1)!=car(L2)) R=cons([I,car(L1),car(L2)],R);
                   3570:                }
                   3571:                return reverse(R);
                   3572:        }
                   3573:        if(T==11||TT=="append"){
                   3574:                if(type(car(L1))!=4) return append(L1,L2);
                   3575:                for(R=[];L1!=[];L1=cdr(L1),L2=cdr(L2))
                   3576:                        R=cons(append(car(L1),car(L2)),R);
                   3577:                return reverse(R);
                   3578:        }
1.6       takayama 3579:        if(T == 1 || T == 2){
                   3580:                L1 = lsort(L1,[],1);
                   3581:                L2 = lsort(L2,[],1);
                   3582:                L3 = [];
                   3583:                if(T == 1){
                   3584:                        while(L1 != []){
                   3585:                                if(L2 == [] || car(L1) < car(L2)){
                   3586:                                 L3 = cons(car(L1), L3);
                   3587:                                 L1 = cdr(L1);
                   3588:                                        continue;
                   3589:                                }
                   3590:                                if(car(L1) > car(L2)){
                   3591:                                        L2 = cdr(L2);
                   3592:                                        continue;
                   3593:                                }
                   3594:                                L1 = cdr(L1); L2 = cdr(L2);
                   3595:                        }
                   3596:                        return reverse(L3);
                   3597:                }
                   3598:                if(T==2){
                   3599:                        while(L1 != [] && L2 != []){
                   3600:                                if(car(L1) != car(L2)){
                   3601:                                        if(car(L1) <= car(L2))
                   3602:                                                         L1 = cdr(L1);
                   3603:                                        else L2 = cdr(L2);
                   3604:                                        continue;
                   3605:                                }
                   3606:                                while(car(L1) == car(L2))
                   3607:                                        L1 = cdr(L1);
                   3608:                                L3 = cons(car(L2), L3);
                   3609:                        }
                   3610:                        return reverse(L3);
                   3611:                }
                   3612:        }
                   3613:        if(T==3){
                   3614:                L1 = qsort(L1); L2 = qsort(L2);
                   3615:                L3 = L4 = [];
                   3616:                while(L1 != [] && L2 != []){
                   3617:                        if(car(L1) == car(L2)){
                   3618:                                L1 = cdr(L1); L2 = cdr(L2);
                   3619:                        }else if(car(L1) < car(L2)){
                   3620:                                L3 = cons(car(L1),L3);
                   3621:                                L1 = cdr(L1);
                   3622:                        }else{
                   3623:                                L4 = cons(car(L2), L4);
                   3624:                                L2 = cdr(L2);
                   3625:                        }
                   3626:                }
                   3627:                L4 = append(reverse(L4),L2);
                   3628:                L3 = append(reverse(L3),L1);
                   3629:                return [L3,L4];
                   3630:        }
                   3631:        L1 = append(L1,L2);
                   3632:        return lsort(L1,[],1);
                   3633: }
                   3634:
                   3635: def mqsub(X,Y)
                   3636: {
                   3637:        for(L=LQS;L!=[];L=cdr(L)){
                   3638:                F=(T=car(L))[0];M=(T=cdr(T))[0];
                   3639:                X0=X;Y0=Y;
                   3640:                for(T=cdr(T);T!=[];T=cdr(T)){
                   3641:                        X0=X0[car(T)];Y0=Y0[car(T)];
                   3642:                }
                   3643:                if(type(M)==1){
                   3644:                        if(M==3){
                   3645:                                X0=type(X0);Y0=type(Y0);
                   3646:                        }else if(M==4&&type(X0)<2&&type(Y0)<2){
                   3647:                                X0=abs(X0);Y0=abs(Y0);
                   3648:                        }else if(M==5){
                   3649:                                X0=str_len(rtostr(X0));Y0=str_len(rtostr(Y0));
                   3650:                        }else if(type(X0)==type(Y0)&&type(X0)>3&&type(X0)<7){
                   3651:                                if(M==1){
                   3652:                                        X0=length(X0);Y0=length(Y0);
                   3653:                                }else if(M==2){
                   3654:                                        LX=length(X0);LY=length(Y0);
                   3655:                                        L0=(LX<LY)?LX:LY;
                   3656:                                        for(I=0;;I++){
                   3657:                                                if(I==L0){
                   3658:                                                        X0=LX;Y0=LY;break;
                   3659:                                                }
                   3660:                                                if(X0[I]==Y0[I]) continue;
                   3661:                                                X0=X0[I];Y0=Y0[I];break;
                   3662:                                        }
                   3663:                                }
                   3664:                        }
                   3665:                }else if(type(M)==2){
                   3666:                        X0=(*M)(X0,Y0);Y0=0;
                   3667:                }else if(type(M)==4&&length(M)==1){
                   3668:                        X0=(*car(M))(X0);Y0=(*car(M))(Y0);
                   3669:                }
                   3670:                if(X0==Y0) continue;
                   3671:                return (X0<Y0)?-F:F;
                   3672:        }
                   3673:        return 0;
                   3674: }
                   3675:
                   3676: def msort(L,S)
                   3677: {
                   3678:        if(type(S)!=4) return qsort(L);
                   3679:        if(type(S[0])!=4) S=[S];
                   3680:        LQS=S;
                   3681:        return qsort(L,os_md.mqsub);
                   3682: }
                   3683:
1.22      takayama 3684: def lpair(A,B)
                   3685: {
                   3686:        if(B==0){
                   3687:                for(S=T=[];A!=[];A=cdr(A)){
                   3688:                        S=cons(car(A)[0],S);T=cons(car(A)[1],T);
                   3689:                }
                   3690:                return [reverse(S),reverse(T)];
                   3691:        }else{
                   3692:                for(R=[];A!=[];A=cdr(A),B=cdr(B))
                   3693:                        R=cons([car(A),car(B)],R);
                   3694:                return reverse(R);
                   3695:        }
                   3696: }
                   3697:
1.6       takayama 3698: def lmax(L)
                   3699: {
                   3700:        if(type(L)==4){
                   3701:                V=car(L);
                   3702:                while((L=cdr(L))!=[])
                   3703:                        if(V < car(L)) V=car(L);
                   3704:                return V;
                   3705:        }else if(type(L)==5||type(L)==6)
                   3706:                return lmax(m2l(L));
                   3707:        return [];
                   3708: }
                   3709:
                   3710: def lmin(L)
                   3711: {
                   3712:        if(type(L)==4){
                   3713:                V=car(L);
                   3714:                while((L=cdr(L))!=[])
                   3715:                        if(V > car(L)) V=car(L);
                   3716:                return V;
                   3717:        }else if(type(L)==5||type(L)==6)
                   3718:                return lmin(m2l(L));
                   3719:        return [];
                   3720: }
                   3721:
                   3722: def lgcd(L)
                   3723: {
                   3724:        if(type(L)==4){
                   3725:                F=getopt(poly);
                   3726:                V=car(L);
                   3727:                while((L=cdr(L))!=[]&&V!=1){
                   3728:                        if(V!=0)
                   3729:                                V=(F==1)?gcd(V,car(L)):igcd(V,car(L));
                   3730:                }
                   3731:                return V;
                   3732:        }else if(type(L)==5||type(L)==6)
                   3733:                return lgcd(m2l(L)|option_list=getopt());
                   3734:        return [];
                   3735: }
                   3736:
                   3737: def llcm(L)
                   3738: {
                   3739:        if(type(L)==4){
                   3740:                F=getopt(poly);
                   3741:                V=car(L);
                   3742:                while((L=cdr(L))!=[]){
                   3743:                        if(V!=0){
                   3744:                                if((V0=car(L))!=0)
                   3745:                                        V=(F==1)?red(V*V0/gcd(V,V0)):ilcm(V,V0);
                   3746:                        }
                   3747:                        else V=car(L);
                   3748:                }
                   3749:                if(F!=1&&V<0) V=-V;
                   3750:                return V;
                   3751:        }
                   3752:        else if(type(L)==5||type(L)==6)
                   3753:                return llcm(m2l(L)|option_list=getopt());
                   3754:        return [];
                   3755: }
                   3756:
                   3757: def ldev(L,S)
                   3758: {
                   3759:        M=abs(lmax(L));N=abs(lmin(L));
                   3760:        if(M<N) M=N;
                   3761:        for(C=0,LT=L;;C++){
                   3762:                LT=ladd(LT,S,1);
                   3763:                MT=abs(lmax(LT));NT=abs(lmin(LT));
                   3764:                if(MT<NT) MT=NT;
                   3765:                if(MT>=M) break;
                   3766:                M=MT;
                   3767:        }
                   3768:        if(!C){
                   3769:                for(C=0,LT=L;;C--){
                   3770:                        LT=ladd(LT,S,-1);
                   3771:                        MT=abs(lmax(LT));NT=abs(lmin(LT));
                   3772:                        if(MT<NT) MT=NT;
                   3773:                        if(MT>=M) break;
                   3774:                        M=MT;
                   3775:                }
                   3776:        }
                   3777:        return [C,ladd(L,S,C)];
                   3778: }
                   3779:
                   3780: def lchange(L,P,V)
                   3781: {
                   3782:        if(getopt(flat)==1&&type(P)==4){
                   3783:                for(L=ltov(L);P!=[];P=cdr(P),V=cdr(V))
                   3784:                        L[car(P)]=car(V);
                   3785:                return vtol(L);
                   3786:        }
                   3787:        if(type(P)==4){
                   3788:                IP=car(P); P=cdr(P);
                   3789:        }else{
                   3790:                IP=P; P=[];
                   3791:        }
                   3792:        for(I=0, LL=[], LT=L; LT!=[]; I++,LT=cdr(LT)){
                   3793:                if(I==IP){
                   3794:                        LL=cons((P==[])?V:lchange(car(LT),P,V),LL);
                   3795:                }else
                   3796:                        LL=cons(car(LT),LL);
                   3797:        }
                   3798:        return reverse(LL);
                   3799: }
                   3800:
                   3801: def lsol(VV,L)
                   3802: {
                   3803:        if(type(VV)<4 && type(L)==2)
                   3804:                return red(L-VV/mycoef(VV,1,L));
                   3805:        S = length(VV);
                   3806:        T = length(L);
                   3807:        V = llbase(VV,L);
                   3808:        for(J = K = 0; J < T; J++){
                   3809:                X = var(L[J]); N = deg(L[J],X);
                   3810:                for(I = K; I < S; I++){
                   3811:                        if((C=mycoef(V[I], N, X)) != 0){
                   3812:                                V[I] = [L[J],red(X^N-V[I]/C)];
                   3813:                                K++;
                   3814:                                break;
                   3815:                        }
                   3816:                }
                   3817:        }
                   3818:        return V;
                   3819: }
                   3820:
                   3821: def lnsol(VV,L)
                   3822: {
                   3823:        LL=lsort(vars(VV),L,1);
                   3824:        VV=ptol(VV,LL|opt=0);
                   3825:        return lsol(VV,L);
                   3826: }
                   3827:
                   3828:
                   3829: def ladd(X,Y,M)
                   3830: {
1.22      takayama 3831:        if(type(Y)==4) Y=ltov(Y);
1.6       takayama 3832:        if(type(X)==4) X=ltov(X);
                   3833:        return vtol(X+M*Y);
                   3834: }
                   3835:
                   3836: def mrot(X)
                   3837: {
1.22      takayama 3838:        if(type(X)==4){
                   3839:                if(getopt(deg)==1)
                   3840:                        X=[deval(@pi*X[0]/180),deval(@pi*X[1]/180),deval(@pi*X[2]/180)];
                   3841:                if(getopt(conj)==1)
                   3842:                        return mrot([-X[2],-X[1],0])*mrot([X[0],X[1],X[2]]);
                   3843:                if(X[1]==0){
                   3844:                        X=[X[0]+X[2],0,0];
                   3845:                        if(X[0]==0) return diagm(3,[1]);
                   3846:                }
                   3847:                if(X[0]!=0){
                   3848:                        M=mat([dcos(X[0]),-dsin(X[0]),0],[dsin(X[0]),dcos(X[0]),0],[0,0,1]);
                   3849:                        if(X[1]==0) return M;
                   3850:                }
                   3851:                N=mat([dcos(X[1]),0,-dsin(X[1])],[0,1,0],[dsin(X[1]),0,dcos(X[1])]);
                   3852:                if(X[0]!=0) N=M*N;
                   3853:                if(X[2]==0) return N;
                   3854:                return N*mrot([X[2],0,0]);
                   3855:        }
1.6       takayama 3856:        if(getopt(deg)==1) X=@pi*X/180;
                   3857:        X=deval(X);
1.22      takayama 3858:        return mat([dcos(X),-dsin(X)],[dsin(X),dcos(X)]);
1.6       takayama 3859: }
                   3860:
                   3861: def m2v(M)
                   3862: {
                   3863:        S = size(M);
                   3864:        V = newvect(S[0]*S[1]);
                   3865:        for(I = C = 0; I < S[0]; I++){
                   3866:                MI = M[I];
                   3867:                for(J = 0; J < S[1]; J++)
                   3868:                        V[C++] = MI[J];
                   3869:        }
                   3870:        return V;
                   3871: }
                   3872:
                   3873: def lv2m(L)
                   3874: {
                   3875:        if(type(L)==5) L=vtol(L);
                   3876:        II=length(L);
                   3877:        for(J=1,T=L; T!=[]; T=cdr(T))
                   3878:                if(length(car(T))>JJ) JJ=length(car(T));
                   3879:        M = newmat(II,JJ);
                   3880:        N = getopt(null);
                   3881:        if(type(N)<0)   N=0;
                   3882:        for(I=0; I<II; I++){
                   3883:                V=car(L); L=cdr(L);
                   3884:                for(J=length(V);--J>=0;)
                   3885:                        M[I][J] = V[J];
                   3886:                if(N!=0){
                   3887:                        for(J=length(V); J<JJ; J++)
                   3888:                                M[I][J]=N;
                   3889:                }
                   3890:        }
                   3891:        return M;
                   3892: }
                   3893:
                   3894: def m2lv(M)
                   3895: {
                   3896:        I=size(M)[0];
                   3897:        for(N=[],I=size(M)[0];I-->0;)
                   3898:                N=cons(M[I],N);
                   3899:        return N;
                   3900: }
                   3901:
                   3902: def s2m(S)
                   3903: {
                   3904:        if(type(S)==6) return S;
                   3905:        if(type(S)==7){
                   3906:                if(str_chr(S,0,"[")!=0) S=s2sp(S);
                   3907:                else if(str_chr(S,0,",")>=0) return eval_str(S);
                   3908:                else{
                   3909:                        for(L=LL=[],I=0; ; ){
                   3910:                                II=str_chr(S,I+2,"]");
                   3911:                                if(II<0) return 0;
                   3912:                                J=str_chr(S,I+2," ");
                   3913:                                while(str_chr(S,J+1," ")==J+1) J++;
                   3914:                                if(J>II-2 || J<0) J=II;
                   3915:                 V=eval_str(sub_str(S,I+1,J-1));
                   3916:                                L=cons(V,L);
                   3917:                                I=J;
                   3918:                                if(J==II){
                   3919:                                        LL=cons(ltov(reverse(L)),LL);
                   3920:                                        L=[];
                   3921:                                        if((I=str_chr(S,II+1,"["))<0)
                   3922:                                                return lv2m(reverse(LL));
                   3923:                                }
                   3924:                        }
                   3925:                }
                   3926:        }
                   3927:        if(type(S)==5) S=vtol(S);
                   3928:        if(type(S[0])==5) return lv2m(S);
                   3929:        I=length(S);
                   3930:        for(J=1,T=S; T!=[]; T=cdr(T))
                   3931:                if(length(car(T))>J) J=length(car(T));
                   3932:        return newmat(I,J,S);
                   3933: }
                   3934:
                   3935: def c2m(L,V)
                   3936: {
                   3937:        if(type(Pow=getopt(pow))!=1){
                   3938:                if(isvar(V)==1){
                   3939:                        for(Pow=0,LT=L;LT!=[];LT=cdr(LT)){
                   3940:                                if(mydeg(car(LT),V)>JJ) Pow=mydeg(car(LT),V);
                   3941:                        }
                   3942:                        JJ=Pow+1;
                   3943:                }else{
                   3944:                        Pow=-1;
                   3945:                        JJ=length(V);
                   3946:                }
                   3947:        }else JJ=Pow+1;
                   3948:        M=newmat(length(L),JJ);
                   3949:        for(I=0;L!=[];L=cdr(L),I++){
                   3950:                for(J=0;J<JJ;J++){
                   3951:                        LT=car(L);
                   3952:                        M[I][J]=(Pow>=0)?mycoef(LT,J,V):mycoef(LT,1,V[J]);
                   3953:                }
                   3954:        }
                   3955:        return M;
                   3956: }
                   3957:
                   3958: #if 0
                   3959: def m2diag(M,N)
                   3960: {
                   3961:        S = size(M);
                   3962:        MM = mtoupper(M,N);
                   3963:        for(I = S[0]-1; I >= 0; I--){
                   3964:                for(J = 0; I < S[1]-N; I++){
                   3965:                        if(MM[I][J] != 0){
                   3966:                                P = MM[I][J];
                   3967:                                for(K = 0; K < I; K++){
                   3968:                                        Q = -rmul(MM[K][J],1/P);
                   3969:                                        MM[K][J] = 0;
                   3970:                                        if(Q != 0){
                   3971:                                                for(L = J+1; L < S[1]; L++){
                   3972:                                                        if(MM[I][L] != 0)
                   3973:                                                                MM[K][L] = radd(MM[K][L], rmul(MM[I][L],Q));
                   3974:                                                }
                   3975:                                        }
                   3976:                                }
                   3977:                        }
                   3978:                }
                   3979:        }
                   3980:        return MM;
                   3981: }
                   3982: #endif
                   3983:
                   3984: def myinv(M)
                   3985: {
                   3986:        S = size(M);
                   3987:        if((T=S[0]) != S[1])
                   3988:                return 0;
                   3989:        MM = mtoupper(M,-T|opt=2);
                   3990:        if(MM[T-1][T-1] != 1) return 0;
                   3991:        return mperm(MM,0,[T,[T]]);
                   3992: }
                   3993:
                   3994: def madj(G,M)
                   3995: {
                   3996:        H=myinv(G);
                   3997:        if(type(M)==6)
                   3998:                return rmul(rmul(G,M),H);
                   3999:        if(type(M)==4||type(M)==5){
                   4000:                L=length(M);
                   4001:                N=newvect(L);
                   4002:                for(I=0;I<L;I++){
                   4003:                        N[I]=rmul(rmul(G,M[I]),H);
                   4004:                }
                   4005:                if(type(N)==4) N=vtol(N);
                   4006:                return N;
                   4007:        }
                   4008:        return -1;
                   4009: }
                   4010:
                   4011: def mpower(M,N)
                   4012: {
                   4013:        if(type(M)<=3) return (red(M))^N;
                   4014:        S = size(M);
                   4015:        if(S[0] != S[1])
                   4016:                return 0;
                   4017:        if(N == 0) return mgen(S[0],0,[1],0);
                   4018:        if(N < 0)
                   4019:                return(mpower(myinv(M), -N));
                   4020:        R = dupmat(M);
                   4021:        V=1;
                   4022:        for(V=1;;){
                   4023:                if(iand(N,1)){
                   4024:                        V=map(red,R*V);
                   4025:                        N--;
                   4026:                }
                   4027:                if((N/=2)==0) break;
                   4028:                R=map(red,R*R);
                   4029:        }
                   4030:        return V;
                   4031: }
                   4032:
                   4033: def texlen(S)
                   4034: {
                   4035:        if(type(S)!=7) return 0;
                   4036:        LF=I=J=0;
                   4037:        LM=str_len(S);
                   4038:        while((I=str_str(S,"\\frac{"|top=J))>=0){
                   4039:                if(I>J) LF+=texlen(str_cut(S,J,I-1));
                   4040:                I+=6;
                   4041:                for(F=L=0,J=I;F<2 && J<LM-1;F++){
                   4042:                        for(C=1;C>0 && J<LM;){
                   4043:                                if((K0=str_char(S,J,"}"))<0) K0=LM;
                   4044:                                if((K1=str_char(S,J,"{"))<0) K1=LM;
                   4045:                                if(K0<0 && K1<0){
                   4046:                                        J = str_len(S)-1;
                   4047:                                        break;
                   4048:                                }
                   4049:                                if(K0<K1){
                   4050:                                        J=K0+1; C--;
                   4051:                                }else{
                   4052:                                        J=K1+1; C++;
                   4053:                                }
                   4054:                        }
                   4055:                        T=str_cut(S,I,J-1);
                   4056:                        if(F==0){
                   4057:                                I=J=K1+1;C=1;
                   4058:                        }else J=K0+1;
                   4059:                        if(type(T)==7 && (LL=texlen(T))>L) L=LL;
                   4060:                }
                   4061:                LF+=L;
                   4062:        }
                   4063:        if(J>0) S=str_cut(S,J,str_len(S)-1);
                   4064:        if(S==0) return LF;
                   4065:        S=ltov(strtoascii(S));
                   4066:        L=LL=length(S);
                   4067:        for(I=F=0; I<L; I++){
                   4068:                if(S[I]==92) F=1;
                   4069:                else if(F==1){
                   4070:                        if((S[I]>96     && S[I]<123)||(S[I]>64 && S[I]<91))     LL--;
                   4071:                        else F=0;
                   4072:                }
                   4073:                if(S[I]<=32||S[I]==123||S[I]==125||S[I]==94||S[I]==38) LL--;    /* {}^& */
                   4074:                else if(S[I]==95){
                   4075:                        LL--;
                   4076:                        if(I+2<L && S[I+2]==94) LL--;   /* x_2^3 */
                   4077:                        else if(I+6<L && S[I+1]==123 && S[I+4]==125){   /* x_{11}^2 */
                   4078:                                 if(S[I+5]==94 || (S[I+5]==125 && S[I+6]==94)) LL--     ;       /* x_{11}}^2 */
                   4079:                        }
                   4080:                }
                   4081:        }
                   4082:        return LL+LF;
                   4083: }
                   4084:
                   4085: def isdif(P)
                   4086: {
                   4087:        if(type(P)<1 || type(P)>3) return 0;
                   4088:        for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4089:                V0=rtostr(car(R));
                   4090:                if(V0>"d" && V0<"e"){
                   4091:                        V=sub_str(V0,1,str_len(V0)-1);
                   4092:                        if(V>="a" && V<"{")     Var=cons([strtov(V),strtov(V0)],Var);
                   4093:                }
                   4094:        }
                   4095:        if(Var==[]) return 0;
                   4096:        for(V=Var; V!=[]; V=cdr(V))
                   4097:                if(ptype(P,car(V)[1])==3) return 0;
                   4098:        return  Var;
                   4099: }
                   4100:
                   4101: def texsp(P)
                   4102: {
                   4103:        Q=strtoascii(P);
                   4104:        if((J=str_char(Q,0,92))<0 || (C=Q[L=str_len(P)-1])==32||C==41||C==125)
                   4105:                return P;
                   4106:        for(;;){
                   4107:                if((I=str_char(Q,J+1,92))<0) break;
                   4108:                J=I;
                   4109:        };
                   4110:        for(I=J+1;I<L&&isalpha(Q[I]);I++);
                   4111:        return(I==L)?P+" ":P;
                   4112: }
                   4113:
                   4114: def fctrtos(P)
                   4115: {
                   4116:        /* extern TeXLim; */
                   4117:
                   4118:        if(!chkfun("write_to_tb", "names.rr"))
                   4119:                return 0;
                   4120:
                   4121:        TeX = getopt(TeX);
                   4122:        if(TeX != 1 && TeX != 2 && TeX != 3)
                   4123:                TeX = 0;
                   4124:        if((Dvi=getopt(dviout)==1) && TeX<2)    TeX=3;
                   4125:        if(TeX>0){
                   4126:                Lim=getopt(lim);
                   4127:                if(Lim!=0 && TeX>1 && (type(Lim)!=1||Lim<30)) Lim=TeXLim;
                   4128:                else if(type(Lim)!=1) Lim=0;
                   4129:                CR=(TeX==2)?"\\\\\n":"\\\\\n&";
                   4130:                if(TeX==1 || Lim==0)    CR="";
                   4131:                else if((Pages=getopt(pages))==1)       CR="\\allowdisplaybreaks"+CR;
                   4132:                if(!chkfun("print_tex_form", "names.rr"))
                   4133:                        return 0;
                   4134:                Small=getopt(small);
                   4135:        }
                   4136:        Dif=getopt(dif);
                   4137:        Var=getopt(var);
                   4138:        if(Lim>0 && type(Var)<2 && TeX!=1)      Var=[strtov("0"),""];
                   4139:        Dif=0;
                   4140:        if(Var=="dif"){
                   4141:                Dif=DV=1;
                   4142:        }else if (Var=="dif0") Dif=1;
                   4143:        else if(Var=="dif1")  Dif=2;
                   4144:        else if(Var=="dif2")  Dif=3;
                   4145:        if(Dif>0){
                   4146:                for(Var=[],R=vars(P);R!=[];R=cdr(R)){
                   4147:                        V=rtostr(car(R));
                   4148:                        if(V>"d" && V<"e"){
                   4149:                                V=sub_str(V,1,str_len(V)-1);
                   4150:                                if(V>="a" && V<"{"){
                   4151:                                        if(TeX>0){
                   4152:                                                V=my_tex_form(strtov(V));
                   4153:                                                if(Dif>=1){
                   4154:                                                        if(Dif==1){
                   4155:                                                                if(str_len(V)==1) V="\\partial_"+V;
                   4156:                                                                else    V="\\partial_{"+V+"}";
                   4157:                                                        }
                   4158:                                                        Var=cons([car(R),V],Var);
                   4159:                                                }
                   4160:                                                else Var=cons([car(R)],Var);
                   4161:                                        }else Var=cons([car(R)],Var);
                   4162:                                }
                   4163:                        }
                   4164:                }
                   4165:                if(TeX>0){
                   4166:                        if(length(Var)==1){
                   4167:                                if(DV==1 && str_len(Var[0][1])==10) Var=[[Var[0][0],"\\partial"]];
                   4168:                        }else if(DV==1){
                   4169:                                for(V=Var;V!=[];V=cdr(V)){
                   4170:                                        VV=rtostr(car(V)[0]);
                   4171:                                        if(VV<"dx0" || VV>= "dx:" || str_len(VV)>4) break;
                   4172:                                }
                   4173:                                if(V==[]){
                   4174:                                        for(VT=[],V=Var;V!=[];V=cdr(V)){
                   4175:                                                VV=str_cut(rtostr(car(V)[0]),2,3);
                   4176:                                                if(str_len(VV)==1)      VT=cons([car(V)[0],"\\partial_"+VV],VT);
                   4177:                                                else    VT=cons([car(V)[0],"\\partial_{"+VV+"}"],VT);
                   4178:                                        }
                   4179:                                        Var=reverse(VT);
                   4180:                                }
                   4181:                        }else
                   4182:                                if(Dif==2 && length(Var)>1) Dif=3;
                   4183:                }
                   4184:                if(Dif>0)       Dif--;
                   4185:        }
                   4186:        if(type(Var)>1 && Var!=[]){     /* as a polynomial of Var */
                   4187:                Add=getopt(add);
                   4188:                if(type(Add)>0){
                   4189:                        if(type(Add)!=7){
                   4190:                                Add=my_tex_form(Add);
                   4191:                                if(str_char(Add,0,"-")>=0 || str_char(Add,0,"+")>=0) Add="("+Add+")";
                   4192:                        }
                   4193:                        if(str_char(Add,0,"(")!=0) Add = " "+Add;
                   4194:                }else Add=0;
                   4195:                if(type(Var)!=4) Var=[Var];
                   4196:                if(length(Var)==2 && type(Var[1]) == 7)
                   4197:                        Var = [Var];
                   4198:                for(VV=VD=[]; Var!=[];Var=cdr(Var)){
                   4199:                        VT=(type(car(Var))==4)?car(Var):[car(Var)];
                   4200:                        VT0=var(car(VT));
                   4201:                        VV=cons(VT0,VV);
                   4202:                        if(length(VT)==1){
                   4203:                                VD=cons((TeX>=1)?my_tex_form(VT0):rtostr(VT0),VD);
                   4204:                        }else   VD=cons(VT[1],VD);
                   4205:                }
                   4206:                VV=reverse(VV);VD=reverse(VD);
                   4207:                Rev=(getopt(rev)==1)?1:0;
                   4208:                Dic=(getopt(dic)==1)?1:0;
                   4209:                TT=terms(P,VV|rev=Rev,dic=Dic);
                   4210:                if(TeX==0){
                   4211:                        Pre="("; Post=")";
                   4212:                }else{
                   4213:                        Pre="{"; Post="}";
                   4214:                }
                   4215:                Out = string_to_tb("");
                   4216:                for(L=C=0,Tm=TT;Tm!=[];C++,Tm=cdr(Tm)){
                   4217:                        for(I=0,PC=P,T=cdr(car(Tm)),PW="";T!=[];T=cdr(T),I++){
                   4218:                                PC=mycoef(PC,D=car(T),VV[I]);
                   4219:                                if(PC==0) continue;
                   4220:                                PT="";
                   4221:                                if(D!=0 && VD[I]!=""){
                   4222:                                        if(TeX==0 && PW!="") PW+="*";
                   4223:                                        if(D>1){
                   4224:                                                if(D>9) PT="^"+Pre+rtostr(D)+Post;
                   4225:                                                else    PT="^"+rtostr(D);
                   4226:                                        }
                   4227:                                        if(Dif>0)       PW+=(Dif==1)?"d":"\\partial ";
                   4228:                                        PW+=VD[I]+PT;
                   4229:                                }
                   4230:                        }
                   4231:                        D=car(Tm)[0];
                   4232:                        if(Dif>0 && D>0){
                   4233:                                Op=(Dif==1)?"\\frac{d":"\\frac{\\partial";
                   4234:                                if(D>1) Op+="^"+((D>9)?(Pre+rtostr(D)+Post):rtostr(D));
                   4235:                                PW=Op+Add+"}{"+PW+"}";
                   4236:                        }else if(Add!=0) PW=PW+Add;
                   4237:                        if(TeX>=1){
                   4238:                                if(type(PC)==1 && ntype(PC)==0 && PC<0)
                   4239:                                        OC="-"+my_tex_form(-PC);
                   4240:                                else OC=fctrtos(PC|TeX=1,br=1);
                   4241:                        }else   OC=fctrtos(PC|br=1);
                   4242:                        if(PW!=""){
                   4243:                                if(OC == "1")        OC = "";
                   4244:                                else if(OC == "-1")  OC = "-";
                   4245:                        }
                   4246:                        if(TeX==0 && D!=0 && OC!="" && OC!="-") PW= "*"+PW;
                   4247:                        if((TOC=type(OC)) == 4){        /* rational coef. */
                   4248:                                if(Lim>0 && (texlen(OC[0])>Lim || texlen(OC[0])>Lim)){
                   4249:                                        OC = (Small==1)?"("+OC[0]+")/("+OC[1]+")"
                   4250:                                                        :"\\Bigl("+OC[0]+"\\Bigr)\\Bigm/\\Bigl("+OC[1]+"\\Bigr)";
                   4251:                                        TOC = 7;
                   4252:                                }else{
                   4253:                                        if(str_char(OC[0],0,"-")==0){
                   4254:                                                OC = fctrtos(-PC|TeX=1,br=1);
                   4255:                                                OC = "-\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4256:                                        }
                   4257:                                        else
                   4258:                                                OC = "\\frac{"+OC[0]+"}{"+OC[1]+"}";
                   4259:                                }
                   4260:                        }
                   4261:                        if(Lim>0){
                   4262:                                LL=texlen(OC)+texlen(PW);
                   4263:                                if(LL+L>=Lim){
                   4264:                                        if(L>0) str_tb(CR,Out);
                   4265:                                        if(LL>Lim){
                   4266:                                                if(TOC==7)      OC=texlim(OC,Lim|cut=CR);
                   4267:                                                PW+=CR; L=0;
                   4268:                                        }else L=LL;
                   4269:                                }else L+=LL;
                   4270:                        }else if(length(Tm)!=1) PW += CR;       /* not final term */
                   4271:                        if(TeX) OC=texsp(OC);
                   4272:                        if(str_chr(OC,0,"-") == 0 || C==0)      str_tb([OC,PW], Out);
                   4273:                        else{
                   4274:                                str_tb(["+",OC,PW],Out);
                   4275:                                if(LL<=Lim) L++;
                   4276:                        }
                   4277:                }
                   4278:                S=str_tb(0,Out);
                   4279:                if(S=="") S="0";
                   4280:        }else{          /* Var is not specified */
                   4281:                if((TP=type(P)) == 3){  /* rational function */
                   4282:                        P = red(P); Nm=nm(P); Dn=dn(P);
                   4283:                        Q=dn(ptozp(Nm|factor=1)[1]);
                   4284:                        if(Q>1){
                   4285:                                Nm*=Q;Dn*=Q;
                   4286:                        }
                   4287:                        if(TeX>0){
                   4288:                                return (TeX==2)?
                   4289:                                "\\frac\{"+fctrtos(Nm|TeX=1)+"\}\{"+fctrtos(Dn|TeX=1)+"\}"
                   4290:                                :[fctrtos(Nm|TeX=1),fctrtos(Dn|TeX=1)];
                   4291:                        }
                   4292:                        else{
                   4293:                                S=fctrtos(Nm);
                   4294:                                if(nmono(Nm)>1) S="("+S+")";
                   4295:                                return S+"/("+fctrtos(Dn)+")";
                   4296:                        }
                   4297:                }
                   4298:                if(imag(P)==0) P = fctr(P);             /* usual polynomial */
                   4299:                else P=[[P,1]];
                   4300:                S = str_tb(0,0);
                   4301:                for(J = N = 0; J < length(P); J++){
                   4302:                        if(type(P[J][0]) <= 1){
                   4303:                                if(P[J][0] == -1){
                   4304:                                        write_to_tb("-",S);
                   4305:                                        if(length(P) == 1)
                   4306:                                                str_tb("1", S);
                   4307:                                }else if(P[J][0] != 1){
                   4308:                                        str_tb((TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]), S);
                   4309:                                        N++;
                   4310:                                }else if(length(P) == 1)
                   4311:                                        str_tb("1", S);
                   4312:                                else if(getopt(br)!=1 && length(P) == 2 && P[1][1] == 1){
                   4313:                                        str_tb((TeX>=1)?my_tex_form(P[1][0]):rtostr(P[1][0]), S);
                   4314:                                        J++;
                   4315:                                }
                   4316:                                continue;
                   4317:                        }
                   4318:                        if(N > 0 && TeX != 1 && TeX != 2 && TeX != 3)
                   4319:                                write_to_tb("*", S);
                   4320:                        SS=(TeX>=1)?my_tex_form(P[J][0]):rtostr(P[J][0]);
                   4321:                        N++;
                   4322:                        if(P[J][1] != 1){               /* (log(x))^2 */
                   4323:                                if(nmono(P[J][0])>1||
                   4324:                                        (!isvar(P[J][0])||vtype(P[J][0]))&&str_len(SS)>1) SS="("+SS+")";
                   4325:                                write_to_tb(SS,S);
                   4326:                                str_tb(["^", (TeX>1)?rtotex(P[J][1]):monotos(P[J][1])],S);
                   4327:                        }else{
                   4328:                                if(nmono(P[J][0])>1) SS="("+SS+")";
                   4329:                                write_to_tb(SS,S);
                   4330:                        }
                   4331:                }
                   4332:                S = str_tb(0,S);
                   4333:                if((Lim>0 || TP!=2) && CR!="")  S=texlim(S,Lim|cut=CR);
                   4334:        }
                   4335:        if(TeX>0){
                   4336:                if(Small==1)    S=str_subst(S,"\\frac{","\\tfrac{");
                   4337:                if(Dvi==1){
                   4338:                        dviout(strip(S,"(",")")|eq=(Pages==1)?6:0); S=1;
                   4339:                }
                   4340:        }
                   4341:        return S;
                   4342: }
                   4343:
                   4344: def strip(S,S0,S1)
                   4345: {
                   4346:        SS=strtoascii(S);
                   4347:        if(length(SS)>1){
                   4348:                if(SS[0]==40&&SS[length(SS)-1]==41&&str_pair(SS,1,S0,S1)==length(SS)-1)
                   4349:                        S=str_cut(SS,1,length(SS)-2);
                   4350:        }
                   4351:        return S;
                   4352: }
                   4353:
                   4354: def texlim(S,Lim)
                   4355: {
                   4356:        /* extern TeXLim;       */
                   4357:        if(S==1 && Lim>10){
                   4358:                TeXLim=Lim;
                   4359:                mycat(["Set TeXLim =",Lim]);
                   4360:                return 1;
                   4361:        }
                   4362:        if(type(Out=getopt(cut))!=7)    Out="\\\\\n&";
                   4363:        if(type(Del=getopt(del))!=7)    Del=Out;
                   4364:        if(Lim<30)      Lim=TeXLim;
                   4365:        S=ltov(strtoascii(S));
                   4366:        for(L=[0],I=F=0;F==0; ){
                   4367:                II=str_str(S,Del|top=I)+2;
                   4368:                if(II<2){
                   4369:                        F++;II=/* str_len(S) */ length(S)-1;
                   4370:                }
                   4371:                for(J=JJ=I+1;;JJ=K+1){
                   4372:                        K=str_char(S,JJ,43);    /* + */
                   4373:                        if((K1=str_char(S,JJ,45))>2 && K1<K){   /* - */
                   4374:                                if(S[K1-1]!=123 && S[K1-1]!=40) K=K1;   /* {, ( */
                   4375:                        }
                   4376:                        if((K1=str_char(S,JJ,40))>0 && K1-JJ>6 && K1<K && S[K1-1]!=43 && S[K1-1]!=45){  /* ( */
                   4377:                                T=str_char(S,K1-6,"\\");  /* \Big*(, \big*( */
                   4378:                                if((T==K1-6 || T==K1-5)
                   4379:                                  && (str_str(S,"big"|top=T+1,end=T+1)>0 || str_str(S,"Big"|top=T+1,end=T+1)>0))
                   4380:                                        K=T;
                   4381:                                else if(K1>0 && K1<K) K=K1;
                   4382:                        }
                   4383:                        if(K<0 || K>II) break;
                   4384:                        if(K-J>Lim && texlen(str_cut(S,J,K-1))>=Lim){
                   4385:                                J=K+1; L=cons(JJ-1,L); SL=0;
                   4386:                        }
                   4387:                }
                   4388:                I=II;
                   4389:        }
                   4390:        SS=str_tb(0,0);
                   4391:        L=cons(length(S),L);
                   4392:        L=reverse(L);
                   4393:        for(I=0; L!=[]; I=J,L=cdr(L)){
                   4394:                str_tb((I==0)?"":Out,SS);
                   4395:                J=car(L);
                   4396:                str_tb(str_cut(S,I,J-1),SS);
                   4397:        }
                   4398:        return str_tb(0,SS);
                   4399: }
                   4400:
                   4401: def fmult(FN,M,L,N)
                   4402: {
                   4403:        Opt=getopt();
                   4404:        for(I = 0; I < length(M); I++)
                   4405:                M = call(FN, cons(M,cons(L[I],N))|option_list=Opt);
                   4406:        return M;
                   4407: }
                   4408:
                   4409: def radd(P,Q)
                   4410: {
                   4411:        if(type(P) <= 3 || type(Q) <= 3){
                   4412:                if(type(P) >= 5)
                   4413:                         return radd(Q,P);
                   4414:                if(type(Q) >= 5){
                   4415:                        R = dupmat(Q);
                   4416:                        if(P == 0)
                   4417:                                return R;
                   4418:                        if(type(Q) == 6){
                   4419:                                S = size(Q);
                   4420:                                if(S[0] != S[1])
                   4421:                                        return 0;
                   4422:                                for(I = 0; I < S[0]; I++)
                   4423:                                        R[I][I]  = radd(R[I][I], P);
                   4424:                        }else{
                   4425:                                for(I = length(R)-1; I >= 0; I--)
                   4426:                                        R[I] = radd(R[I],P);
                   4427:                        }
                   4428:                        return R;
                   4429:                }
                   4430:                /* P=red(P);Q=red(Q); */
                   4431:                if((P1=dn(P)) == (Q1=dn(Q))){
                   4432:                        if(P1==1) return P+Q;
                   4433:                        return red((nm(P)+nm(Q))/P1);
                   4434:                }
                   4435:                R=gcd(P1,Q1);S=tdiv(P1,R);
                   4436:                return red((nm(P)*tdiv(Q1,R)+nm(Q)*S)/(S*Q1));
                   4437:        }
                   4438:        if(type(P) == 5){
                   4439:                S = length(P);
                   4440:                R = newvect(S);
                   4441:                for(I = 0; I < S; I++)
                   4442:                        R[I] = radd(P[I],Q[I]);
                   4443:                return R;
                   4444:        }
                   4445:        if(type(P) == 6){
                   4446:                S = size(P);
                   4447:                R = newmat(S[0],S[1]);
                   4448:                for(I = 0; I < S[0]; I++){
                   4449:                        for(J = 0; J < S[1]; J++)
                   4450:                                R[I][J] = radd(P[I][J],Q[I][J]);
                   4451:                }
                   4452:                return R;
                   4453:        }
                   4454:        erno(0);
                   4455: }
                   4456:
                   4457: def getel(M,I)
                   4458: {
                   4459:        if(type(M) >= 4 && type(M) <= 6 && type(I) <= 1)
                   4460:                return M[I];
                   4461:        if(type(M) == 6 && type(I) == 5)
                   4462:                return M[I][J];
                   4463:        return M;
                   4464: }
                   4465:
                   4466: def ptol(P,X)
                   4467: {
                   4468:        F=(getopt(opt)==0)?0:1;
                   4469:        if(type(P) <= 3)
                   4470:                P = [P];
                   4471:        if(type(X) == 4){
                   4472:                for( ; X != []; X = cdr(X))
                   4473:                        P=ptol(P,car(X)|opt=F);
                   4474:                return P;
                   4475:        }
                   4476:        P = reverse(P);
                   4477:        for(R=[]; P != []; P = cdr(P)){
                   4478:                Q = car(P);
                   4479:                for(I = mydeg(Q,X); I >= 0; I--){
                   4480:                        S=mycoef(Q,I,X);
                   4481:                        if(F==1 || S!=0) R = cons(S,R);
                   4482:                }
                   4483:        }
                   4484:        return R;
                   4485: }
                   4486:
                   4487: def rmul(P,Q)
                   4488: {
                   4489:        if(type(P) <= 3 && type(Q) <= 3){
                   4490:                P=red(P);Q=red(Q);
                   4491:                P1=dn(P);P2=nm(P);Q1=dn(Q);Q2=nm(Q);
                   4492:                if(P1==1 && Q1==1)
                   4493:                        return P*Q;
                   4494:                if((R=gcd(P1,Q2)) != 1){
                   4495:                        P1=tdiv(P1,R);Q2=tdiv(Q2,R);
                   4496:                }
                   4497:                if((R=gcd(Q1,P2)) != 1){
                   4498:                        Q1=tdiv(Q1,R);P2=tdiv(P2,R);
                   4499:                }
                   4500:                return P2*Q2/(P1*Q1);
                   4501:        }
                   4502: #ifdef USEMODULE
                   4503:        return mmulbys(os_md.rmul,P,Q,[]);
                   4504: #else
                   4505:        return mmulbys(rmul,P,Q,[]);
                   4506: #endif
                   4507: }
                   4508:
                   4509: def mtransbys(FN,F,LL)
                   4510: {
                   4511:        Opt=getopt();
                   4512:        if(type(F) == 4){
                   4513:                F = ltov(F);
                   4514:                S = length(F);
                   4515:                R = newvect(S);
                   4516:                for(I = 0; I < S; I++)
                   4517:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   4518:                return vtol(R);
                   4519:        }
                   4520:        if(type(F) == 5){
                   4521:                S = length(F);
                   4522:                R = newvect(S);
                   4523:                for(I = 0; I < S; I++)
                   4524:                        R[I] = mtransbys(FN,F[I],LL|option_list=Opt);
                   4525:                return R;
                   4526:        }
                   4527:        if(type(F) == 6){
                   4528:                S = size(F);
                   4529:                R = newmat(S[0],S[1]);
                   4530:                for(I = 0; I < S[0]; I++){
                   4531:                        for(J = 0; J < S[1]; J++)
                   4532:                        R[I][J] = mtransbys(FN,F[I][J],LL|option_list=Opt);
                   4533:                }
                   4534:                return R;
                   4535:        }
                   4536:        if(type(F) == 7) return F;
                   4537:        return call(FN, cons(F,LL)|option_list=Opt);
                   4538: }
                   4539:
                   4540: def drawopt(S,T)
                   4541: {
                   4542:        if(type(S)!=7) return -1;
                   4543:        if(T==0||T==1){
                   4544:                for(I=0,R=LCOPT;I<7;I++,R=cdr(R))
                   4545:                        if(str_str(S,car(R))>=0) return(T==0)?COLOPT[I]:car(R);
                   4546:                return -1;
                   4547:        }
                   4548:        if(T==2){
                   4549:                V0=V1=0;
                   4550:                for(I=0,R=LPOPT;R!=[];I++,R=cdr(R)){
                   4551:                        if(str_str(S,car(R))>=0){
                   4552:                                if(I==0) V1++;
                   4553:                                else if(I==1) V1--;
                   4554:                                else if(I==2) V0--;
                   4555:                                else V0++;
                   4556:                        }
                   4557:                }
                   4558:                if(V0==0&&V1==0) return -1;
                   4559:                return [V0,V1];
                   4560:        }
                   4561:        if(T==3){
                   4562:                V=0;
                   4563:                for(I=1,R=LFOPT;R!=[];R=cdr(R),I*=2){
                   4564:                        if(str_str(S,car(R))>=0) V+=I;
                   4565:                }
                   4566:                return (V==0)?-1:V;
                   4567:        }
                   4568:        return -1;
                   4569: }
                   4570:
                   4571: def execdraw(L,P)
                   4572: {
                   4573:        if((Proc=getopt(proc))!=1) Proc=0;
                   4574:        if(type(P)<2) P=[P];
                   4575:        if(L!=[]&&type(L[0])!=4) L=[L];
                   4576:                /* special command */
                   4577:        if(P[0]<0){
                   4578:                if(length(P)==1&&(P[0]==-1||P[0]==-2||P[0]==-3)){       /* Bounding Box */
                   4579:                        W=WS=N=LS=0;
                   4580:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   4581:                                T=car(LL);
                   4582:                                if(P[0]!=-3 && T[0]==0){
                   4583:                                        if(length(T)>3) S="  by "+rtostr(T[3])+" cm";
                   4584:                                        else S="";
                   4585:                                        if(P[0]==-1){
                   4586:                                                mycat(["Windows : ",T[1][0],"< x <",T[1][1],", ",
                   4587:                                                        T[2][0],"< y <",T[2][1],S]);
                   4588:                                                if(length(T)>4 && type(T[4])==4) mycat(["ext :",T[4]]);
                   4589:                                                if(length(T)>5) mycat(["shift :",T[5]]);
                   4590:                                        }
                   4591:                                        return cdr(T);
                   4592:                                }
                   4593:                                if(type(T[0])==1){
                   4594:                                        if(T[0]==1){
                   4595:                                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4596:                                                        D=car(TT);
                   4597:                                                        if(type(D[0][0])==4){
                   4598:                                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4599:                                                                        if(N++==0) W=ptbbox(car(DT));
                   4600:                                                                        else W=ptbbox(car(DT)|box=W);
                   4601:                                                                }
                   4602:                                                        }else{
                   4603:                                                                if(N++==0) W=ptbbox(D);
                   4604:                                                                else W=ptbbox(D|box=W);
                   4605:                                                        }
                   4606:                                                }
                   4607:                                        }else if(T[0]==2){
                   4608:                                                V=T[2];
                   4609:                                                if(type(V[0])>1||type(V[1])>1) continue;  /* not supported */
                   4610:                                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   4611:                                                        Sc=car(Sc)[1];
                   4612:                                                        if(type(Sc)==1) V=[Sc*V[0],Sc*V[1]];
                   4613:                                                        else V=[Sc[0]*V[0],Sc[1]*V[1]];
                   4614:                                                }
                   4615:                                                if(LS==0) WS=ptbbox([V]);
                   4616:                                                else WS=ptbbox([V]|box=WS);
                   4617:                                                if(length(T)>4) S=T[4];
                   4618:                                                else if(type(S=T[3])==4){
                   4619:                                                        S=S[0];
                   4620:                                                        if(type(S)==4) S=S[length(S)-1];
                   4621:                                                        S=rtostr(S);
                   4622:                                                }
                   4623:                                                if(str_len(S)>LS) LS=str_len(S);
                   4624:                                        }else if(T[0]==3||T[0]==4){
                   4625:                                                if(N++==0) W=ptbbox(cdr(cdr(T)));
                   4626:                                                else W=ptbbox(cdr(cdr(T))|box=W);
                   4627:                                        }
                   4628:                                }
                   4629:                        }
                   4630:                        if(W!=0&&WS!=0) W=ptbbox([W,WS]|box=1);
                   4631:                        return (P[0]==-3)?[W,LS,WS]:W;
                   4632:                }else if(length(P)>1&&P[0]==-1){        /* set Bounding Box */
                   4633:                        P=cons(0,cdr(P));
                   4634:                        Ex=Sft=[0,0];
                   4635:                        if(type(X=getopt(ext))==4) Ex=X;
                   4636:                        if(type(X=getopt(shift))==4) Sft=X;
                   4637:                        if(Ex!=Sft||Ex!=[0,0]){
                   4638:                                if(Sft==[0,0]) Sft=[Ex];
                   4639:                                else Sft=[Ex,Sft];
                   4640:                                if(length(P)==3) Sft=cons(1,Sft);
                   4641:                                if(length(P)==3||length(P)==4) P=append(P,Sft);
                   4642:                        }
                   4643:                        return cons(P,delopt(L,0));
                   4644:                }
                   4645:                if(P[0]==-4){
                   4646:                        for(N=0,LT=L;LT!=[];LT=cdr(LT)){        /* count coord. */
                   4647:                                T=car(LT);
                   4648:                                if(T[0]==1){
                   4649:                                        for(T=cdr(cdr(T));T!=[];T=cdr(T)){
                   4650:                                                if(type((S=car(T))[0][0])==4) N+=length(S);
                   4651:                                                else for(;S!=[];S=cdr(S)) if(type(car(S))==4) N++;
                   4652:                                        }
                   4653:                                }else if(T[0]==2) N++;
                   4654:                                else if(T[0]==3||T[0]==4) N+=2;
                   4655:                        }
                   4656:                        return N;
                   4657:                }
                   4658:                if(P[0]==-5){                                           /* functions */
                   4659:                        for(N=0,R=[],LT=L;LT!=[];LT=cdr(LT)){
                   4660:                                T=car(LT);
                   4661:                                if(T[0]==0) N=ior(N,1);
                   4662:                                else if(type(T[0])==1){
                   4663:                                        if(T[0]>0) N=ior(N,2^T[0]);
                   4664:                                }
                   4665:                                else if(Type(T[0])==2){
                   4666:                                        if(findin(T[0],R)<0) R=cons(T[0],R);
                   4667:                                }
                   4668:                        }
                   4669:                        for(I=5;I>=0;I--) if(iand(N,2^I)) R=cons(I,R);
                   4670:                        return R;
                   4671:                }
                   4672:                return 0;
                   4673:        }
                   4674:
                   4675:        if(length(P)>1){
                   4676:                if(type(P[1])==6||(type(P[1])<2&&P[1]>0)) M=P[1];
                   4677:                else if(type(P[1])==4&&length(P[1])==2) M=diagm(2,P[1]);
                   4678:        }
                   4679:        if(length(P)>2&&type(P[2])==4){
                   4680:                Org=[["shift",P[2]]];
                   4681:                if(M==0) M=1;
                   4682:        }else Org=[];
                   4683:        if(P[0]==0||(type(P[0])==4&&P[0][0]==0)){               /* Risa/Asir */
                   4684:                PP=car(P);PPP=0;
                   4685:                if(type(PP)!=4) PP=[PP];
                   4686:                if(length(PP)<3){
                   4687:                        if(length(PP)==1 || type(PP[1])==4){
                   4688:                                if(ID_PLOT<0) ID_PLOT=ox_launch_nox(0,"ox_plot");
                   4689:                                Id=ID_PLOT;
                   4690:                                if(length(PP)==1&&type(Canvas)==4&&length(Canvas)==2)
                   4691:                                        PP=cons(PP[0],[Canvas]);
                   4692:                                if(length(PP)>1){
                   4693:                                        PPP=PP[1][0];
                   4694:                                        PPQ=(length(PP[1])==2)?PP[1][1]:PPP;
                   4695:                                        open_canvas(Id,[PPP,PPQ]);
                   4696:                                }else open_canvas(Id);
                   4697:                                Ind=ox_pop_cmo(Id);
                   4698:                        }else{
                   4699:                                Ind=PP[1];
                   4700:                                if(getopt(cl)==1) clear_canvas(Id,Ind);
                   4701:                        }
                   4702:                }else{
                   4703:                        Id=PP[1];Ind=PP[2];
                   4704:                        if(length(PP)>3 && type(PP[3])==1) PPP=PP[3];
                   4705:                        if(length(PP)>4 && type(PP[4])==1) PPQ=PP[4];
                   4706:                        if(getopt(cl)==1) clear_canvas(Id,Ind);
                   4707:                }
                   4708:                if(L==[]) return (PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   4709:                Ex0=Ex0;Sft=[0,0];
                   4710:                if(length(P)>1&&P[1]==0&&length(P)<4){
                   4711:                        R=execdraw(L,-3);
                   4712:                        Ex0=Ex1=Ex2=10;
                   4713:                        if((U=R[1])>0){         /* string */
                   4714:                                if(U>20) U=16;                                  /* adj 16,8,2,7,15 */
                   4715:                                if(R[0][0][0]>R[2][0][0]-(R[0][0][1]-R[0][0][0])/256) Ex0+=8*U; /* adj 256 */
                   4716:                                else Ex0+=2*U;
                   4717:                                if(R[0][0][1]<R[2][0][1]+(R[0][0][1]-R[0][0][0])/256) Ex1+=7*U;
                   4718:                                else Ex1+=2*U;
                   4719:                                if(R[0][1][1]<R[2][1][1]+(R[0][1][1]-R[0][1][0])/256) Ex2+=15;
                   4720:                        }
                   4721:                        R=[R[0][0],R[0][1],0,[Ex0,Ex1],[0,-Ex2]];
                   4722:                        if(length(P)>2 && P[2]==1)
                   4723:                                mycat0(["Box:",[R[0],R[1]], ",  ext=",R[3],",  shift=",R[4]],1);
                   4724:                }else R=execdraw((length(P)>3)?P[3]:L,-2);      /* Windows */
                   4725:                XW=R[0];YW=R[1];
                   4726:                if(length(R)>3){
                   4727:                        if(R[3]!=0 && R[3]!=[0,0]) Ex=R[3];
                   4728:                        if(length(R)>4) Sft=R[4];
                   4729:                }
                   4730:                if(type(X=getopt(ext))==4)
                   4731:                        Ex=(Ex0)?[X[0]+Ex[0],X[1]+Ex[1]]:X;
                   4732:                if(type(M)<2){
                   4733:                        if(length(P)>1&&type(P[1])==1) M=P[1];
                   4734:                        else if((length(P)==1||P[1]==0||P[1]==1)&& PPP>0) M=PPP;
                   4735:                        if(M<2) M=400;
                   4736:                        if(Ex!=0 && type(Ex)==4){
                   4737:                                M-=Ex[0]+Ex[1];
                   4738:                        }
                   4739:                        M=(M/(XW[1]-XW[0]))*diagm(2,[1,-1]);
                   4740:                }
                   4741:                if(type(X=getopt(shift))==4) Sft=(Ex0)?[Sft[0]+X[0],Sft[1]+X[1]]:X;
                   4742:                if(type(Sft)==4) Sft=[Sft[0],-Sft[1]];
                   4743:                if(Ex!=0) Sft=[Sft[0]+Ex[0],Sft[1]];
                   4744:                Org=[["shift",ptaffine(M,[-XW[0],-YW[1]]|shift=Sft)]];
                   4745:                for(CT=0;CT<2;CT++){
                   4746:                  for(LT=L;LT!=[];LT=cdr(LT)){
                   4747:                        T=car(LT);
                   4748:                        if(!CT && T[0]!=2) continue;
                   4749:                        if(CT && T[0]==2) continue;
                   4750:                        if(T[0]==1){
                   4751:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4752:                                        D=car(TT);
                   4753:                                        if(type(D[0][0])==4){
                   4754:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4755:                                                        V=car(DT);
                   4756:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   4757:                                                        draw_bezier(Id,Ind,V|option_list=T[1]);
                   4758:                                                }
                   4759:                                        }else{
                   4760:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   4761:                                                draw_bezier(Id,Ind,D|option_list=T[1]);
                   4762:                                        }
                   4763:                                }
                   4764:                        }else if(T[0]==2){      /* put */
                   4765:                                if(length(T)<4) continue;
                   4766:                                V=T[2];
                   4767:                                if(type(VLB)==4&&V[0]=="_") V=VLB;
                   4768:                                else if(type(V[0])>1||type(V[1])>1) continue;   /* not supported */
                   4769:                                if(length(T)>3&&type(T[3])==4&&length(T[3])>1&&T[3][1]==1) VLB=V;
                   4770:                                F++;MM=M;
                   4771:                                if((Sc=delopt(T[1],"scale"|inv=1))!=[]){
                   4772:                                        if(!MM) MM=1;
                   4773:                                        Sc=car(Sc)[1];
                   4774:                                        if(type(Sc)==1) MM=MM*Sc;
                   4775:                                        else if(type(Sc)==6) MM=MM*diagm(2,Sc);
                   4776:                                }
                   4777:                                if(MM) V=ptaffine(MM,V|option_list=Org);
                   4778:                                if(type(S=S0=T[3])==4) S=S0[0];
                   4779:                                if(length(T)>4) S=T[4];                                         /* subst. string */
                   4780:                                if(type(S0)==4&&type(S0[0])==4){
                   4781:                                        if((Col=drawopt(S0[0][0],0))<0) Col=0;  /* attrib. */
                   4782:                                        if(type(S)!=7) S=rtostr(S0[0][1]);
                   4783:                                        S=str_subst(S,[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   4784:                                        if(type(Pos=drawopt(S0[0][0],2))==4)
                   4785:                                                V=[V[0]+4*str_len(S)*Pos[0],V[1]-10*Pos[1]]; /* adjustable */
                   4786:                                }else S=str_subst(rtostr(S),[["$\\bullet$","*"],["$\\times$","x"],["$",""]],0);
                   4787:                                V=[V[0]-str_len(S)*4,V[1]-8];   /* adjustable */
                   4788:                                draw_string(Id,Ind,V,S,Col);
                   4789:                        }else if(T[0]==3){      /* arrow */
                   4790:                                F++;
                   4791:                                T1=T[2];T2=T[3];
                   4792:                                if(M){
                   4793:                                        T1=ptaffine(M,T1|option_list=Org);
                   4794:                                        T2=ptaffine(M,T2|option_list=Org);
                   4795:                                }
                   4796:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T[1]);
                   4797:                        }else if(T[0]==4){      /* line */
                   4798:                                F++;
                   4799:                                T1=T[2];T2=T[3];
                   4800:                                if(M){
                   4801:                                        T1=ptaffine(M,T1|option_list=Org);
                   4802:                                        T2=ptaffine(M,T2|option_list=Org);
                   4803:                                }
                   4804:                                V=delopt(T1=T[1],"opt"|inv=1);
                   4805:                                if(V!=[]&&str_str(V[1],".")>=0)
                   4806:                                        T1=cons(["opt",cons("dotted,",V[1])],delopt(T1,"opt"));
                   4807:                                draw_bezier(Id,Ind,[T1,T2]|option_list=T1);
                   4808:                        }else if(T[0]==5){      /* TeX */
                   4809:                                mycat(rtostr(T[2]));
                   4810:                                if(F){
                   4811:                                        S=str_tb(0,Out);
                   4812:                                        Out=str_tb(0,0);
                   4813:                                        F=0;
                   4814:                                        if(S!=""){
                   4815:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   4816:                                                else LOut=cons(xyproc(S),LOut);
                   4817:                                        }
                   4818:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   4819:                                        else{
                   4820:                                                LOut=cons(T[2],Out);
                   4821:                                        }
                   4822:                                }
                   4823:                        }else if(Proc==1&&type(T[0])==2){
                   4824:                                if(length(T)<3) call(T[0],T[1]);
                   4825:                                else call(T[0],T[1]|option_list=T[2]);
                   4826:                        }
                   4827:                }
                   4828:          }
                   4829:          S=(PPP>0)? [0,Id,Ind,PPP,PPQ]:[0,Id,Ind];
                   4830:          if(Ex==0&&Sft!=[0,0]) Ex=[0,0];
                   4831:          return (Ex!=0&&length(P)>2&&P[2]==-1)?
                   4832:                [S,0,0,[0,R[0],R[1],0,Ex,[Sft[0]-Ex[0],-Sft[1]]]]:S;
                   4833:        }
                   4834:        if(P[0]==1||P[0]==2){   /* TeX */
                   4835:                Out=str_tb(0,0);LOut=[];F=0;
                   4836:                if(getopt(cl)==1) dviout0(0);
                   4837:                for(;L!=[];L=cdr(L)){
                   4838:                        T=car(L);Opt=T[1];
                   4839:                        if(type(T[0])>=2) continue;
                   4840:                        if(T[0]==0){
                   4841:                                XW=T[1];YW=T[2];
                   4842:                                if(length(P)>1&&type(P[1])==1&&P[1]<0)
                   4843:                                        M=-P[1]/(XW[0]-XW[1]);
                   4844:                        }else if(T[0]==1){
                   4845:                                F++;
                   4846:                                for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   4847:                                        D=car(TT);
                   4848:                                        if(type(D[0][0])==4){
                   4849:                                                for(DT=D;DT!=[];DT=cdr(DT)){
                   4850:                                                        V=car(DT);
                   4851:                                                        if(M) V=ptaffine(M,V|option_list=Org);
                   4852:                                                        str_tb(xybezier(V|option_list=Opt),Out);
                   4853:                                                }
                   4854:                                        }else{
                   4855:                                                if(M) D=ptaffine(M,D|option_list=Org);
                   4856:                                                str_tb(xybezier(D|option_list=Opt),Out);
                   4857:                                        }
                   4858:                                }
                   4859:                        }else if(T[0]==2){
                   4860:                                F++;V=T[2];
                   4861:                                Opt=delopt(Opt,"scale"|inv=1);
                   4862:                                MM=M;
                   4863:                                if(Opt!=[]){
                   4864:                                        Opt=car(Opt)[1];
                   4865:                                        if(type(Opt)==1) Opt=[Opt,Opt];
                   4866:                                        if(Opt!=[1,1]){
                   4867:                                                if(!MM) MM=1;
                   4868:                                                MM=MM*diagm(2,[Opt[0],Opt[1]]);
                   4869:                                        }
                   4870:                                }
                   4871:                                if(MM) V=ptaffine(MM,V|option_list=Org);
                   4872:                                if(length(T)>3) V=append(V,T[3]);
                   4873:                                str_tb(xyput(V),Out);
                   4874:                        }else if(T[0]==3){
                   4875:                                F++;
                   4876:                                T1=T[2];T2=T[3];
                   4877:                                if(M){
                   4878:                                        T1=ptaffine(M,T1|option_list=Org);
                   4879:                                        T2=ptaffine(M,T2|option_list=Org);
                   4880:                                }
                   4881:                                str_tb(xyarrow(T1,T2|option_list=Opt),Out);
                   4882:                        }else if(T[0]==4){
                   4883:                                F++;
                   4884:                                T1=T[2];T2=T[3];
                   4885:                                if(M){
                   4886:                                        T1=ptaffine(M,T1|option_list=Org);
                   4887:                                        T2=ptaffine(M,T2|option_list=Org);
                   4888:                                }
                   4889:                                str_tb(xyline(T1,T2|option_list=Opt),Out);
                   4890:                        }else if(T[0]==5){
                   4891:                                if(F){
                   4892:                                        S=str_tb(0,Out);
                   4893:                                        Out=str_tb(0,0);
                   4894:                                        F=0;
                   4895:                                        if(S!=""){
                   4896:                                                if(P[0]==2) dviout(xyproc(S)|keep=1);
                   4897:                                                else LOut=cons(xyproc(S),LOut);
                   4898:                                        }
                   4899:                                        if(P[0]==2)     dviout(T[2]|option_list=T[1]);
                   4900:                                        else LOut=cons(T[2],Out);
                   4901:                                }
                   4902:                        }else if(T[0]==-2)
                   4903:                                str_tb(["%",T[1],"\n"],Out);
                   4904:                        else if(Proc==1&&type(T[0])==2){
                   4905:                                if(length(T)<3) call(T[0],T[1]);
                   4906:                                else call(T[0],T[1]|option_list=T[2]);
                   4907:                        }
                   4908:                }
                   4909:                S=str_tb(0,Out);
                   4910:                if(P[0]==1){
                   4911:                        if(F) LOut=cons(xyproc(S),LOut);
                   4912:                        Out=str_tb(0,0);
                   4913:                        for(L=reverse(LOut);L!=[];L=cdr(L))
                   4914:                                str_tb(car(L),Out);
                   4915:                        return str_tb(0,Out);
                   4916:                }
                   4917:                if(F) dviout(xyproc(S));
                   4918:                else dviout(" ");
                   4919:        }
                   4920: }
                   4921:
                   4922: def execproc(L)
                   4923: {
                   4924:        if(type(N=getopt(var))!=1&&N!=0) N=2;
                   4925:        for(R=[];L!=[];L=cdr(L)){
                   4926:                P=car(L);
                   4927:                if(type(P[0])==2&&vtype(P[0])==3){
                   4928:                        if((VS=vars(cdr(P)))!=[]){
                   4929:                                for(I=0;I<N;I++){
                   4930:                                        V=makev(["v",I+1]);
                   4931:                                        if(findin(V,VS)>=0) P=mysubst(P,[V,R[I]]);
                   4932:                                }
                   4933:                        }
                   4934:                        if(length(P)<3) R=cons(call(P[0],P[1]),R);
                   4935:                        else R=cons(call(P[0],P[1]|option_list=P[2]),R);
                   4936:                }
                   4937:        }
                   4938:        return (getopt(all)==1)?R:car(R);
                   4939: }
                   4940:
                   4941: def myswap(P,L)
                   4942: {
                   4943:        X=makenewv(P);
                   4944:        for(L=reverse(L);length(L)>1;L=cdr(L))
                   4945:                P=subst(P,L[0],X,L[1],L[0],X,L[1]);
                   4946:        return P;
                   4947: }
                   4948:
                   4949: def mysubst(P,L)
                   4950: {
                   4951:        if(P==0) return 0;
1.29      takayama 4952:        if(getopt(lpair)==1||(type(L[0])==4&&length(L[0])>2)) L=lpair(L[0],L[1]);
1.6       takayama 4953:        Inv=getopt(inv);
                   4954:        if(type(L[0]) == 4){
                   4955:                while((L0 = car(L))!=[]){
                   4956:                        P = mysubst(P,(Inv==1)?[L0[1],L0[0]]:L0);
                   4957:                        L = cdr(L);
                   4958:                }
                   4959:                return P;
                   4960:        }
                   4961:        if(Inv==1) L=[L[1],L[0]];
                   4962:        if(type(P) > 3){
                   4963:                if(type(P)==7) return P;
                   4964:                if(type(P)>7)
                   4965:                        return subst(P,L[0],L[1]);
                   4966: #ifdef USEMODULE
                   4967:                return mtransbys(os_md.mysubst,P,[L]);
                   4968: #else
                   4969:                return mtransbys(mysubst,P,[L]);
                   4970: #endif
                   4971:        }
                   4972:        P = red(P);
                   4973:        if(type(P) == 3){
                   4974:                A=mysubst(nm(P),L);B=mysubst(dn(P),L);
                   4975:                return red(nm(A)/nm(B))*red(dn(B)/dn(A));
                   4976:        }
                   4977:        L1=(type(L[1])==3)?red(L[1]):L[1];X=L[0];
                   4978:        if(ptype(L1,X)==3){
                   4979:                LN=nm(L1);LD=dn(L1);
                   4980:                Deg=mydeg(P,X);
                   4981:                if(Deg <= 0) return P;
                   4982:                V = newvect(Deg+1);
                   4983:                for(V[I=Deg]=1;I >= 1;I--)
                   4984:                 V[I-1]=V[I]*LD;
                   4985:                for(R = 0, I = Deg; I >= 0; I--)
                   4986:                        R = R*LN + mycoef(P,I,X)*V[I];
                   4987:                return red(R/V[0]);
                   4988:        }
                   4989:        return subst(P,X,L1);
                   4990: }
                   4991:
                   4992: def mmulbys(FN,P,F,L)
                   4993: {
                   4994:        Opt=getopt();
                   4995:        if(type(F) <= 3){
                   4996:                if(type(P) <= 3)
                   4997:                        return call(FN, cons(P,cons(F,L))|option_list=Opt);
                   4998:                if(type(P) == 5){
                   4999:                        S = length(P);
                   5000:                        R = newvect(S);
                   5001:                        for(I = 0; I < S; I++)
                   5002:                                R[I] = call(FN, cons(P[I],cons(F,L))|option_list=Opt);
                   5003:                        return R;
                   5004:                }else if(type(P) == 6){
                   5005:                        S = size(P);
                   5006:                        R = newmat(S[0],S[1]);
                   5007:                        for(I = 0; I < S[0]; I++){
                   5008:                                for(J = 0; J < S[1]; J++)
                   5009:                                        R[I][J] = call(FN, cons(P[I][J],cons(F,L))|option_list=Opt);
                   5010:                        }
                   5011:                        return R;
                   5012:                }
                   5013:        }
                   5014:        if(type(F) == 5){
                   5015:                S = length(F);
                   5016:                if(type(P) <= 3){
                   5017:                        R = newvect(S);
                   5018:                        for(I = 0; I < S; I++)
                   5019:                                R[I] = call(FN, cons(P,cons(F[I],L))|option_list=Opt);
                   5020:                        return R;
                   5021:                }
                   5022:                if(type(P) == 5){
                   5023:                        for(J=R=0; J<S; J++)
                   5024:                                R = radd(R, call(FN, cons(P[J],cons(F[J],L)))|option_list=Opt);
                   5025:                        return R;
                   5026:                }
                   5027:                T = size(P);
                   5028:                R = newvect(T[0]);
                   5029:                for(I = 0; I < T[0]; I++){
                   5030:                        for(J = 0; J < S; J++)
                   5031:                                R[I] = radd(R[I], call(FN, cons(P[I][J],cons(F[J],L))|option_list=Opt));
                   5032:                }
                   5033:                return R;
                   5034:        }
                   5035:        if(type(F) == 6){
                   5036:                S = size(F);
                   5037:                if(type(P) <= 3){
                   5038:                        R = newmat(S[0],S[1]);
                   5039:                        for(I = 0; I < S[0]; I++){
                   5040:                                for(J = 0; J < S[1]; J++)
                   5041:                                        R[I][J] = call(FN, cons(P,cons(F[I][J],L))|option_list=Opt);
                   5042:                        }
                   5043:                        return R;
                   5044:                }
                   5045:                if(type(P) == 5){
                   5046:                        R = newvect(S[1]);
                   5047:                        for(J = 0; J < S[1]; J++){
                   5048:                                for(K = U = 0; K < S[0]; K++)
                   5049:                                        U = radd(U, call(FN, cons(P[K],cons(F[K][J],L))|option_list=Opt));
                   5050:                                R[J] = U;
                   5051:                        }
                   5052:                        return R;
                   5053:                }
                   5054:                T = size(P);
                   5055:                R = newmat(T[0],S[1]);
                   5056:                for(I = 0; I < T[0]; I++){
                   5057:                        for(J = 0; J < S[1]; J++){
                   5058:                                for(K = U = 0; K < S[0]; K++)
                   5059:                                        U = radd(U, call(FN, cons(P[I][K],cons(F[K][J],L)|option_list=Opt)));
                   5060:                                R[I][J] = U;
                   5061:                        }
                   5062:                }
                   5063:                return R;
                   5064:        }
                   5065:        erno(0);
                   5066:        return 0;
                   5067: }
                   5068:
                   5069: def appldo(P,F,L)
                   5070: {
                   5071:        if(type(F) <= 3){
                   5072:                if(type(L) == 4 && type(L[0]) == 4)
                   5073:                        return applpdo(P,F,L);
                   5074:                L = vweyl(L);
                   5075:                X = L[0]; DX = L[1];
                   5076:                J = mydeg(P,DX);
                   5077:                for(I = R = 0; I <= J; I++){
                   5078:                        if(I > 0)
                   5079:                                F = mydiff(F,X);
                   5080:                        R = radd(R,mycoef(P,I,DX)*F);
                   5081:                }
                   5082:                return R;
                   5083:        }
                   5084: #ifdef USEMODULE
                   5085:        return mmulbys(os_md.appldo,P,F,[L]);
                   5086: #else
                   5087:        return mmulbys(appldo,P,F,[L]);
                   5088: #endif
                   5089: }
                   5090:
                   5091: def appledo(P,F,L)
                   5092: {
                   5093:        if(type(F) <= 3){
                   5094:                L = vweyl(L);
                   5095:                X = L[0]; DX = L[1];
                   5096:                J = mydeg(P,DX);
                   5097:                for(I = R = 0; I <= J; I++){
                   5098:                        if(I > 0)
                   5099:                                F = myediff(F,X);
                   5100:                        R = radd(R,mycoef(P,I,DX)*F);
                   5101:                }
                   5102:                return R;
                   5103:        }
                   5104: #ifdef USEMODULE
                   5105:        mmulbys(os_md.appledo,P,F,[L]);
                   5106: #else
                   5107:        mmulbys(appledo,P,F,[L]);
                   5108: #endif
                   5109: }
                   5110:
                   5111: def muldo(P,Q,L)
                   5112: {
                   5113:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5114:        if(type(Q) <= 3){
                   5115:                if(type(L) == 4 && type(L[0]) == 4)
                   5116:                        return mulpdo(P,Q,L|lim=Lim);   /* several variables */
                   5117:                R = rmul(P,Q);
                   5118:                L = vweyl(L);
                   5119:                X = L[0]; DX = L[1];
                   5120:                if(X != 0){
                   5121:                        for(I = F = 1; ; I++){
                   5122:                                P = mydiff(P,DX);
                   5123:                                if(I>Lim){
                   5124:                                        mycat(["Over", Lim,"derivations!"]);
                   5125:                                        break;
                   5126:                                }
                   5127:                                if(P == 0)
                   5128:                                        break;
                   5129:                                Q = mydiff(Q,X);
                   5130:                                if(Q == 0)
                   5131:                                        break;
                   5132:                                F *= I;
                   5133:                                R = radd(R,P*Q/F);
                   5134:                        }
                   5135:                }
                   5136:                return R;
                   5137:        }
                   5138: #ifdef USEMODULE
                   5139:        return mmulbys(os_md.muldo,P,Q,[L]);
                   5140: #else
                   5141:        return mmulbys(muldo,P,Q,[L]);
                   5142: #endif
                   5143: }
                   5144:
                   5145: def jacobian(F,X)
                   5146: {
                   5147:        F=ltov(F);X=ltov(X);
1.30      takayama 5148:        N=length(F);L=length(X);
                   5149:        M=newmat(N,L);
1.6       takayama 5150:        for(I=0;I<N;I++)
1.30      takayama 5151:                for(J=0;J<L;J++) M[I][J]=red(diff(F[I],X[J]));
                   5152:        if(N!=L||getopt(mat)==1) return M;
1.6       takayama 5153:        return mydet(M);
                   5154: }
                   5155:
                   5156: def hessian(F,X)
                   5157: {
                   5158:        X=ltov(X);
                   5159:        N=length(X);
                   5160:        M=newmat(N,N);
                   5161:        for(I=0;I<N;I++){
                   5162:                G=red(diff(F,X[I]));
                   5163:                for(J=0;J<N;J++) M[I][J]=red(diff(G,X[J]));
                   5164:        }
                   5165:        if(getopt(mat)==1) return M;
                   5166:        return mydet(M);
                   5167: }
                   5168:
                   5169: def wronskian(F,X)
                   5170: {
                   5171:        N=length(F);
                   5172:        M=newmat(N,N);
                   5173:        for(I=0;F!=[];F=cdr(F),I++){
                   5174:                M[I][0]=car(F);
                   5175:                for(J=1;J<N;J++) M[I][J]=red(diff(M[I][J-1],X));
                   5176:        }
                   5177:        if(getopt(mat)==1) return M;
                   5178:        return mydet(M);
                   5179: }
                   5180:
                   5181: def adj(P,L)
                   5182: {
                   5183:        if(type(P) == 4)
                   5184: #ifdef USEMODULE
                   5185:                return map(os_md.adj,mtranspose(P),L);
                   5186: #else
                   5187:                return map(adj,mtranspose(P),L);
                   5188: #endif
                   5189:        if(type(L) == 4 && type(L[0]) == 4)
                   5190: #ifdef USEMODULE
                   5191:                return fmult(os_md.adj,P,L,[]);
                   5192: #else
                   5193:                return fmult(adj,P,L,[]);
                   5194: #endif
                   5195:        L = vweyl(L);
                   5196:        X = L[0]; DX = L[1];
                   5197:        P = R = subst(P, DX, -DX);
                   5198:        for(I = 1; (R = mydiff(mydiff(R, X), DX)/I) != 0 && I < 100; I++)
                   5199:                P = radd(P,R);
                   5200:        return P;
                   5201: }
                   5202:
                   5203: def laplace1(P,L)
                   5204: {
                   5205:        if(type(L) == 4 && type(L[0]) == 4)
                   5206: #ifdef USEMODULE
                   5207:                return fmult(os_md.laplace,P,L,[]);
                   5208: #else
                   5209:                return fmult(laplace,P,L,[]);
                   5210: #endif
                   5211:        L = vweyl(L);
                   5212:        X = L[0]; DX = L[1];
                   5213:        P = adj(P, L);
                   5214:        return subst(P,X,o_1,DX,X,o_1,DX);
                   5215: }
                   5216:
                   5217: def laplace(P,L)
                   5218: {
                   5219:        if(type(L) == 4 && type(L[0]) == 4)
                   5220: #ifdef USEMODULE
                   5221:                return fmult(os_md.laplace1,P,L,[]);
                   5222: #else
                   5223:                return fmult(laplace1,P,L,[]);
                   5224: #endif
                   5225:        L = vweyl(L);
                   5226:        X = L[0]; DX = L[1];
                   5227:        P = adj(P, L);
                   5228:        return subst(P,X,o_1,DX,-X,o_1,-DX);
                   5229: }
                   5230:
                   5231: def mce(P,L,V,R)
                   5232: {
                   5233:        L = vweyl(L);
                   5234:        X = L[0]; DX = L[1];
                   5235:        P = sftexp(laplace1(P,L),L,V,R);
                   5236:        return laplace(P,L);
                   5237: }
                   5238:
                   5239: def mc(P,L,R)
                   5240: {
                   5241:        return mce(P,L,0,R);
                   5242: }
                   5243:
                   5244: def rede(P,L)
                   5245: {
                   5246:        Q = ltov(fctr(nm(red(P))));
                   5247:        P = 1;
                   5248:        if(type(L) < 4)
                   5249:                L = [L];
                   5250:        if(type(L[0]) < 4)
                   5251:                L = [L];
                   5252:        for( ; L != []; L = cdr(L)){
                   5253:                DX = vweyl(car(L))[1];
                   5254:                for(I = 1; I < length(Q); I++){
                   5255:                        if(mydeg(Q[I][0],DX) > 0){
                   5256:                                P *= (Q[I][0])^(Q[I][1]);
                   5257:                                Q[I]=[1,0];
                   5258:                        }
                   5259:                }
                   5260:        }
                   5261:        return P;
                   5262: }
                   5263:
                   5264: def ad(P,L,R)
                   5265: {
                   5266:        L = vweyl(L);
                   5267:        DX = L[1];
                   5268:        K = mydeg(P,DX);
                   5269:        S = mycoef(P,0,DX);
                   5270:        Q = 1;
                   5271:        for(I=1; I <= K;I++){
                   5272:                Q = muldo(Q,DX-R,L);
                   5273:                S = radd(S,mycoef(P,I,DX)*Q);
                   5274:        }
                   5275:        return S;
                   5276: }
                   5277:
                   5278: def add(P,L,R)
                   5279: {
                   5280:        return rede(ad(P,L,R),L);
                   5281: }
                   5282:
                   5283:
                   5284: def vadd(P,L,R)
                   5285: {
                   5286:        L = vweyl(L);
                   5287:        if(type(R) != 4)
                   5288:                return 0;
                   5289:        N = length(R);
                   5290:        DN = 1; Ad = PW = 0;
                   5291:        for( ; R != []; R = cdr(R), PW++){
                   5292:                DN *= (T=1-car(R)[0]*L[0]);
                   5293:                Ad = Ad*T-car(R)[1]*x^PW;
                   5294:        }
                   5295:        Ad /= DN;
                   5296:        return add(P,L,Ad);
                   5297: }
                   5298:
                   5299: def addl(P,L,R)
                   5300: {
                   5301:        return laplace1(add(laplace(P,L),L,R),L);
                   5302: }
                   5303:
                   5304: def cotr(P,L,R)
                   5305: {
                   5306:        L = vweyl(L);
                   5307:        X = L[0]; DX = L[1];
                   5308:        T = 1/mydiff(P,DX);
                   5309:        K = mydeg(P,DX);
                   5310:        S = mysubst(mycoef(P,0,DX), [X, R]);
                   5311:        Q = 1;
                   5312:        for(I = 1; I <= K; I++){
                   5313:                Q = muldo(Q, K*DX, L);
                   5314:                S = radd(S,mysubst(mycoef(P,I,DX), [X, R])*Q);
                   5315:        }
                   5316: }
                   5317:
                   5318: def rcotr(P,L,R)
                   5319: {
                   5320:        return rede(cotr(P,L,R), L);
                   5321: }
                   5322:
                   5323: def muledo(P,Q,L)
                   5324: {
                   5325:        if(type(Q)>3)
                   5326: #ifdef USEMODULE
                   5327:                return mmulbys(os_md.muledo,P,Q,[L]);
                   5328: #else
                   5329:                return mmulbys(muledo,P,Q,[L]);
                   5330: #endif
                   5331:        R = P*Q;
                   5332:        L = vweyl(L);
                   5333:        X = L[0]; DX = L[1];
                   5334:        for(I = F = 1; I < 100; I++){
                   5335:                P = mydiff(P,DX);
                   5336:                if(P == 0)
                   5337:                        break;
                   5338:                Q = myediff(Q,X);
                   5339:                if(Q == 0)
                   5340:                        break;
                   5341:                F = rmul(F,I);
                   5342:                R = radd(R,P*Q/F);
                   5343:        }
                   5344:        return R;
                   5345: }
                   5346:
                   5347:
                   5348: #if 1
                   5349: def mulpdo(P,Q,L)
                   5350: {
                   5351:        if(type(Q)>3)
                   5352: #ifdef USEMODULE
                   5353:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5354: #else
                   5355:                return mmulbys(mulpdo,P,Q,[L]);
                   5356: #endif
                   5357:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5358:        M = vweyl(car(L)); X= M[0]; DX = M[1];
                   5359:        L = cdr(L);
                   5360:        R = 0;
                   5361:        for(I = 0; Q != 0 && I <= Lim; I++){
                   5362:                if(I>Lim){
                   5363:                        mycat(["Over", Lim,"derivations!"]);
                   5364:                        break;
                   5365:                }
                   5366:                if(I > 0)
                   5367:                        P /= I;
                   5368:                if(length(L)==0)
                   5369:                        R = radd(R,P*Q);
                   5370:                else
                   5371:                        R = radd(R,mulpdo(P,Q,L));
                   5372:                if(X==0) break;
                   5373:                P = mydiff(P,DX);
                   5374:                if(P == 0)
                   5375:                        break;
                   5376:                Q = mydiff(Q,X);
                   5377:        }
                   5378:        if(I>Lim)       mycat(["Over", Lim,"derivations!"]);
                   5379:        return R;
                   5380: }
                   5381:
                   5382: #else
                   5383: def mulpdo(P,Q,L);
                   5384: {
                   5385:        if(type(Q)>3)
                   5386: #ifdef USEMODULE
                   5387:                return mmulbys(os_md.mulpdo,P,Q,[L]);
                   5388: #else
                   5389:                return mmulbys(mulpdo,P,Q,[L]);
                   5390: #endif
                   5391:        if(type(Lim=getopt(lim))!=1) Lim=100;
                   5392:        N  = length(L);
                   5393:        VO = newvect(2*N);
                   5394:        VN = newvect(2*N);
                   5395:        for(I = J = 0; I < N; J += 2, I++){
                   5396:                M = vweyl(L[I]);
                   5397:                P = subst(P, VO[J]=M[0], VN[J]=strtov("o_"+rtostr(V[J])),
                   5398:                        VO[J+1]=M[1], VN[J+1] = strtov("o_"+rtostr(V[J+1])));
                   5399:        }
                   5400:        for(PQ = P*Q, I = 0; I < 2*N; I += 2){
                   5401:                for(R = PQ, J = 1; J < Lim; J++){
                   5402:                        R = mydiff(R, VN[I+1])/J;
                   5403:                        if(R == 0)
                   5404:                                break;
                   5405:                        R = mydiff(R, VO[I]);
                   5406:                        if(R == 0)
                   5407:                                break;
                   5408:                        PQ = radd(PQ,R);
                   5409:                }
                   5410:                if(I==Lim)      mycat(["Over", Lim,"derivations!"]);
                   5411:                PQ = red(subst(PQ,VN[I],VO[I],VN[I+1],VO[I+1]));
                   5412:        }
                   5413: }
                   5414: #endif
                   5415:
                   5416: def transpdosub(P,LL,K)
                   5417: {
                   5418:        Len = length(K)-1;
                   5419:        if(Len < 0 || P == 0)
                   5420:                return P;
                   5421:        KK=K[Len];
                   5422:        if(type(KK)==4){
                   5423:                KK0=KK[0]; KK1=KK[1];
                   5424:        }else{
                   5425:                L = vweyl(LL[Len]);
                   5426:                KK0=L[1]; KK1=K[Len];
                   5427:        }
                   5428:        Deg = mydeg(P,KK0);
                   5429:        K1 = reverse(cdr(reverse(K)));
                   5430:        R = transpdosub(mycoef(P,0,KK0),LL,K1);
                   5431:        for(I = M = 1; I <= Deg ; I++){
                   5432:                M = mulpdo(M,KK1,LL);
                   5433:                S = mycoef(P,I,KK0);
                   5434:                if(Len > 0)
                   5435:                        S = transpdosub(S,LL,K1);
                   5436:                R = radd(R,mulpdo(S,M,LL));
                   5437:        }
                   5438:        return R;
                   5439: }
                   5440:
                   5441: def transpdo(P,LL,K)
                   5442: {
                   5443:        if(type(K[0]) < 4)
                   5444:                K = [K];
                   5445:        Len = length(K)-1;
                   5446:        K1=K2=[];
                   5447:        if(type(LL)!=4) LL=[LL];
                   5448:        if(type(LL[0])!=4) LL=[LL];
                   5449:        if(getopt(ex)==1){
                   5450:                for(LT=LL, KT=K; KT!=[]; LT=cdr(LT), KT=cdr(KT)){
                   5451:                        L = vweyl(LL[J]);
                   5452:                        K1=cons([L[0],car(KT)[0]],K1);
                   5453:                        K2=cons([L[1],car(KT)[1]],K2);
                   5454:                }
                   5455:                K2=append(K1,K2);
                   5456:        }else{
                   5457:                for(J = length(K)-1; J >= 0; J--){
                   5458:                        L = vweyl(LL[J]);
                   5459:                        if(L[0] != K[J][0])
                   5460:                                K1 = cons([L[0],K[J][0]],K1);
                   5461:                        K2 = cons(K[J][1],K2);
                   5462:                }
                   5463:                P = mulsubst(P, K1);
                   5464:        }
                   5465:        return transpdosub(P,LL,K2);
                   5466: }
                   5467:
                   5468: def translpdo(P,LL,M)
                   5469: {
                   5470:        S=length(LL);
                   5471:        L0=newvect(S);L1=newvect(S);
                   5472:        K=newvect(S);
                   5473:        for(J=0;J<S;J++){
                   5474:                L = vweyl(LL[J]);
                   5475:                L0[J]=L[0];
                   5476:                L1[J]=L[1];
                   5477:        }
                   5478:        K=rmul(M,L0);
                   5479:        for(T=[],J=0;J<S;J++)
                   5480:                T=cons([L0[J],K[J]],T);
                   5481:        P=mulsubst(P,T);
                   5482:        K=rmul(myinv(M),L1);
                   5483:        for(T=[],J=0;J<S;J++)
                   5484:                T=cons([L1[J],K[J]],T);
                   5485:        return mulsubst(P,T);
                   5486: }
                   5487:
                   5488: /*
                   5489:                return [R, M, S] : R = M*P - S*Q
                   5490:                deg(R,X) < deg(Q,X)
                   5491: */
                   5492: def rpdiv(P,Q,X)
                   5493: {
                   5494:        if(P == 0)
                   5495:                return [0,1,0];
                   5496:        DQ = mydeg(Q,X);
                   5497:        CO = mycoef(Q,DQ,X);
                   5498:        S  = 0;
                   5499:        while((DP = mydeg(P,X)) >= DQ){
                   5500:                R = mycoef(P,DP,X)/CO;
                   5501:                S = radd(S,R*X^(DP-DQ));
                   5502:                P = radd(P, -R*Q*X^(DP-DQ));
                   5503:        }
                   5504:        Lcm = lcm(dn(S),dn(P));
                   5505:        Gcd = gcd(nm(S),nm(P));
                   5506:        return [red(P*Lcm/Gcd), red(Lcm/Gcd),red(S*Lcm/Gcd)];
                   5507: }
                   5508:
                   5509: def texbegin(T,S)
                   5510: {
                   5511:        if(type(Opt=getopt(opt))==7) Opt="["+Opt+"]\n";
                   5512:        else Opt="\n";
                   5513:        return "\\begin{"+T+"}"+Opt+S+"%\n\\end{"+T+"}\n";
                   5514: }
                   5515:
                   5516: def mygcd(P,Q,L)
                   5517: {
                   5518:        if((Dvi=getopt(dviout))==3 || Dvi==-3){ /* dviout=3 */
                   5519:                if((Rev=getopt(rev))!=1) Rev=0;
                   5520:                R=mygcd(P,Q,L|rev=Rev);
                   5521:                if(type(L)<2) Var=0;
                   5522:                else if(type(L)==2){
                   5523:                        Val=L;L=[0,L];
                   5524:                }else if(type(L)==4){
                   5525:                        L=vweyl(L);
                   5526:                        Var=[[L[1],"\\partial"]];
                   5527:                }
                   5528:                S=mat([P],[Q]);T=mat([R[0]],[0]);
                   5529:                M=mat([R[1],R[2]],[R[3],R[4]]);
                   5530:                if(type(Val)==4)
                   5531:                        N=mdivisor(M,L|trans=1)[1];
                   5532:                else N=myinv(M);
                   5533:                Tb=str_tb(mtotex(S|var=Var),0);
                   5534:                str_tb("&="+mtotex(N|var=Var)+mtotex(T|var=Var)+",\\\\\n",Tb);
                   5535:                str_tb(mtotex(T|var=Var),Tb);
                   5536:                str_tb("&="+mtotex(M|var=Var)+mtotex(S|var=Var)+".",Tb);
                   5537:                Out=str_tb(0,Tb);
                   5538:                if(Dvi<0) return Out;
                   5539:                dviout(Out|eq="align*");
                   5540:                return 1;
                   5541:        }
                   5542:        if((type(Dvi)==1||Dvi==0) && getopt(rev)!=1)    V=[[P,Q]];
                   5543:        else V=0;
                   5544:        if(L==0){       /* integer case */
                   5545:                if(type(P) > 1 || type(Q) > 1 || Q==0  /* P <= 0 || Q <= 0 */
                   5546:                        || dn(P) > 1 || dn(Q) > 1)
                   5547:                        return 0;
                   5548:                        CPP = CQQ = 1; CQP = CPQ = 0;
                   5549:                        P1 = P; Q1 = Q;
                   5550:                /* P1 = CPP*P + CPQ*Q
                   5551:                   Q1 = CQP*P + CQQ*Q */
                   5552:                while(Q1 != 0){
                   5553:                        Div1 = idiv(P1,Q1); Div2 = irem(P1,Q1);
                   5554:                        if(type(V)==4) V=cons([Div1,Div2],V);
                   5555:                        P1 = Q1 ; Q1 = Div2;
                   5556:                        TP = CQP; TQ = CQQ;
                   5557:                        CQP = CPP-Div1*CQP;
                   5558:                        CQQ = CPQ-Div1*CQQ;
                   5559:                        CPP = TP; CPQ = TQ;
                   5560:                }
                   5561:                if(V!=0){
                   5562:                        V=reverse(V);
                   5563:                        if((DVI=abs(Dvi))==0) return V;
                   5564:                        PT=P;QT=Q;
                   5565:                        if(DVI==1 || DVI==2){
                   5566:                                Tb=str_tb(0,0);
                   5567:                                for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   5568:                                        T=car(V);
                   5569:                                        if(C++) str_tb(texcr(11),Tb);
                   5570:                                        if(DVI==1){
                   5571:                                                Qs=rtostr(QT);
                   5572:                                                if(QT<0) Qs="("+Qs+")";
                   5573:                                                if(T[1]>0) Qs=Qs+"+";
                   5574:                                                if(T[1]!=0) Qs=Qs+rtostr(T[1]);
                   5575:                                                str_tb(rtostr(PT)+"&="
                   5576:                                                        +rtostr(T[0])+"\\times"+Qs,Tb);
                   5577:                                        }else{
                   5578:                                                N=mat([T[0],1],[1,0]);
                   5579:                                                if(C==1){
                   5580:                                                        str_tb(S0=mtotex(mat([PT],[QT])),Tb);
                   5581:                                                        M=N;
                   5582:                                                }
                   5583:                                                str_tb("&=",Tb);
                   5584:                                                if(C>1) str_tb(mtotex(M),Tb);
                   5585:                                                str_tb(mtotex(N),Tb);
                   5586:                                                str_tb(S=mtotex(mat([QT],[T[1]])),Tb);
                   5587:                                                if(C>1){
                   5588:                                                        str_tb("=",Tb);
                   5589:                                                        str_tb(mtotex(M=M*N),Tb);
                   5590:                                                        str_tb(S,Tb);
                   5591:                                                }
                   5592:                                        }
                   5593:                                        PT=QT;QT=T[1];
                   5594:                                }
                   5595:                                if(DVI==2){
                   5596:                                        str_tb(texcr(43)+S+"&=",Tb);
                   5597:                                        str_tb(mtotex(myinv(M)),Tb);
                   5598:                                        str_tb(S0,Tb);
                   5599:                                }
                   5600:                                Out=str_tb(0,Tb);
                   5601:                                if(Dvi>0){
                   5602:                                        dviout(Out|eq="align*");
                   5603:                                        return 1;
                   5604:                                }
                   5605:                                return Out;
                   5606:                        }
                   5607:                }
                   5608:                if(P1<0) return [-P1,-CPP,-CPQ,CQP,CQQ];
                   5609:                return [P1, CPP, CPQ, CQP, CQQ];
                   5610:        }
                   5611:        if(type(L) == 2)        /* polynomical case */
                   5612:                L = [0,L];
                   5613:        if(getopt(rev)==1 && L[0]!=0){
                   5614:                R=mygcd(adj(P,L),adj(Q,L),L);
                   5615:                return [adj(R[0],L),adj(R[1],L),adj(R[2],L),adj(R[3],L),adj(R[4],L)];
                   5616:        }
                   5617:        if(type(P) == 3)
                   5618:                P = red(P);
                   5619:        if(type(Q) == 3)
                   5620:                Q = red(Q);
                   5621:        CP=newvect(2,[1/dn(P),0]); CQ=newvect(2,[0,1/dn(Q)]);
                   5622:        P=PT=nm(P); Q =QT=nm(Q);
                   5623:        L = vweyl(L);
                   5624:        while(Q != 0){
                   5625:                R = divdo(P,Q,L);
                   5626:                if(type(V)==4) V=cons(R,V);
                   5627: /* R[1] = R[2]*P - R[0]*Q
                   5628:                = R[2]*(CP[0]*P0+CP[1]*Q0) - R[0]*(CQ[0]*P0+CQ[1]*Q0) */
                   5629: /*
                   5630:   P(n)     |0        1 |  P(n-1)
                   5631:          = |           |
                   5632:   R[1]     |R[2]  -R[0]|  P(n)
                   5633:   P(n+1) = R[1], P(n) = P, P(n-1) = Q
                   5634: */
                   5635:                P = Q;
                   5636:                Q = R[1];
                   5637:                {
                   5638:                        CT = dupmat(CQ);
                   5639:                        CQ = [R[2]*CP[0]-muldo(R[0],CQ[0],L),
                   5640:                                        R[2]*CP[1]-muldo(R[0],CQ[1],L)];
                   5641:                        CP = CT;
                   5642:                }
                   5643:        }
                   5644:        if(V!=0){
                   5645:                V=reverse(V);
                   5646:                if((DVI=abs(Dvi))==0) return V;
                   5647:                if(type(L[0])<1) Var=L[1];
                   5648:                else Var=[L[1],"\\partial"];
                   5649:                if(DVI==1 || DVI==2){
                   5650:                        Tb=str_tb(0,0);
                   5651:                        PT=car(V)[0];QT=car(V)[1];
                   5652:                        for(C=0,V=cdr(V);V!=[];V=cdr(V)){
                   5653:                                T=car(V);
                   5654:                                if(C++) str_tb(texcr(11),Tb);
                   5655:                                if(DVI==1){
                   5656:                                        if(T[2]!=1){
                   5657:                                                str_tb(monototex(T[2]),Tb);
                   5658:                                                str_tb("(",Tb);
                   5659:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   5660:                                                str_tb(")&=",Tb);
                   5661:                                        }else{
                   5662:                                                str_tb(fctrtos(PT|var=Var,TeX=2),Tb);
                   5663:                                                str_tb("&=",Tb);
                   5664:                                        }
                   5665:                                        str_tb("(",Tb);
                   5666:                                        str_tb(fctrtos(T[0]|var=Var,TeX=2),Tb);
                   5667:                                        str_tb(")(",Tb);
                   5668:                                        str_tb(fctrtos(QT|var=Var,TeX=2),Tb);
                   5669:                                        if(T[1]!=0){
                   5670:                                                str_tb(")+(",Tb);
                   5671:                                                str_tb(fctrtos(T[1]|var=Var,TeX=2),Tb);
                   5672:                                        }
                   5673:                                        str_tb(")",Tb);
                   5674:                                }else{
                   5675:                                        N=mat([red(T[0]/T[2]),1],[1,0]);
                   5676:                                        if(C==1){
                   5677:                                                str_tb(S0=mtotex(mat([PT],[QT])|var=Var),Tb);
                   5678:                                                M=N;
                   5679:                                        }
                   5680:                                        str_tb("&=",Tb);
                   5681:                                        if(C>1) str_tb(mtotex(M),Tb);
                   5682:                                        str_tb(mtotex(N|var=Var),Tb);
                   5683:                                        str_tb(S=mtotex(mat([QT],[T[1]])|var=Var),Tb);
                   5684:                                        if(C>1){
                   5685:                                                str_tb("=",Tb);
                   5686:                                                str_tb(mtotex(M=muldo(M,N,L)|var=Var),Tb);
                   5687:                                                str_tb(S,Tb);
                   5688:                                        }
                   5689:                                }
                   5690:                                PT=QT;QT=T[1];
                   5691:                        }
                   5692:                        if(DVI==2){
                   5693:                                FT=fctr(PT);
                   5694:                                for(R=1;FT!=[];FT=cdr(FT)){
                   5695:                                        if(mydeg(car(FT)[0],L[1])<1)
                   5696:                                                for(J=car(FT)[1];J>0;J--) R*=car(FT)[0];
                   5697:                                }
                   5698:                                if(R!=1){
                   5699:                                        str_tb(texcr(79),Tb);
                   5700:                                        M=muldo(M,mat([R,0],[0,1]),L);
                   5701:                                        str_tb(mtotex(M|var=Var),Tb);
                   5702:                                        str_tb(S=mtotex(mat([PT/R],[QT])|var=Var),Tb);
                   5703:                                }
                   5704:                                str_tb(texcr(43)+S+"&=",Tb);
                   5705:                                if(type(Var)==4){
                   5706:                                        N=mdivisor(M,L|trans=1);
                   5707:                                        N=N[1];
                   5708:                                }else
                   5709:                                        N=myinv(M);
                   5710:                                str_tb(mtotex(N|var=Var),Tb);
                   5711:                                str_tb(S0,Tb);
                   5712:                        }
                   5713:                        Out=str_tb(0,Tb);
                   5714:                        if(Dvi>0){
                   5715:                                dviout(Out|eq="align*");
                   5716:                                return 1;
                   5717:                        }
                   5718:                        return Out;
                   5719:                }
                   5720:        }
                   5721:        Q = rede(P,L);
                   5722:        R = red(P/Q);
                   5723:        return [Q,red(CP[0]/R),red(CP[1]/R),red(CQ[0]/R),red(CQ[1]/R)];
                   5724: }
                   5725:
                   5726: def mylcm(P,Q,L)
                   5727: {
                   5728:        Rev=(getopt(rev)==1)?1:0;
                   5729:        if(Rev==1){
                   5730:                P=adj(P); Q=adj(Q);
                   5731:        }
                   5732:        R = mygcd(P,Q,L);
                   5733:        S=(type(L)<=2)?R[3]*P:muldo(R[3],P,L);
                   5734:        S = nm(S);
                   5735:        if(type(S) <= 1 && type(L) <= 1){
                   5736:                if(S<0) S = -S;
                   5737:                return S;
                   5738:        }
                   5739:        if(type(L) == 2)
                   5740:                return easierpol(S,L);
                   5741:        S=rede(easierpol(S,L[1]),L);
                   5742:        return (Rev==1)?adj(S):S;
                   5743: }
                   5744:
                   5745: def sftpexp(P,LL,F,Q)
                   5746: {
                   5747:        if(type(LL[0]) < 4)
                   5748:                LL = [LL];
                   5749:        for(L0=L1=[],LT=LL;LT!=[];LT=cdr(LT)){
                   5750:                W=vweyl(car(LT));
                   5751:                L0=cons(W,L0);
                   5752:                D=mydiff(F,W[0]);
                   5753:                if(D!=0) L1=cons(W[1]+Q*D/F,L1);
                   5754:                else L1=cons(W[1],L1);
                   5755:        }
                   5756:        return rede(transpdosub(P,L0,L1),L0);
                   5757: }
                   5758:
                   5759: def applpdo(P,F,LL)
                   5760: {
                   5761:        if(type(F)>3)
                   5762: #ifdef USEMODULE
                   5763:                return mmulbys(os_md.applpdo,P,F,[LL]);
                   5764: #else
                   5765:                return mmulbys(applpdo,P,F,[LL]);
                   5766: #endif
                   5767:        L = vweyl(LL[0]);
                   5768:        LL = cdr(LL);
                   5769:        Deg = deg(P,L[1]);
                   5770:        S = F;
                   5771:        for(I = R = 0; I <= Deg ; I++){
                   5772:                if(I > 0)
                   5773:                        S = mydiff(S,L[0]);
                   5774:                if(LL == [])
                   5775:                        R = radd(R,mycoef(P,I,L[1])*S);
                   5776:                else
                   5777:                        R = radd(R,applpdo(mycoef(P,I,L[1]), S, LL));
                   5778:        }
                   5779:        return R;
                   5780: }
                   5781:
                   5782: def tranlpdo(P,L,M)
                   5783: {
                   5784:        N = length(L);
                   5785:        R = size(M);
                   5786:        if(R[0] != N || R[1] != N){
                   5787:                print("Strange size");
                   5788:                return;
                   5789:        }
                   5790:        InvM = M;
                   5791:        if(InvM[1] == 0){
                   5792:                print("Not invertible");
                   5793:                return;
                   5794:        }
                   5795:        XL = newvector(N);
                   5796:        DL = newvector(N);
                   5797:        for(I = 0; I < 0; I++){
                   5798:                R = vweyl(L[I]);
                   5799:                XL[I] = R[0];
                   5800:                DL[I] = R[1];
                   5801:        }
                   5802:        for(I = 0; I < N; I++){
                   5803:                for(J = XX = D0 = 0; J < N; J++){
                   5804:                        XX = radd(XX,M[I][J]*XL[J]);
                   5805:                        DD = radd(DD, red(InvM[0][I][J]/InvM[1])*DL[J]);
                   5806:                        P = mysubst(P,[[XL[I],XX],[DL[I],DD]]);
                   5807:                }
                   5808:        }
                   5809:        return P;
                   5810: }
                   5811:
                   5812: def divdo(P,Q,L)
                   5813: {
                   5814:        if(L==0){
                   5815:                R=P-idiv(P,Q)*Q;
                   5816:                if(R<0){
                   5817:                        if(Q>0) R+=Q;
                   5818:                        else R-=Q;
                   5819:                }
                   5820:                return [(P-R)/Q,R,1];
                   5821:        }
                   5822:        L = vweyl(L);
                   5823:        if(getopt(rev)==1){
                   5824:                R=divdo(adj(P,L),adj(Q,L),L);
                   5825:                return [adj(R[0],L),adj(R[1],L),R[2]];
                   5826:        }
                   5827:        X = L[0]; DX = L[1];
                   5828:        S = 0;
                   5829:        M = 1;
                   5830:        I = mydeg(Q,DX);
                   5831:        CQ = mycoef(Q,I,DX);
                   5832:        while((J=mydeg(P,DX)) >= I){
                   5833:         C = mycoef(P,J,DX);
                   5834:         SR = red(C/CQ);
                   5835:                 if(dn(SR) != 1){
                   5836:                        M *= dn(SR);
                   5837:                        P *= dn(SR);
                   5838:                        S *= dn(SR);
                   5839:                        SR = nm(SR);
                   5840:                }
                   5841:                P -= muldo(SR*(DX)^(J-I),Q,L);
                   5842:                S += SR*(DX)^(J-I);
                   5843:        }
                   5844:        return [S,P,M];
                   5845: }
                   5846:
                   5847: def qdo(P,Q,L)
                   5848: {
                   5849:        L = vweyl(L); DX = L[1]; OD = deg(P,DX);
                   5850:        V = newvect(OD+1);
                   5851:        for(I = 0; I <= OD; I++){
                   5852:                if(I)
                   5853:                        Q = muldo(DX,Q,L);
                   5854:                S = divdo(Q,P,L);
                   5855:                V[I] = S[1]*DX-S[2]*zz^I;
                   5856:        }
                   5857:        for(K = [], I = OD; I >= 0; I--)
                   5858:                K = cons(DX^(I+1), K);
                   5859:        R = lsol(V,K);
                   5860:        S = length(R);
                   5861:        for(I = P1 = 0; I < S; I++){
                   5862:                if(type(R[I]) < 4 && mydeg(R[I],DX) == 0 && R[I] != 0
                   5863:                        && (mydeg(R[I],zz) <= mydeg(P,DX)))
                   5864:                                P1 = R[I];
                   5865:                else if(type(R[I]) == 4 && R[I][0] == DX)
                   5866:                                P2 = R[I][1];
                   5867:        }
                   5868:        T=fctr(P1);
                   5869:        for(I=0, S=length(T), P1=1; I<S; I++){
                   5870:                if(mydeg(T[I][0],zz) > 0)
                   5871:                        P1 *= T[I][0]^(T[I][1]);
                   5872:        }
                   5873:        return subst([P1,P2],zz,DX);
                   5874: }
                   5875:
                   5876: def sqrtdo(P,L)
                   5877: {
                   5878:        L = vweyl(L);
                   5879:        P = toeul(P,L,0);
                   5880:        V = -1;
                   5881:        for(R = 0, Ord = mydeg(P,L[1]); Ord >= 0; Ord--){
                   5882:                Q = coef(P,Ord,L[1]);
                   5883:                M = mydeg(Q,L[0]);
                   5884:                N = mymindeg(Q,L[0]);
                   5885:                if(V < 0)
                   5886:                        V = M+N;
                   5887:                else if(V != M+N){
                   5888:                        print("Cannot be transformed!");
                   5889:                        return;
                   5890:                }
                   5891:                Q = tohomog(red(Q/L[0]^N), [L[0]], z_z);
                   5892:                if(irem(Ord,2))
                   5893:                        B = x-z_z;
                   5894:                else
                   5895:                        B = x+z_z;
                   5896:                Q = substblock(Q,x,B,z_zz);
                   5897:                if(mydeg(Q,x) > 0){
                   5898:                        print("Cannot be transformed!");
                   5899:                        return;
                   5900:                }
                   5901:                R += mysubst(Q,[z_zz,x])*L[1]^Ord;
                   5902:        }
                   5903:        return fromeul(R,L,0);
                   5904: }
                   5905:
                   5906: def ghg(A,B)
                   5907: {
                   5908:        R = dx;
                   5909:        while(length(B)>0){
                   5910:                R = muldo(x*dx+car(B),R,[x,dx]);
                   5911:                B = cdr(B);
                   5912:        }
                   5913:        T = 1;
                   5914:        while(length(A)>0){
                   5915:                T = muldo(x*dx+car(A),T,[x,dx]);
                   5916:                A = cdr(A);
                   5917:        }
                   5918:        return R-T;
                   5919: }
                   5920:
                   5921: def ev4s(A,B,C,S,T)
                   5922: {
                   5923:  R4 = x^2*(x-1)^2;
                   5924:  R3 = x*(x-1)*((2*A-2*B-8)*x-2*A+5);
                   5925:  R2 = (-3/2*(A^2+B^2)+3*A*B+9*A-9*B-29/2+1/4*(S^2+T^2))*x^2
                   5926:        +(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
                   5927:        - (2*A+2*C-5)*(2*A-2*C-3)/4;
                   5928:  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
                   5929:         +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
                   5930: #if 1
                   5931:         + A^2*B
                   5932: #endif
                   5933:         - B*C^2 - A^3/2+(2*A-3)*(S^2+T^2)/8;
                   5934: /* OK? for the above term added */
                   5935:  R0 = -(A-B-1-S)*(A-B-1+S)*(A-B-1-T)*(A-B-1+T)/16;
                   5936:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   5937: }
                   5938:
                   5939: def b2e(A,B,C,S,T)
                   5940: {
                   5941:        R4 = x^2*(x-1)^2;
                   5942:        R3 = x*(x-1)*(2*x-1)*(2*c-5);
                   5943:        R2 = (-6*C^2+24*C-25+1/2*S^2+1/2*T^2)*x^2
                   5944:                        +(6*C^2-24*C+25-1/2*S^2-1/2*T^2-A^2+B^2+A-B)*x
                   5945:                        +A^2-C^2-A+4*C-15/4;
                   5946:        R1 = (2*C-3)*(2*C^2-6*C+5-1/2*S^2-1/2*T^2)*x
                   5947:                        +(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);
                   5948:        R0 = -(2-2*C+S+T)*(2-2*C-S-T)*(2-2*C+S-T)*(2-2*C-S+T)/16;
                   5949:  return (R4*dx^4-R3*dx^3-R2*dx^2-R1*dx-R0);
                   5950: }
                   5951:
                   5952:
                   5953: /*
                   5954:        T^m = T(T-1)....(T-m+1)
                   5955:        f(t) -> g(t)
                   5956:
                   5957:        f(t)   = a_mt^m + ... + a_1t+a_0
                   5958:        g(x*dx) = a_m*x^m*dx^m + ... + a_1*x*dx+a_0
                   5959:
                   5960:        ret: x(x-1)...(x-i+1)
                   5961:  */
                   5962: def sftpow(X,I)
                   5963: {
                   5964:         R = 1;
                   5965:         for(J=0;J<I;J++)
                   5966:                R *= X-J;
                   5967:         return(R);
                   5968: }
                   5969:
                   5970: /*
                   5971:        ret: x(x+K)(x+2*k)...(x+(i-1)*k)
                   5972: */
                   5973: def sftpowext(X,I,K)
                   5974: {
                   5975:         R = 1;
                   5976:         for(J=0;J<I;J++)
                   5977:                R *= X+K*J;
                   5978:         return(R);
                   5979: }
                   5980:
                   5981: def polinsft(F,A)
                   5982: {
                   5983:         R = 0;
                   5984:         while(F != 0){
                   5985:                 D = mydeg(F,A);
                   5986:                 C = mycoef(F,D,A);
                   5987:                 R += C*A^D;
                   5988:                 F -= C*sftpow(A,D);
                   5989:         }
                   5990:         return R;
                   5991: }
                   5992:
                   5993: def pol2sft(F,A)
                   5994: {
                   5995:        S=getopt(sft);
                   5996:        if(type(S)<0 || type(S)>2) S=1;
                   5997:        R = 0;
                   5998:        for(I = mydeg(F,A); I >= 0; I--)
                   5999:                R = R*(A-I*S) + mycoef(F,I,A);
                   6000:        return R;
                   6001: }
                   6002:
                   6003: def binom(P,N)
                   6004: {
1.20      takayama 6005:        if(type(N)!=1 || N<=0) return 1;
1.6       takayama 6006:        for(S=1;N>0;N--,P-=1)   S*=P/N;
                   6007:        return red(S);
                   6008: }
                   6009:
                   6010: def expower(P,R,N)
                   6011: {
                   6012:        if(type(N)!=1 || N<0) return 0;
                   6013:        for(S=S0=K=1;K<=N;K++,R-=1){
                   6014:                S0*=P*R/K;S+=S0;
                   6015:        }
                   6016:        return red(S);
                   6017: }
                   6018:
                   6019: def seriesHG(A,B,X,N)
                   6020: {
1.20      takayama 6021:        if(N==0) return 1;
1.6       takayama 6022:        if(type(N)!=1 || N<0) return 0;
                   6023:        if(type(X)<4){
                   6024:                for(K=0,S=S0=1;K<N;K++){
                   6025:                        for(T=A; T!=[]; T=cdr(T))       S0*=car(T)+K;
                   6026:                        for(T=B; T!=[]; T=cdr(T))       S0/=car(T)+K;
                   6027:                        S0=red(S0*X/(K+1));
                   6028:                        DN=dn(S0);
                   6029:                        S=red((red(S*DN)+nm(S0))/DN);
                   6030:                }
                   6031:                return S;
                   6032:        }
                   6033:        S=0;
                   6034:        for(K=0;K<=N;K++){
                   6035:                for(I=0;I<=N-K;I++){
                   6036:                        C=1/sftpowext(1,I,1)/sftpowext(1,J,1);
                   6037:                        for(T=A[0];T!=[];T=cdr(T)) C*=sftpowext(car(T),I+K,1);
                   6038:                        for(T=A[1];T!=[];T=cdr(T)) C*=sftpowext(car(T),I,1);
                   6039:                        for(T=A[2];T!=[];T=cdr(T)) C*=sftpowext(car(T),K,1);
                   6040:                        for(T=B[0];T!=[];T=cdr(T)) C/=sftpowext(car(T),I+K,1);
                   6041:                        for(T=B[1];T!=[];T=cdr(T)) C/=sftpowext(car(T),I,1);
                   6042:                        for(T=B[2];T!=[];T=cdr(T)) C/=sftpowext(car(T),K,1);
                   6043:                        S+=red(C*X[0]^I*X[1]^K);
                   6044:                }
                   6045:        }
                   6046:        return S;
                   6047: }
                   6048:
                   6049: def evalred(F)
                   6050: {
                   6051:        Opt=getopt(opt);
                   6052:        if(type(Opt)!=4){
                   6053:                 Opt=[];
                   6054:        }else if(length(Opt)==2 && type(Opt[0])!=4)     Opt=[Opt];
                   6055:        for(;;){
1.17      takayama 6056:                G=mysubst(F,[[tan(0),0],[asin(0),0],[atan(0),0],[sinh(0),0],[tanh(0),0],
                   6057:                        [log(1),0],[cosh(0),1],[exp(0),1]]);
1.6       takayama 6058:                for(Rep=Opt; Rep!=[]; Rep=cdr(Rep))
                   6059:                        G=subst(G,car(Rep)[0],car(Rep)[1]);
                   6060:                Var=vars(G);
                   6061:                for(V=Var; V!=[]; V=cdr(V)){
1.17      takayama 6062:                        if(!(VV=args(CV=car(V)))) continue;
                   6063:                        if((functor(CV)==sin||functor(CV)==cos)){
                   6064:                                P=2*red(VV[0]/@pi);
                   6065:                                if(functor(CV)==sin) P=1-P;
                   6066:                                if(isint(P)){
                   6067:                                        if(iand(P,1)) G=subst(G,CV,0);
                   6068:                                        else if(!iand(P,3)) G=subst(G,CV,1);
                   6069:                                        else G=subst(G,CV,-1);
                   6070:                                        continue;
                   6071:                                }
                   6072:                                if(isint(P*=3/2)){
                   6073:                                        if(iand(P,3)==1) G=subst(G,CV,1/2);
                   6074:                                        else G=subst(G,CV,-1/2);
                   6075:                                }
                   6076:                        }
                   6077:                        for(;VV!=[];VV=cdr(VV))
                   6078:                                if(car(VV)!=(TV=evalred(car(VV)))) G=subst(G,car(VV),TV);
                   6079:                        if(functor(CV)!=pow || (args(CV)[0])!=1) continue;
                   6080:                        G=subst(G,CV,1);
1.6       takayama 6081:                }
                   6082:                if(G==F) return F;
                   6083:                F=G;
                   6084:        }
                   6085: }
                   6086:
                   6087: def seriesMc(F,N,V)
                   6088: {
                   6089:        if(type(V)<4) V=[V];
                   6090:        V=reverse(V);
                   6091:        L=length(V);
                   6092:        if(type(Opt=getopt(evalopt))!=4) Opt=[];
                   6093:        P=newvect(L);
                   6094:        G=newvect(L+1);
                   6095:        G[0]=F;
                   6096:        for(I=0;I<L;I++)
                   6097:                G[I+1]=eval(evalred(subst(G[I],V[I],0)|opt=Opt));
                   6098:        R=G[L];
                   6099:        for(;;){
                   6100:                for(M=0,I=0;I<L;I++){
                   6101:                        M+=P[I];
                   6102:                        if(M==N) break;
                   6103:                }
                   6104:                if(M<N){
                   6105:                        P[L-1]++;
                   6106:                        G[L-1]=mydiff(G[L-1],V[L-1]);
                   6107:                        G[L]=eval(evalred(mysubst(G[L-1],[V[L-1],0])|opt=Opt));
                   6108:                }else{
                   6109:                        if(I--==0) break;
                   6110:                        P[I]++;
                   6111:                        G[I]=mydiff(G[I],V[I]);
                   6112:                        while(I++<L){
                   6113:                                G[I]=eval(evalred(mysubst(G[I-1],[V[I-1],0])|opt=Opt));
                   6114:                                if(I<L) P[I]=0;
                   6115:                        }
                   6116:                }
                   6117:                K=1;
                   6118:                for(I=0;I<L;I++) K*=V[I]^P[I]/fac(P[I]);
                   6119:                R+=G[L]*K;
                   6120:        }
                   6121:        return R;
                   6122: }
                   6123:
                   6124: def seriesTaylor(F,N,V)
                   6125: {
                   6126:        G=F;
                   6127:        if(isvar(V)) V=[V];
                   6128:        if(length(V)==2 && type(car(V))!=4 && !isvar(V[1])) V=[V];
                   6129:        for(V0=V1=[];V!=[];V=cdr(V)){
                   6130:                if(type(T=car(V))!=4) T=[T];
                   6131:                V0=cons(X=car(T),V0);
                   6132:                if(length(T)==1 || T[1]==0){
                   6133:                        V1=cons(X,V1);continue;
                   6134:                }
                   6135:                S=my_tex_form(-T[1]);
                   6136:                if(str_char(S,0,"-")!=0) S="+"+S;
                   6137:                S="("+my_tex_form(X)+S+")";
                   6138:                V1=cons([X,S],V1);
                   6139:                F=red(subst(F,T[0],T[0]+T[1]));
                   6140:        }
                   6141:        V0=reverse(V0);V1=reverse(V1);
                   6142:        F=seriesMc(F,N,V0|option_list=getopt());
                   6143:        if(getopt(frac)==0) F=frac2n(F);
                   6144:        T=getopt(dviout);
                   6145:        if(type(T)!=1) T=0;
                   6146:        F=fctrtos(F|var=V1,rev=1,TeX=(T==0||T==2)?2:3);
                   6147:        if(getopt(small)==1) F=str_subst(F,"\\frac{","\\tfrac{");
                   6148:        if(T<0 || T==1) F="\\begin{align}\\begin{split}\n"+
                   6149:                my_tex_form(G)+"&="+F+"+\\cdots\n\\end{split}\\end{align}\n";
                   6150:        if(T==1) dviout(F);
                   6151:        else if(T==1) dviout(F|eq=4);
                   6152:        return F;
                   6153: }
                   6154:
1.27      takayama 6155: def mulpolyMod(P,Q,X,N)
                   6156: {
                   6157:        Red=(type(P)>2||type(Q)>2)?1:0;
                   6158:        for(I=R=0;I<=N;I++){
                   6159:                P0=mycoef(P,I,X);
                   6160:                for(J=0;J<=N-I;J++){
                   6161:                        R+=P0*mycoef(Q,J,X)*X^(I+J);
                   6162:                        if(Red) R=red(R);
                   6163:                }
                   6164:        }
                   6165:        return R;
                   6166: }
                   6167:
1.26      takayama 6168: def taylorODE(D){
                   6169:        Dif=(getopt(dif)==1)?1:0;
                   6170:        if(D==0) return Dif?f:f_00;
1.27      takayama 6171:        if(type(T=getopt(runge))!=1||ntype(T)!=0) T=0;
1.26      takayama 6172:        if(type(F=getopt(f))!=7&&type(F)<2) F="f_";
                   6173:        if(type(D)!=1||ntype(D)!=0||D<0||D>30) return 0;
                   6174:        if(type(H=getopt(taylor))==4&&length(H)==2){
1.27      takayama 6175:                if(type(Lim=getopt(lim))==2) DD=D;
                   6176:                else if(type(Lim)==4){
                   6177:                        DD=Lim[1];Lim=Lim[0];
                   6178:                }else Lim=0;
                   6179:                for(R=I=0;I<=D;I++){
                   6180: #if 0
                   6181:                        if(I) H0*=H[0];
                   6182:                        else  H0=1;
                   6183:                        if(Lim) H0=os_md.polcut(H0,DD,Lim);
                   6184:                        if(type(F)!=7) G=I?mydiff(G,x):F;
                   6185:                        for(J=0;J<=D-I;J++){
                   6186:                                if(J) H1*=H[1];
                   6187:                                else H1=H0;
                   6188:                                if(Lim) H1=os_md.polcut(H1,DD,Lim);
                   6189:                                if(type(F)==7) G=makev([F,I,J]);
                   6190:                                else if(J) G=mydiff(G,y);
                   6191:                                if(Lim) H1=os_md.polcut(H1,DD,Lim);
                   6192:                                R+=G*H1/fac(I)/fac(J);
                   6193: #else
                   6194:                        if(I){
                   6195:                                if(Lim) H0=mulpolyMod(H0,H[0],Lim,DD);
                   6196:                                else H0*=H[0];
                   6197:                        }else  H0=1;
                   6198:                        if(type(F)!=7) G=I?mydiff(G,x):F;
                   6199:                        for(J=0;J<=D-I;J++){
                   6200:                                if(J){
                   6201:                                        if(Lim) H1=mulpolyMod(H1,H[1],Lim,DD);
                   6202:                                        else H1*=H[1];
                   6203:                                }else H1=H0;
                   6204:                                if(type(F)==7) G=makev([F,I,J]);
                   6205:                                else if(J) G=mydiff(G,y);
                   6206:                                R+=G*H1/fac(I)/fac(J);
                   6207: #endif
1.26      takayama 6208:                        }
                   6209:                }
1.27      takayama 6210:                if(Lim) R=os_md.polcut(R,DD,Lim);
                   6211:                return R;
1.26      takayama 6212:        }else{
                   6213:                if(type(H=getopt(series))>=0||getopt(list)==1){
                   6214:                        if(type(F)!=7){
                   6215:                                for(PP=[F],I=1;I<D;I++)
                   6216:                                        PP=cons(mydiff(car(PP),x)+mydiff(car(PP),y)*F,PP);
                   6217:                                if(type(H)<0) return PP;
                   6218:                                for(R=0,DD=D;DD>=1;DD--,PP=cdr(PP)) R+=car(PP)*H^DD/fac(DD);
                   6219:                                return red(R);
                   6220:                        }
                   6221:                        if(type(H)>=0) D--;
                   6222:                        PP=taylorODE(D-1|list=1);
                   6223:                        if(type(PP)!=4) PP=[PP];
                   6224:                        P=car(PP);
                   6225:                }else P=taylorODE(D-1);
                   6226:                for(R=I=0;I<D;I++){
                   6227:                        for(J=0;J<D-I;J++){
                   6228:                                Q=diff(P,makev([F,I,J]));
                   6229:                                if(Q!=0) R+=Q*(f_00*makev([F,I,J+1])+makev([F,I+1,J]));
                   6230:                        }
                   6231:                }
                   6232:                if(getopt(list)==1){
                   6233:                        R=cons(R,PP);
                   6234:                        if(Dif!=1) return R;
                   6235:                }else if(type(H)>=0){
                   6236:                        R=y+R*H^(D+1)/fac(D+1);
                   6237:                        for(DD=D;DD>0;PP=cdr(PP),DD--) R+=car(PP)*H^(DD)/fac(DD);
                   6238:                        if(T){
                   6239:                                TT=(T<0)?-T:T;
                   6240:                                K=newvect(TT);K[0]=Dif?f:f_00;
                   6241:                                for(I=1;I<TT;I++){
                   6242:                                        for(S=J=0;J<I;J++) S+=makev(["a_",I+1,J+1])*K[J];
1.27      takayama 6243:                                        K[I]=taylorODE(D|taylor=[makev(["c_",I+1])*H,S*H],lim=[H,TT-1]);
1.26      takayama 6244:                                }
                   6245:                                for(S=I=0;I<TT;I++) S+=makev(["b_",I+1])*K[I];
                   6246:                                S=S*H+y;
                   6247:                                R=S-R;
                   6248:                                if(T<0){
                   6249:                                        for(V=[H],I=0;I<=D;I++)
                   6250:                                                for(J=0;J<=D-I;J++) V=cons(makev([F,I,J]),V);
                   6251:                                        return os_md.ptol(R,reverse(V)|opt=0);
                   6252:                                }
                   6253:                        }else T=0;
                   6254:                }
                   6255:        }
                   6256:        if(Dif){
                   6257:                for(I=0;I<=D;I++){
                   6258:                        for(J=0;J<=D;J++){
                   6259:                                if(I==0&&J==0){
                   6260:                                        R=subst(R,f_00,f);
                   6261:                                        continue;
                   6262:                                }
                   6263:                                V=makev([F,str_times("x",I),str_times("y",J)]);
                   6264:                                R=subst(R,makev([F,I,J]),V);
                   6265:                        }
                   6266:                }
                   6267:        }
                   6268:        return R;
                   6269: }
                   6270:
1.6       takayama 6271: def toeul(F,L,V)
                   6272: {
                   6273:        L = vweyl(L);
                   6274:        X = L[0]; DX = L[1];
                   6275:        I = mydeg(F,DX);
                   6276:        if(V == "infty"){
                   6277:                for(II=I; II>=0; II--){
                   6278:                        J = mydeg(P=mycoef(F,I,DX),X);
                   6279:                        if(II==I) S=II-J;
                   6280:                        else if(P!=0 && II-J>S) S=II-J;
                   6281:                }
                   6282:                F *= X^S;
                   6283:                R = 0;
                   6284:                for( ; I >= 0; I--)
                   6285:                         R += red((mysubst(mycoef(F,I,DX),[X,1/X])*(x*DX)^I));
                   6286:                return(subst(pol2sft(R,DX),DX,-DX));
                   6287:        }
                   6288:        F = subst(F,X,X+V);
                   6289:        for(II=I; II>=0; II--){
                   6290:                J = mymindeg(P=mycoef(F,II,DX),X);
                   6291:                if(II==I) S=II-J;
                   6292:                else if(P!=0 && II-J>S) S=II-J;
                   6293:        }
                   6294:        F *= X^S;
                   6295:        R = 0;
                   6296:        for( ; I >= 0; I--)
                   6297:                R += (red(mycoef(F,I,DX)/X^I))*DX^I;
                   6298:        return pol2sft(R,DX);
                   6299: }
                   6300:
                   6301: /*
                   6302: def topoldif(P,F,L)
                   6303: {
                   6304:        L = vweyl(L);
                   6305:        P = nm(red(P));
                   6306:        while(deg(P,L[1]) > 0){
                   6307:                R = coef(P,0,L[0]);
                   6308:                Q = red((P-R)/(F*L[0]);
                   6309:                P = nm(Q)*zz+F*R*dn(Q);
                   6310:        }
                   6311: }
                   6312: */
                   6313:
                   6314: def fromeul(P,L,V)
                   6315: {
                   6316:        if(P == 0)
                   6317:                return 0;
                   6318:        L = vweyl(L);
                   6319:        X = L[0]; DX = L[1];
                   6320:        I = mydeg(P,DX);
                   6321:        if(V == "infty"){
                   6322:                P = subst(P,DX,-DX);
                   6323:                J = mydeg(P,X);
                   6324:                P = red(mysubst(P,[X,1/X])*X^J);
                   6325:        }
                   6326:        R = mycoef(P,0,DX);
                   6327:        S = 1;
                   6328:        for(S = J = 1; J <= I; J++){
                   6329:                S = DX*(S*X + mydiff(S,DX));
                   6330:                R += mycoef(P,J,DX)*S;
                   6331:        }
                   6332:        while(mycoef(R,0,X) == 0)
                   6333:                R = tdiv(R,X);
                   6334:        if(V != "infty" && V != 0)
                   6335:                R = mysubst(R,[X,X-V]);
                   6336:        return R;
                   6337: }
                   6338:
                   6339: def sftexp(P,L,V,N)
                   6340: {
                   6341:        L = vweyl(L); DX = L[1];
                   6342:        P = mysubst(toeul(P,L,V),[DX,DX+N]);
                   6343:        return fromeul(P,L,V);
                   6344: }
                   6345:
                   6346:
                   6347: def fractrans(P,L,N0,N1,N2)
                   6348: {
                   6349:        L = vweyl(L);
                   6350:        if(N2 != "infty"){
                   6351:                if(N0 == "infty")
                   6352:                        N0 = 0;
                   6353:                else
                   6354:                        N0 = red(1/(N0-N2));
                   6355:                if(N1 == "infty")
                   6356:                        N1 = 0;
                   6357:                else
                   6358:                        N1 = red(1/(N1-N2));
                   6359:                P = mysubst(P,[L[0],L[0]+N2]);
                   6360:                P = fromeul(toeul(P,L,"infty"),L,0);
                   6361:        }
                   6362:        if(N0 != 0){
                   6363:                P = mysubst(P,[L[0],L[0]+N0]);
                   6364:                N1 -= N0;
                   6365:        }
                   6366:        if(N1 != 1)
                   6367:                P = mysubst(P,[[L[0],L[0]/N1],[L[1],L[1]*N1]]);
                   6368:        return P;
                   6369: }
                   6370:
                   6371: def soldif(P,L,V,Q,N)
                   6372: {
                   6373:        L = vweyl(L); X = L[0]; DX = L[1];
                   6374:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   6375:        DEG = mydeg(P,X);
                   6376:        P0 = newvect(DEG+1);
                   6377:        for(I = 0; I <= DEG; I++)
                   6378:                P0[I] = coef(P,I,X);
                   6379:        if(P0[0] == 0)
                   6380:                return 0;
                   6381:        if(subst(P0[0],DX,0) != 0){
                   6382:                mycat([Q,"is not the exponent at", V])$
                   6383:                return 0;
                   6384:        }
                   6385:        R = newvect(N+1);
                   6386:        R[0] = 1;
                   6387:        for(I = 1; I <= N; I++){
                   6388:                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   6389:                        S += mysubst(P0[K],[DX,I-K])*R[I-K];
                   6390:                S = red(S);
                   6391:                M = mysubst(P0[0],[DX,I]);
                   6392:                if(M != 0){
                   6393:                        R[I] = -red(S/M);
                   6394:                        if(R1 != 0){
                   6395:                                for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   6396:                                        S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   6397:                                                         mysubst(P1[K],[DX,I-K])*R[I-K];
                   6398:                                R1[I] = -red(S/M);
                   6399:                        }
                   6400:                }else{
                   6401:                        if(S == 0){
                   6402:                                if(R1 != 0){
                   6403:                                        for(S = 0, K = 1; K <= DEG && K <= I; K++)
                   6404:                                                 S += mysubst(P0[K],[DX,I-K])*R1[I-K] +
                   6405:                                                                 mysubst(P1[K],[DX,I-K])*R[I-K];
                   6406:                                }
                   6407:                                if(S == 0)
                   6408:                                        continue;
                   6409:                        }
                   6410:                        R1 = newvect(N+1);
                   6411:                        for(K = 0; K < I; K++){
                   6412:                                R1[K] = R[K];
                   6413:                                R[K] = 0;
                   6414:                        }
                   6415:                        R1[I] = 0;
                   6416:                        P1 = newvect(DEG);
                   6417:                        for(K = 0; K <= DEG; K++)
                   6418:                                P1[K] = mydiff(P0[K], DX);
                   6419:                        M = mysubst(P1[0],[DX,I]);
                   6420:                        if(M == 0){
                   6421:                                cat(["multiple log at ", I])$
                   6422:                                return 0;
                   6423:                        }
                   6424:                        R[I] = -red(S/M);
                   6425:                }
                   6426:        }
                   6427:        if(R1 != 0)
                   6428:                return [R1, R];
                   6429:        else
                   6430:                return R;
                   6431: }
                   6432:
                   6433: def chkexp(P,L,V,Q,N)
                   6434: {
                   6435:        L = vweyl(L); X = L[0]; DX = L[1];
                   6436:        P = mysubst(toeul(P,L,V),[DX,DX+Q]);
                   6437:        P = fromeul(P,L,0);
                   6438:        D = mydeg(P,DX);
                   6439:        Z = mindeg(mycoef(P,D,DX), X) - (D-N);
                   6440:        R = [];
                   6441:        for(I = 0; I < Z; I++){
                   6442:                S = mycoef(P,I,X);
                   6443:                if(S != 0){
                   6444:                        for(J = mydeg(S,DX); J >= 0; J--){
                   6445:                                T = mycoef(S,J,DX);
                   6446:                                if(T != 0)
                   6447:                                        R = cons(T,R);
                   6448:                        }
                   6449:                }
                   6450:        }
                   6451:        return R;
                   6452: }
                   6453:
                   6454:
                   6455: def sqrtrat(P)
                   6456: {
                   6457:        if(P==0) return 0;
                   6458:        if(type(P)==3||type(P)==2){
                   6459:                P=red(P);
                   6460:                if(imag(dn(P))!=0||imag(nm(P))!=0){
                   6461:                        if(imag(dn(P))==0&&real(P)!=0){
                   6462:                                F=red(imag(P)/real(P));
                   6463:                                if(F==3^(1/2)||F==-3^(1/2)){
                   6464:                                        if(eval(real(P))<0)
                   6465:                                                return -real(P)+imag(P)*@i;
                   6466:                                        else{
                   6467:                                                if(eval(imag(P))>0) return imag(P)+real(P)*@i;
                   6468:                                                else return -imag(P)-real(P)*@i;
                   6469:                                        }
                   6470:                                }
                   6471:                        }
                   6472:                        return [];
                   6473:                }
                   6474:                F=fctr(dn(P));
                   6475:                R=sqrtrat(car(F)[0]);
                   6476:                for(F=cdr(F);F!=[];F=cdr(F)){
                   6477:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   6478:                        else return [];
                   6479:                }
                   6480:                F=fctr(nm(P));
                   6481:                R=sqrtrat(car(F)[0])/R;
                   6482:                for(F=cdr(F);F!=[];F=cdr(F)){
                   6483:                        if(!iand(car(F)[1],1)) R*=car(F)[0]^(car(F)[1]/2);
                   6484:                        else return [];
                   6485:                }
                   6486:                return R;
                   6487:        }
                   6488:        if(ntype(P)==4){
                   6489:                P0=real(P);P1=imag(P)/2;
                   6490:                X=makenewv(P);
                   6491:                for(R=fctr(X^4-P0*X^2-P1^2);R!=[];R=cdr(R)){
                   6492:                        RT=car(R)[0];
                   6493:                        if(deg(RT,X)==1){
                   6494:                                X=-mycoef(RT,0,X)/mycoef(RT,1,X);
                   6495:                                return X+P1/X*@i;
                   6496:                        }
                   6497:                        if(deg(RT,X)==2){
                   6498:                                if((D=mycoef(RT,1,X)^2-4*mycoef(RT,2,X)*mycoef(RT,0,X))<0) continue;
                   6499:                                X=(-mycoef(RT,1,X)+sqrtrat(D))/(2*mycoef(RT,2,X));
                   6500:                                return X+P1*sqrt2rat(1/X)*@i;
                   6501:                        }
                   6502:                }
                   6503:                D=P0^2+4*P1^2;
                   6504:                if(P1>0) return ((sqrtrat(D)+P0)/2)^(1/2)+((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   6505:                return ((sqrtrat(D)+P0)/2)^(1/2)-((sqrtrat(D)-P0)/2)^(1/2)*@i;
                   6506:        }else if(ntype(P)!=0) return [];
                   6507:        if(P==1) return P;
                   6508:        Dn=dn(P);Nm=nm(P);C=R=1;
                   6509:        N=pari(factor,Dn);
                   6510:        if(N){
                   6511:                for(II=car(size(N))-1;II>=0;II--){
                   6512:                        if(iand(K=N[II][1],1)){
                   6513:                                R*=N[II][0];
                   6514:                                K++;
                   6515:                        }
                   6516:                        C/=N[II][0]^(K/2);
                   6517:                }
                   6518:        }
                   6519:        N=pari(factor,Nm);
                   6520:        if(N){
                   6521:                for(II=car(size(N))-1;II>=0;II--){
                   6522:                        if(N[II][0]==-1){
                   6523:                                C*=@i;
                   6524:                        continue;
                   6525:                        }
                   6526:                        K=N[II][1];
                   6527:                        if(iand(K,1)){
                   6528:                                R*=N[II][0];
                   6529:                                K--;
                   6530:                        }
                   6531:                        if(K!=0) C*=N[II][0]^(K/2);
                   6532:                }
                   6533:        }
                   6534:        if(R!=1) C*=R^(1/2);
                   6535:        return C;
                   6536: }
                   6537:
                   6538: def fctri(F)
                   6539: {
                   6540:        R=(iscoef(F,os_md.israt))?fctr(F):[[1,1],[F,1]];
                   6541:        if(!iscoef(F,os_md.iscrat)||chkfun("af_noalg",0)==0) return R;
                   6542:        X=makenewv(vars(F));
                   6543:        for(S=[];R!=[];R=cdr(R)){
                   6544:                if(length(Var=vars(R0=car(R)[0])) == 1 && (D=mydeg(R0,Var=car(Var))) > 0){
                   6545:                        if(imag(T=mycoef(R0,D,Var))!=0) R0/=T;
                   6546:                        T=af_noalg(real(R0)+imag(R0)*X,[[X,X^2+1]]);
                   6547:                        if(length(T)>1||T[0][1]>1){
                   6548:                                T=subst(T,X,@i);
                   6549:                                for(; T!=[];T=cdr(T)){
                   6550:                                        if(vars(T[0])!=[])
                   6551:                                                S=cons([car(T)[0],car(T)[1]*car(R)[1]],S);
                   6552:                                }
                   6553:                                continue;
                   6554:                        }
                   6555:                }
                   6556:                S=cons(R[0],S);
                   6557:        }
                   6558:        return reverse(S);
                   6559: }
                   6560:
                   6561: def getroot(F,X)
                   6562: {
                   6563:        S=[];
                   6564:        if(type(Cpx=getopt(cpx))!=1) Cpx=0;
                   6565:        M=getopt(mult);
                   6566:        if(type(F) == 3)
                   6567:                F = nm(red(F));
                   6568:        for(R=fctri(F); length(R)>0; R = cdr(R)){
                   6569:                T=car(R);
                   6570:                P=car(T);
                   6571:                I=car(cdr(T));
                   6572:                if(mydeg(P,X)>0){
                   6573:                        if(mydeg(P,X)==1){
                   6574:                                C = mycoef(P,1,X);
                   6575:                                P = X - red(P/C);
                   6576:                        }else if(mydeg(P,X)==2 && Cpx>0){
                   6577:                                C2=mycoef(P,2,X);C1=mycoef(P,1,X);C0=mycoef(P,0,X);
                   6578:                                C=sqrt2rat(C1^2-4*C0*C2);
                   6579:                                C0=[];
                   6580:                                if(type(C)==0&&ntype(C)==0&&pari(issquare,-C)) C0=sqrt(C);
                   6581:                                else if(Cpx>1) C0=sqrtrat(C);
                   6582:                                if(C0==[]&&Cpx>2) C0=C^(1/2);
                   6583:                                if(C0!=[]){
                   6584:                                        if(M==1)
                   6585:                                                S=cons([I,sqrt2rat((-C1+C0)/(2*C2))],S);
                   6586:                                        else{
                   6587:                                                for(II=I; II>0; II--)
                   6588:                                                        S=cons(sqrt2rat((-C1+C0)/(2*C2)),S);
                   6589:                                        }
                   6590:                                        P=sqrt2rat((-C1-C0)/(2*C2));
                   6591:                                }
                   6592:                        }else if(mydeg(P,X)==3 && Cpx>1){
                   6593:                                Omg=(-1+3^(1/2)*@i)/2;
                   6594:                                PP=P/mycoef(P,3,X);
                   6595:                                C2=mycoef(PP,2,X)/3;
                   6596:                                PP=subst(PP,X,X-C2);
                   6597:                                if((C1=mycoef(PP,1,X))==0){
                   6598:                                        C0=mycoef(PP,0,X);
                   6599:                                        if(real(C0)==0||imag(C0)==0){
                   6600:                                                if(real(C0)==0){
                   6601:                                                        PP=getroot(X^3+imag(C0),X);
                   6602:                                                        if(length(PP)==3){
                   6603:                                                                for(;PP!=[];PP=cdr(PP)){
                   6604:                                                                        if(imag(PP[0])==0){
                   6605:                                                                                C0=PP[0]*@i;
                   6606:                                                                                break;
                   6607:                                                                        }
                   6608:                                                                }
                   6609:                                                                if(PP==[]) C0=0;
                   6610:                                                        }
                   6611:                                                }else{
                   6612:                                                        if(C0>0) C0=C0^(1/3);
                   6613:                                                        else C0=-(-C0)^(1/3);
                   6614:                                                }
                   6615:                                                if(C0!=0){
                   6616:                                                        if(M==1){
                   6617:                                                                S=cons([I,C0-C2],S);
                   6618:                                                                S=cons([I,C0*Omg-C2],S);
                   6619:                                                                S=cons([I,C0*(-1-Omg)-C2],S);
                   6620:                                                        }else{
                   6621:                                                                for(II=I; II>0; II--){
                   6622:                                                                        S=cons(C0-C2,S);
                   6623:                                                                        S=cons(C0*Omg-C2,S);
                   6624:                                                                        S=cons(C0*(-1-Omg)-C2,S);
                   6625:                                                                }
                   6626:                                                        }
                   6627:                                                        continue;
                   6628:                                                }
                   6629:                                        }
                   6630:                                }
                   6631:                                if(Cpx>2){
                   6632:                                        Q=X^2+(mycoef(PP,1,X)/3)*X+mycoef(PP,0,X)^3;
                   6633:                                        SQ=getroot(Q,X|cpx=2);
                   6634:                                        SQ=SQ[0]^(1/3);SQ2=mycoef(PP,0,X)/SQ;
                   6635:                                        if(M==1){
                   6636:                                                S=cons([I,SQ+SQ2-C2],S);
                   6637:                                                S=cons([I,SQ*Omg+SQ2*(-1-Omg)-C2],S);
                   6638:                                                S=cons([I,SQ*(-1-Omg)+SQ2*Omg-C2],S);
                   6639:                                        }else{
                   6640:                                                for(II=I; II>0; II--){
                   6641:                                                        S=cons(SQ+SQ2-C2,S);
                   6642:                                                        S=cons(SQ*Omg+SQ2*(-1-Omg)-C2,S);
                   6643:                                                        S=cons(SQ*(-1-Omg)+SQ2*Omg-C2,S);
                   6644:                                                }
                   6645:                                        }
                   6646:                                        continue;
                   6647:                                }
                   6648:                        }else if(mydeg(P,X)==4 && Cpx>0){
                   6649:                                C2=mycoef(P,3,X)/(4*mycoef(P,4,X));
                   6650:                                PP=subst(P,X,X-C2);
                   6651:                                if(mycoef(PP,1,X)==0){
                   6652:                                        PP=mycoef(PP,4,X)*X^2+mycoef(PP,2,X)*X+(SQ2=mycoef(PP,0,X));
                   6653:                                        SQ=getroot(PP,X|cpx=2);
                   6654:                                        if(length(SQ)==2){
                   6655:                                                if((C0=sqrtrat(SQ[0]))==[]){
                   6656:                                                        if(mycoef(PP,1,X)==0){
                   6657:                                                                if(SQ2<0) C0=(-SQ2)^(1/4);
                   6658:                                                                else C0=SQ2^(1/4)*(1+@i)/2;
                   6659:                                                        }
                   6660:                                                        else if(Cpx>2) C0=SQ[0]^(1/2);
                   6661:                                                        else C0=0;
                   6662:                                                }
                   6663:                                                if((C1=sqrtrat(SQ[1]))==[]){
                   6664:                                                        if(mycoef(PP,1,X)==0) C1=-C0;
                   6665:                                                        else C1=SQ[1]^(1/2);
                   6666:                                                }
                   6667:                                                if(C0!=0){
                   6668:                                                        if(M==1)
                   6669:                                                                S=append([[I,C0-C2],[I,-C0-C2],[I,C1-C2],[I,-C1-C2]],S);
                   6670:                                                        else{
                   6671:                                                                for(II=I; II>0; II--)
                   6672:                                                                        S=append([C0-C2,-C0-C2,C1-C2,-C1-C2],S);
                   6673:                                                        }
                   6674:                                                        continue;
                   6675:                                                }
                   6676:                                        }
                   6677:                                }else{
                   6678:                                        PP/=mycoef(PP,4,X);
                   6679:                                        CC=mycoef(PP,2,X);C1=mycoef(PP,1,X);C0=mycoef(PP,0,X);
                   6680:                                        SQ=getroot(X*(CC+X)^2-4*C0*X-C1^2,X|cpx=Cpx);
                   6681:                                        if(length(SQ)>1){
                   6682:                                                SQ=sqrt2rat(SQ[0]);
                   6683:                                                SQ2=getroot(X^2-SQ,X|cpx=Cpx);
                   6684:                                                if(length(SQ2)>1){
                   6685:                                                        C1=SQ2[0]*X-C1/SQ2[0]/2;
                   6686:                                                        C0=getroot(X^2+CC/2+SQ/2+C1,X|cpx=Cpx);
                   6687:                                                        C1=getroot(X^2+CC/2+SQ/2-C1,X|cpx=Cpx);
                   6688:                                                        if(length(C0)>1&&length(C1)>1){
                   6689:                                                                C0=[sqrt2rat(C0[0]-C2),sqrt2rat(C0[1]-C2),
                   6690:                                                                        sqrt2rat(C1[0]-C2),sqrt2rat(C1[1]-C2)];
                   6691:                                                                if(M==1) for(II=0;II<4;II++) S=cons([I,C0[II]],S);
                   6692:                                                                else for(II=I; II>0; II--) S=append(C0,S);
                   6693:                                                                continue;
                   6694:                                                        }
                   6695:                                                }
                   6696:                                        }
                   6697:                                }
                   6698:                        }
                   6699:                        if(M==1)
                   6700:                                S=cons([I,P],S);
                   6701:                        else for( ; I>0; I--) S=cons(P,S);
                   6702:                }
                   6703:        }
                   6704:        S=qsort(S);
                   6705:        if(M==1) S=reverse(S);
                   6706:        return S;
                   6707: }
                   6708:
                   6709: def expat(F,L,V)
                   6710: {
                   6711:         L = vweyl(L);
                   6712:         if(V == "?"){
                   6713:                 Ans = [];
                   6714:
                   6715:                 F = nm(red(F));
                   6716:                 S = fromeul(toeul(F,L,"infty"),L,0);
                   6717:                 S = mycoef(S,mydeg(S,L[1]),L[1]);
                   6718:                 if(mydeg(S,L[0]) > 0)
                   6719:                         Ans = cons(["infty", expat(F,L,"infty")],Ans);
                   6720:
                   6721:                 S = mycoef(F,mydeg(F,L[1]), L[1]);
                   6722:                 R = getroot(S,L[0]);
                   6723:                 for(I = 0; I < length(R); I++){
                   6724:                         if(I > 0 && R[I-1] == R[I])
                   6725:                                 continue;
                   6726:                         if(mydeg(R[I], L[0]) <= 0)
                   6727:                                 Ans = cons([R[I], expat(F,L,R[I])], Ans);
                   6728:                         else
                   6729:                                 Ans = cons([R[I]], Ans);
                   6730:                 }
                   6731:                 return Ans;
                   6732:         }
                   6733:         return getroot(subst(toeul(F,L,V),L[0],0),L[1]);
                   6734: }
                   6735:
                   6736: def polbyroot(P,X)
                   6737: {
                   6738:        R = 1;
                   6739:        while(length(P)){
                   6740:                R *= X-car(P);
                   6741:                if(type(R)>2) R = red(R);
                   6742:                P = cdr(P);
                   6743:        }
                   6744:        return R;
                   6745: }
                   6746:
                   6747: def polbyvalue(P,X)
                   6748: {
                   6749:        R = 1; S = 0;
                   6750:        while(length(P)){
                   6751:                T = car(P);
                   6752:                V0 = T[1] - mysubst(S,[X,T[0]]);
                   6753:                if(V0 != 0){
                   6754:                        if(type(R) > 2) R = red(R);
                   6755:                        V1 = mysubst(R,[X,T[0]]);
                   6756:                        if(V1 == 0){
                   6757:                                erno(0);
                   6758:                                return 0;
                   6759:                        }
                   6760:                        S += (V0/V1)*R;
                   6761:                        if(type(S) > 2) S = red(S);
                   6762:                }
                   6763:                R *= X - T[0];
                   6764:                P = cdr(P);
                   6765:        }
                   6766:        return S;
                   6767: }
                   6768:
                   6769:
                   6770: def pcoef(P,L,Q)
                   6771: {
                   6772:        if(L==0)
                   6773:                return 1;
                   6774:        Coef=TP=0;
                   6775:        if(type(Q)>=4){
                   6776:                TP=1;
                   6777:                V=Q[0];
                   6778:                if(type(V)==4)
                   6779:                        V=ltov(V);
                   6780:                else V=dupmat(V);
                   6781:                N=length(V);
                   6782:                if(type(Q[1])==5) MR=dupmat(Q[1]);
                   6783:                else{
                   6784:                        MR=newvect(N);
                   6785:                        for(K=Q[1], I=0; I< N; I++){
                   6786:                                MR[I] = car(K);
                   6787:                                K = cdr(K);
                   6788:                        }
                   6789:                }
                   6790:        }else{
                   6791:                V=ltov(vars(P));
                   6792:                N=length(V);
                   6793:                MR=newvect(N);
                   6794:                for(I=0;I<N;I++){
                   6795:                        MR[I]=mydeg(Q,V[I]);
                   6796:                        Q=mycoef(Q,MR[I],V[I]);
                   6797:                }
                   6798:                if(type(Q)>1) return 0;
                   6799:        }
                   6800:        if(L==1){
                   6801:                for(I=0;I<N;I++)
                   6802:                        P=mycoef(P,MR[I],V[I]);
                   6803:                return P;
                   6804:        }
                   6805:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   6806:                for(K1=MR[I],K2=V[I],J=I-1; J>=0 && MR[J]<K1; J--);
                   6807:                for(II=I-1;II>J;II--){
                   6808:                        MR[II+1]=MR[II];V[II+1]=V[II];
                   6809:                }
                   6810:                MR[II+1]=K1;V[II+1]=K2;
                   6811:        }
                   6812:        for(NN=N; N>0 && MR[N-1]==0; N--);
                   6813:        Mon=[];Coe=[];Q=P;
                   6814:        while(Q!=0){
                   6815:                M=newvect(N);
                   6816:                for(R=Q,F=I=0,MT=1;I<NN;I++){
                   6817:                        K=mydeg(R,V[I]);
                   6818:                        R=mycoef(R,K,V[I]);
                   6819:                        if(I<N) M[I]=K;
                   6820:                        if(K>0) MT*=V[I]^K;
                   6821:                        if(K>MR[I]) F=1;
                   6822:                }
                   6823:                Q -= R*MT;
                   6824:                if(F==0){
                   6825:                        Mon=cons(M,Mon);
                   6826:                        Coe=cons(R,Coe);
                   6827:                }
                   6828:        }
                   6829:        Mon=ltov(reverse(Mon));
                   6830:        Coe=ltov(reverse(Coe));
                   6831:        Len=length(Mon);
                   6832:        S=newvect(Len);
                   6833:        for(JL=0; JL<Len;JL++){
                   6834:                if(L*Mon[JL][0]<MR[0]) break;
                   6835:        }
                   6836:        S[0]=L;
                   6837:
                   6838:        K0=Mon[0][0];
                   6839:        K=L*K0-MR[0];
                   6840:        for(I=II=0;II<Len && K>=0;II++){
                   6841:                if((K1=K0-Mon[0][II])>0){
                   6842:                        while(K>K1 && S[I]>0){
                   6843:                                S[I]--;S[II]++;
                   6844:                                K-=K1;
                   6845:                                I=II;
                   6846:                                K0=Mon[0][II];
                   6847:                        }
                   6848:                }else break;
                   6849:        }
                   6850:
                   6851:        I=0;
                   6852:        while(1){
                   6853:         for(T=T0=J=JP=0; J<Len; J++){
                   6854:                 if(S[J]!=0){
                   6855:                         if(T0==0 && J>=JL) return Coef;
                   6856:                         JP=J;T0=1;
                   6857:                         T+=S[J]*Mon[J][I];
                   6858:                 }
                   6859:         }
                   6860:         if(T==MR[I]){
                   6861:                 if(++I<N) continue;
                   6862:                 for(TT=1,J=1; J<=L; J++)  /* find a solution */
                   6863:                         TT*=J;
                   6864:                 for(J=0;J<Len;J++){
                   6865:                         if(S[J]!=0){
                   6866:                                 TT*=Coe[J]^S[J];
                   6867:                                 for(II=S[J]; II>1; II--)
                   6868:                                         TT/=II;
                   6869:                         }
                   6870:                 }
                   6871:                 Coef+=TT;
                   6872:                 if(TP==1 && type(Coef)==3) Coef=red(Coef);
                   6873:                 if(JP<Len-2 && S[JP]>1){
                   6874:                         S[JP]-=2;S[JP+1]++;S[JP+2]++;
                   6875:                 }else{
                   6876:                         for(JT=JP-1;JT>=0&&S[JT]==0;JT--);
                   6877:                         if(JT<0) break;
                   6878:                         if(JT==JP-1){
                   6879:                                 S[JT]--;
                   6880:                                 if(JP<Len-1)
                   6881:                                         S[JP+1]++;
                   6882:                                 else
                   6883:                                         S[JP]++;
                   6884:                         }else{
                   6885:                                 S[JT]--;
                   6886:                                 S[JT+1]+=S[JP]+1;
                   6887:                                 S[JP]=0;
                   6888:                         }
                   6889:                 }
                   6890:                 I=0;
                   6891:                 continue;
                   6892:         }
                   6893:         if(JP<Len-1){
                   6894:                 for(JP1=JP+1;JP1<Len-1;JP1++){
                   6895:                                if(Mon[JP1][I]!=Mon[JP][I]) break;
                   6896:                 }
                   6897:
                   6898:                 if(I>0 && Mon[JP1][0] < Mon[JP][0]){
                   6899:                         S[JP]--;S[Len-1]++;JP=JP-1;
                   6900:                 }else{
                   6901:
                   6902:                         S[JP]--;
                   6903:                         if(JP1<Len){
                   6904:                                 S[JP1]++;
                   6905:                         }else{
                   6906:                                 S[JP1-1]++;
                   6907:                         }
                   6908:                 }
                   6909:         }
                   6910:         if(JP==Len-1){
                   6911:                 for(JT=JP-1;JT>=0 && S[JT]==0;JT--);
                   6912:                 if(JT<0) break;
                   6913:                 S[JT]--;
                   6914:                 if(JT==JP-1){
                   6915:                         S[JP]++;
                   6916:                 }else{
                   6917:                         S[JT+1]+=S[JP]+1;
                   6918:                         S[JP]=0;
                   6919:                 }
                   6920:         }
                   6921:         I=0;
                   6922:        }
                   6923:        return Coef;
                   6924: }
                   6925:
                   6926: def prehombf(P,Q)
                   6927: {
                   6928:        if((Mem=getopt(mem))!=1 && Mem!=-1)
                   6929:                return prehombfold(P,Q);
                   6930:        if(Q==0) Q=P;
                   6931:        V=ltov(vars(P));
                   6932:        N=length(V);
                   6933:        for(I=1;I<N;I++){  /* sorted by required degrees */
                   6934:                for(K=mydeg(P,V[I]),K1=V[I],J=I-1; J>=0 && mydeg(P,V[J])<K; J--);
                   6935:                for(II=I-1;II>J;II--) V[II+1]=V[II];
                   6936:                V[II+1]=K1;
                   6937:        }
                   6938:        S=newvect(N);T=newvect(N);U=newvect(N);
                   6939:        for(R=P,M=1,Deg=I=0;I<N;I++){  /* extreme vector */
                   6940:                Deg+=(S[I]=mydeg(R,V[I]));
                   6941:                R=mycoef(R,S[I],V[I]);
                   6942:        }
                   6943:        DR=[[-1,0]];
                   6944:        if((R1=N/Deg)!=1){
                   6945:                DR=cons([-R1,0],DR);
                   6946:                Sft=1;
                   6947:        }else Sft=0;
                   6948:        if(Deg%2==0) Sg=1;
                   6949:        else Sg=-1;
                   6950:        for(I=0,R=R2=1,QQ=Q; 2*I+Sft < Deg; I++){
                   6951:                if(Mem==-1){
                   6952:                        print(I+1,0);print("/",0);print(idiv(Deg-Sft+1,2),0);print(" ",2);
                   6953:                }
                   6954:                Coef=0;
                   6955:                Q=QQ;
                   6956:                while(Q!=0){
                   6957:                        for(R=Q,J=0,RR=1;J<N;J++){
                   6958:                                T[J]=mydeg(R,V[J]);
                   6959:                                R=mycoef(R,T[J],V[J]);
                   6960:                                if(T[J]>0) RR*=V[J]^T[J];
                   6961:                        }
                   6962:                        Q-=R*RR;
                   6963:                        for(J=0,CC=R;J<N;J++){
                   6964:                                U[J]=I*S[J]+T[J];
                   6965:                                for(II=0; II<T[J]; II++)
                   6966:                                        CC*=(U[J]-II);
                   6967:                        }
                   6968:                        CC*=pcoef(P,I+1,[V,U]);
                   6969:                        if(Mem==-1) print("*",2);
                   6970:                        Coef+=CC;
                   6971:                }
                   6972:                DR=cons([I,Coef],DR);
                   6973:                DR=cons([-R1-1-I,Sg*Coef],DR);
                   6974:                if(Mem==-1) print("");
                   6975:        }
                   6976:        P = polbyvalue(DR,s);
                   6977:        return fctr(P);
                   6978: }
                   6979:
                   6980: def prehombfold(P,Q)
                   6981: {
                   6982:        V = vars(P);
                   6983:        if(Q==0) Q=P;
                   6984:        for(Deg=0, R=P, V1=V, DD=[]; V1!=[]; V1=cdr(V1)){
                   6985:                VT = car(V1);
                   6986:                D = mydeg(R,VT);
                   6987:                R = mycoef(R,D,VT);
                   6988:                Deg += D;
                   6989:                X = makev(["d",VT]);
                   6990:                Q = subst(Q,VT,X);
                   6991:                DD=cons([VT,X],DD);
                   6992:        }
                   6993:        DR=[[-1,0]];
                   6994:        NV=length(V);
                   6995:        if((R1=NV/Deg)!=1){
                   6996:                DR=cons([-R1,0],DR);
                   6997:                Sft=1;
                   6998:        }else
                   6999:                Sft=0;
                   7000:        if(Deg%2==0)
                   7001:                Sg=1;
                   7002:        else Sg=-1;
                   7003:        for(I = 0, R=R2=1; 2*I+Sft < Deg; I++){
                   7004:                R = R2;
                   7005:                R2 = R*P;
                   7006:                S = appldo(Q,R2,DD);
                   7007:                QQ = sdiv(S,R);
                   7008:                DR=cons([I,QQ],DR);
                   7009:                DR=cons([-R1-1-I,Sg*QQ],DR);
                   7010:        }
                   7011:        P = polbyvalue(DR,s);
                   7012:        return fctr(P);
                   7013: }
                   7014:
                   7015: def sub3e(P0,P1,P2,N0,N1,N)
                   7016: {
                   7017:        R = x^N0*(x-1)^N1*dx^N;
                   7018:        for(V = I = 1, J = 1; I <= N; I++){
                   7019:                S = 0;
                   7020:                M = N-I;
                   7021:                if(I <= N0){
                   7022:                        T = mycoef(P0,N0-I,x);
                   7023:                        S += T;
                   7024:                        R += T*x^(N0-I)*(x-1)^N1*dx^M;
                   7025:                        K1 = N0-I+1;
                   7026:                }else
                   7027:                        K1 = 0;
                   7028:                if(I <= N1){
                   7029:                        T = mycoef(P1,N1-I,x);
                   7030:                        S += T;
                   7031:                        R += T*x^N0*(x-1)^(N1-I)*dx^M;
                   7032:                        K2 = N0-1;
                   7033:                }else
                   7034:                        K2 = N-I;
                   7035:                for(K = K1; K <= K2; K++){
                   7036:                        if(K == K2){
                   7037:                                R += (mycoef(P2,N-I,x)-S)*x^K*(x-1)^(M-K)*dx^M;
                   7038:                                continue;
                   7039:                        }
                   7040:                        R += strtov("r"+rtostr(V))*x^K*(x-1)^(M-K)*dx^M;
                   7041:                        S += strtov("r"+rtostr(V++));
                   7042:                }
                   7043:        }
                   7044:        if(V > 1)
                   7045:                mycat([V-1, "accessory parameters: r1,r2,..."]);
                   7046:        return R;
                   7047: }
                   7048:
                   7049: def fuchs3e(P,Q,R)
                   7050: {
                   7051:        return getbygrs([R,P,Q],3);
                   7052: }
                   7053:
                   7054: def okubo3e(P,Q,R)
                   7055: {
                   7056:        if(getopt(opt)==1){
                   7057:                N=length(R);
                   7058:                M1=N-length(P);M2=N-length(Q);
                   7059:                V=(M1-1)*(M2-1);
                   7060:                if(V>0) mycat([V, "accessory parameters"]);
                   7061:                return getbygrs([R,cons([M1,0],P),cons([M2,0],Q)],3);
                   7062:        }
                   7063:        S = 0;
                   7064:        V = -1;
                   7065:        L = newvect(3,[[],[],[]]);
                   7066:        N = newvect(3,[0,0,0]);
                   7067:        if(type(R) < 4){
                   7068:                I = -1;
                   7069:                V = 3;
                   7070:        }else{
                   7071:                I = 2;
                   7072:                V = -1;
                   7073:        }
                   7074:        for( ; I >= 0; I--){
                   7075:                if(I == 2)
                   7076:                        U = R;
                   7077:                else if(I == 1)
                   7078:                        U = Q;
                   7079:                else
                   7080:                        U = P;
                   7081:                for( ; length(U); U = cdr(U)){
                   7082:                        T = car(U);
                   7083:                        if( T == "?"){
                   7084:                                if(V < 0)
                   7085:                                        V = I;
                   7086:                                else
                   7087:                                        return 0;
                   7088:                        }else{
                   7089:                                if(I == 2)
                   7090:                                        L[I] = cons(-T, L[I]);
                   7091:                                else
                   7092:                                        L[I] = cons(T, L[I]);
                   7093:                                S += T;
                   7094:                        }
                   7095:                        N[I]++;
                   7096:                }
                   7097:        }
                   7098:        if(V == 3){
                   7099:                N[2] = N[0] + N[1];
                   7100:                P2 = x^N;
                   7101:                for(I = 1; I <= N; I++)
                   7102:                        P2 += makev([R,I])*x^(N-I);
                   7103:        }else{
                   7104:                if(N[0]+N[1] != N[2]){
                   7105:                        print("Number of exponents are wrong",0);
                   7106:                        return -1;
                   7107:                }
                   7108:                S -= N[0]*N[1];
                   7109:                if(V < 0){
                   7110:                        if(S != 0){
                   7111:                                mycat(["Viorate Fuchs relation ->",S]);
                   7112:                                return -2;
                   7113:                        }
                   7114:                }else{
                   7115:                        if(V != 2)
                   7116:                                S = -S;
                   7117:                        L[V] = cons(S, L[V]);
                   7118:                }
                   7119:                P2 = polinsft(polbyroot(L[2],x),x);
                   7120:        }
                   7121:        P0 = polinsft(mysubst(polbyroot(L[0],x),[x,x+N[1]]),x);
                   7122:        P1 = polinsft(mysubst(polbyroot(L[1],x),[x,x+N[0]]),x);
                   7123:        return sub3e(P0,P1,P2,N[0],N[1],N[2]);
                   7124: }
                   7125:
                   7126: /*    N = 2*M (N-M = M)  or  2*M+1 (N-M = M+1)
                   7127:                0 : 0   1 ..... M-1 B B+1 ... B+N-M-2 A
                   7128:                1 : C C+1 ... C+M-1 0   1 ....  N-M-2 N-M-1
                   7129:  */
                   7130: def eosub(A,B,C,N)
                   7131: {
                   7132:        M = N%2;
                   7133:        P = [];
                   7134:        Q = [];
                   7135:        P = cons(A,P);
                   7136:        for(I = 0; I < N-M-1; I++)
                   7137:                P = cons(B+I,P);
                   7138:        for(I = 0; I < M; I++)
                   7139:                Q = cons(C+I,Q);
                   7140:        P = okubo3e(P,Q,s);
                   7141:
                   7142:        C  = newvect(2);
                   7143:        L  = newvect(2);
                   7144:        C[1] = chkexp(P,[x,dx],0,b,N-M-1);
                   7145:        C[0] = chkexp(P,[x,dx],1,c,M);
                   7146:        for(LL = K = 0; K < 2; K++){
                   7147:                L[K] = length(C[K]);
                   7148:                C[K] = ltov(C[K]);
                   7149:                if(L[K] > LL)
                   7150:                        LL = L[K];
                   7151:        }
                   7152:        JJ = 0;
                   7153:
                   7154:        for(I = 1; Do; I++){
                   7155:                Do = 0;
                   7156:                S = makev(["r",I]);
                   7157:                for(J = JJ; J < LL; J++){
                   7158:                        JJ = LL;
                   7159:                        for(K = 0; K < 2; K++){
                   7160:                                if(J >= L[K] || C[K][J] == 0)
                   7161:                                        continue;
                   7162:                                if(J < JJ)
                   7163:                                        JJ = J;
                   7164:                                if(Do == 1){
                   7165:                                        CC = C[K];
                   7166:                                        CC[J] = mysubst(CC[J], [S, Var]);
                   7167:                                        continue;
                   7168:                                }
                   7169:                                if(mydeg(C[K][J]) >= 1){
                   7170:                                        if(mydeg(C[K][J]) > 1){
                   7171:                                                print("Internal error");
                   7172:                                                return;
                   7173:                                        }
                   7174:                                        Var = getroot(C[K][J],S);
                   7175:                                        Var = Var[0];
                   7176:                                        CC = C[K];
                   7177:                                        CC[J] = 0;
                   7178:                                        P = mysubst(P, [S, Var]);
                   7179:                                        Do = 1;
                   7180:                                        J = JJ - 1;
                   7181:                                        K++;
                   7182:                                }
                   7183:                        }
                   7184:                }
                   7185:        }
                   7186:        if(JJ != L){
                   7187:                print("Internal error (non Rigid)");
                   7188:                return;
                   7189:        }
                   7190:        return P;
                   7191: }
                   7192:
                   7193: def even4e(X,Y){
                   7194:        if(length(X) != 4 || length(Y) != 2){
                   7195:                print("Usage: even4e([a,b,c,d],[e,f])");
                   7196:                print("0:     0 1 e f");
                   7197:                print("1;     0 1 * *+1");
                   7198:                print("infty: a b c d");
                   7199:                return;
                   7200:        }
                   7201:        S = -3;
                   7202:        for(I = 0; I < 4; I++){
                   7203:                S += X[I];
                   7204:                if(I < 2)
                   7205:                        S += Y[I];
                   7206:        }
                   7207:        S = -S/2;
                   7208:        P = okubo3e(Y,[S,"?"],X);
                   7209:        T = chkexp(P,x,1,S,2);
                   7210:        T = getroot(T[0],r1);
                   7211:        return mysubst(P,[r1,T[0]]);
                   7212: }
                   7213:
                   7214: def odd5e(X,Y)
                   7215: {
                   7216:        if(length(X) != 5 || length(Y) != 2){
                   7217:                print("Usage: spec6e([a,b,c,d,e],[f,g])");
                   7218:                print("0:     0  1  f  g g+1");
                   7219:                print("1:     0  1  2  * *+1");
                   7220:                print("infty: a  b  c  d  e");
                   7221:                return;
                   7222:        }
                   7223:        S = -4;
                   7224:        for(I = 0; I < 5; I++){
                   7225:                S += X[I];
                   7226:                if(I < 2)
                   7227:                        S += Y[I];
                   7228:        }
                   7229:        S = -(S + Y[1])/2;
                   7230:        P = okubo3e([Y[0],Y[1],Y[1]+1],[S,"?"],X);
                   7231:        T = chkexp(P,x,1,S,2);
                   7232:        T = getroot(T[0],r1);
                   7233:        P = mysubst(P,[r1,T[0]]);
                   7234:        T = chkexp(P,x,0,Y[1],2);
                   7235:        T = getroot(T[0],r2);
                   7236:        return mysubst(P,[r2,T[0]]);
                   7237: }
                   7238:
                   7239: def extra6e(X,Y)
                   7240: {
                   7241:        if(length(X) != 6 || length(Y) != 2){
                   7242:                print("Usage: extra6e([a,b,c,d,e,f],[g,h])");
                   7243:                print("0:     0  1  g g+1 h h+1");
                   7244:                print("1:     0  1  2  3  * *+1");
                   7245:                print("infty: a  b  c  d  e  f");
                   7246:                return;
                   7247:        }
                   7248:        S = -5;
                   7249:        for(I = 0; I < 6; I++){
                   7250:                S += X[I];
                   7251:                if(I < 2)
                   7252:                        S += 2*Y[I];
                   7253:        }
                   7254:        S = -S/2;
                   7255:        P = okubo3e([Y[0],Y[0]+1,Y[1],Y[1]+1],[S,"?"],X);
                   7256:        T = chkexp(P,x,1,S,2);
                   7257:        T = getroot(T[0],r1);
                   7258:        P = mysubst(P,[r1,T[0]]);
                   7259:        T = chkexp(P,x,0,Y[0],2);
                   7260:        T = getroot(T[0],r3);
                   7261:        P = mysubst(P,[r3,T[0]]);
                   7262:        T = chkexp(P,x,0,Y[1],2);
                   7263:        T = getroot(T[0],r2);
                   7264:        return mysubst(P,[r2,T[0]]);
                   7265: }
                   7266:
                   7267: def rigid211(X,Y,Z)
                   7268: {
                   7269:        if(length(X) != 2 || length(Y) != 2 || length(Z) != 2){
                   7270:                print("Usage: rigid211([a,b],[c,d],[e,f])");
                   7271:                print("0:     0  1   a  b");
                   7272:                print("1:     0  1   c  d");
                   7273:                print("infty: e  e+1 f  *");
                   7274:                return;
                   7275:        }
                   7276:        P = okubo3e(X,Y,[Z[0],Z[0]+1,Z[1],"?"]);
                   7277:        T = chkexp(P,x,"infty",Z[0],2);
                   7278:        T = getroot(T[0],r1);
                   7279:        return mysubst(P,[r1,T[0]]);
                   7280: }
                   7281:
                   7282: def solpokuboe(P,L,N)
                   7283: {
                   7284:        if(type(N) > 1 || ntype(N) != 0 || dn(N) != 1){
                   7285:                mycat(["Irrigal argument :", N]);
                   7286:                return 0;
                   7287:        }
                   7288:        L = vweyl(L);
                   7289:        DD=N+1;
                   7290:        for(U = S = L[0]^N; U != 0; ){
                   7291:                D = mydeg(U,L[0]);
                   7292:                if(D>=DD){
                   7293:                        mycat(["Internal Error",D,DD]);
                   7294:                        return -1;
                   7295:                }
                   7296:                DD=D;
                   7297:                UU = L[0]^D;
                   7298:                R  = appldo(P,UU,L);
                   7299:                if(mydeg(R,L[0]) > D){
                   7300:                        printf("Bad operator\n");
                   7301:                        return 0;
                   7302:                }
                   7303:                CC = mycoef(R,D,L[0]);
                   7304:                if(D == N){
                   7305:                        P -= (E = CC);
                   7306:                        U = R-E*U;
                   7307:                        continue;
                   7308:                }
                   7309:                if(CC == 0){
                   7310:                        printf("No polynomial\n");
                   7311:                        return 0;
                   7312:                }
                   7313:                CC= mycoef(U,D,L[0])/CC;
                   7314:                S = red(S - UU*CC);
                   7315:                U = red(U - R*CC);
                   7316:        }
                   7317:        return [nm(S),E];
                   7318: }
                   7319:
                   7320: def stoe(M,L,N)
                   7321: {
                   7322:        L = vweyl(L);
                   7323:        Size = size(M);
                   7324:        S = Size[0];
                   7325:        NN = 0;
                   7326:        if(type(N) == 4){
                   7327:                NN=N[0]; N=N[1];
                   7328:        }else if(N < 0){
                   7329:                NN=-N; N=0;
                   7330:        }
                   7331:        if(S != Size[1] || N >= S || NN >= S)
                   7332:                return;
                   7333:        D = newmat(S+1,S+1);
                   7334:        MN = dupmat(M);
                   7335:        MD = newmat(S,S);
                   7336:        DD = D[0];
                   7337:        DD[N] = 1; DD[S] = 1;
                   7338:        for(Lcm = I = 1; ; ){
                   7339:                DD = D[I];
                   7340:                MM = MN[N];
                   7341:                for(J = 0; J < S; J++){
                   7342:                        DD[J] = MM[J];
                   7343:                        Lcm = lcm(dn(DD[J]),Lcm);
                   7344:                }
                   7345:                DD[S] = L[1]^I;
                   7346:                for(J = 0; J <= S; J++)
                   7347:                         DD[J] = red(DD[J]*Lcm);
                   7348:                if(I++ >= S)
                   7349:                        break;
                   7350:                if(I==S && NN>0){
                   7351:                        DD = D[I];
                   7352:                        DD[0]=-z_zz; DD[NN]=1;
                   7353:                        break;
                   7354:                }
                   7355:                Mm = dupmat(MN*M);
                   7356:                for(J = 0; J < S; J++){
                   7357:                        for(K = 0; K < S; K++)
                   7358:                                MN[J][K] = red(diff(MN[J][K],L[0])+Mm[J][K]);
                   7359:                }
                   7360:        }
                   7361: #if 0
                   7362:        P = fctr(mydet2(D));
                   7363: #else
                   7364:        P = fctr(det(D));
                   7365: #endif
                   7366:        for(I = R = 1; I < length(P); I++){
                   7367:                if(mydeg(P[I][0],L[1]) > 0)
                   7368:                         R *= P[I][0]^P[I][1];
                   7369:        }
                   7370:        if(NN > 0)
                   7371:                R = -red(coef(R,0,z_zz)/coef(R,1,z_zz));
                   7372:        return R;
                   7373: }
                   7374:
                   7375: def dform(L,X)
                   7376: {
                   7377:        if(type(X)==2) X=[X];
                   7378:        if(type(L[0])!=4) L=[L];
                   7379:        if(type(X)==4) X=ltov(X);
                   7380:        M=length(X);
                   7381:        if(length(car(L))==2){
                   7382:                R=newvect(M);
                   7383:                for(LL=L; LL!=[]; LL=cdr(LL)){
                   7384:                        for(I=0; I<M; I++){
                   7385:                                RT=rmul(car(LL)[0],mydiff(car(LL)[1],X[I]));
                   7386:                                R[I] = (R[I]==0)?RT:radd(R[I],RT);
                   7387:                        }
                   7388:                }
                   7389:                Dif=getopt(dif);
                   7390:                for(RR=[], I=M-1; I>=0; I--){
                   7391:                        if(Dif==1) RR=cons([1,R[I],X[I]],RR);
                   7392:                        else RR=cons([R[I],X[I]],RR);
                   7393:                }
                   7394:                if(Dif==1) RR=dform(RR,X);
                   7395:                return RR;
                   7396:        }else if(length(car(L))!=3) return L;
                   7397:        N=M*(M-1)/2;
                   7398:        R=newvect(N);
                   7399:        S=newvect(N);
                   7400:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   7401:                for(I=K=0; I<M; I++){
                   7402:                        for(J=I+1; J<M; J++, K++){
                   7403:                                if(LL==L) S[K]=[X[I],X[J]];
                   7404:                                LT=car(LL);
                   7405:                                R1=mydiff(LT[2],X[J]);
                   7406:                                R2=mydiff(-LT[2],X[I]);
                   7407:                                if(R2==0){
                   7408:                                        if(R1==0) continue;
                   7409:                                        R1=rmul(mydiff(LT[1],X[I]),R1);
                   7410:                                }else if(R1==0){
                   7411:                                        R1=rmul(mydiff(LT[1],X[J]),R2);
                   7412:                                }else
                   7413:                                        R1=rmul(mydiff(LT[1],X[I]),R1)+rmul(mydiff(LT[1],X[J]),R2);
                   7414:                                R1=rmul(LT[0],R1);
                   7415:                                R[K] = (R[K]==0)?R1:radd(R[K],R1);
                   7416:                        }
                   7417:                }
                   7418:        }
                   7419:        for(RR=[],I=N-1; I>=0; I--)
                   7420:                RR=cons([R[I],S[I][0],S[I][1]],RR);
                   7421:        return RR;
                   7422: }
                   7423:
                   7424: def polinvsym(P,Q,Sym)
                   7425: {
                   7426:        N  = length(Q);
                   7427:        T  = polbyroot(Q,zz);
                   7428:        for(I = 1; I <= N; I++){
                   7429:                P = mysubst(P,[makev([Sym,I]), (-1)^I*coef(T,N-I,zz)]);
                   7430:        }
                   7431:        return P;
                   7432: }
                   7433:
                   7434: def polinsym(P,Q,Sym)
                   7435: {
                   7436:        if(type(P) == 3){
                   7437:                P = red(P);
                   7438:                if(type(P) == 3){
                   7439:                        D = polinsym(dn(P),Q,Sym);
                   7440:                         if(D == 0)
                   7441:                                 return 0;
                   7442:                        return polinsym(nm(P),Q,Sym)/D;
                   7443:                }
                   7444:        }
                   7445:        N  = length(Q);
                   7446:        V  = newvect(N+1);
                   7447:        S  = newvect(N+1);
                   7448:        E  = newvect(N+1);
                   7449:        E0 = newvect(N+1);
                   7450:        T  = polbyroot(Q,zzz);
                   7451:        for(J = 1; J <= N; J++){
                   7452:                K = coef(T,N-J,zzz);
                   7453:                if(J % 2)
                   7454:                        K = -K;
                   7455:                S[J] = K;
                   7456:                V[J] = makev([Sym,J]);
                   7457:        }
                   7458:        K = deg(P,Q[0]);
                   7459:        for(J = 0; J <= N; J++)
                   7460:                E0[J] = K+1;
                   7461:        E[0] = K+1;
                   7462:        while(deg(P,Q[0]) > 0){
                   7463:                for(P0 = P, J = 1; J <= N; J++){
                   7464:                        E[J] = deg(P0,Q[J-1]);
                   7465:                        P0 = coef(P0,E[J],Q[J-1]);
                   7466:                }
                   7467:        /* P0*Q[0]^E[1]*Q[1]^E[2]*...  E[1] >= E[2} >= ... */
                   7468:                for(J = 1; J <= N; J++){
                   7469:                        if(E[J] < E0[J])
                   7470:                                break;
                   7471:                        if(E[J-1] < E[J])
                   7472:                                J = N;
                   7473:                }
                   7474:                if(J > N){
                   7475:                        print("Not symmetric");
                   7476:                        return 0;
                   7477:                }
                   7478:                for(J = 1; J <= N; J++)
                   7479:                        E0[J] = E[J];
                   7480:                for(J = N; J > 1; J--){
                   7481:                        if(E[J] != 0)
                   7482:                                for(K = 1; K < J; K++)
                   7483:                                        E[K] -= E[J];
                   7484:                }
                   7485:                for(R0 = P0, K = 1; K <= N; K++){
                   7486:                        if(E[K] > 0)
                   7487:                                P0 *= S[K]^E[K];
                   7488:                                R0 *= V[K]^E[K];
                   7489:                }
                   7490:                P += R0 - P0;
                   7491:        }
                   7492:        return P;
                   7493: }
                   7494:
                   7495: def tohomog(P,L,V)
                   7496: {
                   7497:        while(length(L)>0){
                   7498:                P = mysubst(P,[car(L),car(L)/V]);
                   7499:                L = cdr(L);
                   7500:        }
                   7501:        P = red(P);
                   7502:        N = mindeg(dn(P),V);
                   7503:        if(N > 0)
                   7504:                P = red(P*V^N);
                   7505:        N = mindeg(dn(P),V);
                   7506:        if(N > 0)
                   7507:                P = red(P/(V^N));
                   7508:        return P;
                   7509: }
                   7510:
                   7511: def substblock(P,X,Q,Y)
                   7512: {
                   7513:        P = red(P);
                   7514:        if(deg(dn(P),X) > 0)
                   7515:                return substblock(nm(P),X,Q,Y)/substblock(dn(P),X,Q,Y);
                   7516:        N = mydeg(Q,X);
                   7517:        if(N < 1)
                   7518:                return P;
                   7519:        R = mycoef(Q,N,X);
                   7520:        while(M = mydeg(P,X), M >= N)
                   7521:                P = red(P - mycoef(P,M,X)*(Q-Y)*X^(M-N)/R);
                   7522:        return P;
                   7523: }
                   7524:
                   7525: def okuboetos(P,L)
                   7526: {
                   7527:        L = vweyl(L); X = L[0]; DX = L[1];
                   7528:        N = mydeg(P,DX);
                   7529:        C = mycoef(P,N,DX);
                   7530:        K = mydeg(C,X);
                   7531:        if(K > N){
                   7532:                print("Irregular singularity at infinity")$
                   7533:                return 0;
                   7534:        }
                   7535:        if(N > K)
                   7536:                P *= x^(N-K);
                   7537:
                   7538:        L = getroot(mycoef(P,N,DX),x);
                   7539:        L = ltov(reverse(L));
                   7540:        if(length(L) != N || N == 0){
                   7541:                print("Cannot get exponents")$
                   7542:                return 0;
                   7543:        }
                   7544:        if( type(LL = getopt(diag)) == 4 ){
                   7545:                LL = ltov(LL);
                   7546:                if(length(LL) != N){
                   7547:                        mycat(["Length of the option should be", N]);
                   7548:                        return 0;
                   7549:                }
                   7550:                Tmp = newvect(N);
                   7551:                for(I = N-1; I >= 0; I--){
                   7552:                         for(LLT = LL[I], J = N-1; J >=0 ; J--){
                   7553:                                 if(LLT == L[J] && Tmp[J] == 0){
                   7554:                                         Tmp[J] = 1;
                   7555:                                         break;
                   7556:                                 }
                   7557:                         }
                   7558:                         if(J < 0){
                   7559:                                 print("option is wrong");
                   7560:                                 return 0;
                   7561:                         }
                   7562:                }
                   7563:                L = LL;
                   7564:        }
                   7565:        P /= mycoef(C,N,X);
                   7566:        A  = newmat(N,N);
                   7567:        AT = newmat(N+1,N+1);
                   7568:        Phi= newvect(N+1);
                   7569:        Phi[0] = 1;
                   7570:        for(J = 0; J < N; J++)
                   7571:                Phi[J+1] = Phi[J]*(X-L[J]);
                   7572:        for(ATT = AT[N], J = 0; J < N; J++)
                   7573:                ATT[J] = mycoef(P,J,DX);
                   7574:
                   7575:        for(K = 1; K <= N; K++){
                   7576:                for(J = N; J >= K; J--){
                   7577:                        Aj = A[J-1];
                   7578:                        SIG = AT[J][J-K];
                   7579:                        for(I = 0; I <= K-2; I++)
                   7580:                                SIG += Aj[J-I-1]*AT[J-I-1][J-K];
                   7581:                        if(K == 1)
                   7582:                                DAT = mydiff(Phi[J-1],X);
                   7583:                        else
                   7584:                                DAT = mydiff(AT[J-1][J-K],X);
                   7585:                        Aj[J-K] = -SIG+(X-L[J-1])*DAT;
                   7586:                        Aj[J-K] /= Phi[J-K];
                   7587:                        Aj[J-K] = mysubst(Aj[J-K],[X,L[J-1]]);
                   7588:                        if(J < K+1) continue;
                   7589:                        ATj = AT[J-1];
                   7590:                        ATj[J-K-1] = SIG+Aj[J-K]*Phi[J-K];
                   7591:                        ATj[J-K-1] /= (X - L[J-1]);
                   7592:                        ATj[J-K-1] = red(ATj[J-K-1]-DAT);
                   7593:                }
                   7594:        }
                   7595:
                   7596:        ATT  = newmat(N,N);
                   7597:        for(J = 0; J < N; J++){
                   7598:                for(K = 0; K < N; K++){
                   7599:                        ATj = ATT[J];
                   7600:                        ATj[K] = AT[J][K];
                   7601:                }
                   7602:                ATj[J] = Phi[J];
                   7603:                if(J < N-1){
                   7604:                        ATj = A[J];
                   7605:                        ATj[J+1] = 1;
                   7606:                }
                   7607:        }
                   7608:        return [L,A,ATT];
                   7609: }
                   7610:
                   7611: def heun(X,P,R)
                   7612: {
                   7613:        if(type(X) != 4 || length(X) != 5){
                   7614:                print("Usage: huen([a,b,c,d,e],p,r)");
                   7615:                print("0:     0  c");
                   7616:                print("1:     0  d");
                   7617:                print("p:     0  e");
                   7618:                print("infty: a  b");
                   7619:                print("Fuchs relation: a+b+1 = c+d+e");
                   7620:                return;
                   7621:        }
                   7622:        S = 1;
                   7623:        V = -1;
                   7624:        X = ltov(X);
                   7625:        for(I = 0; I < 5; I++){
                   7626:                if(X[I] == "?"){
                   7627:                        if(V >= 0)
                   7628:                                return;
                   7629:                        V = I;
                   7630:                }else if(I < 2){
                   7631:                        S += X[I];
                   7632:                }else
                   7633:                        S -= X[I];
                   7634:        }
                   7635:        if(V >= 0){
                   7636:         if(V < 2)
                   7637:                 X[V] = -S;
                   7638:         else
                   7639:                 X[V] = S;
                   7640:        }else if(S != 0){
                   7641:                mycat(["Fuch relation:", S,"should be zero!"]);
                   7642:                return;
                   7643:        }
                   7644:        return
                   7645:         x*(x-1)*(x-P)*dx^2
                   7646:                + (X[2]*(x-1)*(x-P)+X[3]*x*(x-P)+X[4]*x*(x-1))*dx
                   7647:                + X[0]*X[1]*(x-R);
                   7648: }
                   7649:
                   7650: def fspt(M,T)
                   7651: {
                   7652:        if(type(M)==7) M=s2sp(M);
                   7653:        if(T == 3)            /* 3: cut 0 */
                   7654:                return cutgrs(M);
                   7655:        if(T == 4 || T== 5){  /* 4: short  5: long */
                   7656:                for(MN = [] ; M != []; M = cdr(M)){
                   7657:                        MT = car(M);
                   7658:                        for(MNT = []; MT != []; MT = cdr(MT)){
                   7659:                                if(type(car(MT)) <= 3){
                   7660:                                        if(T == 4) MNT = cons(car(MT),MNT);
                   7661:                                        else       MNT = cons([1,car(MT)],MNT);
                   7662:                                }else{
                   7663:                                        if(T == 5 || car(MT)[0] > 1) MNT = cons(car(MT),MNT);
                   7664:                                        else if(car(MT)[0] == 1)  MNT = cons(car(MT)[1],MNT);
                   7665:                                }
                   7666:                        }
                   7667:                        MN = cons(reverse(MNT), MN);
                   7668:                }
                   7669:                return reverse(MN);
                   7670:        }
                   7671:        if(type(M[0][0]) == 4){
                   7672:                for(MN = [] ; M != []; M = cdr(M)){
                   7673:                        MT = car(M);
                   7674:                        for(MNT = []; MT != []; MT = cdr(MT))
                   7675:                                MNT = cons(car(MT)[0], MNT);
                   7676:                         MN = cons(reverse(MNT), MN);
                   7677:                }
                   7678:                return fspt(reverse(MN),T);
                   7679:        }
                   7680:        if(T == 0)  /* 0: sp */
                   7681:                return M;
                   7682:        for(MN = [] ; M != []; M = cdr(M)){
                   7683:                MT = qsort(ltov(car(M)));
                   7684:                L = length(MT);
                   7685:                for(MNT = [], I = 0; I < L; I++)
                   7686:                        MNT = cons(MT[I], MNT);
                   7687:                MN = cons(MNT, MN);
                   7688:        }
                   7689:        MN = reverse(MN);
                   7690:        if(T==6) return MN; /* 7: sort */
                   7691:        L = length(MN);
                   7692:        for(M = MN; M != []; M = cdr(M)){
                   7693:                for(I = 0, MT = car(M); MT != []; MT = cdr(MT))
                   7694:                        I += car(MT);
                   7695:                if(OD == 0)
                   7696:                        OD = I;
                   7697:                else if(OD != I || OD == 0)
                   7698:                        return 0;
                   7699:        }
                   7700:        ALL = [MN];
                   7701:        RD=[];
                   7702:        while(OD > 0){
                   7703:                for(S = 0, MT = MN; MT != []; MT = cdr(MT))
                   7704:                        S += car(MT)[0];
                   7705:                S -= (L-2)*OD;
                   7706:                if(S <= 0){
                   7707:                        if(T==7) return [ALL[0],ALL[length(ALL)-1],RD];
                   7708:                        return (T==1)?MN:ALL;
                   7709:                }
                   7710:                RD=cons([S,0,0],RD);
                   7711:                for(NP=0, M = [], MT = MN; MT != []; NP++, MT = cdr(MT)){
                   7712:                        MTT = car(MT);
                   7713:                        I = MTT[0] - S;
                   7714:                        if(I < 0){
                   7715:                                if(I+OD!=0) return 0;
                   7716:                                if(T==7) return [ALL[0],ALL[length(ALL)-1],cdr(RD)];
                   7717:                                return (T==1)?MN:ALL;
                   7718:                        }
                   7719:                        MTT = cdr(MTT);
                   7720:                        NC=1; DO=0;
                   7721:                        for(MNT = []; MTT != []; MTT = cdr(MTT)){
                   7722:                                if(MTT[0] > I){
                   7723:                                        if(DO==0) RD=cons([MTT[0]-I,NP,NC++],RD);
                   7724:                                        MNT = cons(MTT[0], MNT);
                   7725:                                }
                   7726:                                else if(MTT[0] <= I && I != 0){
                   7727:                                        DO=1;
                   7728:                                        MNT = cons(I, MNT);
                   7729:                                        I = 0;
                   7730:                                        if(MTT[0] > 0)
                   7731:                                                MNT = cons(MTT[0], MNT);
                   7732:                                }
                   7733:                        }
                   7734:                        if(I > 0)
                   7735:                                MNT = cons(I,MNT);
                   7736:                        M = cons(reverse(MNT), M);
                   7737:                }
                   7738:                MN = reverse(M);
                   7739:                ALL = cons(MN,ALL);
                   7740:                OD -= S;
                   7741:        }
                   7742: }
                   7743:
                   7744: def abs(X)
                   7745: {
                   7746:        if(vars(X)!=[]) return todf(os_md.abs,[X]);
                   7747:        if(type(X)==4){
                   7748:                P=X[1];X=X[0];
                   7749:        }else P=0;
                   7750:        if(type(X)==1){
                   7751:                if((T=ntype(X))<2 || T==3){
                   7752:                        if(X<0) X=-X;
                   7753:                }else if(T==4) X=P?pari(abs,X,P):pari(abs,X);
                   7754:        }
                   7755:        return X;
                   7756: }
                   7757:
1.20      takayama 7758: def sgn(X)
                   7759: {
                   7760:        if(X==0) return 0;
                   7761:        if(type(X)==1){
                   7762:                return (X>0)?1:-1;
                   7763:        }
                   7764:        if(type(X)==5) X=vtol(X);
                   7765:        if(type(X)==4){
                   7766:                for(W=0,Y=X;Y!=[];Y=cdr(Y))
                   7767:                        for(Z=cdr(Y);Z!=[];Z=cdr(Z))
                   7768:                                if(car(Y)>car(Z)) W++;
                   7769:                if(getopt(val)==1) return W;
                   7770:                return (iand(W,1))?-1:1;
                   7771:        }
                   7772: }
                   7773:
1.6       takayama 7774: def calc(X,L)
                   7775: {
1.10      takayama 7776:        if(type(X)<4||type(X)==7){
                   7777:                if(type(L)==4||type(L)==7){
1.6       takayama 7778:                        V=L[1];
1.10      takayama 7779:                        if(type(X)!=7){
                   7780:                                if((L0=L[0])=="+") X+=V;
                   7781:                                else if(L0=="-")   X-=V;
                   7782:                                else if(L0=="*")   X*=V;
                   7783:                                else if(L0=="/")   X/=V;
                   7784:                                else if(L0=="^")   X^=V;
                   7785:                        }
                   7786:                        if((L0=L[0])==">")      X=(X>V);
                   7787:                        else if(L0=="<")        X=(X<V);
                   7788:                        else if(L0=="=")        X=(X==V);
1.6       takayama 7789:                        else if(L0==">=")   X=(X>=V);
                   7790:                        else if(L0=="<=")   X=(X<=V);
                   7791:                        else if(L0=="!=")       X=(X!=V);
1.10      takayama 7792:                }else if(type(L)==7&&type(X)<4){
1.6       takayama 7793:                        if(L=="neg") X=-X;
                   7794:                        else if(L=="abs") X=abs(X);
                   7795:                        else if(L=="neg") X=-X;
                   7796:                        else if(L=="sqr") X*=X;
                   7797:                        else if(L=="inv") X=1/X;
                   7798:                        else if(L=="sgn"){
                   7799:                                if(X>0)X=1;
                   7800:                                else if(X<0) X=-1;
                   7801:                        }
                   7802:                }
                   7803:        }
                   7804:        return X;
                   7805: }
                   7806:
1.23      takayama 7807: def tobig(X)
                   7808: {
                   7809:        if((type(X)==1 && ntype(X)==3)||type(X)>3) return X;
                   7810:        return eval(X*exp(0));
                   7811: }
                   7812:
1.6       takayama 7813: def isint(X)
                   7814: {
                   7815:        if(X==0||(type(X)==1 && ntype(X)==0 && dn(X)==1)) return 1;
                   7816:        return 0;
                   7817: }
                   7818:
                   7819: def israt(X)
                   7820: {
                   7821:        if(X==0||(type(X)==1 && ntype(X)==0)) return 1;
                   7822:        return 0;
                   7823: }
                   7824:
                   7825: def iscrat(X)
                   7826: {
                   7827:        if(X==0 || (type(X)==1 && israt(real(X)) && israt(imag(X)))) return 1;
                   7828:        return 0;
                   7829: }
                   7830:
                   7831: def isalpha(X)
                   7832: {
                   7833:        return ((X>64&&X<91)||(X>96&&X<123))?1:0;
                   7834: }
                   7835:
                   7836: def isnum(X)
                   7837: {
                   7838:        return (X>47&&X<58)?1:0;
                   7839: }
                   7840:
                   7841: def isalphanum(X)
                   7842: {
                   7843:        return (isalpha(X)||isnum(X))?1:0;
                   7844: }
                   7845:
1.8       takayama 7846: def isdecimal(X)
                   7847: {
                   7848:        if(type(X)!=7) return 0;
                   7849:        F=S=0;
                   7850:        L=strtoascii(X);
                   7851:        while(L!=[]&&car(L)==32) L=cdr(L);
                   7852:        if(L!=[]&&car(L)==45) L=cdr(L);  /* - */
                   7853:        while(L!=[]&&isnum(car(L))){
                   7854:                F=1; L=cdr(L);
                   7855:        }
                   7856:        while(L!=[]&&car(L)<33){
                   7857:                S=1;L=cdr(L);
                   7858:        }
                   7859:        if(L==[]) return F;
                   7860:        else if(S||car(L)!=46) return 0; /* . */
                   7861:        L=cdr(L);F=0;
                   7862:        while(L!=[]&&isnum(car(L))){
                   7863:                F=1; L=cdr(L);
                   7864:        }
                   7865:        while(L!=[]&&car(L)<33) L=cdr(L);
                   7866:        return (L==[])?F:0;
                   7867: }
                   7868:
1.6       takayama 7869: def isvar(X)
                   7870: {
                   7871:        return ([X]==vars(X)&&vtype(X)<3)?1:0;
                   7872: }
                   7873:
                   7874: def isyes(F)
                   7875: {
                   7876:        if((CC=getopt(set))==1){
                   7877:                IsYes=(type(F[0])==4)?F:[F];
                   7878:                return 1;
                   7879:        }else if(CC==0) return(IsYes);
                   7880:        if(type(CC)!=7)
                   7881:                CC=IsYes;
                   7882:        for(;CC!=[]; CC=cdr(CC)){
                   7883:                C=car(CC);
                   7884:                V=call(C[0],cons(F,C[1]));
                   7885:                if(type(C[2])!=4){
                   7886:                        if(V!=C[2])     break;
                   7887:                }else{
                   7888:                        if(C[2][0]!="" && V<C[2][0]) break;
                   7889:                        if(C[2][1]!="" && V>C[2][1]) break;
                   7890:                }
                   7891:        }
                   7892:        return (CC==[])?1:0;
                   7893: }
                   7894:
                   7895: def isall(FN,M)
                   7896: {
                   7897:        if(type(M)<4 || type(M)>6) return ((*FN)(M)==0)?0:1;
                   7898:        if(type(M)==4){
                   7899:                for(;M!=[];M=cdr(M))
                   7900:                        if((*FN)(car(M))==0) return 0;
                   7901:        }else if(type(M)==5){
                   7902:                K=length(M);
                   7903:                for(I=0;I<K;I++)
                   7904:                        if((*FN)(M[I])==0) return 0;
                   7905:        }else if(type(M)==6){
                   7906:                K=size(M)[0];
                   7907:                for(I=0;I<K;I++)
                   7908:                        if (isall(FN,M[I])==0) return 0;
                   7909:        }
                   7910:        return 1;
                   7911: }
                   7912:
                   7913: def sproot(MP,T)
                   7914: {
                   7915:        if((I=str_chr(T,0,","))>0){
                   7916:                if(type(MP)==7) M=s2sp(MP);
                   7917:                else M=chkspt(MP|opt=0);
                   7918:                if(I==length(M[0])){
                   7919:                        N=s2sp(T);S=SM=SN=K=0;
                   7920:                        for(MM=M,NN=N;MM!=[];MM=cdr(MM),NN=cdr(NN),K++){
                   7921:                                for(MT=car(MM),NT=car(NN);MT!=[];MT=cdr(MT),NT=cdr(NT)){
                   7922:                                        S+=car(MT)*car(NT);
                   7923:                                        if(K==0){
                   7924:                                                SM+=car(MT);SN+=car(NT);
                   7925:                                        }
                   7926:                                }
                   7927:                        }
                   7928:                        return S-(length(M)-2)*SM*SN;
                   7929:                }
                   7930:        }
                   7931:        MM=chkspt(MP|opt=7);
                   7932:        if(T=="base") return MM;
                   7933:        Keep=(getopt(keep)==1)?1:0;
                   7934:        Null=getopt(null);
                   7935:        Only=getopt(only);
                   7936:        if(type(Only)!=1) Only=7;
                   7937:        M0=MM[0];
                   7938:        M1=MM[1];
                   7939:        M=MM[2];
                   7940:        if(T=="length") return length(M);
                   7941:        if(T=="height"){
                   7942:                for(J=2,S=M1[0][0],M2=M1; M2!=[]; M2=cdr(M2)){
                   7943:                        for(MT=cdr(car(M2)); MT!=[]; J++, MT=cdr(MT)){
                   7944:                                S+= J*car(MT);
                   7945:                        }
                   7946:                        J=1;
                   7947:                }
                   7948:                return S;
                   7949:        }
                   7950:        for(OD=0, MT=M1[0]; MT!=[]; MT=cdr(MT)) OD+=car(MT);
                   7951:        if(T=="type"){
                   7952:                R=newvect(OD+1);
                   7953:                for(MT=M; MT!=[]; MT=cdr(MT)) R[MT[0][0]]++;
                   7954:                for(RR=[],I=OD; I>0; I--)
                   7955:                        if(R[I]>0) RR=cons([R[I],I],RR);
                   7956:                return RR;
                   7957:        }
                   7958:        if(T=="part"||T=="pair"||T=="pairs"){
                   7959:                NP=length(M1);
                   7960:                LM=newvect(NP);
                   7961:                R=newvect(length(M));
                   7962:                for(K=0; K<NP; K++) LM[K]=length(M1[K]);
                   7963:                for(I=0,TM=M; TM!=[]; I++, TM=cdr(TM)){
                   7964:                        V=newvect(NP);
                   7965:                        for(K=0; K<NP; K++) V[K]=newvect(LM[K]);
                   7966:                        TP=car(TM);
                   7967:                        if(TP[2]==0){
                   7968:                                for(K=0;K<NP;K++) V[K][0]=1;
                   7969:                                for(J=0; J<I; J++){
                   7970:                                        VJ=R[J][1];
                   7971:                                        for(S=K=0;K<NP;K++) S+=VJ[K][0];
                   7972:                                        for(OD=0,K=0;K<LM[0];K++) OD+=VJ[0][K];
                   7973:                                        S-=(NP-2)*OD;
                   7974:                                        for(K=0;K<NP;K++) VJ[K][0]-=S;
                   7975:                                }
                   7976:                        }else{
                   7977:                                K=TP[1]; P=TP[2];
                   7978:                                V[K][P-1]=-1; V[K][P]=1;
                   7979:                                for(J=0; J<I; J++){
                   7980:                                        VJ=R[J][1];
                   7981:                                        S=VJ[K][P]; VJ[K][P]=VJ[K][P-1]; VJ[K][P-1]=S;
                   7982:                                }
                   7983:                        }
                   7984:                        R[I]=[TP[0],V];
                   7985:                }
                   7986:                if(T=="pair"||T=="pairs"){
                   7987:                        MV=ltov(M1);
                   7988:                        for(K=0; K<NP; K++) MV[K] = ltov(MV[K]);
                   7989:                        for(RR=UU=SS=[],I=0; I<length(M); I++){
                   7990:                                V=newvect(NP); W=newvect(NP); U=newvect(NP);
                   7991:                                for(K=0; K<NP; K++){
                   7992:                                        U[K]=newvect(LM[K]); V[K]=newvect(LM[K]); W[K]=newvect(LM[K]);
                   7993:                                }
                   7994:                                S=R[I][0];
                   7995:                                for(K=0; K<NP; K++){
                   7996:                                        for(Q=J=0; J<LM[K]; J++){
                   7997:                                                V[K][J] = S*(U[K][J] = R[I][1][K][J]);
                   7998:                                                Q+=(W[K][J] = MV[K][J] - V[K][J]);
                   7999:                                        }
                   8000:                                }
                   8001:                                if(Q>0 && iand(Only,1)==0) continue;
                   8002:                                if(Q==0 && iand(Only,2)==0) continue;
                   8003:                                if(Q<0 && iand(Only,4)==0) continue;
                   8004:                                for(K=0; K<NP; K++){
                   8005:                                        V[K] = vtol(V[K]); W[K] = vtol(W[K]); U[K]=vtol(U[K]);
                   8006:                                }
                   8007:                                V=vtol(V); W=vtol(W);U=vtol(U);
                   8008:                                if(Q<0) S=-S;
                   8009:                                RR = cons([V,W], RR); UU = cons(U,UU); SS=cons(S,SS);
                   8010:                        }
                   8011:                        RR = reverse(RR); UU=reverse(UU); SS=reverse(SS);
                   8012:                        if(getopt(dviout)==1 && (Null!=1 || RR!=[])){
                   8013:                                 Out=string_to_tb("\\begin{align}\\begin{split}"+s2sp(M1)+"&=");
                   8014:                                 for(I=0,R=RR, U=UU; R!=[]; I++, R=cdr(R), U=cdr(U)){
                   8015:                                         if(I>0) str_tb("\\\\\n &=",Out);
                   8016:                                         if(T=="pairs"){
                   8017:                                                 if((S=SS[I])<0) S=-S;
                   8018:                                                 if(S>1) str_tb([my_tex_form(S),"("],Out);
                   8019:                                                 str_tb(s2sp(car(U)),Out);
                   8020:                                                 if(S>1) str_tb(")",Out);
                   8021:                                                 str_tb(" \\oplus ",Out);
                   8022:                                                 if(SS[I]<0){
                   8023: #ifdef USEMODULE
                   8024:                                                         str_tb(["-(",s2sp(mtransbys(os_md.abs,car(R)[1],[])),")"],Out);
                   8025: #else
                   8026:                                                         str_tb(["-(",s2sp(mtransbys(abs,car(R)[1],[])),")"],Out);
                   8027: #endif
                   8028:                                                 }else
                   8029:                                                         str_tb(s2sp(car(R)[1]),Out);
                   8030:                                         }else
                   8031:                                                 str_tb([s2sp(car(R)[0])," \\oplus ",s2sp(car(R)[1])],Out);
                   8032:                                }
                   8033:                                 str_tb("\n\\end{split}\\end{align}",Out);
                   8034:                                 dviout(str_tb(0,Out)|keep=Keep);
                   8035:                        }
                   8036:                        return RR;
                   8037:                }
                   8038:                for(I=0; I<length(M); I++){
                   8039:                        for(K=0; K<NP; K++) R[I][1][K] = vtol(R[I][1][K]);
                   8040:                        R[I] = [R[I][0],vtol(R[I][1])];
                   8041:                }
                   8042:                R = vtol(R);
                   8043:                return [M0,M1,R];
                   8044:        }
                   8045: }
                   8046:
                   8047: def spgen(MO)
                   8048: {
                   8049:        Eq=(getopt(eq)==1)?1:0;
                   8050:        Sp=getopt(sp);
                   8051:        if(type(Sp)==7) Sp=s2sp(Sp);
                   8052:        St=getopt(str);
                   8053:        LP=getopt(pt);
                   8054:        F=getopt(std);
                   8055:        if(F!=1&&F!=-1) F=0;
                   8056:        if(type(LP)==4){
                   8057:                L0=LP[0]; L1=LP[1];
1.29      takayama 8058:        }else if(type(LP)==1){
                   8059:                L0=L1=LP;
1.6       takayama 8060:        }else{
                   8061:                L0=0; L1=MO+1;
                   8062:        }
                   8063:        if(MO<=0){
                   8064:                MO=-MO;
                   8065:                if(iand(MO,1)==1) return [];
                   8066:                if(MO>1){
                   8067:                        if(isMs()==0) return [];
                   8068:                        Cmd="okubo "+rtostr(-MO);
                   8069:                        MO/=2;
                   8070:                        if(L1>0) Cmd=Cmd+"+"+rtostr(L0)+"-"+rtostr(L1);
                   8071:                        else L1=MO+4;
                   8072:                        Cmd=Cmd+" B";
                   8073:                        Id=getbyshell(Cmd);
                   8074:                        if(Id<0) return [];
                   8075:                        B=[];
                   8076:                        while((S=get_line(Id)) !=0){
                   8077:                                P0=str_chr(S,1,":")+1;
                   8078:                                if(P0>1){
                   8079:                                        P1=str_chr(S,P,"\n");
                   8080:                                        if(P1<0) P1=str_len(S);
                   8081:                                        B=cons(sub_str(S,P0,P1-1),B);
                   8082:                                }
                   8083:                        }
1.17      takayama 8084:                        close_file(Id);
1.6       takayama 8085:                }else{
                   8086:                        MO/=2;
                   8087:                        if(L1<=1) L1=MO+4;
                   8088: BB=[
                   8089: ["11,11,11,11","111,111,111","1^4,1^4,22","1^6,222,33"],
                   8090: ["11,11,11,11,11","1^4,1^4,211","211,22,22,22","1^6,2211,33",
                   8091: "2211,222,222","22211,2^4,44","2^511,444,66","1^4,22,22,31",
                   8092: "2^5,3331,55","1^5,1^5,32","1^8,332,44","111,111,21,21","1^5,221,221"],
                   8093: ["11,11,11,11,11,11","1^4,1^4,1^4","1^4,22,22,22","111,111,111,21",
                   8094: "1^6,21^4,33","21^4,222,222","221^4,2^4,44","2^41^4,444,66",
                   8095: "1^5,1^5,311","1^8,3311,44","1^6,222,321","321,33,33,33",
                   8096: "3321,333,333","33321,3^4,66","3^721,666,99","2^5,3322,55",
                   8097: "1^6,1^6,42","222,33,33,42","1^a,442,55","1^6,33,33,51",
                   8098: "222,222,33,51","1^9,333,54","2^7,554,77","1^5,2111,221",
                   8099: "2^41,333,441","1^7,2221,43","211,211,22,22","2211,2211,222",
                   8100: "22211,22211,44","1^4,211,22,31","2^411,3331,55","1^4,1^4,31,31",
                   8101: "22,22,22,31,31","1^7,331,331","2221,2221,331","111,21,21,21,21"],
                   8102: ["11,11,11,11,11,11,11","111,111,111,111","1^6,1^6,33",
                   8103: "1^6,222,222","222,33,33,33","1^5,1^5,221",
                   8104: "1^4,211,22,22","1^4,1^4,22,31","22,22,22,22,31",
                   8105: "111,111,21,21,21","21^6,2^4,44","2221^6,444,66",
                   8106: "1^6,222,3111","3111,33,33,33","33111,333,333",
                   8107: "333111,3^4,66","3^5111,666,99","2^5,33211,55",
                   8108: "1^8,3221,44","3222,333,333","33222,3^4,66",
                   8109: "3^4222,666,99","1^6,1^6,411","222,33,33,411",
                   8110: "1^a,4411,55","2^4,2^4,431","431,44,44,44",
                   8111: "2^6,4431,66","4431,444,444","44431,4^4,88",
                   8112: "4^531,888,cc","1^a,433,55","1^7,1^7,52",
                   8113: "1^c,552,66","3^4,444,552","1^8,2^4,53",
                   8114: "1^8,44,44,71","3^5,555,771","21^4,2211,222",
                   8115: "221^4,22211,44","2221^4,3331,55","1^6,2211,321",
                   8116: "2^411,3322,55","1^7,322,331","2211,33,33,42",
                   8117: "3^42,4442,77","2211,222,33,51","3^51,5551,88",
                   8118: "2^611,554,77","2221,2221,322","2^41,2^41,54",
                   8119: "1^5,2111,2111","222111,333,441","1^7,22111,43",
                   8120: "1^5,1^5,41,41","1^9,441,441","22111,2221,331",
                   8121: "1^5,221,32,41","221,221,221,41","211,211,211,22",
                   8122: "2211,2211,2211","1^4,211,211,31","211,22,22,31,31",
                   8123: "1^4,22,31,31,31","1^5,32,32,32","221,221,32,32","21,21,21,21,21,21"],
                   8124: ["11,11,11,11,11,11,11,11","1^4,1^4,22,22","1^8,2^4,44",
                   8125: "1^6,2211,222","2211,33,33,33","111,111,111,21,21",
                   8126: "1^5,1^5,2111","1^4,211,211,22","1^4,1^4,211,31",
                   8127: "211,22,22,22,31","1^4,22,22,31,31","111,21,21,21,21,21",
                   8128: "221^8,444,66","2^5,331^4,55","1^8,32111,44",
                   8129: "32211,333,333","332211,3^4,66","3^42211,666,99",
                   8130: "2^5,32221,55","1^7,1^7,511","1^c,5511,66",
                   8131: "3^4,444,5511","541,55,55,55","5541,555,555",
                   8132: "55541,5^4,aa","5^541,aaa,ff","1^8,1^8,62",
                   8133: "1^a1^4,662,77","1^a,55,55,91","2^71,555,87",
                   8134: "21^6,22211,44","221^6,3331,55","1^6,2211,3111",
                   8135: "2^411,33211,55","1^7,3211,331","2211,33,33,411",
                   8136: "3^42,44411,77","22211,2^4,431","2^511,4431,66",
                   8137: "1^8,332,431","3^42,4433,77","1^8,22211,53",
                   8138: "2221,2221,3211","221^5,333,441","1^7,21^5,43",
                   8139: "1^b,443,65","21^5,2221,331","2^51,3332,65",
                   8140: "21^4,21^4,222","221^4,221^4,44","1^6,21^4,321",
                   8141: "2221^4,3322,55","21^4,33,33,42","21^4,222,33,51",
                   8142: "2^51^4,554,77","2^4,3311,3311","3^411,4442,77",
                   8143: "321,321,33,33","3321,3321,333","33321,33321,66",
                   8144: "222,321,33,42","1^6,321,33,51","222,222,321,51",
                   8145: "1^9,3321,54","1^7,322,322","3^422,5551,88",
                   8146: "1^6,33,42,42","1^6,222,42,51","33,33,33,42,51",
                   8147: "1^6,1^6,51,51","222,33,33,51,51","1^b,551,551",
                   8148: "1^5,221,311,41","2^41,3321,441","22111,2221,322",
                   8149: "2^51,443,551","222111,2^41,54","21^4,2211,2211",
                   8150: "1^5,311,32,32","3331,3331,442","2211,2211,33,51",
                   8151: "221,221,311,32","22111,22111,331","1^5,2111,32,41",
                   8152: "2111,221,221,41","2111,221,32,32","211,211,211,211",
                   8153: "211,211,22,31,31","1^4,211,31,31,31","22,22,31,31,31,31"],
                   8154: ["11,11,11,11,11,11,11,11,11","1^5,1^5,1^5","2^5,2^5,55",
                   8155: "111,111,111,111,21","2^41,333,333","1^4,1^4,211,22",
                   8156: "211,22,22,22,22","1^8,22211,44","1^4,1^4,1^4,31",
                   8157: "1^4,22,22,22,31","1^7,1^7,43","1^7,2221,331",
                   8158: "2221,2221,2221","1^6,21^4,222","21^4,33,33,33",
                   8159: "1^6,1^6,321","222,321,33,33","1^6,33,33,42",
                   8160: "222,222,33,42","1^6,222,33,51","222,222,222,51",
                   8161: "33,33,33,33,51","1^6,2211,2211","111,111,21,21,21,21",
                   8162: "1^5,1^5,32,41","1^5,221,221,41","1^5,221,32,32",
                   8163: "221,221,221,32","1^4,211,211,211","211,211,22,22,31",
                   8164: "1^4,211,22,31,31","1^4,1^4,31,31,31","22,22,22,31,31,31",
                   8165: "21,21,21,21,21,21,21","21^a,444,66","1^8,31^5,44",
                   8166: "321^4,333,333","3321^4,3^4,66","3^421^4,666,99",
                   8167: "2^5,322111,55","32^41,3^4,66","3332^41,666,99",
                   8168: "1^8,1^8,611","2^4,44,44,611","1^d,6611,77",
                   8169: "4^5,66611,aa","2^6,444,651","3^4,3^4,651",
                   8170: "651,66,66,66","3^6,6651,99","6651,666,666",
                   8171: "66651,6^4,cc","6^551,ccc,ii","2^8,655,88",
                   8172: "1^9,1^9,72","1^g,772,88","1^c,444,75",
                   8173: "2^6,3^4,75","1^c,66,66,b1","3^4,444,66,b1",
                   8174: "3^7,777,ba","1^7,2221,4111","2^41,333,4311",
                   8175: "1^9,2^41,63","21^8,3331,55","2^411,331^4,55",
                   8176: "1^7,31^4,331","2^411,32221,55","22211,2^4,422",
                   8177: "2^511,4422,66","1^8,332,422","2^5,3331,541",
                   8178: "22211,44,44,62","2^411,2^5,64","2^711,664,88",
                   8179: "1^a,3331,64","2221,2221,31^4","21^7,333,441",
                   8180: "333,333,441,81","2^6111,555,87","21^6,221^4,44",
                   8181: "221^6,3322,55","2^41^6,554,77","1^6,21^4,3111",
                   8182: "3111,321,33,33","33111,3321,333","333111,33321,66",
                   8183: "222,3111,33,42","1^6,3111,33,51","222,222,3111,51",
                   8184: "1^9,33111,54","2221^4,33211,55","1^7,3211,322",
                   8185: "3^4211,5551,88","2^4,3221,3311","333221,4442,77",
                   8186: "3222,3321,333","33222,33321,66","1^9,3222,54",
                   8187: "21^4,33,33,411","3^411,44411,77","222,321,33,411",
                   8188: "1^6,33,411,42","1^6,222,411,51","33,33,33,411,51",
                   8189: "221^4,2^4,431","2^41^4,4431,66","1^8,3311,431",
                   8190: "3^411,4433,77","33321,444,552","1^8,221^4,53",
                   8191: "3311,44,44,53","4^42,5553,99","2^4,3311,44,71",
                   8192: "3^421,555,771","4^52,7771,bb","3^611,776,aa",
                   8193: "2^41,33111,441","22111,2221,3211","2^41,3222,441",
                   8194: "2^61,4441,76","3331,3331,4411","22211,22211,431",
                   8195: "3331,3331,433","3^41,3^41,76","1^7,1^7,61,61",
                   8196: "1^d,661,661","21^5,2221,322","221^5,2^41,54",
                   8197: "2^51,33311,65","21^5,22111,331","3^41,4441,661",
                   8198: "1^7,331,43,61","2221,2221,43,61","2221,331,331,61",
                   8199: "21^4,21^4,2211","21^4,2211,33,51","22211,3311,3311",
                   8200: "1^5,311,311,32","2211,321,33,42","2211,222,321,51",
                   8201: "3322,3331,442","2211,222,42,42","2^411,442,442",
                   8202: "1^6,2211,42,51","2211,33,33,51,51","221,221,311,311",
                   8203: "1^5,2111,311,41","222111,3321,441","22111,22111,322",
                   8204: "222111,222111,54","2111,221,311,32","2111,2111,221,41",
                   8205: "1^5,221,41,41,41","2221,43,43,43","1^5,32,32,41,41",
                   8206: "331,331,43,43","221,221,32,41,41","221,32,32,32,41",
                   8207: "211,211,211,31,31","211,22,31,31,31,31","1^4,31,31,31,31,31"]];
                   8208:                        B=BB[MO];
                   8209:                }
                   8210:                if(St!=1){
                   8211:                        for(R=[]; B!=[]; B=cdr(B)){
                   8212:                                RT=F?s2sp(car(B)|std=F):s2sp(car(B));
                   8213:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   8214:                                R=cons(RT,R);
                   8215:                        }
                   8216:                        return reverse(R);
                   8217:                }else{
                   8218:                        if(L0<=3 && L1>=MO+4) return B;
                   8219:                        for(R=[]; B!=[]; B=cdr(B)){
                   8220:                                RT=s2sp(T=car(B));
                   8221:                                if(length(RT)<L0 || length(RT)>L1) continue;
                   8222:                                if(F) T=s2sp(s2sp(T|std=K));
                   8223:                                R=cons(T,R);
                   8224:                        }
                   8225:                        return reverse(R);
                   8226:                }
                   8227:        }
                   8228:        MP=(L1<MO+1)?L1:MO+1;
                   8229:        LL=newvect(MO+1);
                   8230:        R=newvect(MP+2);
                   8231:        R0=newvect(MP+2);
                   8232:        for(I=1; I<=MO; I++) LL[I]=[];
                   8233:        if(type(Sp)==4){
                   8234:                if(getopt(basic)==1) Sp=chkspt(Sp[6]);
                   8235:                R=chkspt(Sp);
                   8236:                if(R[1]>MO) return 0;
                   8237:                LL[R[1]]=R;
                   8238:                K=R[1];
                   8239:        }
                   8240:        if(K==1||type(Sp)!=4){
                   8241:                LL[1]=[[[1]]];
                   8242:                for(I=2; I<=MO && I<MP;I++){
                   8243:                        for(T=[], J=0; J<I+1; J++)
                   8244:                                T=cons([I-1,1],T);
                   8245:                        LL[I]=cons(T,LL[I]);
                   8246:                }
                   8247:                K=2;
                   8248:        }
                   8249:        for(OD=K; OD<MO; OD++){
                   8250:                for(LT=LL[OD]; LT!=[]; LT=cdr(LT)){
                   8251:                        for(II=0,L=car(LT); L!=[]; II++, L=cdr(L)){
                   8252:                                R0[II]=R[II]=car(L);
                   8253:                        }
                   8254:                        for(; ;){
                   8255:                                for(S=-2*OD, I=0; I<II; I++){
                   8256:                                        S += OD;
                   8257:                                        if(R[I]!=[]) S-=car(R[I]);
                   8258:                                }
                   8259:                                --I;
                   8260:                                for(;S+OD<=MO && I<=MP;S+=OD,I++){
                   8261:                                        if(S<=0) continue;
                   8262:                                        for(J=0;J<=I;J++){
                   8263:                                                if(J>=II){
                   8264:                                                        if(S<OD) break;
                   8265:                                                }else
                   8266:                                                        if(S+((R[J]==[])?0:car(R[J]))<car(R0[J])) break;
                   8267:                                        }
                   8268:                                        if(--J>=I){
                   8269:                                                V=newvect(I);
                   8270:                                                RRR=[];
                   8271:                                                for(;J>=0;J--){
                   8272:                                                        if(J>=II) RR=[OD,S];
                   8273:                                                        else{
                   8274:                                                                K=length(R[J]);
                   8275:                                                                RR=[S+((K==0)?0:car(R[J]))];
                   8276:                                                                K=length(R0[J])-K;
                   8277:                                                                for(RT=R0[J]; RT!=[]; K--,RT=cdr(RT)){
                   8278:                                                                        if(K!=0) RR=cons(car(RT),RR);
                   8279:                                                                }
                   8280:                                                        }
                   8281:                                                        RRR=cons(reverse(RR),RRR);
                   8282:                                                }
                   8283:                                                RRR=qsort(reverse(RRR));
                   8284:                                                if(findin(RRR,LL[S+OD])<0)
                   8285:                                                        LL[S+OD]=cons(RRR,LL[S+OD]);
                   8286:                                        }
                   8287:                                }
                   8288:                                for(K=0; K<II; K++){
                   8289:                                        if(R[K]!=[]){
                   8290:                                                S=car(R[K]);
                   8291:                                                while((R[K]=cdr(R[K]))!=[] && car(R[K])==S);
                   8292:                                                break;
                   8293:                                        }else R[K]=R0[K];
                   8294:                                }
                   8295:                                if(K>=II) break;
                   8296:                        }
                   8297:                }
                   8298:        }
                   8299:        if(L0>0 || L1<MO+1 || St==1 || F){
                   8300:                for(J=1; J<=MO; J++){
                   8301:                        for(RT=[],R=LL[J];R!=[];R=cdr(R)){
                   8302:                                L=length(T=car(R));
                   8303:                                if(L<L0 || L>L1) continue;
                   8304:                                if(F) T=s2sp(T|std=F);
                   8305:                                RT=cons((St==1)?s2sp(T):T,RT);
                   8306:                        }
                   8307:                        LL[J] = reverse(RT);
                   8308:                }
                   8309:        }
                   8310:        if(Eq==1) return LL[MO];
                   8311:        return LL;
                   8312: }
                   8313:
                   8314: def spType2(L)
                   8315: {
                   8316:        C=0;R=[];
                   8317:        for(LT=L;LT!=[];LT=cdr(LT)){
                   8318:                D=-1;LP=car(LT);
                   8319:                for(LPT=LP;LPT!=[];LPT=cdr(LPT)){
                   8320:                        if(D==-1) D=car(LPT);
                   8321:                        else D=igcd(D,car(LPT));
                   8322:                        if(D==1){
                   8323:                                C++;break;
                   8324:                        }
                   8325:                }
                   8326:                if(C==2) return 0;
                   8327:                R=cons(D,R);
                   8328:        }
                   8329:        if(C==0) return L;
                   8330:        if(C==1){
                   8331:                for(K=length(R)-1;R[K]!=1;K--);
                   8332:                D=-1;
                   8333:                for(I=length(R)-1;I>=0;I--){
                   8334:                        if(I==K) continue;
                   8335:                        if(D==-1) D=R[I];
                   8336:                        else D=igcd(D,R[I]);
                   8337:                        if(D==1) return 0;
                   8338:                }
                   8339:        }
                   8340:        return L;
                   8341: }
                   8342:
                   8343:
                   8344: /* ret [#points, order, idx, Fuchs, reduction order, reduction exponents, fund] */
                   8345: def chkspt(M)
                   8346: {
                   8347:        Opt= getopt(opt);
                   8348:        Mat= getopt(mat);
                   8349:        if(type(M)==7) M=s2sp(M);
1.28      takayama 8350:        if(type(Opt) >= 0&&Opt!="idx"){
1.6       takayama 8351:                if(type(Opt) == 7)
                   8352:                        Opt = findin(Opt, ["sp","basic","construct","strip","short","long","sort","root"]);
                   8353:                if(Opt < 0){
                   8354:                        erno(2);
                   8355:                        return 0;
                   8356:                }
                   8357:                return fspt(M,Opt);
                   8358:        }
                   8359:        P  = length(M);
                   8360:        OD = -1;
                   8361:        XM = newvect(P);
                   8362:        Fu = 0;
                   8363:        for( I = SM = SSM = 0; I < P; I++ ){
                   8364:                LJ = length(M[I]);
                   8365:                JM = JMV = 0;
                   8366:                for(J = SM = 0; J < LJ; J++){
                   8367:                        MV = M[I][J];
                   8368:                        if(type(MV) == 4){
                   8369:                                Fu += MV[0]*MV[1];
                   8370:                                MV = MV[0];
                   8371:                        }
                   8372:                        if(MV > JMV){
                   8373:                                JM = J; JMV = MV;
                   8374:                        }
                   8375:                        SM  += MV;
                   8376:                        SSM += MV^2;
                   8377:                }
                   8378:                if(OD < 0)
                   8379:                        OD = SM;
                   8380:                else if(OD != SM){
1.28      takayama 8381:                        if(getopt(dumb)!=1) print("irregal partitions");
                   8382:                        return -1;
1.6       takayama 8383:                }
                   8384:                XM[I] = JM;
                   8385:        }
                   8386:        SSM -= (P-2)*OD^2;
                   8387:        for(I = SM = JM = 0; I < P; I++){
                   8388:                MV = M[I][XM[I]];
                   8389:                if(type(MV) == 4){
                   8390:                        MV = MV[0]; JM = 1;
                   8391:                }
                   8392:                if(I == 0)
                   8393:                 SMM = MV;
                   8394:                else if(SMM > MV)
                   8395:                 SMM = MV;
                   8396:                SM += MV;
                   8397:        }
                   8398:        SM -= (P-2)*OD;
1.28      takayama 8399:        if(Opt=="idx") return SSM;
1.6       takayama 8400:        if(SM > SMM && SM != 2*OD){
1.28      takayama 8401:                if(getopt(dumb)!=1) print("not realizable");
                   8402:                return 0;
1.6       takayama 8403:        }
                   8404:        if(JM==1 && Mat!=1)
                   8405:                Fu -= OD - SSM/2;
1.28      takayama 8406:        return [P, OD, SSM, Fu, SM, XM, fspt(M,1)];
1.6       takayama 8407: }
                   8408:
                   8409: def cterm(P)
                   8410: {
                   8411:        V = getopt(var);
                   8412:        if(type(V) != 4)
                   8413:                V=vars(P);
                   8414:        for(; V !=[]; V = cdr(V))
                   8415:                P = mycoef(P,0,car(V));
                   8416:        return P;
                   8417: }
                   8418:
                   8419: def terms(P,L)
                   8420: {
                   8421:        Lv=getopt(level);
                   8422:        if(type(Lv)!=1) Lv=0;
                   8423:        V=car(L);L=cdr(L);
                   8424:        for(R=[],D=mydeg(P,V);D>=0; D--){
                   8425:                if((Q=mycoef(P,D,V))==0) continue;
                   8426:                if(L!=[]){
                   8427:                        R0=terms(Q,L|level=Lv+1);
                   8428:                        for(;R0!=[];R0=cdr(R0)) R=cons(cons(D,car(R0)),R);
                   8429:                }else R=cons([D],R);
                   8430:        }
                   8431:        if(Lv>0) return R;
                   8432:        R=qsort(R);
                   8433:        Rev = getopt(rev); Dic=getopt(dic);
                   8434:        if(Dic==1 && Rev==1) R=reverse(R);
                   8435:        for(R0=[];R!=[];R=cdr(R)){
                   8436:                for(RT=car(R),S=0;RT!=[];RT=cdr(RT))    S+=car(RT);
                   8437:                R0=cons(cons(S,car(R)),R0);
                   8438:        }
                   8439:        if(Dic==1) return R0;
                   8440:        if(Rev==1){
                   8441:                for(R=[];R0!=[];R0=cdr(R0)){
                   8442:                        T=car(R0);
                   8443:                        R=cons(cons(-car(T),cdr(T)),R);
                   8444:                }
                   8445:                R0=R;
                   8446:        }
                   8447:        R0=qsort(R0);
                   8448:        if(Rev==1){
                   8449:                for(R=[];R0!=[];R0=cdr(R0)){
                   8450:                        T=car(R0);
                   8451:                        R=cons(cons(-car(T),cdr(T)),R);
                   8452:                }
                   8453:                R0=R;
                   8454:        }
                   8455:        return (Rev==1)?R0:reverse(R0);
                   8456: }
                   8457:
                   8458: def polcut(P,N,L)
                   8459: {
                   8460:        if(type(L)==2) L=[L];
                   8461:        M=getopt(top);
                   8462:        if(type(M)!=1) M=0;
                   8463:        T=terms(P,L);
                   8464:        for(S=0;T!=[];T=cdr(T)){
                   8465:                LT=car(T);
                   8466:                if(LT[0]<M || LT[0]>N) continue;
                   8467:                for(PW=1,LT=cdr(LT),V=L,Q=P;LT!=[];LT=cdr(LT),V=cdr(V)){
                   8468:                        Q=mycoef(Q,car(LT),car(V));PW*=car(V)^car(LT);
                   8469:                }
                   8470:                S+=Q*PW;
                   8471:        }
                   8472:        return S;
                   8473: }
                   8474:
                   8475: def redgrs(M)
                   8476: {
                   8477:        Mat = getopt(mat);
                   8478:        if(Mat!=1) Mat=0;
                   8479:        R = chkspt(M|mat=Mat);
                   8480:        if(type(R) < 4)
                   8481:                return -1;
                   8482:        if(R[4] <= 0)
                   8483:                return 1-R[4];
                   8484:        if(R[4] == 2*R[1])
                   8485:                return 0;
                   8486:        V = newvect(R[0]);
                   8487:        Type = type(M[0][0]);
                   8488:        if(Type > 3){
                   8489:                Mu = Mat-1;
                   8490:                for(I = 0; I < R[0]; I++)
                   8491:                        Mu += M[I][R[5][I]][1];
                   8492:        }
                   8493:        for(I = 0; I < R[0]; I++){
                   8494:                IR = R[5][I]; L = []; MI = M[I]; MIE=MI[IR];
                   8495:                for(J = length(MI)-1; J >= 0; J--){
                   8496:                        if(Type <= 3){
                   8497:                                VM = MI[J];
                   8498:                                if(J == IR){
                   8499:                                        VM -= R[4];
                   8500:                                        if(VM < 0) return -1;
                   8501:                                }
                   8502:                                L = cons(VM, L);
                   8503:                        }else{
                   8504:                                VM = MI[J][0];
                   8505:                                if(J == IR){
                   8506:                                        VM -= R[4];
                   8507:                                        if(VM < 0)
                   8508:                                                return -1;
                   8509:                                        if(I == 0)
                   8510:                                                EV = 1-Mat-Mu;
                   8511:                                        else
                   8512:                                                EV = 0;
                   8513:                                }else{
                   8514:                                        if(I == 0)
                   8515:                                                EV = MI[J][1] - M[0][R[5][0]][1] + 1-Mat; /* + MX - Mu; */
                   8516:                                        else
                   8517:                                                EV = MI[J][1] - MIE[1] + Mu;
                   8518:                                }
                   8519:                                L = cons([VM,EV], L);
                   8520: /*
1.24      takayama 8521:                                if(R[2] >= 2){ */ /* rigid */
1.6       takayama 8522: /*          P = dx^(R[1]);
                   8523:                                } */
                   8524:                        }
                   8525:                }
                   8526:                V[I] = L;
                   8527:        }
                   8528:        return [R[5], vtol(V)];
                   8529: }
                   8530:
                   8531: def cutgrs(A)
                   8532: {
                   8533:        for(AL=[] ; A!=[]; A=cdr(A)){    /* AT: level 2 */
                   8534:                for(ALT=[], AT=car(A); AT!=[]; AT=cdr(AT)){
                   8535:                        M = (type(car(AT)) < 4)?car(AT):car(AT)[0];
                   8536:                        if(M > 0)
                   8537:                                ALT = cons(car(AT), ALT);  /* ALT: level 2 */
                   8538:                }
                   8539:                AL = cons(reverse(ALT), AL);   /* AL: level 3 */
                   8540:        }
                   8541:        return reverse(AL);
                   8542: }
                   8543:
                   8544: def mcgrs(G, R)
                   8545: {
                   8546:        NP = length(G);
                   8547:        Mat = (getopt(mat)==1)?0:1;
1.24      takayama 8548:        if(Mat==1 && type(SM=getopt(slm))==4){
                   8549:                SM0=SM[0];SM1=anal2sp(SM[1],["*",-1]);
                   8550:                if(findin(0,SM0)>=0){
                   8551:                        for(SM=[],I=length(G)-1;I>0;I--)
                   8552:                                if(findin(I,SM0)<0) SM=cons(I,SM);
                   8553:                        SM=[SM,SM1];
                   8554:                        G=mcgrs(G,R|slm=SM);
                   8555:                        return [G[0],anal2sp(G[1],["*",-1])];
                   8556:                }
                   8557:        }else SM0=0;
1.6       takayama 8558:        for(R = reverse(R) ; R != []; R = cdr(R)){
                   8559:                GN = [];
                   8560:                L = length(G)-1;
                   8561:                RT = car(R);
                   8562:                if(type(RT) == 4){
1.24      takayama 8563:                        if(length(RT)==L&&RT[0]!=0){
                   8564:                                R=cons(cdr(RT),R);
                   8565:                                R=cons(RT[0],R);
                   8566:                                continue;
                   8567:                        }               /* addition */
                   8568:                        RT = reverse(RT); S = ADS = 0;
1.6       takayama 8569:                        for(G = reverse(G); G != []; G = cdr(G), L--){
                   8570:                                AD = car(RT); RT = cdr(RT);
1.24      takayama 8571:                                if(L > 0){
1.6       takayama 8572:                                        S += AD;
1.24      takayama 8573:                                        if(SM && findin(L,SM0)>=0) ADS+=AD;
                   8574:                                }else
1.6       takayama 8575:                                        AD = -S;
                   8576:                                for(GTN = [], GT = reverse(car(G)); GT != []; GT = cdr(GT))
                   8577:                                        GTN = cons([car(GT)[0],car(GT)[1]+AD], GTN);
                   8578:                                GN = cons(GTN, GN);
                   8579:                        }
                   8580:                        G = GN;
1.24      takayama 8581:                        if(SM0){
                   8582:                                for(ST=reverse(SM1),SM1=[]; ST!=[]; ST=cdr(ST))
                   8583:                                        SM1 = cons([car(ST)[0],car(ST)[1]+ADS], SM1);
                   8584:                        }
1.6       takayama 8585:                        continue;
                   8586:                }
1.24      takayama 8587:                if(RT==0) continue;
                   8588:                VP = newvect(L+1); GV = ltov(G);        /* middle convolution */
1.6       takayama 8589:                for(I = S = OD = 0; I <= L; I++){
                   8590:                        RTT = (I==0)?(Mat-RT):0;
                   8591:                        VP[I] = -1;
1.24      takayama 8592:                        for(J = M = K = 0, GT = GV[I]; GT != []; GT = cdr(GT), J++){
1.6       takayama 8593:                                if(I == 0)
                   8594:                                        OD += car(GT)[0];
                   8595:                                if(car(GT)[1] == RTT && car(GT)[0] > M){
                   8596:                                        S += car(GT)[0]-M;
                   8597:                                        VP[I] = J;
                   8598:                                }
                   8599:                        }
1.24      takayama 8600:                }
                   8601:                S -= (L-1)*OD;
                   8602:                for(GN = []; L >= 0; L--){
                   8603:                        GT = GV[L];
                   8604:                        RTT = (L==0)?(-RT):RT;
                   8605:                        GTN = [(VP[L] >= 0 || S == 0)?[]:[-S,(L==0)?(Mat-RT):0]];
                   8606:                        for(J = 0; GT != []; GT = cdr(GT), J++){
                   8607:                                if(J != VP[L]){
                   8608:                                        GTN = cons([car(GT)[0],car(GT)[1]+RTT], GTN);
                   8609:                                        continue;
1.6       takayama 8610:                                }
1.24      takayama 8611:                                K = car(GT)[0] - S;
                   8612:                                if(K < 0){
                   8613:                                        print("Not realizable");
                   8614:                                        return;
                   8615:                                }
                   8616:                                GTN = cons([K,(L==0)?(Mat-RT):0], GTN);
                   8617:                        }
                   8618:                        if(VP[L]<0) GTN=cons([-S,(L==0)?(Mat-RT):0],GTN);
                   8619:                        GN = cons(reverse(GTN), GN);
                   8620:                }
                   8621:                if(SM0){
                   8622:                        for(M=0,L=length(G)-1;L>0;L--)
                   8623:                                if(findin(L,SM0)>=0&&VP[L]>=0) M+=GV[L][VP[L]][0];
                   8624:                        Mx=sp2anal(SM1,["max",1,0]);
                   8625:                        for(SM2=[],J=0;SM1!=[];J++,SM1=cdr(SM1)){
                   8626:                                if(J!=Mx[0]) SM2=cons([car(SM1)[0],car(SM1)[1]+RT],SM2);
                   8627:                                else if((V=car(SM1)[0]-M)!=0) SM2=cons([V,RT],SM2);
                   8628:                        }
                   8629:                        Mx=sp2anal(SM1,["max",1,0]);
                   8630:                        for(J=0;SM2!=[];J++,SM2=cdr(SM2)){
                   8631:                                if(J!=Mx[0]) SM1=cons(car(SM2),SM1);
                   8632:                                else if((V=car(SM1)[0]-S+M)!=0) SM1=cons([V,0],SM2);
1.6       takayama 8633:                        }
1.24      takayama 8634:                        if(Mx[0]<0) SM1=cons([-S,0],SM1);
1.6       takayama 8635:                }
                   8636:                G = cutgrs(GN);
                   8637:        }
1.24      takayama 8638:        return SM0?[G[0],SM1]:G;
1.6       takayama 8639: }
                   8640:
                   8641: /*
                   8642:   F=0 : unify
                   8643:   F=["add",S] :
                   8644:   F=["sub",S] :
                   8645:   F=["+",A,B] :
                   8646:   F=["*",A,B] :
                   8647:   F=["mul",K];
                   8648:   F=["get",F,V] :
                   8649:   F=["put",F,V] :
                   8650:   F=["get1",F,V] :
                   8651:   F=["put1",F,V] :
1.24      takayama 8652:   F=["max"] :
                   8653:   F=["max",F.V] :
1.6       takayama 8654:   F=["put1"] :
                   8655:   F=["val",F];
                   8656:   F=["swap"];
                   8657:  */
                   8658: def anal2sp(R,F)
                   8659: {
                   8660:        if(type(F)==4&&type(F[0])==4){ /* multiple commands */
                   8661:                for(;F!=[];F=cdr(F)) R=anal2sp(R,car(F));
                   8662:                return R;
                   8663:        }
                   8664:        if(type(F)==7) F=[F];
                   8665:        if(F==0){               /* unify */
                   8666:                R=ltov(R);
                   8667:                L=length(R);
                   8668:                for(J=1;J<L;J++){
                   8669:                        for(I=0;I<J;I++){
                   8670:                                if(cdr(R[I])==cdr(R[J])){
                   8671:                                        R[I]=cons(R[I][0]+R[J][0],cdr(R[I]));
                   8672:                                        R[J]=cons(0,cdr(R[J]));
                   8673:                                        break;
                   8674:                                }
                   8675:                        }
                   8676:                }
                   8677:                for(G=[],I=L-1;I>=0;I--)
                   8678:                        if(R[I][0]!=0) G=cons(R[I],G);
                   8679:                if(length(G[0])==2){    /* sort by multiplicity */
                   8680:                        R=ltov(G);
                   8681:                        L=length(R);
                   8682:                        for(I=1;I<L;I++){
                   8683:                                for(J=I;J>0;J--){
                   8684:                                        if(R[J-1][0]>R[J][0]) break;
                   8685:                                        if(R[J-1][0]==R[J][0]){
                   8686:                                                S1=rtostr(R[J-1][1]);S2=rtostr(R[J][1]);
                   8687:                                                if((K=str_len(S1)-str_len(S2))<0) break;
                   8688:                                                if(!K&&S1<S2) break;
                   8689:                                        }
                   8690:                                        S=R[J-1];R[J-1]=R[J];R[J]=S;
                   8691:                                }
                   8692:                        }
                   8693:                        G=vtol(R);
                   8694:                }
                   8695:                return G;
                   8696:        }
                   8697:        if(F[0]=="add") return append(R,F[1]);
1.24      takayama 8698:        if(F[0]=="max"){
                   8699:                if(length(F)==3) C=1;
                   8700:                else C=0;
                   8701:                M=-10^10;K=[-1];
                   8702:                for(I=0;R!=[];R=cdr(R),I++){
                   8703:                        if(C>0&&car(R)[F[1]]!=F[2]) continue;
                   8704:                        if(M<car(R)[0]){
                   8705:                                M=car(R)[0];K=[I,car(R)];
                   8706:                        }
                   8707:                }
                   8708:                return K;
                   8709:        }
1.6       takayama 8710:        R=reverse(R);
                   8711:        if(F[0]=="sub"){
                   8712:                for(S=F[1];S!=[];S=cdr(S))
                   8713:                        R=cons(cons(-car(S)[0],cdr(car(S))),R);
                   8714:                return reverse(R);
                   8715:        }
                   8716:        if(F[0]=="swap"){
                   8717:                for(G=[];R!=[];R=cdr(R))
                   8718:                        G=cons([car(R)[0],car(R)[2],car(R)[1]],G);
                   8719:                return G;
                   8720:        }
                   8721:        if(F[0]=="+"){
1.24      takayama 8722:                L=length(F);
                   8723:                for(G=[];R!=[];R=cdr(R)){
                   8724:                        for(S=[],I=L-1;I>0;I--) S=cons(car(R)[I]+F[I],S);
                   8725:                        G=cons(cons(car(R)[0],S),G);
                   8726:                }
1.6       takayama 8727:                return G;
                   8728:        }
                   8729:        if(F[0]=="*"){
1.24      takayama 8730:                L=length(F);
                   8731:                for(G=[];R!=[];R=cdr(R)){
                   8732:                        for(S=0,I=1;I<L;I++) S+=car(R)[I]*F[I];
                   8733:                        G=cons([car(R)[0],S],G);
                   8734:                }
1.6       takayama 8735:                return G;
                   8736:        }
                   8737:        if(F[0]=="mult"){
                   8738:                K=F[1];
                   8739:                for(G=[];R!=[];R=cdr(R)) G=cons(cons(K*car(R)[0],cdr(car(R))),G);
                   8740:                return G;
                   8741:        }
                   8742:        if(F[0]=="get"){
                   8743:                for(G=[];R!=[];R=cdr(R))
                   8744:                        if(car(R)[F[1]]==F[2])  G=cons(car(R),G);
                   8745:                return G;
                   8746:        }
                   8747:        if(F[0]=="put"){
                   8748:                if(F[1]==1){
                   8749:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[2]],G);
                   8750:                }else{
                   8751:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   8752:                }
                   8753:                return G;
                   8754:        }
                   8755:        if(F[0]=="get1"){
                   8756:                if(length(F)==2){
                   8757:                        for(G=[];R!=[];R=cdr(R)) G=cons([R[0][0],car(R)[F[1]]],G);
                   8758:                        return G;
                   8759:                }
                   8760:                for(G=[];R!=[];R=cdr(R))
                   8761:                        if(car(R)[F[1]]==F[2])  G=cons([R[0][0],car(R)[3-F[1]]],G);
                   8762:                return G;
                   8763:        }
                   8764:        if(F[0]=="put1"){
                   8765:                if(length(F)==1)
                   8766:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],car(R)[1]],G);
                   8767:                else if(F[1]==1)
                   8768:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],F[2],car(R)[1]],G);
                   8769:                else{
                   8770:                        for(G=[];R!=[];R=cdr(R)) G=cons([car(R)[0],car(R)[1],F[2]],G);
                   8771:                }
                   8772:                return G;
                   8773:        }
                   8774:        if(F[0]=="val"){
                   8775:                V=(length(F)==1)?1:F[1];
                   8776:                for(I=J=0;R!=[];R=cdr(R)){
                   8777:                        I+=car(R)[0];
                   8778:                        J+=car(R)[0]*car(R)[V];
                   8779:                }
                   8780:                return [I,J];
                   8781:        }
                   8782:        return 0;
                   8783: }
                   8784:
                   8785: /*
                   8786:  G=0          get trivial common spct
                   8787:  G="..,..,"   spectre type of 4 singular points
                   8788:  P=["get"]    all spct
                   8789:  P=["get",L]
                   8790:     L=n        for variable x_n
                   8791:     L=[m,n]    for residue [m,n]
1.23      takayama 8792:     L=[m,n,l]  for residue [m,n,l]
1.6       takayama 8793:     L=[[m,n],[m',n']] for common spct
1.23      takayama 8794:  P=["eigen",I]   decomposition of A_I
1.6       takayama 8795:  P=["get0",[m,n],[m',n']] for the sum of residues
1.23      takayama 8796:  P=["rest",[m,n]] restriction
1.6       takayama 8797:  P=["swap",[m,n]] for symmetry
                   8798:  P=["perm",[...]] for symmetry
                   8799:  P=["deg"]
                   8800:  P=["homog"]
                   8801:  P=["sort"]
                   8802:  P=[[[m,n],c],...] for addition
                   8803:  P=[c] or [[c],...] for middle convolution wrt 0
                   8804:  P=[m,c] or [[m,c],...] for general middle convolution
                   8805:  P=[[a,b,c]] for special additions
                   8806:  P=[[d,a,b,c]] for middle convotution and additions
                   8807:  P=["multi",...] multiple commands
                   8808:  P=0,1,3 : return sim. spectre of 4 singular points
                   8809: */
                   8810: def mc2grs(G,P)
                   8811: {
                   8812:        if(G==0){
                   8813:                G=[];
                   8814:                for(I=4;I>=0;I--){
                   8815:                        V=lsort([0,1,2,3,4],[I],1);
                   8816:                        for(J=1;J<4;J++){
                   8817:                                for(T=[],K=3;K>0;K--)
                   8818:                                        if(K!=J) T=cons(V[K],T);
                   8819:                                G=cons([[[V[0],V[J]],T],[1,0,0]],G);
                   8820:                        }
                   8821:                }
                   8822:                G=mc2grs(G,"sort");
                   8823:        }else if(type(G)==7||(type(G)==4&&length(G)==4)){
                   8824:                if(type(G)==7) G=s2sp(G);
                   8825:                F=(getopt(top)==0)?1:0;
                   8826:                K=[];
                   8827:                if(type(P)==1&&iand(P,1)&&type(G[0][0])<4){
                   8828:                        G=s2sp(G|std=1);
                   8829:                        if(F) G=[G[1],G[2],G[3],G[0]];
                   8830:                        G=sp2grs(G,[d,c,b,a],[1,length(G[0]),-1]|mat=1);
                   8831:                        G=reverse(G);
                   8832:                        if(iand(P,3)==3){
                   8833:                                V=vars(G);
                   8834:                                for(H=L=[a,b,c,d];H!=[];H=cdr(H))
                   8835:                                        if(findin(car(H),V)>=0) G=subst(G,car(H),makev([car(H),1]));
                   8836:                                G=shortv(G,[a,b,c,d]);
                   8837:                                V=vars(G);
                   8838:                                for(H=G[3];H!=[];H=cdr(H)){
                   8839:                                        T=car(H)[1];
                   8840:                                        if(type(T)>1&&!isvar(T)){
                   8841:                                                K=[car(H)[0],T];
                   8842:                                                break;
                   8843:                                        }
                   8844:                                }
                   8845:                        }
                   8846:                        F=1;
                   8847:                }
                   8848:                if(F) G=[G[3],G[0],G[1],G[2]];
                   8849:                S=cons(["anal",1],getopt());
                   8850:                if(!(R=m2mc(G,0|option_list=S))) return R;
                   8851:                for(G=0,R=cdr(R);R!=[];R=cdr(R)){
                   8852:                        TR=car(R)[0];
                   8853:                        if(TR[0]) G=mc2grs(G,[[TR[0]]]);
                   8854:                        G=mc2grs(G,[cdr(TR)]);
                   8855:                }
                   8856:                if(type(P)==1&&K!=[]){
                   8857:                        for(T=10;T<36;T++){
                   8858:                                if(findin(X=makev([T]),V)>=0) continue;
                   8859:                                F=K[0]*(X-K[1]);
                   8860:                                return [F,simplify(G,[F],4)];
                   8861:                        }
                   8862:                }
                   8863:        }
                   8864:        if(type(P)<2) return G;
                   8865:        F=0;
1.25      takayama 8866:        if(type(P)==7||(type(P)==4&&
                   8867:                (type(P[0])<4||(type(P[0])==4&&length(P[0])==2&&type(P[0][0])<4&&type(P[1])<4))
                   8868:          )) P=[P];
1.6       takayama 8869:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   8870:        Keep=(Dvi==2)?1:0;
                   8871:        if(type(P)==4&&type(F=car(P))==7){
                   8872:                if(F=="mult"){
                   8873:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
                   8874:                        return G;
                   8875:                }
                   8876:                if(F=="show"){
                   8877:                        for(R=str_tb(0,0);G!=[];){
                   8878:                                L=car(G);
                   8879:                                I=L[0][0];J=L[0][1];
                   8880:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1])
                   8881:                                        +"}]&=\\left\\{",R);
                   8882:                                for(L=cdr(L);;){
                   8883:                                        S=car(L);
                   8884:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   8885:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   8886:                                        if((L=cdr(L))==[]) break;
                   8887:                                        str_tb(",\\,",R);
                   8888:                                }
                   8889:                                str_tb("\\right\\}",R);
                   8890:                                if((G=cdr(G))==[]) break;
                   8891:                                str_tb(",\\\\\n",R);
                   8892:                        }
                   8893:                        R=texbegin("align*",str_tb(0,R));
                   8894:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   8895:                        return R;
                   8896:                }
                   8897:                if(F=="show0"){
1.26      takayama 8898:                        if(type(Fig=getopt(fig))>0){
                   8899:                                PP=[[-1.24747,-5.86889],[1.24747,-5.86889],[3.52671,-4.8541],[5.19615,-3],
                   8900:                                  [5.96713,-0.627171],[5.70634,1.8541],[4.45887,4.01478],[2.44042,5.48127],
                   8901:                                  [0,6],[-2.44042,5.48127],[-4.45887,4.01478],[-5.70634,1.8541],
                   8902:                                  [-5.96713,-0.627171],[-5.19615,-3],[-3.52671,-4.8541]];
                   8903:                                PL=[[1.8,-5.2],[5.7,-1.7],[3.2,5],[-3.6,4.7],[2.2,3],[-2.8,2.8],
                   8904:                                  [-1.5,-1.4],[-3.2,-2.5],[0.76,-1.4],[-2,0.2]];
                   8905:                                PC=["black,dashed","green,dashed","red,dashed","blue,dashed",
                   8906:                                        "black","cyan","green","blue","red","magenta"];
                   8907:                                N=["1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
                   8908:                                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],
                   8909:                                  [2,9,14],[3,6,13]];
                   8910:                                TB=str_tb("\\draw\n",TB);
                   8911:                                if(type(Fig)==4){
                   8912:                                        if(type(car(Fig))==1){
                   8913:                                                PP=ptaffine(car(Fig)/12,PP);PL=ptaffine(car(Fig)/12,PL);
                   8914:                                                Fig=cdr(Fig);
                   8915:                                        }
                   8916:                                        if(Fig!=[]&&length(Fig)==10) PC=Fig;
                   8917:                                }
                   8918:                                for(R=mc2grs(G,"show0"|dviout=-1),I=0;R!="";I++){       /* 頂点 */
                   8919:                                        J=str_chr(R,0,",");
                   8920:                                        if(J>0){
                   8921:                                                S=str_cut(R,0,J-1);
                   8922:                                                R=str_cut(R,J+1,1000);
                   8923:                                        }else{
                   8924:                                                S=R;R="";
                   8925:                                        }
                   8926:                                        T=(str_chr(S,0,"1")==0)?"":"[red]";
                   8927:                                        str_tb(["node",T,"(",N[I],") at ",xypos(PP[I]),"{$",S,"$}\n"],TB);
                   8928:                                }
                   8929:                                for(S=PC,P=PL,I=0;I<4;I++){
                   8930:                                        for(J=I+1;J<5;J++,S=cdr(S),P=cdr(P)){                   /* 線の番号 */
                   8931:                                                SS=car(S);
                   8932:                                                if((K=str_chr(SS,0,","))>0) SS=sub_str(SS,0,K-1);
                   8933:                                                str_tb(["node[",SS,"] at ",xypos(car(P)),
                   8934:                                                        "{$[",rtostr(I),rtostr(J),"]$}\n"],TB);
                   8935:                                        }
                   8936:                                }
                   8937:                                str_tb(";\n",TB);
                   8938:                                for(I=0;I<10;I++){              /* 線 */
                   8939:                                        S=car(PC);P0=car(PC);L0=car(LL);PC=cdr(PC);LL=cdr(LL);
                   8940:                                        C=[N[L0[0]-1],N[L0[1]-1],N[L0[2]-1]];
                   8941:                                        str_tb(["\\draw[",S,"] (", C[0],")--(",C[1],") (",
                   8942:                                                C[0],")--(",C[2],") (",C[1],")--(",C[2],");\n"],TB);
                   8943:                                }
                   8944:                                R=str_tb(0,TB);
                   8945:                                if(TikZ==1&&Dvi!=-1) dviout(xyproc(R)|dviout=1,keep=Keep);
                   8946:                                return R;
                   8947:                        }
1.6       takayama 8948:                        for(S="",L=[];G!=[];G=cdr(G)){
                   8949:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   8950:                                TL=msort(TL,[-1,0]);
                   8951:                                if(Dvi){
                   8952:                                        if(S!="") S=S+",";
                   8953:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   8954:                                                if(car(T)==I) J++;
                   8955:                                                else{
                   8956:                                                        if(I>0&&J>0){
                   8957:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   8958:                                                                else S=S+rtostr(I);
                   8959:                                                                if(J>1){
                   8960:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   8961:                                                                        else S=S+"^"+rtostr(J);
                   8962:                                                                }
                   8963:                                                        }
                   8964:                                                        I=car(T);J=1;
                   8965:                                                }
                   8966:                                        }
                   8967:                                }
                   8968:                                L=cons(TL,L);
                   8969:                        }
                   8970:                        if(Dvi){
                   8971:                                if(Dvi!=-1) dviout(S|eq=0);
                   8972:                                return S;
                   8973:                        }
                   8974:                        return reverse(L);
                   8975:                }
                   8976:                if(F=="sort"){
                   8977:                        G=ltov(G);L=length(G);
                   8978:                        for(I=0;I<L;I++){
                   8979:                                S=G[I][0];
                   8980:                                if(S[0][0]>S[0][1]) S=[[S[0][1],S[0][0]],S[1]];
                   8981:                                if(S[1][0]>S[1][1]) S=[S[0],[S[1][1],S[1][0]]];
                   8982:                                if(S[0]>S[1]){
                   8983:                                        F=0;S=[S[1],S[0]];
                   8984:                                }
                   8985:                                if(S!=G[I][0]){
                   8986:                                        if(F==0) G[I]=cons(S,anal2sp(cdr(G[I]),"swap"));
                   8987:                                        else G[I]=cons(S,cdr(G[I]));
                   8988:                                }
                   8989:                                for(J=I;J>0;J--){
                   8990:                                        if(G[J-1][0]<G[J][0]) break;
                   8991:                                        S=G[J-1];G[J-1]=G[J];G[J]=S;
                   8992:                                }
                   8993:                        }
                   8994:                        return vtol(G);
                   8995:                }
                   8996:                if(F=="get"||F=="get0"){
                   8997:                        if(Dvi!=0) F="get";
                   8998:                        if(length(P)==1||type(P[1])<2){
                   8999:                                L=[];
                   9000:                                if(length(P)==1){
                   9001:                                        for(I=3;I>=0;I--){
                   9002:                                                for(J=4;J>I;J--) L=cons(mc2grs(G,[F,[I,J]]),L);
                   9003:                                        }
                   9004:                                }else{
                   9005:                                        for(I=P[1],J=4;J>=0;J--){
                   9006:                                                if(I==J) continue;
                   9007:                                                L=cons(mc2grs(G,[F,(I<J)?[I,J]:[J,I]]),L);
                   9008:                                        }
                   9009:                                }
                   9010:                                if(Dvi){
                   9011:                                        if(length(L)==10){
                   9012:                                                R=ltov(L);
                   9013:                                                if(R[6][0]==[1,4]){
                   9014:                                                        S=R[6];R[6]=R[7];R[7]=S;
                   9015:                                                        L=vtol(R);
                   9016:                                                }
                   9017:                                        }
                   9018:                                        for(R=S=[],L=reverse(L);L!=[];L=cdr(L)){
                   9019:                                                T=car(L);
                   9020:                                                R=cons(cdr(T),R);
                   9021:                                                if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   9022:                                                else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   9023:                                        }
                   9024:                                        L=ltotex(R|opt="GRS",pre=S);
1.26      takayama 9025:                                        if(type(D=getopt(div))==1 || type(D)==4) L=divmattex(L,D);
1.6       takayama 9026:                                        if(Dvi>0) dviout(L|eq=0,keep=Keep);
                   9027:                                }
                   9028:                                return L; /* get all spct */
                   9029:                        }
                   9030:                        if(type(T=P[1])==4){
                   9031:                                if(F=="get0"&&length(P)==3&&type(I=P[1])==4&&type(J=P[2])==4){
                   9032:                                        if(I[0]>I[1]) I=[I[1],I[0]];
                   9033:                                        if(J[0]>J[1]) J=[J[1],J[0]];
                   9034:                                        if(I[0]>I[0]){S=I;I=J;J=S;};
                   9035:                                        K=lsort(I,J,0);
                   9036:                                        if(length(K)==4){
1.24      takayama 9037:                                                S=mc2grs(G,["get0",[I,J]]);
1.6       takayama 9038:                                                return anal2sp(S,[["*",1,1],0]);
                   9039:                                        }
                   9040:                                        I=lsort(K,lsort(I,J,2),1);
                   9041:                                        S=lsort([0,1,2,3,4],K,1);
1.24      takayama 9042:                                        D=mc2grs(G,"deg");
1.6       takayama 9043:                                        if(findin(4,S)<0) D=-D;
1.24      takayama 9044:                                        J=mc2grs(G,["get0",[I,S]]);
1.6       takayama 9045:                                        if(I[0]>S[0]) J=sp2grs(J,"swap");
                   9046:                                        return anal2sp(J,[["+",0,D],["*",-1,1]]);
                   9047:                                }
                   9048:                                if(type(car(T))==4){
                   9049:                                        if(T[0][0]>T[0][1]) T=[[T[0][1],T[0][0]],T[1]];
                   9050:                                        if(T[1][0]>T[1][1]) T=[T[0],[T[1][1],T[1][0]]];
                   9051:                                        if(T[0][0]>T[1][0]) T=[T[1],T[0]];
                   9052:                                        for(PG=G;PG!=[];PG=cdr(PG))
                   9053:                                                if(car(PG)[0]==T) return (F=="get")?car(PG):cdr(car(PG));
                   9054:                                        return [];      /* get common spct */
                   9055:                                }
1.23      takayama 9056:                                if(length(T)==3){
                   9057:                                        T0=T;T=lsort([0,1,2,3,4],T,1);
                   9058:                                        if(length(T)!=2) return [];
                   9059:                                }else T0=0;
1.6       takayama 9060:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   9061:                                for(FT=0,PG=G;PG!=[];PG=cdr(PG)){
                   9062:                                        if(car(PG)[0][0]==T){
                   9063:                                                FT=1;break;
                   9064:                                        }
                   9065:                                        if(car(PG)[0][1]==T){
                   9066:                                                FT=2;break;
                   9067:                                        }
                   9068:                                }
                   9069:                                if(!FT) return [];
                   9070:                                L=anal2sp(cdr(car(PG)),[["get1",FT],0]);
1.23      takayama 9071:                                if(T0!=0){
                   9072:                                        if((K=mc2grs(G,"deg"))!=0){
                   9073:                                                if(T[1]!=4) K=-K;
                   9074:                                                R=reverse(L);
                   9075:                                                for(L=[];R!=[];R=cdr(R)) L=cons([car(R)[0],car(R)[1]+K],L);
                   9076:                                        }
                   9077:                                        T=T0;
                   9078:                                }
1.6       takayama 9079:                                return (F=="get")?cons(T,L):L;
                   9080:                        }
                   9081:                }
1.27      takayama 9082:                if(F=="rest"||F=="eigen"||F=="rest0"||F=="rest1"){
1.23      takayama 9083:                        if(F!="eigen") G=mc2grs(G,"homog");
1.26      takayama 9084:                        if(length(P)==1){
                   9085:                                for(R=[],I=0;I<4;I++){
                   9086:                                        for(J=I+1;J<5;J++){
                   9087:                                                S=mc2grs(G,[F,[I,J]]);
1.27      takayama 9088:                                                if(S!=[]) R=cons(cons([I,J],S),R);
1.26      takayama 9089:                                        }
                   9090:                                }
                   9091:                                R=reverse(R);
                   9092:                                if(Dvi){
                   9093:                                        TB=str_tb(0,0);
1.27      takayama 9094:                                        if(F=="rest0"||F=="rest1"){
1.26      takayama 9095:                                                for(T=R;;){
                   9096:                                                        TT=car(T);
                   9097:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   9098:                                                        str_tb(["[",S,"]","&: "],TB);
                   9099:                                                        for(TR=[],TT=cdr(TT);TT!=[];TT=cdr(TT))
                   9100:                                                                TR=cons(car(TT)[1],TR);
                   9101:                                                        for(TR=qsort(TR);TR!=[];TR=cdr(TR))
                   9102:                                                                str_tb([s2sp(car(TR)|short=1,std=-1),"\\ \\ "],TB);
                   9103:                                                        if((T=cdr(T))==[]) break;
                   9104:                                                        str_tb("\\\\\n",TB);
                   9105:                                                }
                   9106:                                        }else{
                   9107:                                                TB=str_tb(0,0);
                   9108:                                                for(T=R;;){
                   9109:                                                        TT=car(T);
                   9110:                                                        S=rtostr(car(TT)[0])+rtostr(car(TT)[1]);
                   9111:                                                        str_tb(["[",S,"]",":\\ "],TB);
                   9112:                                                        for(TR=[],TT=cdr(TT);;){
                   9113:                                                                T0=car(TT);
                   9114:                                                                str_tb(["&",my_tex_form(car(T0)),"&&\\to\\ \n",
                   9115:                                                                        ltotex(cdr(T0)|opt="GRS")],TB);
                   9116:                                                                if((TT=cdr(TT))==[]) break;
                   9117:                                                                str_tb("\\\\\n",TB);
                   9118:                                                        }
                   9119:                                                        if((T=cdr(T))==[]) break;
                   9120:                                                        str_tb("\\allowdisplaybreaks\\\\\n",TB);
                   9121:                                                }
                   9122:                                        }
                   9123:                                        R=texbegin("align*",str_tb(0,TB));
                   9124:                                        if(Dvi!=-1) dviout(R|keep=Keep);
                   9125:                                }
                   9126:                                return R;
                   9127:                        }
1.23      takayama 9128:                        I=P[1];
                   9129:                        if(I[0]>I[1]) I=[I[1],I[0]];
                   9130:                        L=lsort([0,1,2,3,4],I,1);
1.29      takayama 9131:                        if(F=="rest"&&length(P)==3){
                   9132:                                J=P[2];if(J[0]>J[1]) J=[J[1],J[0]];
                   9133:                                L=lsort(L,J,1);
                   9134:                                if(length(L)!=1) return 0;
                   9135:                                return [mc2grs(G,["get0",I]),mc2grs(G,["get0",[I[0],J[0]],[I[1],J[1]]]),
                   9136:                                        mc2grs(G,["get0",[I[0],J[1]],[I[1],J[0]]]),mc2grs(G,["get0",[I[0],I[1],L[0]]])];
                   9137:                        }
1.23      takayama 9138:                        L=[[L[0],L[1]],[L[0],L[2]],[L[1],L[2]]];
1.24      takayama 9139:                        if(F!="eigen"){
                   9140:                                if(I==[0,4]) L=reverse(L);
                   9141:                                else{
                   9142:                                        for(V=[],J=2;J>=0;J--){
                   9143:                                                if(L[J][0]==0) V=cons([L[J][1],J],V);
                   9144:                                                else{
                   9145:                                                        for(K=4;K>=0;K--){
                   9146:                                                                if(findin(K,L[J])<0){
                   9147:                                                                        V=cons([K,J],V);break;
                   9148:                                                                }
                   9149:                                                        }
                   9150:                                                }
                   9151:                                        }
                   9152:                                        V=qsort(V);
                   9153:                                        L=[L[V[0][1]],L[V[1][1]],L[V[2][1]]];
                   9154:                                }
                   9155:                        }
1.23      takayama 9156:                        for(LL=[],T=L;T!=[];T=cdr(T))
                   9157:                                LL=cons(mc2grs(G,["get0",[I,car(T)]]),LL);
                   9158:                        LL=reverse(LL);
                   9159:                        for(R=[],Q=mc2grs(G,["get0",I]);Q!=[];Q=cdr(Q)){
1.24      takayama 9160:                                for(T=[],J=2;J>=0;J--){
                   9161:                                        V=anal2sp(LL[J],["get1",(I[0]<L[J][0])?1:2,car(Q)[1]]);
                   9162:                                        if(F=="rest"){
                   9163:                                                if(I[0]==0){
                   9164:                                                        if(I[1]!=4){
                   9165:                                                                if(L[J][1]!=4) V=anal2sp(V,["+",-car(Q)[1]]);
                   9166:                                                        }else if (L[J][0]!=2) V=anal2sp(V,["+",-car(Q)[1]]);
                   9167:                                                }else if(L[J][0]!=0) V=anal2sp(V,["+",-car(Q)[1]]);
                   9168:                                        }
                   9169:                                        T=cons(V,T);
                   9170:                                }
1.23      takayama 9171:                                R=cons(cons(car(Q)[1],T),R);
                   9172:                        }
1.27      takayama 9173:                        if(F=="rest0"||F=="rest1"){
                   9174:                                for(L=[];R!=[];R=cdr(R)){
                   9175:                                        TR=cdr(car(R));
1.28      takayama 9176:                                        if(F=="rest1"&&chkspt(TR|opt="idx")==2) continue;
1.27      takayama 9177:                                        L=cons([car(R)[0],s2sp(chkspt(TR|opt=6))],L);
                   9178:                                }
1.23      takayama 9179:                                R=reverse(L);
                   9180:                        }
                   9181:                        return R;
                   9182:                }
1.6       takayama 9183:                if(F=="deg"){
                   9184:                        for(S=I=0;I<3;I++){
                   9185:                                for(J=I+1;J<4;J++){
                   9186:                                        L=mc2grs(G,["get0",[I,J]]);
                   9187:                                        L=anal2sp(L,"val");
                   9188:                                        S+=L[1];
                   9189:                                }
                   9190:                        }
                   9191:                        return S/L[0];
                   9192:                }
1.27      takayama 9193:                if(F=="spct"||F=="spct1"){
                   9194:                        K=(F=="spct")?5:6;
1.6       takayama 9195:                        G=mc2grs(G,"get");
1.27      takayama 9196:                        M=newmat(5,K);
1.6       takayama 9197:                        for(;G!=[];G=cdr(G)){
                   9198:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   9199:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   9200:                                        L=cons(car(GT)[0],L);
                   9201:                                }
                   9202:                                L=reverse(qsort(L));
                   9203:                                M[I][J]=M[J][I]=L;
                   9204:                        }
                   9205:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   9206:                        for(I=0;I<5;I++){
                   9207:                                S=-2*D^2;
                   9208:                                for(J=0;J<5;J++){
                   9209:                                        if(I==J) continue;
                   9210:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   9211:                                }
                   9212:                                M[I][I]=S;
1.27      takayama 9213:                                if(K==6){
                   9214:                                        for(S=[],J=4;J>=0;J--)
                   9215:                                                if(I!=J) S=cons(M[I][J],S);
                   9216:                                        R=chkspt(S|opt=2);
                   9217:                                        M[I][5]=((L=length(R))>1)?s2sp(R[L-2]|short=1):"";
                   9218:                                }
1.6       takayama 9219:                        }
                   9220:                        if(Dvi){
                   9221:                                S=[];
                   9222:                                for(I=4;I>=0;I--){
1.27      takayama 9223:                                        L=(K==6)?[M[I][5]]:[];
                   9224:                                        L=cons(M[I][I],L);
1.6       takayama 9225:                                        for(J=4;J>=0;J--){
                   9226:                                                if(I==J) L=cons("",L);
                   9227:                                                else L=cons(s2sp([M[I][J]]),L);
                   9228:                                        }
                   9229:                                        S=cons(L,S);
                   9230:                                }
1.27      takayama 9231:                                T=(K==6)?["reduction"]:[];
                   9232:                                S=cons(append([x0,x1,x2,x3,x4,"idx"],T),S);
                   9233:                                M=ltotex(S|opt="tab",hline=[0,1,z],
                   9234:                                        vline=(K==6)?[0,1,z-2,z-1,z]:[0,1,z-2,z-1,z],
1.26      takayama 9235:                                        left=["","$x_0$","$x_1$","$x_2$","$x_3$","$x_4$"]);
1.6       takayama 9236:                                if(Dvi>0) dviout(M|keep=Keep);
                   9237:                        }
                   9238:                        return M;
                   9239:                }
                   9240:                if(F=="swap"||F=="perm"){
                   9241:                        if(F=="perm") TR=P[1];
                   9242:                        else{
                   9243:                                TR=newvect(5,[0,1,2,3,4]);
                   9244:                                K=P[1][0];L=P[1][1];
                   9245:                                TR[K]=L;TR[L]=K;
                   9246:                                if(TR[4]!=4) G=mc2grs(G,"deg");
                   9247:                        }
                   9248:                        V=newvect(2);
                   9249:                        for(L=[],T=G;T!=[];T=cdr(T)){
                   9250:                                TP=car(T)[0];
                   9251:                                for(TQ=[],I=1;I>=0;I--){
                   9252:                                        V=[TR[TP[I][0]],TR[TP[I][1]]];
                   9253:                                        if(V[0]>V[1]) V=[V[1],V[0]];
                   9254:                                        TQ=cons(V,TQ);
                   9255:                                }
                   9256:                                if(TQ[0][0]<TQ[1][0]){
                   9257:                                        L=cons(cons(TQ,cdr(car(T))),L);
                   9258:                                        continue;
                   9259:                                }
                   9260:                                TQ=[[TQ[1],TQ[0]]];
                   9261:                                for(TP=cdr(car(T));TP!=[];TP=cdr(TP))
                   9262:                                        TQ=cons([car(TP)[0],car(TP)[2],car(TP)[1]],TQ);
                   9263:                                L=cons(reverse(TQ),L);
                   9264:                        }
                   9265:                        return mc2grs(L,"sort");
                   9266:                }
                   9267:                if(F=="homog"){
                   9268:                        V=mc2grs(G,"deg");
                   9269:                        return mc2grs(G,[[[2,3],-V]]);
                   9270:                }else if(F=="deg"){
                   9271:                        R=mc2grs(G,4);
                   9272:                        for(V=0;R!=[];R++){
                   9273:                                for(TR=cdr(R);TR!=[];TR=cdr(TR))
                   9274:                                        V+=car(TR)[0]*car(TR)[1];
                   9275:                        }
                   9276:                        return -V;
                   9277:                }
                   9278:        }
                   9279:        if(type(F)!=4) return 0;
                   9280:        if(type(P[0])!=4) P=[P];
                   9281:        for(;P!=[];P=cdr(P)){
                   9282:                if(type((S=P[0])[0])==4){ /* addition */
                   9283:                        T=P[0][0];
                   9284:                        if(T[0]>T[1]) T=[T[1],T[0]];
                   9285:                        T1=[T[0],4];T2=[T[1],4];
                   9286:                        for(L=[],PG=reverse(G);PG!=[];PG=cdr(PG)){
                   9287:                                R=car(PG);R0=R[0];F=0;K=P[0][1];
                   9288:                                if(R0[0]==T) F=1;
                   9289:                                else if(R0[1]==T) F=2;
                   9290:                                else if(getopt(unique)!=1){
                   9291:                                        K=-K;
                   9292:                                        if(R0[0]==T1||R0[0]==T2) F=1;
                   9293:                                        else if(R0[1]==T1||R0[1]==T2) F=2;
                   9294:                                }
                   9295:                                if(F==0) L=cons(R,L);
                   9296:                                else{
                   9297:                                        R1=anal2sp(cdr(R),(F==1)?["+",K,0]:["+",0,K]);
                   9298:                                        L=cons(cons(R0,R1),L);
                   9299:                                }
                   9300:                        }
                   9301:                        G=L;
                   9302:                }else if(type(S[0])<4){
                   9303:                         if(length(S)==1){       /* mc wrt0 4:cases */
                   9304:                                U=mc2grs(G,"deg");
                   9305:                                C=P[0][0];
                   9306:                                L=[];
                   9307:                        /* [[0,1],[2,3]] : [K=[0,k],J=[i,j]], S=[k,4] : 3 cases */
                   9308:                                for(K=1;K<4;K++){
                   9309:                                        J=lsort([1,2,3],[K],1);
                   9310:                                        K4=[K,4];K0=[0,K];
                   9311:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   9312:                                        LT=anal2sp(G0,["+",C,0]);
                   9313:                                        G0=mc2grs(G,["get0",J]);
                   9314:                                        L0=anal2sp(G0,["put1",1,0]);
                   9315:                                        LT=anal2sp(LT,["add",L0]);
                   9316:                                        G0=mc2grs(G,["get0",K4]);
                   9317:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,U]]);
                   9318:                                        LT=anal2sp(LT,["add",L0]);
                   9319:                                        G0=mc2grs(G,["get0",[[0,J[0]],K4]]);
                   9320:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   9321:                                        LT=anal2sp(LT,["sub",L0]);
                   9322:                                        G0=mc2grs(G,["get0",[[0,J[1]],K4]]);
                   9323:                                        L0=anal2sp(G0,[["get",1,0],["+",0,U]]);
                   9324:                                        LT=anal2sp(LT,["sub",L0]);
                   9325:                                        G0=mc2grs(G,["get0",[K0,J]]);
                   9326:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9327:                                        LT=anal2sp(LT,["sub",L0]);
                   9328:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9329:                                        L0=anal2sp(G0,[["+",-C,0],["get",1,0]]);
                   9330:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9331:                                        L=cons(cons([K0,J],LT),L);
                   9332:                                }
                   9333:                        /* [[0,1],[2,4]] : [K,I]=[[0,k],[i,4]] S=[j,k] : 6 cases */
                   9334:                                for(K=1;K<4;K++){
                   9335:                                  for(I=1;I<4;I++){
                   9336:                                        if(I==K) continue;
                   9337:                                        for(J=1;J<4;J++) if(J!=I&&J!=K)  break;
                   9338:                                        I4=[I,4];S=(J<K)?[J,K]:[K,J];K0=[0,K];
                   9339:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   9340:                                        LT=anal2sp(G0,["+",C,0]);
                   9341:                                        G0=cdr(mc2grs(G,["get",I4]));
                   9342:                                        L0=anal2sp(G0,["put1",1,0]);
                   9343:                                        LT=anal2sp(LT,["add",L0]);
                   9344:                                        G0=cdr(mc2grs(G,["get",S]));
                   9345:                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C-U]]);
                   9346:                                        LT=anal2sp(LT,["add",L0]);
                   9347:
                   9348:                                        G0=cdr(mc2grs(G,["get",[[0,I],S]]));
                   9349:                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C-U]]);
                   9350:                                        LT=anal2sp(LT,["sub",L0]);
                   9351:                                        G0=cdr(mc2grs(G,["get",[[0,J],I4]]));
                   9352:                                        L0=anal2sp(G0,["get",1,0]);
                   9353:                                        LT=anal2sp(LT,["sub",L0]);
                   9354:                                        G0=cdr(mc2grs(G,["get",[K0,I4]]));
                   9355:                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9356:                                        LT=anal2sp(LT,["sub",L0]);
                   9357:                                        G0=cdr(mc2grs(G,["get",[[0,4],S]]));
                   9358:                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C-U]]);
                   9359:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9360:                                        L=cons(cons([K0,I4],LT),L);
                   9361:                                  }
                   9362:                                }
                   9363:                        /* [[0,4],[2,3]] : [[0,4],J]=[[0,4],[i,j]] 3 cases */
                   9364:                                for(K=3;K>0;K--){
                   9365:                                        J=lsort([1,2,3],[K],1);
                   9366:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9367:                                        LT=anal2sp(G0,["+",-C,0]);
                   9368:                                        G0=mc2grs(G,["get0",J]);
                   9369:                                        L0=anal2sp(G0,["put1",1,-C]);
                   9370:                                        LT=anal2sp(LT,["add",L0]);
                   9371:                                        G0=mc2grs(G,["get0",[K,4]]);
                   9372:                                        L0=anal2sp(G0,[["put1",1,-C],["+",0,U]]);
                   9373:                                        LT=anal2sp(LT,["add",L0]);
                   9374:
                   9375:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   9376:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   9377:                                        LT=anal2sp(LT,["sub",L0]);
                   9378:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   9379:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,U]]);
                   9380:                                        LT=anal2sp(LT,["sub",L0]);
                   9381:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   9382:                                        L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   9383:                                        LT=anal2sp(LT,["sub",L0]);
                   9384:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9385:                                        L0=anal2sp(G0,[["get",1,C],["put",1,0]]);
                   9386:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9387:                                        L=cons(cons([[0,4],J],LT),L);
                   9388:                                }
                   9389:                        /* [[1,2],[3,4]] : [J,K]=[[i,j],[k,4]] 3 cases  */
                   9390:                                for(K=3;K>0;K--){
                   9391:                                        J=lsort([1,2,3],[K],1);
                   9392:                                        if(K>1)
                   9393:                                                LT=mc2grs(G,["get0",[J,[K,4]]]);
                   9394:                                        else{
                   9395:                                                LT=mc2grs(G,["get0",[[K,4],J]]);
                   9396:                                                LT=anal2sp(LT,"swap");
                   9397:                                        }
                   9398:                                        G0=mc2grs(G,["get0",J]);
                   9399:                                        L0=anal2sp(G0,[["put1"],["+",0,-C-U]]);
                   9400:                                        LT=anal2sp(LT,["add",L0]);
                   9401:                                        G0=mc2grs(G,["get0",[K,4]]);
                   9402:                                        L0=anal2sp(G0,[["put1"],["+",U,0]]);
                   9403:                                        LT=anal2sp(LT,["add",L0]);
                   9404:
                   9405:                                        G0=mc2grs(G,["get0",[[0,J[0]],[K,4]]]);
                   9406:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   9407:                                        LT=anal2sp(LT,["sub",L0]);
                   9408:                                        G0=mc2grs(G,["get0",[[0,J[1]],[K,4]]]);
                   9409:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",U,0]]);
                   9410:                                        LT=anal2sp(LT,["sub",L0]);
                   9411:                                        G0=mc2grs(G,["get0",[[0,K],J]]);
                   9412:                                        L0=anal2sp(G0,[["get1",1,0],["put1"],["+",0,-C-U]]);
                   9413:                                        LT=anal2sp(LT,["sub",L0]);
                   9414:                                        G0=mc2grs(G,["get0",[[0,4],J]]);
                   9415:                                        L0=anal2sp(G0,[["get1",1,C],["put1"],["+",0,-C-U]]);
                   9416:                                        LT=anal2sp(LT,[["sub",L0],0]);
                   9417:                                        if(K==1){
                   9418:                                                LT=anal2sp(LT,"swap");
                   9419:                                                L=cons(cons([[K,4],J],LT),L);
                   9420:                                        }else L=cons(cons([J,[K,4]],LT),L);
                   9421:                                }
                   9422:                                G=L;
                   9423:                          }else if(length(S)==2){        /* general mc */
                   9424:                                if(S[1]!=0){
                   9425:                                        I=S[0];
                   9426:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   9427:                                        G=mc2grs(G,[S[1]]);
                   9428:                                        if(I!=0) G=mc2grs(G,["swap",[0,I]]);
                   9429:                                }
                   9430:                        }else if(length(S)==3||length(S)==4){   /* addition */
                   9431:                                for(I=1;I<4;I++,S=cdr(S))
                   9432:                                        if(S[0]) G=mc2grs(G,[[[0,I],S[0]]]);
                   9433:                                if(length(S)==1 && S[0])                        /* mc */
                   9434:                                        G=mc2grs(G,[S[0]]);
                   9435:                        }
                   9436:                }
                   9437:        }
                   9438:        return mc2grs(G,"sort");
                   9439: }
                   9440:
                   9441: def mcmgrs(G,P)
                   9442: {
                   9443:        if(type(G)<2){
                   9444:                if(G>1){
                   9445:                        N=G+2;G=[];
                   9446:                        for(I=1;I<=N;I++){
                   9447:                                for(J=1;J<N;J++){
                   9448:                                        if(I==J) continue;
                   9449:                                        for(K=J+1;K<=N;K++){
                   9450:                                                if(I==K) continue;
                   9451:                                                G=cons([[[0,I],[J,K]],[1,0,0]],G);
                   9452:                                        }
                   9453:                                }
                   9454:                        }
                   9455:                        for(I=1;I<=N;I++){
                   9456:                                for(J=1;J<I;J++) G=cons([[[0,I],[0,J,I]],[1,0,0]],G);
                   9457:                                for(J=I+1;J<=N;J++) G=cons([[[0,I],[0,I,J]],[1,0,0]],G);
                   9458:                        }
                   9459:                        return reverse(G);
                   9460:                }
                   9461:                return 0;
                   9462:        }
                   9463:        if(type(G)==7) G=os_md.s2sp(G);
                   9464:        if(type(G)!=4||type(G[0])!=4) return 0;
                   9465:        if(type(G[0][0])!=4){                   /* spectre type -> GRS */
                   9466:                G=s2sp(G|std=1);
                   9467:                L=length(G);
                   9468:                for(V=[],I=L-2;I>=0;I--) V=cons(makev([I+10]),V);
                   9469:                V=cons(makev([L+9]),V);
                   9470:                G=sp2grs(G,V,[1,length(G[0]),-1]|mat=1);
                   9471:                if(getopt(short)!=0){
                   9472:                        V=append(cdr(V),[V[0]]);
                   9473:                        G=shortv(G,V);
                   9474:                }
                   9475:                R=chkspt(G|mat=1);
                   9476:                if(R[2] != 2 || R[3] != 0 || !(R=getbygrs(G,1|mat=1))) return 0;
                   9477:                if(getopt(anal)==1) return R;   /* called by mcmgrs() */
                   9478:                if(!(G=mcmgrs(L-2,0))) return 0;
                   9479:                for(R=cdr(R);R!=[];R=cdr(R)){
                   9480:                        TR=car(R)[0];
                   9481:                        if(TR[0]) G=mcmgrs(G,[[TR[0]]]);
                   9482:                        G=mcmgrs(G,[cdr(TR)]);
                   9483:                }
                   9484:        }
                   9485:        L=length(G);
                   9486:        for(N=4;N<25;N++){
                   9487:                K=N^2*(N-1)/2;
                   9488:                if(K>L) return 0;
                   9489:                if(K==L) break;
                   9490:        }
                   9491:        if(type(P)<2) return G;
                   9492:        F=0;
                   9493:        if(type(P)==7||(type(P)==4&&type(P[0])<4)) P=[P];
                   9494:        if((Dvi=getopt(dviout))!=1&&Dvi!=2&&Dvi!=-1) Dvi=0;
                   9495:        Keep=(Dvi==2)?1:0;
                   9496:        if(type(P)==4 && type(F=car(P))==7){
                   9497:                if(F=="mult"){
1.24      takayama 9498:                        for(P=cdr(P);P!=[];P=cdr(P)) G=mc2grs(G,car(P)|option_list=getopt());
1.6       takayama 9499:                        return G;
                   9500:                }
                   9501:                if(F=="get"||F=="get0"){
                   9502:                        if(Dvi!=0) F="get";
                   9503:                        if(length(P)==2){
                   9504:                                if(type(P[1])==4){
                   9505:                                        if(type(P[1][1])==4){           /* [[,],[,]] */
                   9506:                                                for(PG=reverse(G);PG!=[];PG=cdr(PG)){
                   9507:                                                        TP=car(PG);
                   9508:                                                        if(TP[0]==P[1]) return (F=="get")?TP:cdr(TP);
                   9509:                                                }
                   9510:                                                return [];
                   9511:                                        }
                   9512:                                        if(P[1][0]==0){
                   9513:                                                if(length(P[1])==2){    /* [0,] */
                   9514:                                                        for(J=1;J<=N;J++) if(J!=P[1][1]) break;
                   9515:                                                        for(K=J+1;K<=N;K++) if(K!=P[1][1]) break;
                   9516:                                                        L=mcmgrs(G,["get0",[P[1],[J,K]]]);
                   9517:                                                        L=anal2sp(L,["get1",1]);
                   9518:                                                }else{                                  /* [0,*,*] */
                   9519:                                                        L=mcmgrs(G,["get0",[[P[1][0],P[1][1]],P[1]]]);
                   9520:                                                        L=anal2sp(L,["get1",2]);
                   9521:                                                }
                   9522:                                        }else{                                          /* [,] */
                   9523:                                                for(J=1;J<=N;J++) if(J!=P[1][0]&&J!=P[1][1]) break;
                   9524:                                                L=mcmgrs(G,["get0",[[0,J],P[1]]]);
                   9525:                                                L=anal2sp(L,["get1",2]);
                   9526:                                        }
                   9527:                                        L=anal2sp(L,0);
                   9528:                                        if(F=="get") L=cons(P[1],L);
                   9529:                                        return L;
                   9530:                                }else{  /* I */
                   9531:                                        for(L=[],I=P[1],J=0;J<=N;J++){
                   9532:                                                if(I==J) continue;
                   9533:                                                II=(I<J)?[I,J]:[J,I];
                   9534:                                                L=cons(mcmgrs(G,[F,II]),L);
                   9535:                                        }
                   9536:                                }
                   9537:                        }else{
                   9538:                                for(L=[],I=0;I<N;I++){
                   9539:                                        for(J=I+1;J<=N;J++) L=cons(mcmgrs(G,[F,[I,J]]),L);
                   9540:                                }
                   9541:                        }
                   9542:                        if(Dvi){
                   9543:                                for(R=S=[];L!=[];L=cdr(L)){
                   9544:                                        T=car(L);
                   9545:                                        R=cons(cdr(T),R);
                   9546:                                        if(S==[]) S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}\\\\\n";
                   9547:                                        else S="A_{"+rtostr(T[0][0])+rtostr(T[0][1])+"}&"+S;
                   9548:                                }
                   9549:                                L=ltotex(R|opt="GRS",pre=S);
                   9550:                                if(type(V=getopt(div))!=4) V=[];
                   9551:                                if(V==[]&&(K=length(R))>10)
                   9552:                                        for(I=9;I<K;I+=9) V=cons(I,V);
                   9553:                                V=reverse(V);
                   9554:                                if(V!=[]) L=divmattex(L,V);
                   9555:                                if(Dvi>0){
                   9556:                                        if(V!=[]) dviout(L|keep=Keep);
                   9557:                                        else dviout(L|eq=0,keep=Keep);
                   9558:                                }
                   9559:                        }else L=reverse(L);
                   9560:                        return L;
                   9561:                }
                   9562:                if(F=="show"){
                   9563:                        for(R=str_tb(0,0);G!=[];){
                   9564:                                L=car(G);
                   9565:                                I=L[0][0];J=L[0][1];
                   9566:                                str_tb("[A_{"+rtostr(I[0])+rtostr(I[1])+"}:A_{"+rtostr(J[0])+rtostr(J[1]),R);
                   9567:                                if(length(J)==3) str_tb(rtostr(J[2]),R);
                   9568:                                str_tb("}]&=\\left\\{",R);
                   9569:                                for(L=cdr(L);;){
                   9570:                                        S=car(L);
                   9571:                                        str_tb("["+my_tex_form(S[1])+":"+my_tex_form(S[2])+"]",R);
                   9572:                                        if(S[0]!=1) str_tb("_{"+rtostr(S[0])+"}",R);
                   9573:                                        if((L=cdr(L))==[]) break;
                   9574:                                        str_tb(",\\,",R);
                   9575:                                }
                   9576:                                str_tb("\\right\\}",R);
                   9577:                                if((G=cdr(G))==[]) break;
                   9578:                                str_tb(texcr(43),R);
                   9579:                        }
                   9580:                        R=texbegin("align*",str_tb(0,R));
                   9581:                        if(Dvi!=-1) dviout(R|keep=Keep);
                   9582:                        return R;
                   9583:                }
                   9584:                if(F=="show0"){
                   9585:                        for(C=N*(N-1)*(N-2)/2,S="",L=[];G!=[];G=cdr(G)){
                   9586:                                for(TL=[],TG=cdr(car(G));TG!=[];TG=cdr(TG)) TL=cons(car(TG)[0],TL);
                   9587:                                TL=msort(TL,[-1,0]);
                   9588:                                if(Dvi){
                   9589:                                        if(S!=""){
                   9590:                                                if(--C==0) S=S+";";
                   9591:                                                else S=S+",";
                   9592:                                        }
                   9593:                                        for(I=J=0,T=append(TL,[[0]]);T!=[];T=cdr(T)){
                   9594:                                                if(car(T)==I) J++;
                   9595:                                                else{
                   9596:                                                        if(I>0&&J>0){
                   9597:                                                                if(I>9) S=S+"("+rtostr(I)+")";
                   9598:                                                                else S=S+rtostr(I);
                   9599:                                                                if(J>1){
                   9600:                                                                        if(J>9) S=S+"^{"+rtostr(J)+"}";
                   9601:                                                                        else S=S+"^"+rtostr(J);
                   9602:                                                                }
                   9603:                                                        }
                   9604:                                                        I=car(T);J=1;
                   9605:                                                }
                   9606:                                        }
                   9607:                                }
                   9608:                                L=cons(TL,L);
                   9609:                        }
                   9610:                        if(Dvi){
                   9611:                                if(Dvi!=-1) dviout(S|eq=0);
                   9612:                                return S;
                   9613:                        }
                   9614:                        return reverse(L);
                   9615:                }
                   9616:                if(F=="spct"){
                   9617:                        G=mcmgrs(G,"get");
                   9618:                        M=newmat(N+1,N+1);
                   9619:                        for(;G!=[];G=cdr(G)){
                   9620:                                GT=car(G);I=GT[0][0];J=GT[0][1];
                   9621:                                for(S=0,L=[],GT=cdr(GT);GT!=[];GT=cdr(GT)){
                   9622:                                        L=cons(car(GT)[0],L);
                   9623:                                }
                   9624:                                L=reverse(qsort(L));
                   9625:                                M[I][J]=M[J][I]=L;
                   9626:                        }
                   9627:                        for(D=0,GT=M[0][1];GT!=[];GT=cdr(GT)) D+=car(GT);
                   9628:                        for(I=0;I<=N;I++){
                   9629:                                S=-(N-2)*D^2;
                   9630:                                for(J=0;J<=N;J++){
                   9631:                                        if(I==J) continue;
                   9632:                                        for(L=M[I][J];L!=[];L=cdr(L)) S+=car(L)^2;
                   9633:                                }
                   9634:                                M[I][I]=S;
                   9635:                        }
                   9636:                        if(Dvi){
                   9637:                                S=[];
                   9638:                                for(LS=[],I=N;I>=0;I--){
                   9639:                                        L=[M[I][I]];
                   9640:                                        for(J=N;J>=0;J--){
                   9641:                                                if(I==J) L=cons("",L);
                   9642:                                                else L=cons(s2sp([M[I][J]]),L);
                   9643:                                        }
                   9644:                                        S=cons(L,S);
                   9645:                                        LS=cons("$x_"+rtostr(I)+"$",LS);
                   9646:                                }
                   9647:                                S=cons(append(LS,["idx"]),S);
                   9648:                                M=ltotex(S|opt="tab",hline=[0,1,z],vline=[0,1,z-1,z],left=cons("",LS));
                   9649:                                if(Dvi>0) dviout(M|keep=Keep);
                   9650:                        }
                   9651:                        return M;
                   9652:                }
                   9653:                if(F=="deg"){
                   9654:                        for(S=I=0;I<N-1;I++){
                   9655:                                for(J=I+1;J<N;J++){
                   9656:                                        L=mcmgrs(G,["get0",[I,J]]);
                   9657:                                        L=anal2sp(L,"val");
                   9658:                                        S+=L[1];
                   9659:                                }
                   9660:                        }
                   9661:                        return S/L[0];
                   9662:                }
                   9663:        }
                   9664:        L=[];
                   9665:        if(type(F)!=4) return 0;
                   9666:        if(type(P[0])!=4||length(P[0])==2) P=[P];
                   9667:        for(;P!=[];P=cdr(P)){
                   9668:                if(type(T=(S=car(P))[0])==4){ /* addition */
                   9669:                        if((K=P[0][1])!=0){
                   9670:                                if(T[0]>T[1]) T=[T[1],T[0]];
                   9671:                                T1=[T[0],N];T2=[T[1],N];
                   9672:                                T01=cons(0,T1);T02=cons(0,T2);
                   9673:                                for(PG=G;PG!=[];PG=cdr(PG)){
                   9674:                                        R=car(PG);R0=R[0];K1=K2=0;
                   9675:                                        TP=R0[0];
                   9676:                                        if(TP==T) K1=K;
                   9677:                                        else if(TP==T1||TP==T2) K1=-K;
                   9678:                                        if(length(TP=R0[1])==2){
                   9679:                                                if(TP==T) K2=K;
                   9680:                                                else if(TP==T1||TP==T2) K2=-K;
                   9681:                                        }else{
                   9682:                                                S=0;
                   9683:                                                if(findin(T[0],TP)>=0) S++;
                   9684:                                                if(findin(T[1],TP)>=0) S++;
                   9685:                                                if(S>0&&TP[2]==N) K2=-K;
                   9686:                                                else if(S==2) K2=K;
                   9687:                                        }
                   9688:                                        R1=anal2sp(cdr(R),["+",K1,K2]);
                   9689:                                        L=cons(cons(R0,R1),L);
                   9690:                                }
                   9691:                                G=reverse(L);
                   9692:                        }
                   9693:                }else if(length(S)==1){         /* middle convolution */
                   9694:                        C=S[0];L=[];
                   9695:                        for(I=1;I<=N;I++){
                   9696:                                for(J=1;J<=N;J++){
                   9697:                                        if(I==J) continue;
                   9698:                                        for(K=J+1;K<=N;K++){    /* [[0,I],[J,K]] */
                   9699:                                                if(I==K)continue;
                   9700:                                                T=[[0,I],JK=[J,K]];
                   9701:                                                if(I==N){
                   9702:                                                        LT=mcmgrs(G,["get0",T]);
                   9703:                                                        G0=mcmgrs(G,["get0",JK]);
                   9704:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9705:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   9706:                                                        LT=anal2sp(LT,["add",L0]);
                   9707:                                                        L0=anal2sp(G0,["put1",1,0]);
                   9708:                                                        LT=anal2sp(LT,["add",L0]);
                   9709:                                                        for(V=1;V<=N;V++){
                   9710:                                                                if(V==I){
                   9711:                                                                        G0=mcmgrs(G,["get0",T]);
                   9712:                                                                        L0=anal2sp(G0,["get",1,C]);
                   9713:                                                                }else if(V==J||V==K){
                   9714:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9715:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9716:                                                                }else{
                   9717:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9718:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9719:                                                                }
                   9720:                                                                LT=anal2sp(LT,["sub",L0]);
                   9721:                                                        }
                   9722:                                                        LT=anal2sp(LT,["+",-C,0]);
                   9723:                                                }else if(K==N){
                   9724:                                                        LT=mcmgrs(G,["get0",T]);
                   9725:                                                        LT=anal2sp(LT,["+",C,0]);
                   9726:                                                        G0=mcmgrs(G,["get0",JK]);
                   9727:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9728:                                                        LT=anal2sp(LT,["add",L0]);
                   9729:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   9730:                                                        L0=anal2sp(G0,[["put1",1,0],["+",0,-C]]);
                   9731:                                                        LT=anal2sp(LT,["add",L0]);
                   9732:                                                        for(V=1;V<=N;V++){
                   9733:                                                                if(V==I){
                   9734:                                                                        G0=mcmgrs(G,["get0",T]);
                   9735:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9736:                                                                }else if(V==J){
                   9737:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9738:                                                                        L0=anal2sp(G0,[["get",1,0],["+",0,-C]]);
                   9739:                                                                }else if(V==N){
                   9740:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9741:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,-C]]);
                   9742:                                                                }else{
                   9743:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9744:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9745:                                                                }
                   9746:                                                                LT=anal2sp(LT,["sub",L0]);
                   9747:                                                        }
                   9748:                                                }else{
                   9749:                                                        G0=mcmgrs(G,["get0",T]);
                   9750:                                                        LT=anal2sp(G0,["+",C,0]);
                   9751:                                                        G0=mcmgrs(G,["get0",JK]);
                   9752:                                                        L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9753:                                                        LT=anal2sp(LT,["add",L0]);
                   9754:                                                        G0=mcmgrs(G,["get0",[0,J,K]]);
                   9755:                                                        L0=anal2sp(G0,["put1",1,0]);
                   9756:                                                        LT=anal2sp(LT,["add",L0]);
                   9757:                                                        for(V=1;V<=N;V++){
                   9758:                                                                if(V==I){
                   9759:                                                                        G0=mcmgrs(G,["get0",T]);
                   9760:                                                                        L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9761:                                                                }else if(V==J||V==K){
                   9762:                                                                        G0=mcmgrs(G,["get0",[[0,V],[0,J,K]]]);
                   9763:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9764:                                                                }else if(V==N){
                   9765:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9766:                                                                        L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9767:                                                                }else{
                   9768:                                                                        G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9769:                                                                        L0=anal2sp(G0,["get",1,0]);
                   9770:                                                                }
                   9771:                                                                LT=anal2sp(LT,["sub",L0]);
                   9772:                                                        }
                   9773:                                                }
                   9774:                                                LT=anal2sp(LT,0);
                   9775:                                                L=cons(cons(T,LT),L);
                   9776:                                        }
                   9777:                                        T=[[0,I],(I<J)?[0,I,J]:[0,J,I]]; /* [0,I], [0,I,J] */
                   9778:                                        JK=(I<J)?[I,J]:[J,I];
                   9779:                                        if(I==N){
                   9780:                                                G0=mcmgrs(G,["get0",T]);
                   9781:                                                LT=anal2sp(G0,["+",-C,0]);
                   9782:                                                G0=mcmgrs(G,["get0",JK]);
                   9783:                                                L0=anal2sp(G0,[["put1",1,-C],["mult",N-3]]);
                   9784:                                                LT=anal2sp(LT,["add",L0]);
                   9785:                                                G0=mcmgrs(G,["get0",T[1]]);
                   9786:                                                L0=anal2sp(G0,["put1",1,-C]);
                   9787:                                                LT=anal2sp(LT,["add",L0]);
                   9788:                                                for(V=1;V<=N;V++){
                   9789:                                                        if(V==J){
                   9790:                                                                G0=mcmgrs(G,["get0",T]);
                   9791:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   9792:                                                        }else if(V==N){
                   9793:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   9794:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9795:                                                        }else{
                   9796:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9797:                                                                L0=anal2sp(G0,[["get",1,0],["+",-C,0]]);
                   9798:                                                        }
                   9799:                                                        LT=anal2sp(LT,["sub",L0]);
                   9800:                                                }
                   9801:                                                LT=anal2sp(LT,["+",0,C]);
                   9802:                                        }else if(J==N){
                   9803:                                                G0=mcmgrs(G,["get0",T]);
                   9804:                                                LT=anal2sp(G0,["+",C,0]);
                   9805:                                                G0=mcmgrs(G,["get0",T[0]]);
                   9806:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9807:                                                LT=anal2sp(LT,["add",L0]);
                   9808:                                                G0=mcmgrs(G,["get0",T[1]]);
                   9809:                                                L0=anal2sp(G0,["put1",1,0]);
                   9810:                                                LT=anal2sp(LT,["add",L0]);
                   9811:                                                for(V=1;V<=N;V++){
                   9812:                                                        if(V==I){
                   9813:                                                                G0=mcmgrs(G,["get0",T]);
                   9814:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,0]]);
                   9815:                                                        }else if(V==N){
                   9816:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   9817:                                                                L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9818:                                                        }else{
                   9819:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9820:                                                                L0=anal2sp(G0,["get",1,0]);
                   9821:                                                        }
                   9822:                                                        LT=anal2sp(LT,["sub",L0]);
                   9823:                                                }
                   9824:                                                LT=anal2sp(LT,["+",0,-C]);
                   9825:                                        }else{
                   9826:                                                G0=mcmgrs(G,["get0",T]);
                   9827:                                                LT=anal2sp(G0,["+",C,C]);
                   9828:                                                G0=mcmgrs(G,["get0",JK]);
                   9829:                                                L0=anal2sp(G0,[["put1",1,0],["mult",N-3]]);
                   9830:                                                LT=anal2sp(LT,["add",L0]);
                   9831:                                                G0=mcmgrs(G,["get0",T[1]]);
                   9832:                                                L0=anal2sp(G0,[["put1",1,0],["+",0,C]]);
                   9833:                                                LT=anal2sp(LT,["add",L0]);
                   9834:                                                for(V=1;V<=N;V++){
                   9835:                                                        if(V==I){
                   9836:                                                                G0=mcmgrs(G,["get0",T]);
                   9837:                                                                L0=anal2sp(G0,[["get",1,0],["+",C,C]]);
                   9838:                                                        }else if(V==J){
                   9839:                                                                G0=mcmgrs(G,["get0",[[0,V],T[1]]]);
                   9840:                                                                L0=anal2sp(G0,[["get",1,0],["+",0,C]]);
                   9841:                                                        }else if(V==N){
                   9842:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);                                                                                                                                       L0=anal2sp(G0,[["get",1,C],["+",-C,0]]);
                   9843:                                                        }else{
                   9844:                                                                G0=mcmgrs(G,["get0",[[0,V],JK]]);
                   9845:                                                                L0=anal2sp(G0,["get",1,0]);
                   9846:                                                        }
                   9847:                                                        LT=anal2sp(LT,["sub",L0]);
                   9848:                                                }
                   9849:                                        }
                   9850:                                        LT=anal2sp(LT,0);
                   9851:                                        L=cons(cons(T,LT),L);
                   9852:                                }
                   9853:                        }
                   9854:                        for(G0=G=[];L!=[];L=cdr(L)){
                   9855:                                if(length(car(L)[0][1])==2) G0=cons(car(L),G0);
                   9856:                                else G=cons(car(L),G);
                   9857:                        }
                   9858:                        G=append(G0,G);
                   9859:                }else{
                   9860:                        if(length(S)==N-1||length(S)==N){               /* [a_1,...,a_{N-1},c] */
                   9861:                                for(I=1;I<N;S=cdr(S),I++) G=mcmgrs(G,[[0,I],car(S)]);
                   9862:                                if(length(S)==1) G=mcmgrs(G,[S[0]]);
                   9863:                        }else return 0;
                   9864:                }
                   9865:        }
                   9866:        return G;
                   9867: }
                   9868:
                   9869:
                   9870: def delopt(L,S)
                   9871: {
                   9872:        if((Inv=getopt(inv))!=1) Inv=0;
                   9873:        for(R=[];L!=[];L=cdr(L)){
                   9874:                if(type(car(L))!=4) F=0;
                   9875:                else if(type(S)==4) F=(findin(car(L)[0],S)<0)?0:1;
                   9876:                else F=(car(L)[0]==S)?1:0;
                   9877:                if(F==Inv) R=cons(car(L),R);
                   9878:        }
                   9879:        return reverse(R);
                   9880: }
                   9881:
                   9882: def str_char(S,N,L)
                   9883: {
                   9884:        if(type(S)==7){
                   9885:                if(type(L)==1) L=asciitostr([L]);
                   9886:                return str_chr(S,N,L);
                   9887:        }
                   9888:        if(type(L)==7)  L=strtoascii(L)[0];
                   9889:        if(type(S)==4){
                   9890:                M=N;
                   9891:                while(M-->0) S=cdr(S);
                   9892:                M=findin(L,S);
                   9893:                return (M>=0)?findin(L,S)+N:-1;
                   9894:        }else if(type(S)==5){
                   9895:                K=length(S);
                   9896:                for(I=N;I<K;I++)
                   9897:                        if(S[I]==L) return I;
                   9898:        }
                   9899:        return -1;
                   9900: }
                   9901:
                   9902: def str_pair(S,N,I,J)
                   9903: {
                   9904:        if(type(I)==7)  I=(II=strtoascii(I))[0];
                   9905:        if(type(J)==7)  J=(JJ=strtoascii(J))[0];
                   9906:        if(type(S)==7)  S=strtoascii(S);
                   9907:        if(getopt(inv)==1){
                   9908:                if(II!=0){
                   9909:                        I=asciitostr(reverse(II));
                   9910:                        IL=length(II);
                   9911:                }else IL=1;
                   9912:                if(JJ!=0) J=asciitostr(reverse(JJ));
                   9913:                R=str_pair(reverse(S),length(S)-N-1,J,I);
                   9914:                if(R>=0) R=length(S)-IL-R;
                   9915:                return R;
                   9916:        }
                   9917:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   9918:        if((II!=0&&length(II)>1)||(JJ!=0&&length(JJ)>1)){
                   9919:                for(;;){
                   9920:                        MJ=str_str(S,N|top=JJ,sjis=SJIS);
                   9921:                        if(MJ>=0){
                   9922:                                MI=str_str(S,II|top=N,sjis=SJIS);
                   9923:                                if(MI<0 || MI>MJ){
                   9924:                                        if(C==0) return MJ;
                   9925:                                        C--; N=MJ+length(II);
                   9926:                                }else if(MI>=0){
                   9927:                                        C++; N=MI+length(JJ);
                   9928:                                }
                   9929:                        }
                   9930:                        return -1;
                   9931:                }
                   9932:        }
                   9933:        if(type(S)==4){
                   9934:                M=N;
                   9935:                while(M-->0) S=cdr(S);
                   9936:                while(S!=[]){
                   9937:                        if(car(S)==I) C++;
                   9938:                        else if(car(S)==J){
                   9939:                                if(C==0) return N;
                   9940:                                C--;
                   9941:                        }
                   9942:                        S=cdr(S);N++;
                   9943:                }
                   9944:        }else if(type(S)==5){
                   9945:                K=length(S);
                   9946:                for(T=N;T<K && C>=0;T++){
                   9947:                        if(S[T]==I) C++;
                   9948:                        else if(S[T]==J){
                   9949:                                if(C==0) return T;
                   9950:                                C--;
                   9951:                        }
                   9952:                }
                   9953:        }
                   9954:        return -1;
                   9955: }
                   9956:
                   9957:
                   9958: def str_cut(S,I,J)
                   9959: {
                   9960:        if(type(S)==7) return sub_str(S,I,J);
                   9961:        if((JJ=length(S))<=J) J=JJ-1;
                   9962:        if(type(S)==5){
                   9963:                for(L=[],K=J; K>=I; K--)        L=cons(S[K],L);
                   9964:        }else if(type(S)==4){
                   9965:                J-=I;
                   9966:                while(I-->0) S=cdr(S);
                   9967:                for(L=[];J-->=0;S=cdr(S)) L=cons(car(S),L);
                   9968:                L=reverse(L);
                   9969:        }
                   9970:        return asciitostr(L);
                   9971: }
                   9972:
                   9973: def str_str(S,T)
                   9974: {
                   9975:        if(S==0) return -1;
                   9976:        if(type(S) == 7)
                   9977:                S = strtoascii(S);
                   9978:        if(type(J=getopt(top))!=1 || J<0) J=0;
                   9979:        LS=length(S);
                   9980:        if(LS-J<1)      return -1;
                   9981:        if(type(S)==4){
                   9982:                LS-=(J0=J);
                   9983:                for( ; J>0 && S!=[]; S=cdr(S),J--);
                   9984:        }
                   9985:        if(type(JJ=getopt(end))!=1 && JJ!=0) JJ=LS;
                   9986:        else JJ-=J0;
                   9987:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   9988:        if(JJ-J<0) return -1;
                   9989:        /* search from J-th to JJ-th */
                   9990:        if(type(T)==1)  T=[T];
                   9991:        else if(type(T)==7)     T = strtoascii(T);
                   9992:        else if(type(T)==4 && type(T[0])>3){
                   9993:                for(K=(KF=-1)-J0; T!=[]; F++,T=cdr(T)){
                   9994:                        JK=str_str(S,car(T)|top=J,end=JJ,sjis=SJIS);
                   9995:                        if(JK>=0){
                   9996:                                JJ=(K=JK)-1; KF=F;
                   9997:                                if(J>JJ) break;
                   9998:                        }
                   9999:                }
                   10000:                return [KF,J0+K];
                   10001:        }
                   10002:        if(type(T)==4)  T=ltov(T);
                   10003:        LT = length(T);
                   10004:        if(LT>0){
                   10005:                LE = LS-LT;
                   10006:                LP = T[0];
                   10007:                if(JJ==0 ||(type(JJ)==1 && JJ<LE)) LE=JJ;
                   10008:                if(type(S)==5){
                   10009:                        for(; J <= LE; J++){
                   10010:                                if(S[J] != LP){
                   10011:                                        if(SJIS && (V=S[J])>128){
                   10012:                                                if(V<160 || (V>223 && V<240)) J++;
                   10013:                                        }
                   10014:                                        continue;
                   10015:                                }
                   10016:                                for(I = 1; I < LT && S[I+J] == T[I]; I++);
                   10017:                                if(I >= LT)  return J;
                   10018:                        }
                   10019:                }else if(type(S)==4){
                   10020:                        for(; J<=LE; S=cdr(S),J++){
                   10021:                                if(car(S) != LP){
                   10022:                                        if(SJIS && (V=S[J])>128){
                   10023:                                                if(V<160 || (V>223 && V<240)) J++;
                   10024:                                        }
                   10025:                                        continue;
                   10026:                                }
                   10027:                                for(ST=cdr(S), I = 1; I < LT && car(ST) == T[I]; I++, ST=cdr(ST));
                   10028:                                if(I >= LT) return J0+J;
                   10029:                        }
                   10030:                }
                   10031:        }
                   10032:        return -1;
                   10033: }
                   10034:
                   10035: def str_times(S,N)
                   10036: {
                   10037:        if(!isint(N))   return "";
                   10038:        if(type(S)==7){
                   10039:                for(Tb=str_tb(0,0);N-->0;)
                   10040:                        str_tb(S,Tb);
                   10041:                return str_tb(0,Tb);
                   10042:        }
                   10043:        if(type(S)==4){
                   10044:                for(LT=[],I=0;I<N;I++){
                   10045:                        if(type(car(S))==7){
                   10046:                                LT=cons(car(S),LT);
                   10047:                                S=cdr(S);
                   10048:                                if(S==[]) S=[[""]];
                   10049:                        }else if(type(car(S))==4){
                   10050:                                ST=car(S);
                   10051:                                for(J=0;I<N;I++){
                   10052:                                        if(J==length(ST)) J=0;
                   10053:                                        LT=cons(ST[J++],LT);
                   10054:                                }
                   10055:                        }
                   10056:                }
                   10057:                return reverse(LT);
                   10058:        }
                   10059:        return S;
                   10060: }
                   10061:
                   10062: def ssubgrs(M,L)
                   10063: {
                   10064:        if(type(L)==7) L=s2sp(L);
                   10065:        for(S=0, L=L, M=M; L!=[]; L=cdr(L), M=cdr(M)){
                   10066:                 for(LT=car(L), MT=car(M); LT!=[]; LT=cdr(LT), MT=cdr(MT)){
                   10067:                         S += car(LT)*car(MT)[1];
                   10068:                 }
                   10069:        }
                   10070:        return S;
                   10071: }
                   10072:
                   10073: def s2os(S)
                   10074: {
                   10075:        return str_subst(S,[["\\","\\\\"],["\"","\\\""]],0);
                   10076: }
                   10077:
                   10078: def l2os(S)
                   10079: {
                   10080:        if(type(S)==6)
                   10081:                S=m2ll(S);
                   10082:        else if(type(S)==5)
                   10083:                S=vtol(S);
                   10084:        else if(type(S)==7) return "\""+s2os(S)+"\"";
                   10085:        else if(type(S)<4) return rtostr(S);
                   10086:        if(type(S)==4){
                   10087:                for(F=0,Tb=str_tb("[",0);S!=[];S=cdr(S)){
                   10088:                        if(F++) str_tb(", ",Tb);
                   10089:                        str_tb(l2os(car(S)),Tb);
                   10090:                }
                   10091:                str_tb("]",Tb);
                   10092:                return str_tb(0,Tb);
                   10093:        }
                   10094:        return 0;
                   10095: }
                   10096:
                   10097: def r2os(S)
                   10098: {
                   10099:        if(type(S)==6){
                   10100:                for(T="",S=m2ll(S);S!=[];S=cdr(S)){
                   10101:                        if(T!="") T=T+","+r2os(car(S));
                   10102:                        else T=r2os(car(S));
                   10103:                }
                   10104:                return "mat("+T+")\n";
                   10105:        }else if(type(S)==5){
                   10106:                for(T="",S=v2l(S);S!=[];S=cdr(S)){
                   10107:                        if(T!="") T=T+","+r2os(car(S));
                   10108:                        else T=r2os(car(S));
                   10109:                }
                   10110:                return "vect("+T+")\n";
                   10111:        }else if(type(S)<4) return rtostr(S);
                   10112:        else if(type(S)==4){
                   10113:                for(T="";S!=[];S=cdr(S)){
                   10114:                        if(T!="") T=T+","+r2os(car(S));
                   10115:                        else T=r2os(car(S));
                   10116:                }
                   10117:                return "["+T+"]";
                   10118:        }else if(type(S)==7) return "\""+s2os(S)+"\"";
                   10119:        return "";
                   10120: }
                   10121:
                   10122: def s2euc(S)
                   10123: {
                   10124:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   10125:                if((C=car(L)) == 0x1b && length(L)>1) {
                   10126:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   10127:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   10128:                                        Mode = 1;
                   10129:                                } else return 0;
                   10130:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   10131:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   10132:                                        Mode = 0;
                   10133:                                }else if(C == 0x49) {   /* I */
                   10134:                                        Mode = 2;
                   10135:                                }else{
                   10136:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   10137:                                }
                   10138:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   10139:                                L=cdr(L);
                   10140:                        }else{
                   10141:                                R=cons(0x1b,R);R=cons(C,R);
                   10142:                        }
                   10143:                }else if(C == 0x0e) {
                   10144:                        Mode = 2;
                   10145:         }else if(C == 0x0f) {
                   10146:             Mode = 0;
                   10147:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   10148:                        D=car(L=cdr(L));
                   10149:                        if(D>0x20 && D<0x7f) {
                   10150:                                R=cons(ior(C,0x80),R);R=cons(ior(D,0x80),R);
                   10151:                        } else return 0;
                   10152:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   10153:                        R=cons(0x8e,R);  R=cons(ior(C,0x80),R);
                   10154:                }else if(((C>0x80 && C<0xa0) || (C>0xdf && C<0xf0)) && length(L)>1) {   /* ShiftJIS */
                   10155:                        D=car(L=cdr(L));
                   10156:                        if(D>0x3f && D<0xfd && D!=0x7f) {
                   10157:                                T=sjis2jis([C,D]);
                   10158:                                R=cons(ior(T[0],0x80),R); R=cons(ior(T[1],0x80),R);
                   10159:                        }else return 0;
                   10160:                }else if(C>0x9f && C<0xe0) {            /* HanKana */
                   10161:                        R=cons(0x8e,R);  R=cons(C,R);
                   10162:                }else if(C == 0x0a){
                   10163:                        CR++;
                   10164:                }else if(C == 0x0d){
                   10165:                        R=cons(0x0d,R);
                   10166:                        CR=0;
                   10167:                }else{
                   10168:                        while(CR-->0) R=cons(0x0d,R);
                   10169:                        R=cons(C,R);
                   10170:                }
                   10171:        }
                   10172:        while(CR-->0) R=cons(0x0d,R);
                   10173:        return asciitostr(reverse(R));
                   10174: }
                   10175:
                   10176: def s2sjis(S)
                   10177: {
                   10178:        for(R=[],CR=0,L=strtoascii(S);L!=[];L=cdr(L)){
                   10179:                if((C=car(L)) == 0x1b && length(L)>1) {
                   10180:                        if((C=car(L=cdr(L)))==0x24 && length(L)>1){     /* $ */
                   10181:                                if((C = car(L=cdr(L))) == 0x40 || C == 0x42) {  /* @, B */
                   10182:                                        Mode = 1;
                   10183:                                } else return 0;
                   10184:                        }else if(C == 0x28 && length(L)>1) {    /* ( */
                   10185:                                if((C = car(L=cdr(L)))== 0x42 || C == 0x4a) {  /* B, J */
                   10186:                                        Mode = 0;
                   10187:                                }else if(C == 0x49) {   /* I */
                   10188:                                        Mode = 2;
                   10189:                                }else{
                   10190:                                        R=cons(0x1b,R);R=cons(0x28,R);R=cons(C,R);
                   10191:                                }
                   10192:                        }else if (C == 0x26 && length(L)>1 && car(cdr(L))==0x1b) { /* & ESC */
                   10193:                                L=cdr(L);
                   10194:                        }else{
                   10195:                                R=cons(0x1b,R);R=cons(C,R);
                   10196:                        }
                   10197:                }else if(C == 0x0e) {
                   10198:                        Mode = 2;
                   10199:         }else if(C == 0x0f) {
                   10200:             Mode = 0;
                   10201:                }else if(Mode == 1 && C>0x20 && C<0x7f && length(L)>1) {        /* JIS KANJI */
                   10202:                        D=car(L=cdr(L));
                   10203:                        if(D>0x20 && D<0x7f) {
                   10204:                                T=jis2sjis([C,D]);
                   10205:                                R=cons(T[0],R);R=cons(T[1],R);
                   10206:                        } else return 0;
                   10207:                }else if(Mode == 2 && C > 0x1f && C < 0x60) {                   /* JIS KANA */
                   10208:                        R=cons(ior(C,0x80),R);
                   10209:                }else if(C>0xa0 && C<0xff && length(L)>1) {                             /* EUC */
                   10210:                        D=car(L=cdr(L));
                   10211:                        if(D>0xa0 && D<0xff) {
                   10212:                                T=jis2sjis([iand(C,0x7f),iand(D,0x7f)]);
                   10213:                                R=cons(T[0],R);R=cons(T[1],R);
                   10214:                        }else return 0;
                   10215:                }else if(C == 0x0a){
                   10216:                        CR++;
                   10217:                }else if(C == 0x0d){
                   10218:                        R=cons(0x0a,R);R=cons(0x0d,R);
                   10219:                        CR=0;
                   10220:                }else{
                   10221:                        while(CR-->0){
                   10222:                                R=cons(0x0a,R);R=cons(0x0d,R);
                   10223:                        }
                   10224:                        R=cons(C,R);
                   10225:                }
                   10226:        }
                   10227:        while(CR-->0){
                   10228:                R=cons(0x0a,R);R=cons(0x0d,R);
                   10229:        }
                   10230:        return asciitostr(reverse(R));
                   10231: }
                   10232:
                   10233: def r2ma(S)
                   10234: {
                   10235:        return evalma(S|inv=1);
                   10236: }
                   10237:
                   10238: def evalma(S)
                   10239: {
                   10240:        L0=["\n","\d","{","}","[","]","Log","Exp","Sinh","Cosh","Tanh","Sin","Cos","Tan",
                   10241:                "ArcSin","ArcCos","ArcTan"];
                   10242:        L1=["",  ""  ,"[","]","(",")","log","exp","sinh","cosh","tanh","sin","cos","tan",
                   10243:                "asin",  "acos", "atan"];
                   10244:        if(getopt(inv)==1){
                   10245:                if(type(S)==6) S=m2ll(S);
                   10246:                else if(type(S)==5) S=vtol(S);
                   10247:                if(type(S)==4){
                   10248:                        for(L=[];S!=[];S=cdr(S)){
                   10249:                                if(type(car(S))==6) L=cons(m2ll(car(S)),L);
                   10250:                                else if(type(car(S))==5) L=cons(vtol(car(S)),L);
                   10251:                                else L=cons(car(S),L);
                   10252:                        }
                   10253:                        S=reverse(L);
                   10254:                }else return 0;
                   10255:                return str_subst(rtostr(S),cdr(cdr(L1)),cdr(cdr(L0)));
                   10256:        }
                   10257:        if(S==0){
                   10258:                print("Mathematica text (terminated by ;) ?");
                   10259:                purge_stdin();
                   10260:                Tb=str_tb(0,0);
                   10261:                for(;;){
                   10262:                        S=get_line();
                   10263:                        str_tb(S,Tb);
                   10264:                        if(str_char(S,0,";")>=0) break;
                   10265:                }
                   10266:                S=str_tb(0,Tb);
                   10267:        }
                   10268: /*
                   10269:        while((P=str_chr(S,0,";"))>=0){
                   10270:                V0=evalma(str_cut(S,0,P+1));
                   10271:                S=str_cut(S,P+1,length(S));
                   10272:        }
                   10273:        if((P=str_char(S,0,"="))>=0){
                   10274:                X=strtoascii(str_cut(S,0,P));
                   10275:                L=length(X);
                   10276:                for(P0=P1=-1,I=0;I<L;I++){
                   10277:                        if(L(I)<=32) continue;
                   10278:                        if(isalphanum(L[I])){
                   10279:                                if(P0<0){
                   10280:                                        if(isnum(L[I])) break;
                   10281:                                        P0=I;
                   10282:                                }
                   10283:                                else if(P1!=I+1) break;
                   10284:                                P1=I;
                   10285:                        }
                   10286:                }
                   10287:                if(I==L && P0>=0){
                   10288:                        for(I==P0;I-->0;) X=cdr(X);
                   10289:                        if((X0=car(X))>96) X0-=32;
                   10290:                        Y=[X0];X=cdr(X);
                   10291:                        for(I=P1-P0;I-->0;X=cdr(X))
                   10292:                                Y=cons(car(X),Y);
                   10293:                        Y=cons(61,Y);
                   10294:                        Var=asciitostr(reverse(Y));
                   10295:                        S=str_cut(S,P,length(S));
                   10296:                }
                   10297:        }
                   10298: */
                   10299:        S=eval_str(str_subst(S,L0,L1));
                   10300:        if(type(S)==4){
                   10301:                for(L=-1,T=S;T!=[];T=cdr(T)){
                   10302:                        if(type(T0=car(T))>4) break;
                   10303:                        if(type(T0)<4){
                   10304:                                if(L>=0) break;
                   10305:                                L=-2;continue;
                   10306:                        }
                   10307:                        if(L<-2) break;
                   10308:                        if(L==-1) L=length(T0);
                   10309:                        else if(L!=length(T0)) break;
                   10310:                }
                   10311:                if(T==[]){
                   10312:                        if(L>0) S=s2m(S);
                   10313:                        else S=ltov(S);
                   10314:                }
                   10315:        }
                   10316: /*
                   10317:        if(S==0 && V0!=0) return V0;
                   10318:        if(type(Var)==7){
                   10319:                T=rtostr(S);
                   10320:                if(type(S)==7) T="\""+T+"\"";
                   10321:                S=eval_str(Var+T);
                   10322:                mycat(["Define",Var]);
                   10323:        }
                   10324: */
                   10325:        return S;
                   10326: }
                   10327:
                   10328: def i2hex(N)
                   10329: {
                   10330:        Opt=getopt();
                   10331:        if(type(N)==4 && isint(car(N))){
                   10332: #ifdef USEMODULE
                   10333:                L=mtransbys(os_md.i2hex,N,[]|option_list=Opt);
                   10334: #else
                   10335:                L=mtransbys(i2hex,N,[]|option_list=Opt);
                   10336: #endif
                   10337:                return rtostr(L);
                   10338:        }
                   10339:        if(!isint(N) || N<0) return 0;
                   10340:        if(!N) L=[];
                   10341:        else{
                   10342:                Cap=(getopt(cap)==1)?32:0;
                   10343:                for(L=[];N!=0;N=ishift(N,4)){
                   10344:                        J=iand(N,15);
                   10345:                        L=cons(((J>9)?(87-Cap):48)+J,L);
                   10346:                }
                   10347:        }
                   10348:        if(!isint(Min=getopt(min))) Min=2;
                   10349:        for(Min-=length(L);Min-->0;)
                   10350:                L=cons(48,L);
                   10351:        if(getopt(num)==1){
                   10352:                L=cons(120,L);L=cons(48,L);
                   10353:        }
                   10354:        return asciitostr(L);
                   10355: }
                   10356:
                   10357: def sjis2jis(L)
                   10358: {
                   10359:        L1=L[1];
                   10360:        if((L0=L[0])<=0x9f){
                   10361:                if(L1<0x9f) L0=L0*2-0xe1;
                   10362:                else L0=(L0*2)-0xe0;
                   10363:        }else{
                   10364:                if(L1<0x9f) L0=L0*2-0x161;
                   10365:                else L0=L0*2-0x160;
                   10366:        }
                   10367:        if(L1<0x7f) return [L0,L1-0x1f];
                   10368:        else if(L1<0x9f) return [L0,L1-0x20];
                   10369:        return [L0,L1-0x7e];
                   10370: }
                   10371:
                   10372: def jis2sjis(L)
                   10373: {
                   10374:        L1=L[1];
                   10375:        if(iand(L0=L[0],1)){
                   10376:                if(L1<0x60) L=[L1+0x1f];
                   10377:                else L=[L1+0x20];
                   10378:        }else L=[L1+0x7e];
                   10379:        if(L0<0x5f) return cons(ishift(L0+0xe1,1),L);
                   10380:        return cons(ishift(L0+0x161,1),L);
                   10381: }
                   10382:
                   10383: def verb_tex_form(P)
                   10384: {
                   10385:        L = reverse(strtoascii(rtostr(P)));
                   10386:        for(SS = []; L != []; L = cdr(L)){
                   10387:                Ch = car(L);  /* ^~\{} */
                   10388:                if(Ch == 92 || Ch == 94 || Ch == 123 || Ch == 125 || Ch == 126){
                   10389:                        SS = append([92,Ch,123,125],SS); /* \Ch{}  */
                   10390:                        if(Ch != 94 && Ch != 126)        /* \char` */
                   10391:                                SS = append([92,99,104,97,114,96],SS);
                   10392:                        continue;
                   10393:                }
                   10394:                SS = cons(Ch, SS);
                   10395:                if((Ch >= 35 && Ch <= 38) || Ch == 95)  /* #$%&_ */
                   10396:                        SS = cons(92, SS);  /* \Ch */
                   10397:        }
                   10398:        return asciitostr(SS);
                   10399: }
                   10400:
                   10401: def tex_cuteq(S,P)
                   10402: {
                   10403:        if(P==0) return 0;
                   10404:        if(S[P]==125){ /* } */
                   10405:                if((Q=str_pair(S,P-1,"{","}"|inv=1))<0) return -1;
                   10406:                if(Q<2||S[Q-1]!=95) return Q;
                   10407:                return tex_cuteq(S,Q-2);
                   10408:        }
                   10409:        if(!isalphanum(S[Q=P--])) return -1;
                   10410:        while(P>0&&isalphanum(S[P])) P--;
                   10411:        if(S[P]==92){ /* \ */
                   10412:                if(P==0) return P;
                   10413:                else P--;
                   10414:        }
                   10415:        if(S[P]!=95||P==0) return Q; /* _ */
                   10416:        return tex_cuteq(S,P-1);
                   10417: }
                   10418:
                   10419:
                   10420: def texket(S)
                   10421: {
                   10422:        if(!isint(F=getopt(all))) F=0;
                   10423:        if(type(S)==7){
                   10424:                L=str_len(S);
                   10425:                SS=strtoascii(S);
                   10426:        }else{
                   10427:                L=length(S);
                   10428:                SS=S;
                   10429:        }
                   10430:        for(T="",I=I0=0;I<L-1;){
                   10431:                J=str_char(SS,I,"(");
                   10432:                if(J<0) break;
                   10433:                if(J<L-1 && J>4 && str_str(SS,"\\left"|top=J-5,end=J-1)>=0){
                   10434:                        I=J+1;continue;
                   10435:                }
                   10436:                if((K=str_pair(SS,J+1,"(",")"))>=0){
                   10437:                        KK=str_char(SS,J+2,"(");
                   10438:                        if(KK>K||KK<0){
                   10439:                                if(F!=1){
                   10440:                                        if(!F){
                   10441:                                                for(N=J+1;N<K;N++)      /* + - _   { } */
                   10442:                                                        if(!isalphanum(P=SS[N])&&findin(P,[32,43,45,95,123,125])<0) break;
                   10443:                                        }else N=K;
                   10444:                                        if(N==K){
                   10445:                                                I=K+1;continue;
                   10446:                                        }
                   10447:                                }
                   10448:                                T=T+str_cut(SS,I0,J-1)+"\\left"+str_cut(SS,J,K-1)+"\\right)";
                   10449:                                I0=I=K+1;
                   10450:                        }else{
                   10451:                                T=T+str_cut(SS,I0,J-1)+"\\left("+texket(str_cut(SS,J+1,K-1)|all=F) +"\\right)";
                   10452:                                I0=I=K+1;
                   10453:                        }
                   10454:                }else break;
                   10455:        }
                   10456:        return T+str_cut(SS,I0,L);
                   10457: }
                   10458:
                   10459:
                   10460: def my_tex_form(S)
                   10461: {
                   10462:        if(getopt(skip) != 1){
                   10463:                if(type(S)==1 && S<0)   return "-"+print_tex_form(-S);
                   10464:                if(type(S)==6) return mtotex(S);
                   10465:                S = print_tex_form(S);
                   10466:                for(F=Top=0;(L=str_str(S,"\\verb`"|top=Top))>=0;Top=LV+1){
                   10467:                        F++;
                   10468:                        if(Top==0)      Tb = string_to_tb("");
                   10469:                        LV = str_chr(S, L+6, "`");
                   10470:                        if(LV<0)        LV=str_len(S);
                   10471:                        str_tb([my_tex_form(sub_str(S, Top, L-1)|skip=1), "\\texttt{"], Tb);
                   10472:                        str_tb([verb_tex_form(sub_str(S,L+6, LV-1)),"}"], Tb);
                   10473:                        Top=LV+1;
                   10474:                }
                   10475:                if(F>0){
                   10476:                        str_tb(my_tex_form(sub_str(S, Top,str_len(S)-1)|skip=1), Tb);
                   10477:                        return tb_to_string(Tb);
                   10478:                }
                   10479:        }
                   10480:        if(S==0) return "";
                   10481:        S = ltov(strtoascii(S));
                   10482:        L = length(S)-1;
                   10483:        while(L >= 1 && S[L] == 10)
                   10484:                L--;
                   10485:        if((Fr=getopt(frac))!=0 && Fr!=1) Fr=2;
                   10486:        for(I = L+1, T = K = 0, SS = []; --I >= 0; ){
                   10487:                if(S[I] == 32 && I!=L){
                   10488:                        if(I==L) continue;
                   10489:                        if(findin(S[I+1], [32,40,41,43,45,123,125]) >= 0  /* " ()+-{}" */
                   10490:                                || (S[I+1] >= 49 && S[I+1] <= 57))  /* 1 - 9 */
                   10491:                                        if(I == 0 || S[I-1] >= 32) continue;
                   10492:                }
                   10493:                if(Fr && S[I]>=48 && S[I]<=57){ /* 2/3 -> \tfrac{2}{3} */
                   10494:                        for(K=0,II=I; II>=0; II--){
                   10495:                                if(S[II]>=48 && S[II]<=57) continue;
                   10496:                                if(S[II]==47){  /* / */
                   10497:                                        if(K>0) break;
                   10498:                                        K=II;
                   10499:                                }else break;
                   10500:                        }
                   10501:                        if(K>II+1){
                   10502:                                SS=cons(125,SS);
                   10503:                                for(J=I; J>K; J--) SS=cons(S[J],SS);
                   10504:                                if(AMSTeX){
                   10505:                                        SS=cons(123,SS);SS=cons(125,SS);
                   10506:                                }else{
                   10507:                                        for(J=[114,101,118,111,92];J!=[];J=cdr(J))      /* \over */
                   10508:                                                SS=cons(car(J),SS);
                   10509:                                }
                   10510:                                for(J=K-1;J>II;J--) SS=cons(S[J],SS);
                   10511:                                SS=cons(123,SS);
                   10512:                                if(AMSTeX){
                   10513:                                        J=(Fr==2)?[99,97,114,102,116,92]:[99,97,114,102,92];
                   10514:                                        for(;J!=[];J=cdr(J))    /* \tfrac */
                   10515:                                                SS=cons(car(J),SS);
                   10516:                                }
                   10517:                                I=II+1;
                   10518:                        }else{
                   10519:                                for(;I>II;I--) SS = cons(S[I], SS);
                   10520:                                I++;
                   10521:                        }
                   10522:                        continue;
                   10523:                }
                   10524:                SS = cons(S[I], SS);
                   10525:        }
                   10526:        SS=str_subst(SS,"\\\\\n\\end{pmatrix}","\n\\end{pmatrix}"|raw=1);
                   10527:        Subst=getopt(subst);
                   10528:        Sub0=["{asin}","{acos}","{atan}"];
                   10529:        Sub1=["\\arcsin ","\\arccos","\\arctan "];
                   10530:        if(type(Subst) == 4){
                   10531:                Sub0=append(Sub0,Subst[0]);Sub1=append(Sub1,Subst[1]);
                   10532:        }
                   10533:        SS = str_subst(SS,Sub0,Sub1|raw=1);
                   10534:        S = ltov(SS);
                   10535:        L = length(S);
                   10536:        SS = [];
                   10537:        while(--L >= 0){
                   10538:                if(S[I=L] == 125){
                   10539:                        while(--I >= 0 && S[I] == 125);
                   10540:                        J = 2*I - L;
                   10541:                        if(J >= 0 && S[I] != 123){
                   10542:                                for(K = J; K < I && S[K] == 123; K++);
                   10543:                                if(K == I){
                   10544:                                        if(J-- <= 0 || S[J] < 65 || S[J] > 122 || (S[J] > 90 && S[J] < 97)){
                   10545:                                                SS = cons(S[I],SS);
                   10546:                                                L = J+1;
                   10547:                                                continue;
                   10548:                                        }
                   10549:                                }
                   10550:                        }
                   10551:                }
                   10552:                SS = cons(S[L],SS);
                   10553:        }
                   10554:        RT=getopt(root);
                   10555:        for(Top=0;;Top++){      /* ((x+1))^{y} , 1/y=2,3,...,9 */
                   10556: #if 1
                   10557:                P=str_str(SS,["))^","^{\\tfrac{1}"]|top=Top);
                   10558:                if(P[0]<0) break;
                   10559:                Sq=0;
                   10560:                if(P[0]==0){
                   10561:                        P=P[1];
                   10562:                        if((Q=str_pair(SS,P,"(",")"|inv=1))<0||SS[Q+1]!=40) continue;
                   10563:                        if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   10564:                        && SS[P+14]==125){
                   10565:                                if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   10566:                        }
                   10567:                        F=2;
                   10568:                }else{
                   10569:                        P=P[1];
                   10570:                        if(SS[P+12]!=125||(Sq=(SS[P+11]-48))<2||Sq>9) break;
                   10571:                        if(SS[P-1]==125){
                   10572:                                if((Q=str_pair(SS,P-2,"{","}"|inv=1))<0) break;
                   10573:                                if(Q>1&&SS[Q-1]==95){
                   10574:                                        if((Q=tex_cuteq(SS,Q-2))<0) break;
                   10575:                                        F=0;
                   10576:                                }else F=1;
                   10577:                        }else{
                   10578:                                if(!isalphanum(SS[Q=P-1]) || (Q=tex_cuteq(SS,Q))<0) break;
                   10579:                                F=0;
                   10580:                        }
                   10581:                        if(RT!=2&&P-Q>32) break;
                   10582:                }
                   10583: #else
                   10584:                if((P=str_str(SS,"))^"|top=Top))<0 || (Q=str_pair(SS,P,"(",")"|inv=1))<0) break;
                   10585:                else F=2;
                   10586:                Sq=0;
                   10587:                if((RT==2||(RT!=0 && P-Q<33)) && str_str(SS,"{\\tfrac{1}"|top=P+3,end=P+3)==P+3
                   10588:                   && SS[P+14]==125){
                   10589:                        if((Sq=SS[P+13]-48)<2||Sq>9) Sq=0;
                   10590:                }
                   10591: #endif
                   10592:                for(I=0,S=[];SS!=[];SS=cdr(SS),I++){
                   10593:                        if(I==Q){
                   10594:                                if(Sq){
                   10595:                                        S=append([116,114,113,115,92],S);
                   10596:                                        if(Sq>2) S=append([93,Sq+48,91],S);
                   10597:                                        S=cons(123,S);
                   10598:                                        if(F==2) SS=cdr(SS);
                   10599:                                        else if(F==0) S=cons(car(SS),S);
                   10600:                                }else if(F==2&&P-Q==3){         /* (2)^x -> 2^x*/
                   10601:                                        SS=cdr(SS);SS=cdr(SS);
                   10602:                                        S=cons(123,S);S=cons(car(SS),S);S=cons(125,S);
                   10603:                                        SS=cdr(SS);SS=cdr(SS);
                   10604:                                        I+=3;
                   10605:                                }
                   10606:                                continue;
                   10607:                        }else if(I==P){
                   10608:                                if(Sq){
                   10609:                                        if(F>0) S=cdr(S);
                   10610:                                        S=cons(125,S);
                   10611:                                        if(F==2) SS=cdr(SS);
                   10612:                                        for(J=0;J<12;J++) SS=cdr(SS);
                   10613:                                }
                   10614:                                continue;
                   10615:                        }
                   10616:                        S=cons(car(SS),S);
                   10617:                }
                   10618:                SS=reverse(S);
                   10619:                Top=P;
                   10620:        }
                   10621:        S=asciitostr(SS);
                   10622:        if((K=getopt(ket))==1) S=texket(S);
                   10623:        else if(K==2) S=texket(S|all=1);
                   10624:        return S;
                   10625: }
                   10626:
                   10627: def smallmattex(S)
                   10628: {
                   10629:  return str_subst(S,[["\\begin{pmatrix}","\\left(\\begin{smallmatrix}"],
                   10630:        ["\\end{pmatrix}","\\end{smallmatrix}\\right)"],
                   10631:        ["\\begin{Bmatrix}","\\left\\{\\begin{smallmatrix}"],
                   10632:        ["\\end{Bmatrix}","\\end{smallmatrix}\\right\\}"],
                   10633:        ["\\begin{bmatrix}","\\left[{\\begin{smallmatrix}"],
                   10634:        ["\\end{bmatrix}","\\end{smallmatrix}\\right]"],
                   10635:        ["\\begin{vmatrix}","\\left|\\begin{smallmatrix}"],
                   10636:        ["\\end{vmatrix}","\\end{smallmatrix}\\right|"],
                   10637:        ["\\begin{Vmatrix}","\\left\\|\\begin{smallmatrix}"],
                   10638:        ["\\end{Vmatrix}","\\end{smallmatrix}\\right\\|"],
                   10639:        ["\\begin{matrix}","\\begin{smallmatrix}"],
                   10640:        ["\\end{matrix}","\\end{smallmatrix}"]],0);
                   10641: }
                   10642:
                   10643:
                   10644: def divmattex(S,T)
                   10645: {
                   10646:        TF=["matrix","pmatrix","Bmatrix","bmatrix","vmatrix","Vmatrix"];
                   10647:        TG=[0,"(","\\{","[","|","\\|"];
                   10648:        TH=[0,")","\\}","]","|","\\|"];
                   10649:        if(type(S)!=7) S=mtotex(S);
                   10650:        S=strtoascii(S0=S);
                   10651:        if((P0=str_str(S,"\\begin{"))<0 || (P1=str_str(S,"}"|top=P0+7))<0)
                   10652:                return S0;
                   10653:        F=str_cut(S,P0+7,P1-1);
                   10654:        if((K=findin(F,TF))<0) return S0;
                   10655:        Q=str_str(S,"\\end{"+F+"}");
                   10656:        if(Q<0) return S0;
                   10657:        for(J=P1+1;S[J]<33;J++);
                   10658:        for(L0=L=[],I=J;J<Q;J++){
                   10659:                if(S[J]==38){   /* & */
                   10660:                        if(I>=J) L0=cons(0,L0);
                   10661:                        else L0=cons(str_cut(S,I,J-1),L0);
                   10662:                        I=J+1;
                   10663:                }
                   10664:                if(S[J]==92&&S[J+1]==92){ /* \\ */
                   10665:                        if(I>=J) L0=cons(0,L0);
                   10666:                        else L0=cons(str_cut(S,I,J-1),L0);
                   10667:                        L=cons(reverse(L0),L);
                   10668:                        L0=[];
                   10669:                        J++;
                   10670:                        for(I=J+1;S[I]<33;I++);
                   10671:                }
                   10672:        }
                   10673:        J--;
                   10674:        if(S[J]<33) J--;
                   10675:        if(I<=J) L0=cons(str_cut(S,I,J),L0);
                   10676:        if(length(L0)>0) L=cons(reverse(L0),L);
                   10677:        L=lv2m(reverse(L));     /* get matrix */
                   10678:        if(T==0) return L;
1.26      takayama 10679:        if(type(T)==1) T=[T];
1.6       takayama 10680:        Size=size(L);S0=Size[0];
                   10681:        if(type(T[0])!=4){
                   10682:                S1=Size[1];
                   10683:                T=append(T,[S1]);
                   10684:                for(TT=[],I=0;T!=[];T=cdr(T)){
                   10685:                        J=car(T);
                   10686:                        if(J>S1) J=S1;
                   10687:                        for(T0=[];J>I;J--) T0=cons(J-1,T0);
                   10688:                        if(T0!=[]) TT=cons(T0,TT);
                   10689:                        I=car(T);
                   10690:                }
                   10691:                T=reverse(TT);
                   10692:        }
                   10693:        SS=length(T);
                   10694:        St=str_tb(0,0);
                   10695:        if(SS==1) St=str_tb("\\begin{"+F+"}\n",St);
                   10696:        else{
                   10697:                if(K>0) St=str_tb("&\\left"+TG[K],St);
                   10698:                St=str_tb("\\begin{matrix}\n",St);
                   10699:        }
                   10700:        for(;T!=[];T=cdr(T)){
                   10701:                for(I=0;I<S0;I++){
                   10702:                        for(J=0,TT=car(T);TT!=[];TT=cdr(TT),J++){
                   10703:                                if(J>0) St=str_tb("&",St);
                   10704:                                if(L[I][car(TT)]!=0) St=str_tb(L[I][car(TT)],St);
                   10705:                        }
                   10706:                        if(I<S0-1) St=str_tb("\\\\",St);
                   10707:                        St=str_tb("\n",St);
                   10708:                }
                   10709:                if(length(T)>1)
                   10710:                        St=str_tb("\\end{matrix}\\right.\\\\\n&\\quad\\left.\\begin{matrix}\n",St);
                   10711:                else{
                   10712:                        if(SS==1) St=str_tb("\\end{"+F+"}\n",St);
                   10713:                        else St=str_tb("\\end{matrix}\\right"+TH[K]+"\n",St);
                   10714:                }
                   10715:        }
                   10716:        S=str_tb(0,St);
                   10717:        if(SS==1) return S;
                   10718:        return texbegin("align*",S);
                   10719: }
                   10720:
                   10721: def str_subst(S, L0, L1)
                   10722: {
                   10723:        if(type(S) == 7)
                   10724:                S = strtoascii(S);
                   10725:        if(type(S) == 4)
                   10726:                S = ltov(S);
                   10727:        SE = length(S);
                   10728:        if(L1 == 0){
                   10729:                for(L1 = L = [], L0 = reverse(L0); L0 != []; L0 = cdr(L0)){
                   10730:                        L  = cons(car(L0)[0], L);
                   10731:                        L1 = cons(car(L0)[1], L1);
                   10732:                }
                   10733:                L0 = L;
                   10734:        }
                   10735:        if(type(L0)==7) L0 = [strtoascii(L0)];
                   10736:        else{
                   10737:                for(LT = []; L0 != []; L0 = cdr(L0))
                   10738:                        LT = cons(strtoascii(car(L0)), LT);
                   10739:                L0 = ltov(LT);
                   10740:        }
                   10741:        E0 = length(L0);
                   10742:        if(type(L1)==7) L1 = [strtoascii(L1)];
                   10743:        else{
                   10744:                for(LT = []; L1 != []; L1 = cdr(L1))
                   10745:                        LT = cons(strtoascii(car(L1)), LT);
                   10746:                L1 = ltov(LT);
                   10747:        }
                   10748:        if(getopt(inv)==1){
                   10749:                L2=L0;L0=L1;L0=L2;
                   10750:        }
                   10751:        if((SJIS=getopt(sjis))!=1) SJIS=0;
                   10752:        for(J = JJ = 0, ST = []; J < SE; J++){
                   10753:                SP = S[J];
                   10754:                for(I = E0-1; I >= 0; I--){
                   10755:                        if(SP != L0[I][0] || J + (K = length(L0[I])) > SE)
                   10756:                                continue;
                   10757:                        while(--K >= 1)
                   10758:                                if(L0[I][K] != S[J+K]) break;
                   10759:                        if(K > 0) continue;
                   10760:                        for(KE = length(L1[I]), K = 0 ;K < KE; K++)
                   10761:                                ST = cons(L1[I][K],ST);
                   10762:                        J += length(L0[I])-1;
                   10763:                        break;
                   10764:                }
                   10765:                if(I < 0){
                   10766:                        ST = cons(S[J],ST);
                   10767:                        if(SJIS && (V=S[J])>128){
                   10768:                                if(V<160 || (V>223 && V<240)) ST = cons(S[J++],ST);
                   10769:                        }
                   10770:                }
                   10771:        }
                   10772:        if(getopt(raw)==1) return reverse(ST);
                   10773:        return asciitostr(reverse(ST));
                   10774: }
                   10775:
                   10776: def dviout0(L)
                   10777: {
                   10778:        Cmd=["TikZ","TeXLim","TeXEq","DVIOUT","XYPrec","XYcm","XYLim","Canvas"];
                   10779:        if(type(Opt=getopt(opt))==7){
                   10780:                if((F=findin(Opt,Cmd)) < 0) return -1;
                   10781:                if(L==-1){
                   10782:                        if(F<=3){
                   10783:                                if(F==0) V=TikZ;
                   10784:                                else if(F==1) V=TeXLim;
                   10785:                                else if(F==2) V=TeXEq;
                   10786:                                else V=iand(DVIOUTF,1);
                   10787:                        }else{
                   10788:                                if(F==4) V=XYPrec;
                   10789:                                else if(F==5) V=XYcm;
                   10790:                                else if(F==6) V=XYLim;
                   10791:                                else V=Canvas;
                   10792:                        }
                   10793:                        return V;
                   10794:                }
                   10795:                if(F==0) TikZ=L;
                   10796:                else if(F==2) TeXEq=L;
                   10797:                else if(F==3){
                   10798:                        if(iand(DVIOUTF,1)==L)
                   10799:                                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   10800:                        else dviout0(4);
                   10801:                        return 1;
                   10802:                }else if(F==7&&type(L)==4)
                   10803:                        Canvas=L;
                   10804:                else if(L>0){
                   10805:                        if(F==1) TeXLim=L;
                   10806:                        else if(F==4) XYPrec=L;
                   10807:                        else if(F==5) XYcm=L;
                   10808:                        else if(F==6) XYLim=L;
                   10809:                }
                   10810:                mycat0([Cmd[F],"=",L],1);
                   10811:                return 1;
                   10812:        }
                   10813:        if(type(L) == 4){
                   10814:                for( ; L != []; L = cdr(L)) dviout0(car(L));
                   10815:                return 1;
                   10816:        }
                   10817:        if(type(L) == 7){
                   10818:                if(L=="")  dviout(" \n"|keep=1);
                   10819:                else if(L=="cls")  dviout0(0);
                   10820:                else if(L=="show") dviout(" ");
                   10821:                else if(L=="?")    dviout0(3);
                   10822:                else dviout("\\"+L+"\n"|keep=1);
                   10823:                return 1;
                   10824:        }
                   10825:        if(L == 0)
                   10826:                dviout(" "|keep=1,clear=1);
                   10827:        else if(L == 1)
                   10828:                dviout(" ");
                   10829:        else if(L == 2)
                   10830:                dviout(" "|clear=1);
                   10831:        else if(L>10)
                   10832:                dviout("\\setcounter{MaxMatrixCols}{"+rtostr(L)+"}%"|keep=1);
                   10833:        else if(L < 0)
                   10834:                dviout(" "|delete=-L,keep=1);
                   10835:        else if(L == 3){
                   10836:                mycat0(["DIROUT =\"", DIROUT,"\""],1);
                   10837:                mycat0(["DVIOUTH=\"", DVIOUTH,"\""],1);
                   10838:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   10839:                mycat0(["DVIOUTB=\"", DVIOUTB,"\""],1);
                   10840:                mycat0(["DVIOUTL=\"", DVIOUTL,"\""],1);
                   10841:                mycat(["Canvas =", Canvas]);
                   10842:                mycat(["TeXLim =", TeXLim]);
                   10843:                mycat(["TeXEq  =", TeXEq]);
                   10844:                mycat(["AMSTeX =", AMSTeX]);
                   10845:                mycat(["TikZ   =", TikZ]);
                   10846:                mycat(["XYPrec =", XYPrec]);
                   10847:                mycat(["XYcm   =", XYcm]);
                   10848:                mycat(["XYLim  =", XYLim]);
                   10849:        }else if(L==4){
                   10850:                Tmp=DVIOUTA; DVIOUTA=DVIOUTB; DVIOUTB=Tmp;
                   10851:                mycat0(["DVIOUTA=\"", DVIOUTA,"\""],1);
                   10852:                DVIOUTF++;
                   10853:        }else if(L==5){
                   10854:                if(!iand(DVIOUTF,1)) dviout0(4);
                   10855:        }else if(L==6){
                   10856:                TikZ=1;mycat("TikZ=1");
                   10857:        }else if(L==7){
                   10858:                TikZ=0;mycat("TikZ=0");
                   10859:        }
                   10860:        return 1;
                   10861: }
                   10862:
                   10863: def myhelp(T)
                   10864: {
                   10865:        /* extern DVIOUT;       */
                   10866:        /* extern HDVI; */
                   10867:        /* extern DVIOUTH;      */
                   10868:
                   10869:        if(type(T)==2){
                   10870:                if(T==getbygrs){
                   10871:                        getbygrs(0,0);
                   10872:                        return 0;
                   10873:                }
                   10874:                else if(T==m2mc){
                   10875:                        m2mc(0,0);
                   10876:                        return 0;
                   10877:                }
                   10878:                else if(T==mgen){
                   10879:                        mgen(0,0,0,0);
                   10880:                        return 0;
                   10881:                }
                   10882:                else T=rtostr(T);
                   10883:        }
                   10884:        if(type(T)==4 && typeT[0]==7){
                   10885:                if(length(T)==2 && type(T[1])==1){
                   10886:                        DVIOUTH="start "+T[0]+" -"+rtostr(T[1])+"-hyper:0x90 \"%ASIRROOT%\\help\\os_muldif.dvi\" #r:%LABEL%";
                   10887:                }else if(str_len(T[0])>2)       DVIOUTH=T[0];
                   10888:                mycat(["DVIOUTH="+DVIOUTH,"\nmyhelp(fn) is set!"]);
                   10889:                return 0;
                   10890:        }
                   10891:        if(T==0){
                   10892:                mycat([
                   10893:                        "myhelp(t) : show help\n",
                   10894: #ifdef USEMODULE
                   10895:                        " t : -1 (dvi), 1 (pdf) or os_md.getbygrs, os_md.m2mc, os_md.mgen\n",
                   10896: #else
                   10897:                        " t : -1 (dvi), 1 (pdf) or getbygrs, m2mc, mgen\n",
                   10898: #endif
                   10899:                        "    \"fn\"    : Help of the function fn\n",
                   10900:                        "    [path,n]  : path of dviout, n = # dviout\n",
                   10901:                        "    [DVIOUTH] : Way to jump to the help of a function\n",
                   10902:                        "       default: start dviout -2 \"%ASIRTOOT%\\help\\os_muldif.dvi\" #r:%LABEL%"
                   10903:                ]);
                   10904:                return 0;
                   10905:        }
                   10906:        if(type(T)==7){
                   10907:                if(str_str(T,"os_md.")==0) T=str_cut(T,6,str_len(T)-1);
                   10908:                Dr=str_subst(DVIOUTH,["%ASIRROOT%","%LABEL%"],[get_rootdir(),"r:"+str_subst(T,"_","")]);
                   10909:                shell(Dr);
                   10910:                return 0;
                   10911:        }
                   10912:        Dr=get_rootdir();
                   10913:        if(T==-1) Dr+="\\help\\os_muldif.dvi";
                   10914:        else Dr+="\\help\\os_muldif.pdf";
                   10915:        if(!isMs()) Dr=str_subst(Dr,"\\","/");
                   10916:        shell(Dr);
                   10917:        return 0;
                   10918: }
                   10919:
                   10920: def isMs()
                   10921: {
                   10922:        if(type(Tmp=getenv("TEMP"))!=7) {
                   10923:        if (type(Tmp=getenv("TMP")) != 7) Tmp=getenv("HOME");
                   10924:     }
                   10925:        if(type(Tmp)==7 && str_chr(Tmp,0,"\\")==2) return 1;
                   10926:        else return 0;
                   10927: }
                   10928:
                   10929: def tocsv(L)
                   10930: {
                   10931:        if(type(L)==6) L=m2ll(L);
                   10932:        else if(type(L)==5) L=vtol(L);
                   10933:        Null=getopt(null);
                   10934:        Tb=str_tb(0,0);
                   10935:        for(LL=L; LL!=[]; LL=cdr(LL)){
                   10936:                LT=car(LL);
                   10937:                if(type(LT)==5) LT=vtol(LT);
                   10938:                if(type(LT)<4) LT=[LT];
                   10939:                for(N=0; LT!=[]; LT=cdr(LT),N++){
                   10940:                        if(N) str_tb(", ",Tb);
                   10941:                        if((T=car(LT))==Null) continue;
                   10942:                        if(type(T)==7){
                   10943:                                K=str_len(T);
                   10944:                                T=str_subst(T,["\""],["\"\""]);
                   10945:                                if(str_len(T)>K||str_char(T,0,",")>=0) T="\""+T+"\"";
                   10946:                                str_tb(T,Tb);
                   10947:                        }else str_tb(rtostr(T),Tb);
                   10948:                }
                   10949:                str_tb("\n",Tb);
                   10950:        }
1.16      takayama 10951:        S=str_tb(0,Tb);
                   10952:        if(type(EXE=getopt(exe))!=1&&EXE!=0&&type(EXE)!=7) return S;
                   10953:        if(type(F)!=7){
1.18      takayama 10954:                fcat(-1,0);
1.16      takayama 10955:                F="risaout";
                   10956:                if(EXE>=2&&EXE<=9) F+=rtostr(EXE);
                   10957:                F=DIROUTD+F+".csv";
                   10958:        }else F=S;
                   10959:        if(EXE!=0 && access(F)) remove_file(F);
                   10960:        fcat(F,S|exe=1);
                   10961:        return 1;
1.6       takayama 10962: }
                   10963:
                   10964: def readcsv(F)
                   10965: {
                   10966:        if((ID=open_file(F))<0) return -1;
                   10967:        SJIS=isMs();
                   10968:        L=[];
                   10969:        if(type(V=getopt(eval))!=4){
                   10970:                if(V=="all") V=1;
                   10971:                else if(type(V)==1) V=[V];
                   10972:                else V=[];
                   10973:        }
1.9       takayama 10974:        Eq=getopt(eq);
1.6       takayama 10975:        Sp=getopt(sp);
                   10976:        if(type(T=getopt(col))!=1) T=0;
                   10977:        Null=getopt(null);
1.9       takayama 10978:        if(type(Null)<0) Null=(Eq==1)?0:"";
1.6       takayama 10979:        while((S=get_line(ID))!=0){
                   10980:                S=strtoascii(S);
                   10981:                N=length(S);
                   10982:                for(I=J=F=0,LL=LT=[];I<N;I++){
                   10983:                        C=S[I];
                   10984:                        if(F==0){
                   10985:                                if(C<=32) continue;
                   10986:                                if(C==34){F=2;continue;}
                   10987:                                F=1;
                   10988:                        }
                   10989:                        if(F==2 && C==34){
                   10990:                                if(I<N-1&& S[I+1]==34){
                   10991:                                        LT=cons(34,LT);I++;continue;
                   10992:                                }
                   10993:                                F=-2;
                   10994:                        }
                   10995:                        if(F==1){
                   10996:                                if((C==44&&Sp!=1)||(C<=32&&Sp==1)) F=-1;
                   10997:                                else if(C<32 && C!=9) continue;
                   10998:                        }
                   10999:                        if(SJIS && I<N-1 && ((C>128 && C<160)||(C>223 && C<240))){
                   11000:                                LT=cons(C,LT);LT=cons(S[++I],LT);continue;
                   11001:                        }
                   11002:                        if(F>0){
                   11003:                                LT=cons(C,LT);continue;
                   11004:                        }
                   11005:                        LS=asciitostr(reverse(LT));
1.9       takayama 11006:                        if(V==1||findin(++J,V)>=0){
                   11007:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   11008:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   11009:                        }
1.6       takayama 11010:                        if(!T || T==J) LL=cons(LS,LL);
                   11011:                        if(F==-2) while(++I<N && Sp!=1 && S[I]!=44);
                   11012:                        F=0;LT=[];
                   11013:                }
                   11014:                if(I<=N && (Sp!=1 || length(LT)>0)){ /* lastline */
                   11015:                        LS=asciitostr(reverse(LT));
1.9       takayama 11016:                        if(V==1||findin(++J,V)>=0){
                   11017:                                if(Eq==1) LS=(LS=="")?Null:eval_str(LS);
                   11018:                                else LS=(isdecimal(LS))?eval_str(LS):((LS=="")?Null:LS);
                   11019:                        }
1.6       takayama 11020:                        if(!T || T==J) LL=cons(LS,LL);
                   11021:                }
                   11022:                L=cons(reverse(LL),L);
                   11023:        }
                   11024:        close_file(ID);
                   11025:        if(T) L=m2l(L|flat=1);
1.16      takayama 11026:        L=reverse(L);
                   11027:        return L;
1.6       takayama 11028: }
                   11029:
                   11030: def showbyshell(S)
                   11031: {
                   11032:        Id = getbyshell(S);
                   11033:        if(Id<0) return Id;
                   11034:        while((S=get_line(Id))!=0) print(S,2);
                   11035:        return close_file(Id);
                   11036: }
                   11037:
                   11038:
                   11039: def getbyshell(S)
                   11040: {
                   11041:        /* extern DIROUT;       */
                   11042:
                   11043:        Home=getenv("HOME");
                   11044:        if(type(Home)!=7) Home="";
                   11045:        if(type(Tmp=getenv("TEMP"))!=7 && type(Tmp=getenv("TMP")) != 7)
                   11046:                Tmp=str_subst(DIROUT,["%HOME%","%ASIRROOT%"],[Home,get_rootdir()]);
                   11047:        Sep=isMs()?"\\":"/";
                   11048:        F=Tmp+Sep+"muldif.tmp";
1.16      takayama 11049:        if(type(S)<=1 && S>=0)  close_file(S);
1.6       takayama 11050:        remove_file(F);
                   11051:        if(type(S)<=1) return -1;
                   11052:        shell(S+" > \""+F+"\"");
                   11053:        return open_file(F);
                   11054: }
                   11055:
                   11056: def show(P)
                   11057: {
                   11058:        T=type(P);
                   11059:        S=P;
                   11060:        Var=getopt(opt);
                   11061:        if(Var=="verb"){
                   11062:                dviout("{\\tt"+verb_tex_form(T)+"}\n\n");
                   11063:                return;
                   11064:        }
                   11065:        if(type(Var)<0) Var=getopt(var);
                   11066:        if(T==6){
                   11067:                if((Sp=getopt(sp))==1 || Sp==2)
                   11068:                        S=mtotex(P|lim=1,small=2,sp=Sp,null=1,mat="B");
                   11069:                else if(type(Var)==4 || type(Var)==7)
                   11070:                        S=mtotex(P|lim=1,small=2,var=Var);
                   11071:                else
                   11072:                        S=mtotex(P|lim=1,small=2);
                   11073:                Size=size(P);
                   11074:                Size=(Size[0]>Size[1])?Size[0]:Size[1];
                   11075:                if(Size>10)     dviout0(Size);
                   11076:        }else if(T<=3){
                   11077:                X=0;
                   11078:                if(Var=="pfrac") X=var(P);
                   11079:                else X=getopt(pfrac);
                   11080:                if(isvar(X)){
                   11081:                                pfrac(P,X|dviout=1);
                   11082:                                return;
                   11083:                }
                   11084:                Opt=cons(["dviout",1],getopt());
                   11085:                if(type(Var)==2||type(Var)==4||type(Var)==7) fctrtos(P|option_list=Opt);
                   11086:                else{
                   11087:                        if(isdif(P)!=0) Opt=cons(["var","dif"],Opt);
                   11088:                        else Opt=cons(["br",1],Opt);
                   11089:                        fctrtos(P|option_list=Opt);
                   11090:                }
                   11091:                return;
                   11092:        }else if(T==4){
                   11093:                if(type(Var)==4 || type(Var)==7){
                   11094:                        S=ltotex(P|option_list=getopt());
                   11095:                        if(Var=="text"){
                   11096:                                dviout(S);
                   11097:                                return;
                   11098:                        }
                   11099:                }else{
                   11100:                        for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   11101:                                LL=car(L);
                   11102:                                if(type(LL)==4){
                   11103:                                        if(F==0){
                   11104:                                                T=type(LL[0]);
                   11105:                                                if(T==4)        F=2;                    /* [[[? */
                   11106:                                                else if(T==1 || T==0)   F=1;    /* [[num,.. */
                   11107:                                        }
                   11108:                                        if(F==1){
                   11109:                                                if(length(LL)!=2 || !isint(LL[0]) || LL[0]<0 || type(LL[1])>3)
                   11110:                                                        F=-1;                                   /* [[num,rat],[num,rat],...] */
                   11111:                                        }else if(F==2){
                   11112:                                                for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   11113:                                                        LLL=car(LLT);           /* [[[num,rat],[num,rat],...],[[..],..]],....] */
                   11114:                                                        if(length(LLL)!=2 || !isint(LLL[0]) || LLL[0]<0 || type(LLL[1])>3)
                   11115:                                                                F=-1;
                   11116:                                                }
                   11117:                                        }
                   11118:                                }else if((F==0 || F==7) && type(LL)==7){
                   11119:                                        F=7;
                   11120:                                }else F=-1;
                   11121:                        }
                   11122:                        if(F==1)        S=ltotex(P|opt="spt");
                   11123:                        else if(F==2){
                   11124:                                M=mtranspose(lv2m(S));
                   11125:                                show(M|sp=1);   /* GRS */
                   11126:                                return;
                   11127:                        }else if(F==7)  S=ltotex(P|opt="spts");
                   11128:                        else{
                   11129:                                for(F=0,L=P;L!=[] && F!=-1;L=cdr(L)){
                   11130:                                        LL=car(L);
                   11131:                                        if(type(LL)!=4){
                   11132:                                                F=-1; break;
                   11133:                                        }
                   11134:                                        for(LLT=LL; LLT!=[] && F!=-1; LLT=cdr(LLT)){
                   11135:                                                T=type(LLL=car(LLT));
                   11136:                                                if(T<7 && T!=4) F0++;
                   11137:                                                else if(T==7){
                   11138:                                                        if(str_char(LLL,0,"\\")<0) F1++;
                   11139:                                                        else F2++;
                   11140:                                                }else F=-1;
                   11141:                                        }
                   11142:                                }
                   11143:                        }
                   11144:                        if(F==0 && F0>0 && (F1+F2)>0){  /* list of list of eq and str */
                   11145:                                if(F2>0)        S=ltotex(P|opt=["cr","spts0"],str=1);
                   11146:                                else    S=ltotex(P|opt=["cr","spts"]);
                   11147:                        }else{
                   11148:                                for(S="[";;){
                   11149:                                        S+=my_tex_form(car(P));
                   11150:                                        if((P=cdr(P))==[]){
                   11151:                                                S+="]";break;
                   11152:                                        }
                   11153:                                        S+=",";
                   11154:                                }
                   11155:                        }
                   11156:                }
                   11157:        }else if(T==7){
                   11158:                if(Var=="raw" ||
                   11159:                        (Var !="eq" && str_chr(P,0,"\\")<0 && str_char(P,0,"^")<0 && str_char(P,0,"_")<0
                   11160:                        && str_char(P,0,"&")<0)){
                   11161:                                dviout(P+"\n\n");
                   11162:                                return;
                   11163:                }
                   11164:        }
                   11165:        dviout(S|eq=5);
                   11166: }
                   11167:
                   11168:
                   11169: /* options : eq = 1 - 8, clear=1, keep=1, delete=1, title=s,
                   11170:                                                 fctr=1, begin=s  */
                   11171: def dviout(L)
                   11172: {
                   11173:        /* extern AMSTeX, TeXEq, DIROUT, DVIOUTA, DVIOUTB, DVIOUTL;     */
                   11174:
                   11175:        MyEq = [
                   11176:                ["\\[\n ","\\]"],
                   11177:                ["\\begin{align}\n","\\end{align}"],
                   11178:                ["\\begin{gather}\n ","\\end{gather}"],
                   11179:                ["\\begin{multline}\n ","\\\\[-15pt]\\end{multline}"],
                   11180:                ["\\begin{align}\\begin{split}\n &","\\end{split}\\end{align}"],
                   11181:                ["\\begin{align*}\n &","\\end{align*}"],
                   11182:                ["\\begin{gather*}\n ","\\end{gather*}"],
                   11183:                ["\\begin{equation}\n ","\\end{equation}"]
                   11184:        ];
                   11185:        if(!chkfun("print_tex_form", "names.rr"))
                   11186:                return 0;
                   11187:        Home=getenv("HOME");
                   11188:        if(type(Home)!=7) Home="";
                   11189:        Dir=str_subst(DIROUT,["%HOME%","%ASIRROOT%","\\"],[Home,get_rootdir(),"/"]);
                   11190:        Dirout=Dir+(AMSTeX?"/out.tex":"/out0.tex");
                   11191:        Risaout=(AMSTeX)?"risaout":"risaout0";
                   11192:        Dirisa=Dir+"/"+Risaout+".tex";
                   11193:        Viewer="dviout";
                   11194:        SV=["c:/w32tex/dviout","c:/dviout"];
                   11195:        Risatex=str_subst(AMSTeX?DVIOUTA:DVIOUTL,
                   11196:                        ["%HOME%","%ASIRROOT%","%TikZ%"],[Home,get_rootdir(),rtostr(TikZ)]);
                   11197:        if(isMs() && !access(Risatex)){
                   11198:                for(TV=SV; TV!=[]; TV=cdr(TV)){
                   11199:                        VV=car(TV)+"/dviout.exe";
                   11200:                        if(access(VV)){
                   11201:                                Viewer=str_subst(VV,"/","\\");
                   11202:                                break;
                   11203:                        }
                   11204:                }
                   11205:                output(Risatex);
                   11206:                print("cd \""+str_subst(Dir,"/","\\")+"\"");
                   11207:                print("latex -src=cr,display,hbox,math,par "+Risaout);
                   11208:                print("start "+Viewer+" -1 \""+Dr+"\\tex\\"+Risaout+"\" 1000");
                   11209:                output();
                   11210:        }
                   11211:        if(access(Dirisa) == 0){
                   11212:                D0="\""+(isMs()?str_subst(Dir,"/","\\")+"\"":Dir);
                   11213:                shell("mkdir "+D0);
                   11214:                output(Dirisa);
                   11215:                if(AMSTeX){
                   11216:                        print("\\documentclass[a4paper]{amsart}");
                   11217:                        print("\\usepackage{amsmath,amssymb,amsfonts}");
                   11218:                }else
                   11219:                        print("\\documentclass[a4paper]{article}");
                   11220:                print("\\pagestyle{empty}\n\\begin{document}\n\\thispagestyle{empty}");
                   11221:                print(AMSTeX?"\\input{out}\n\\end{document}":"\\input{out0}\n\\end{document}");
                   11222:                output();
                   11223:        }
                   11224:        if((K = getopt(delete)) >= 1){  /* delete */
                   11225:                LC = 0;
                   11226:                if(type(K) == 1 && K > 10) K = 10;
                   11227:                if(type(K) == 4){
                   11228:                        K = qsort(K);
                   11229:                        LC = 1; /* specific lines */
                   11230:                }
                   11231:                Done = 1;
                   11232:                Id  = open_file(Dirout);
                   11233:                if(Id >= 0){
                   11234:                        Buf = Buf0 = Buf1 = Key = "";
                   11235:                        PE  = 0;
                   11236:                        if(type(K) == 1)
                   11237:                                BufE = newvect(K--);
                   11238:                        Dout = Dirout+"0";
                   11239:                        remove_file(Dout);
                   11240:                        output(Dout);
                   11241:                        while((S = get_line(Id)) != 0){
                   11242:                                if(LC){
                   11243:                                        while(K != [] && car(K) < LC)
                   11244:                                                K = cdr(K);
                   11245:                                        if(K == [] || car(K) > LC)
                   11246:                                                output(S);
                   11247:                                }
                   11248:                                if(Key == ""){
                   11249:                                         if((P0 = str_str(S,"\\begin{")) == 0){
                   11250:                                                 Key = sub_str(S,7,str_str(S,"}")-1);
                   11251:                                                 if(findin(Key,["align", "gather","multline", "equation","align*"]) < 0)
                   11252:                                                         Key = "";
                   11253:                                                 else{
                   11254:                                                         Key = "\\end{"+Key+"}";
                   11255:                                                         if(!LC){
                   11256:                                                                 if(Buf != ""){
                   11257:                                                                         if(PE < K)
                   11258:                                                                                 BufE[PE++] = Buf1+Buf;
                   11259:                                                                         else{
                   11260:                                                                                 if(K > 0){
                   11261:                                                                                         print(BufE[0]);
                   11262:                                                                                         for(I = 1; I < K; I++)
                   11263:                                                                                                 BufE[I-1]=BufE[I];
                   11264:                                                                                         BufE[K-1] = Buf1+Buf;
                   11265:                                                                                 }else
                   11266:                                                                                         print(Buf1+Buf);
                   11267:                                                                                 Done = 0;
                   11268:                                                                         }
                   11269:                                                                         Buf1 = Buf0;
                   11270:                                                                         Buf = Buf0 ="";
                   11271:                                                                 }
                   11272:                                                         }
                   11273:                                                 }
                   11274:                                         }
                   11275:                                         if(Key == "" && !LC) Buf0 += S;
                   11276:                                }
                   11277:                                if(Key != ""){
                   11278:                                        if(!LC) Buf += S;
                   11279:                                        if(str_str(S,Key) >= 0){
                   11280:                                                Key = "";
                   11281:                                                if(LC) LC++;
                   11282:                                        }
                   11283:                                }
                   11284:                        }
                   11285:                        output();
                   11286:                        close_file(Id);
                   11287:                }
                   11288:                if(Done==0){
                   11289:                         Id = open_file(Dout);
                   11290:                         if(Id >= 0){
                   11291:                                 remove_file(Dirout);
                   11292:                                 output(Dirout);
                   11293:                                 while((S = get_line(Id)) != 0)
                   11294:                                         print(S,0);
                   11295:                                 output();
                   11296:                                 close_file(Id);
                   11297:                         }
                   11298:                         remove_file(Dout);
                   11299:                }else L=" ";
                   11300:        }
                   11301:        if(getopt(clear) == 1 || Done == 1){  /* clear */
                   11302:                remove_file(Dirout);
                   11303:                if(L == "" || L == " "){
                   11304:                        output(Dirout);
                   11305:                        print("\\centerline{Risa/Asir}");
                   11306:                        output();
                   11307:                }
                   11308:        }
                   11309:        if(L != " "){
                   11310:                Eq=1;
                   11311:                Eqo = getopt(eq);
                   11312:                Fc = getopt(fctr);
                   11313:                if(Fc == 1 && (type(L) == 2 || type(L) == 3)){
                   11314:                        L = fctrtos(L|TeX=1);
                   11315:                        if(type(L) == 4)
                   11316:                                L = "\\fact{"+L[0]+"}{"+L[1]+"}";
                   11317:                        if(type(Eqo) != 0 && type(Eqo) !=7){
                   11318:                                Eqo=0;
                   11319:                        }
                   11320:                }
                   11321:                if(type(L) != 4 || getopt(mult) != 1)
                   11322:                        L = [L];
                   11323:                if(type(Eqo)!=7 && (Eqo<1 || Eqo>8))
                   11324:                        Eqo = (AMSTeX==1)?TeXEq:1;
                   11325:                Title = getopt(title);
                   11326:                if(type(Title) == 7){
                   11327:                        output(Dirout);
                   11328:                        print(Title);
                   11329:                        output();
                   11330:                }
                   11331:                Sb = getopt(subst);
                   11332:                for( ; L != []; L = cdr(L)){
                   11333:                        Eq = 1;
                   11334:                        if(type(LT=car(L)) != 7 && type(LT) != 21)
                   11335:                                LT = my_tex_form(LT);
                   11336:                        else if(type(getopt(eq)) < 0)
                   11337:                                Eq = 0;
                   11338:                        if(type(Sb) == 4)
                   11339:                                LT = str_subst(LT,Sb[0],Sb[1]);
                   11340:                        output(Dirout);
                   11341:                        if(Eq == 1){
                   11342:                                if(type(Eqo)==7)
                   11343:                                        print(texbegin(Eqo,LT));
                   11344:                                else if(Eqo >= 1 && Eqo <= 8){
                   11345:                                        mycat0([MyEq[Eqo-1][0],LT,"%"],1);
                   11346:                                        print(MyEq[Eqo-1][1]);
                   11347:                                }else print(LT);
                   11348:                        }else print(LT);
                   11349:                        output();
                   11350:                }
                   11351:        }
                   11352:        if(str_char(Risatex,0," ")>=0 && str_char(DVIOUTA,0," ")<0 && str_char(DVIOUTB,0," ")<0
                   11353:         && str_char(DVIOUTL,0," ")<0)
                   11354:                Risatex="\""+Risatex+"\"";
                   11355:        if(getopt(keep) != 1) shell(Risatex);
                   11356:        return 1;
                   11357: }
                   11358:
                   11359: def rtotex(P)
                   11360: {
                   11361:        S = my_tex_form(P);
                   11362:        return (str_len(S) == 1)?S:"{"+S+"}";
                   11363: }
                   11364:
                   11365: def mtotex(M)
                   11366: {
                   11367:        /* extern TexLim;       */
                   11368:
                   11369:        MB=mat(["(",")","p"],["\\{","\\}","B"],["[","]","b"],["|","|","v"],
                   11370:                ["\\|","\\|","V"], [".",".",""]);
                   11371:        if(type(MT=getopt(mat))==7){
                   11372:                MT=findin(MT,["p","B","b","v","V",""]);
                   11373:                if(MT<0)        MT=0;
                   11374:        }
                   11375:        else MT=0;
                   11376:        MT=MB[MT];
                   11377:        if((F=getopt(small))!=1 && F!=2) F=0;
                   11378:        Lim=getopt(lim);
                   11379:        if(type(Lim)==1){
                   11380:                 if(Lim<30 && Lim!=0) Lim = TexLim;
                   11381:        }else Lim=0;
                   11382:        FL=getopt(len);
                   11383:        Rw=getopt(raw);
                   11384:        Sp=getopt(sp);
                   11385:        Idx=getopt(idx);
                   11386:        if(type(Idx)==4) Idx=ltov(Idx);
                   11387:        if(type(Idx)==6 && length(Idx)==0)      Idx=-1;
                   11388:        Var=getopt(var);
                   11389:        if(Lim>0) FL=1;
                   11390:        Null=getopt(null);
                   11391:        if(Null!=1 && Null!=2) Null=0;
                   11392:        if(type(M)==5) M=lv2m([V]);
                   11393:        else if(type(M)!=6) return monototex(M);
                   11394:        S=size(M);
                   11395:        if(FL==1){
                   11396:                L=newmat(S[0],S[1]);    LL=newvect(S[1]);
                   11397:        }
                   11398:        SS=newmat(S[0],S[1]);
                   11399:        for(I=0; I<S[0]; I++){
                   11400:                for(J=0; J<S[1]; J++){
                   11401:                        if(type(P=M[I][J])<=3){
                   11402:                                if(P!=0 || Null == 0 || (Null==2 && I==J)){
                   11403:                                        SS[I][J]=(type(Var)>1)?fctrtos(P|TeX=2,lim=0,var=Var):fctrtos(P|TeX=2,lim=0);
                   11404:                                        if(type(P)==1 && str_str(SS[I][J],"\\frac{-"|end=0)==0)
                   11405:                                                SS[I][J]="-\\frac{"+str_cut(SS[I][J],7,100000);
                   11406:                                }
                   11407:                        }else if(type(P)==6){
                   11408:                                ST= mtotex(P|small=1,len=1);
                   11409:                                SS[I][J]=ST[0];
                   11410:                                L[I][J]=ST[1];
                   11411:                        }else if(type(P)==7){
                   11412:                                if(Rw==1)       SS[I][J]=P;
                   11413:                                else            SS[I][J]="\\text{"+P+"\}";
                   11414:                        }else if(type(P)==4 && length(P)==2 && P[0]>0 && (Sp==1 || Sp==2)){
                   11415:                                if(P[0]==1){
                   11416:                                        SS[I][J]=fctrtos(P[1]|TeX=2,lim=0);
                   11417:                                }else{
                   11418:                                        ST=my_tex_form(P[0]);
                   11419:                                        if(Sp==2)       ST="("+ST+")";
                   11420:                                        SS[I][J]="["+fctrtos(P[1]|TeX=2,lim=0)+"]_";
                   11421:                                        if(str_len(ST)<2)       SS[I][J]+=ST;
                   11422:                                        else    SS[I][J]+="{"+ST+"}";
                   11423:                                }
                   11424:                        }else
                   11425:                                SS[I][J]=my_tex_form(P);
                   11426:                        if(FL==1) L[I][J]=texlen(SS[I][J]);
                   11427:                }
                   11428:        }
                   11429:        if(Lim>0 || FL==1){
                   11430:                for(LLL=J=0; J<S[1];J++){
                   11431:                        for(I=K=0; I<S[0];I++){
                   11432:                                if(K<L[I][J])   K=L[I][J];
                   11433:                        }
                   11434:                        LLL+=(LL[J]=K);
                   11435:                }
                   11436:        }
                   11437:        if(Lim>0){
                   11438:                if(F==2 && LLL>Lim-2*S[1]-2)    F=1;
                   11439:                if(F==1)
                   11440:                        Lim=idiv(Lim*6,5);
                   11441:                if(LLL<=Lim-(2-F)*S[I]-2)       Lim=0;
                   11442:        }
                   11443:        Mat=(F==1)?"smallmatrix}":"matrix}";
                   11444:        if(F==1)        Out=str_tb("\\left"+MT[0]+"\\begin{",0);
                   11445:        else            Out=str_tb((Lim==0)?"\\begin{"+MT[2]:"\\left"+MT[0]+"\\begin{",0);
                   11446:        Out = str_tb(Mat,Out);
                   11447:        for(I=II=LT=0; II<=S[0]; II++){
                   11448:                if(Lim==0) II=S[0];
                   11449:                if(II<S[0]){
                   11450:                        K=LL[II]+(2-F);
                   11451:                        if(I==II){
                   11452:                                LT+=K;
                   11453:                                continue;
                   11454:                        }
                   11455:                        if(LT+K<Lim-2)  continue;
                   11456:                        LT=K;
                   11457:                }
                   11458:                for(I0=I; I<II; I++){
                   11459:                        if(I==I0){
                   11460:                                str_tb((I==0)?
                   11461:                                  "\n ":
                   11462:                                  "\\right.\\\\\n \\allowdisplaybreaks\\\\\n &\\ \\left.\\begin{"+Mat+"\n ", Out);
                   11463:                                if(Idx==1||Idx==0||type(Idx)==5){
                   11464:                                        for(J=I; J<II; J++){
                   11465:                                                if(type(Idx)!=4)
                   11466:                                                        str_tb("("+rtostr(J+Idx)+")",Out);
                   11467:                                                else{
                   11468:                                                        JJ=length(Idx)-1;
                   11469:                                                        if(J<JJ) JJ=J;
                   11470:                                                        str_tb(my_tex_form(Idx[JJ]),Out);
                   11471:                                                }
                   11472:                                                if(J<II) str_tb(" & ",Out);
                   11473:                                        }
                   11474:                                        str_tb("\\\\\n ",Out);
                   11475:                                }
                   11476:                        }
                   11477:                        else str_tb("\\\\\n ",Out);
                   11478:                        for(J=0; J<S[1]; J++){
                   11479:                                if(J!=0) str_tb(" & ",Out);
                   11480:                                if(type(SS[I][J])==7)   str_tb(SS[I][J],Out);
                   11481:                        }
                   11482:                }
                   11483:                Out=str_tb("\n\\end{", Out);
                   11484:                if(II==S[0])    Out=str_tb((Lim==0&&F!=1)?MT[2]+Mat:Mat+"\\right"+MT[1],Out);
                   11485:                else                    Out=str_tb(Mat+"\\right.",Out);
                   11486:        }
                   11487:        SS = str_tb(0,Out);
                   11488:        if(FL!=1)       return SS;
                   11489:        if(F==1)        LLL=idiv((LLL+S[1])*5+13,6);
                   11490:        else LLL+=2*(1+S[1]);
                   11491:        return [SS,LLL];
                   11492: }
                   11493:
                   11494: def sint(N,P)
                   11495: {
1.11      takayama 11496:     if( type(N)==1 || N==0 ) {
1.6       takayama 11497:                NT=ntype(N);
                   11498:                if((type(Opt=getopt(str))==1 || Opt==0) && Opt>=0 && P>=0){
                   11499:                        if(Opt==2 || Opt==4 || Opt==0){
1.11      takayama 11500:                                if(N==0) return (Opt>0)?"0":0;
1.6       takayama 11501:                                Pw=0;
                   11502:                                if(NT==4){
                   11503:                                        NN=abs(real(N));N1=abs(imag(N));
                   11504:                                        if(NN<N1) NN=N1;
                   11505:                                }else NN=abs(N);
                   11506:                                while(NN<1 && NN>-1){
                   11507:                                        Pw--;
                   11508:                                        N*=10;NN*=10;
                   11509:                                }
                   11510:                                while(N>=10 || N<=-10){
                   11511:                                        Pw++;
                   11512:                                        N/=10;NN/=10;
                   11513:                                }
                   11514:                                if(Opt==0) return sint(N*10^Pw,P-Pw-1);
                   11515:                                S=(getopt(sqrt)==1)?sint(N,P|str=(Opt==4)?3:1,sqrt=1):sint(N,P|str=(Opt==4)?3:1);
                   11516:                                if(Pw==0) return S;
                   11517:                                if(NT==4)
                   11518:                                        S="("+S+")";
                   11519:                                if(Pw==1){
                   11520:                                        if(Opt==2)
                   11521:                                                return S+"*10";
                   11522:                                        else
                   11523:                                                return S+"\\times10";
                   11524:                                }
                   11525:                                if(Opt==2)
                   11526:                                        return S+"*10^("+rtostr(Pw)+")";
                   11527:                                else
                   11528:                                        return S+"\\times10^{"+rtostr(Pw)+"}";
                   11529:                        }
                   11530:                        if(NT==4){
                   11531:                                NN=real(N);
                   11532:                                if(NN!=0){
                   11533:                                        S=sint(NN,P|str=1);
                   11534:                                        if(imag(N)>0) S=S+"+";
                   11535:                                }
                   11536:                                else S="";
                   11537:                                S=S+sint(imag(N),P|str=1)+((Opt==3)?((getopt(sqrt)==1)?"\\sqrt{-1}":"i"):"@i");
                   11538:                                return S;
                   11539:                        }
                   11540:                        if(N<0){
                   11541:                                N=-N;
                   11542:                                Neg="-";
                   11543:                        }else Neg="";
1.11      takayama 11544:                        N=rint(N*10^P)/10^P;
1.6       takayama 11545:                        NN=floor(N);
1.11      takayama 11546:                        NV=(N-NN+1)*10^P;
1.6       takayama 11547:                        NS=rtostr(NN);
                   11548:                        if(P<=0) return Neg+NS;
                   11549:                        if(NN==0 && getopt(zero)==0) NS="";
1.11      takayama 11550:                        return Neg+NS+"."+str_cut(rtostr(NV),1,P);
1.6       takayama 11551:                }
                   11552:                if(NT==4)
                   11553:                        return sint(real(N),P)+sint(imag(N),P)*@i;
                   11554:         X = rint( N*10^P );
1.11      takayama 11555:         return deval(X/10^P);
1.6       takayama 11556:        }
                   11557:     if( (type(N)==2) || (type(N)==3) ){
                   11558:                NN = eval(N);
                   11559:                if( type(NN)==1 )
                   11560:                        return sint(NN,P|option_list=getopt());
                   11561:                else return N;
                   11562:        }
1.8       takayama 11563:     if( type(N)>3 && type(N) < 7)
1.6       takayama 11564: #ifdef USEMODULE
                   11565:         return mtransbys(os_md.sint,N,[P]|option_list=getopt());
                   11566: #else
                   11567:         return mtransbys(sint,N,[P]|option_list=getopt()));
                   11568: #endif
1.8       takayama 11569:        return N;
1.6       takayama 11570: }
                   11571:
                   11572: def frac2n(N)
                   11573: {
                   11574:        if((T=type(N))<0) return N;
                   11575:        E=(getopt(big)==1)?eval(@e):0.1;
                   11576:        if(T==1){
1.15      takayama 11577:                if(ntype(N)==0) return (E*N)/E;
1.6       takayama 11578:                else if(ntype(N)!=4) return N;
1.15      takayama 11579:                else return (E*(1+@i)*N)/(E*(1+@i));
1.6       takayama 11580:        }
                   11581:        if(T==3||T==2){
                   11582:                N=red(N);
                   11583:                Nm=nm(N);Var=vars(Nm);V=car(Var);K=length(Var);
                   11584:                for(S=0,I=mydeg(Nm,V);I>=0;I--) S+=frac2n(mycoef(Nm,I,V))*V^I;
                   11585:                return S/dn(N);
                   11586:        }
1.15      takayama 11587:        if(T<4) return (E*N)/E;
1.6       takayama 11588: #ifdef USEMODULE
                   11589:         return mtransbys(os_md.frac2n,N,[]|option_list=getopt());
                   11590: #else
                   11591:         return mtransbys(frac2n,N,[]|option_list=getopt());
                   11592: #endif
                   11593: }
                   11594:
                   11595: def xyproc(F)
                   11596: {
                   11597:        if(type(Opt=getopt(opt))!=7) Opt="";
                   11598:        if(type(Env=getopt(env))!=7)
                   11599:                Env=(!TikZ)?"xy":"tikzpicture";
                   11600:        if(F==1)
                   11601:                return(Opt=="")?"\\begin{"+Env+"}\n":"\\begin{"+Env+"}["+Opt+"]\n";
                   11602:        if(F==0) return "\\end{"+Env+"}\n";
                   11603:        if(type(F)==7){
                   11604:                F=xyproc(1|opt=Opt,env=Env)+F+xyproc(0|env=Env);
                   11605:                if(getopt(dviout)==1) dviout(F);
                   11606:                else return F;
                   11607:        }
                   11608: }
                   11609:
                   11610: def xypos(P)
                   11611: {
                   11612:        if(type(P[0])==7){
                   11613:                if(P[0]=="") S="";
                   11614:                else S=(!TikZ)?"\""+P[0]+"\"":"("+P[0]+")";
                   11615:        }
                   11616:        else{
                   11617:                if(TikZ==0 && XYcm==1){
                   11618:                        X=sint(P[0]*10,XYPrec); Y=sint(P[1]*10,XYPrec);
                   11619:                }else{
                   11620:                        X=sint(P[0],XYPrec); Y=sint(P[1],XYPrec);
                   11621:                }
                   11622:                S="("+rtostr(X)+","+rtostr(Y)+")";
                   11623:        }
                   11624:        if(!TikZ){
                   11625:                if(length(P)>2 && (PP=P[2])!=""){
                   11626:                        S=S+" *";
                   11627:                        if(type(PP)==4 && length(PP)==2 && type(PP[0])==7){
                   11628:                                S=S+PP[0];
                   11629:                                PP=PP[1];
                   11630:                        }
                   11631:                        if(type(PP)==7){
                   11632:                                L=str_len(PP);
                   11633:                                if(str_chr(PP,0,"$")==0 && str_chr(PP,L-1,"$")==L-1){
                   11634:                                        PP=str_cut(PP,1,L-2);
                   11635:                                }else S+="\\txt";
                   11636:                        }
                   11637:                        else PP=my_tex_form(PP);
                   11638:                        S=S+"{"+PP+"}";
                   11639:                }
                   11640:                if(length(P)>3){
                   11641:                        if(type(P[3])==7 && P[3]!="") S=S+"=\""+P[3]+"\"";
                   11642:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   11643:                }
                   11644:        }else{
                   11645:                T="";
                   11646:                if(length(P)>2 && (PP=P[2])!=""){
                   11647:                        F=1;
                   11648:                        if(type(PP)==4){
                   11649:                                if(length(PP)==2 && type(PP[0])==7){
                   11650:                                        T="["+PP[0]+"]";
                   11651:                                        PP=PP[1];
                   11652:                                }
                   11653:                        }
                   11654:                        if(type(PP)!=7) PP="$"+my_tex_form(PP)+"$";
                   11655:                        S=S+"{"+PP+"}";
                   11656:                }else F=0;
                   11657:                if(length(P)>3){
                   11658:                        if(type(P[3])==7 && P[3]!="") T=T+"("+P[3]+")";
                   11659:                        else if(P[3]==1) T=T+"(_)";
                   11660:                        if(length(P)>4 && type(P[4])==7) S=S+P[4];
                   11661:                }
                   11662:                if(length(P)>2){
                   11663:                        if(F) S="node"+T+" at"+S;
                   11664:                        else  S="coordinate"+T+" at"+S;
                   11665:                }
                   11666:        }
                   11667:        return S;
                   11668: }
                   11669:
                   11670: def xyput(P)
                   11671: {
                   11672:        if((type(Sc=getopt(scale))==1 && Sc!=1) || type(Sc)==4){
                   11673:                if(type(Sc)==1) Sc=[Sc,Sc];
                   11674:                Sx=Sc[0];Sy=Sc[1];
                   11675:                if(length(P)>2)
                   11676:                        P1=cons(Sy*P[1],cdr(cdr(P)));
                   11677:                else P1=[Sy*P[1]];
                   11678:                P=cons((type(P[0])==7)?P[0]:(Sx*P[0]),P1);
                   11679:        }
                   11680:        if(!TikZ) return "{"+xypos(P)+"};\n";
                   11681:        return "\\"+xypos(P)+";\n";
                   11682: }
                   11683:
                   11684: def xyline(P,Q)
                   11685: {
                   11686:        if(!TikZ)       return "{"+xypos(P)+" \\ar@{-} "+xypos(Q)+"};\n";
                   11687:        if(type(T=getopt(opt))!=7) T="";
                   11688:        else T="["+T+"]";
                   11689:        if(length(P)<3 && length(Q)<3)
                   11690:                return "\\draw"+T+xypos(P)+"--"+xypos(Q)+";\n";
                   11691:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   11692:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   11693:                P=[P[0],P[1],P[2],"_0"];
                   11694:        else if(length(P)>4 && P[3]=="")
                   11695:                P=[P[0],P[1],P[2],"_0",P[4]];
                   11696:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   11697:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   11698:                Q=[Q[0],Q[1],Q[2],"_1"];
                   11699:        else if(length(Q)>4 && Q[3]=="")
                   11700:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   11701:        return "\\draw "+T+xypos(P)+" "+xypos(Q)+"("+P[3]+")--("+Q[3]+");\n";
                   11702: }
                   11703:
                   11704: def xylines(P)
                   11705: {
                   11706:        Lf=getopt(curve);
                   11707:        if(type(Lf)!=1) Lf=0;
                   11708:        SS=getopt(opt);
                   11709:        SF=(SS==0)?1:0;
                   11710:        if((Proc=getopt(proc))==1||Proc==2||Proc==3){
                   11711:                OL=cons(["opt",0],delopt(getopt(),["opt","proc"]));
                   11712:                R=xylines(P|option_list=OL);
                   11713:                OP=(type(SS)<0)?[]:((type(SS)==4)?[["opt",SS[0]],["cmd",SS[1]]]:[["opt",SS]]);
                   11714:                return [1,OP,R];
                   11715:        }
                   11716:        if(type(SS)!=7 && type(SS)!=4){
                   11717:                if(Lf==0 && !TikZ) SS="@{-}";
                   11718:                else SS="";
                   11719:        }
                   11720:        if(type(Sc=getopt(scale))==1 || type(Sc)==4){
                   11721:                if(type(Sc)==1) Sc=[Sc,Sc];
                   11722:                Sx=Sc[0];Sy=Sc[1];
                   11723:                if(Sx!=1 || Sy!=1){
                   11724:                        for(PP=[], P0=P; P0!=[]; P0=cdr(P0)){
                   11725:                                PT=car(P0);
                   11726:                                if((type(PT)!=4 && type(PT)!=5) || (type(PT[0])!=1 && PT[0]!=0))
                   11727:                                        PP=cons(PT,PP);
                   11728:                                else{
                   11729:                                        if(length(PT)>2 && type(PT)==4)
                   11730:                                                P1=cons(Sy*PT[1],cdr(cdr(PT)));
                   11731:                                        else P1=[Sy*PT[1]];
                   11732:                                        PP=cons(cons(Sx*PT[0],P1),PP);
                   11733:                                }
                   11734:                        }
                   11735:                        P=reverse(PP);
                   11736:                }
                   11737:        }
                   11738:        if(type(Cl=CL0=getopt(close))!=1) Cl=0;
                   11739:        if((Vb=getopt(verb))!=1&&type(Vb)!=4) Vb=0;
                   11740:        if(type(Lf)!=1 || Lf==0){       /* lines */
                   11741:                if(TikZ||SF){
                   11742:                        for(L=[],F=0,PT=P;PT!=[];PT=cdr(PT)){
                   11743:                                if(type(car(PT))<4){
                   11744:                                        L=cons(car(PT),L);
                   11745:                                        F=0;
                   11746:                                }else{
                   11747:                                        if(F++>1) L=cons(1,L);
                   11748:                                        L=cons(car(PT),L);
                   11749:                                }
                   11750:                        }
                   11751:                        if(Cl==1){
                   11752:                                L=cons(1,L);L=cons(-1,L);
                   11753:                        }
                   11754:                        if(L) L=reverse(L);
                   11755:                        if(SF) return L;
                   11756:                        if(type(SS)!=4) S=xybezier(L|opt=SS);
                   11757:                        else S=xybezier(L|opt=SS[0],cmd=SS[1]);
                   11758:
                   11759:                }else{
                   11760:                        Out = str_tb(0,0);
                   11761:                        for(PT=P; PT!=[]; ){
                   11762:                                PS1=car(PT);
                   11763:                                PT=cdr(PT);
                   11764:                                if(PT==[]){
                   11765:                                        if(Cl==1)       PS2=car(P);
                   11766:                                        else PS2=0;
                   11767:                                }else PS2=car(PT);
                   11768:                                str_tb(xyarrow(PS1,PS2|opt=SS),Out);
                   11769:                        }
                   11770:                        S=str_tb(0,Out);
                   11771:                }
                   11772:        }else if(Lf==2){        /* B-spline */
                   11773:                if(SF) return P;
                   11774:                if(!TikZ){
                   11775:                        Out = str_tb("{\\curve{",0);
                   11776:                        for(PT=P;PT!=[];PT=cdr(PT)){
                   11777:                                if(car(PT)==0){
                   11778:                                        str_tb("}};\n{\\curve{",Out);
                   11779:                                        continue;
                   11780:                                }
                   11781:                                if(PT!=P) str_tb("&",Out);
                   11782:                                str_tb(xypos([car(PT)[0],car(PT)[1]]),Out);
                   11783:                        }
                   11784:                        str_tb("}};\n",Out);
                   11785:                        S=str_tb(0,Out);
                   11786:                }else Out=str_tb(xybezier(P|opt=SS),0);
                   11787:                for(I=0;I<2;I++){
                   11788:                        Q=car(P);
                   11789:                        if(length(Q)>2)
                   11790:                                str_tb(xyput(Q),Out);
                   11791:                        P=reverse(P);
                   11792:                }
                   11793:                S=str_tb(0,Out);
                   11794:        }else{          /* extended Bezier */
                   11795:                RTo=getopt(ratio);
                   11796:                if(type(Acc=getopt(Acc))!=1) Acc=0;
                   11797:                if(type(RTo)!=1 || RTo>1.5 || RTo<0.001) RTo=0;
                   11798:                if(Cl==1){
                   11799:                        PR=reverse(P);
                   11800:                        PT=car(PR);
                   11801:                        PR=cons(P[0],PR);
                   11802:                        PR=cons(P[1],PR);
                   11803:                        P=cons(PT,reverse(PR));
                   11804:                }else if(Cl==-1) Cl=1;
                   11805:                for(L=P2=P3=0,PT=P;;){
                   11806:                        P1=P2;P2=P3;P3=P4;
                   11807:                        P4=(PT==[])?0:car(PT);
                   11808:                        if(PT==[] && (Cl==1 || P3==0)) break;
                   11809:                        PT=cdr(PT);
                   11810:                        if(P3==0)       str_tb("%\n", Out);
                   11811:                        if(P2==0 || P3==0 || (Cl==1 && P1==0)) continue;
                   11812:                        if(L!=0){
                   11813:                                if(car(L)==P2)
                   11814:                                        L=cons(1,L);
                   11815:                                else{
                   11816:                                        L=cons(0,L); L=cons(P2,L);
                   11817:                                }
                   11818:                        }else L=[P2];
                   11819:                        X=P3[0]-P2[0];Y=P3[1]-P2[1];
                   11820:                        DL1=DL2=0;DL=Acc?sqrt(X^2+Y^2):dsqrt(X^2+Y^2);
                   11821:                        if(P4!=0){
                   11822:                                XD1=P4[0]-P2[0];YD1=P4[1]-P2[1];DL1=Acc?sqrt(XD1^2+YD1^2):dsqrt(XD1^2+YD1^2);
                   11823:                        }
                   11824:                        if(P1!=0){
                   11825:                                XD2=P3[0]-P1[0];YD2=P3[1]-P1[1];DL2=Acc?sqrt(XD2^2+YD2^2):dsqrt(XD2^2+YD2^2);
                   11826:                        }
                   11827:                        if(RTo!=0)
                   11828:                                R=RTo;
                   11829:                        else if(DL1>0 && DL2>0){
                   11830:                                Cos=(XD1*XD2+YD1*YD2)/(DL1*DL2);
                   11831:                                RT=4/(3*(Acc?sqrt((1+Cos)/2):dsqrt((1+Cos)/2))+3);
                   11832:                                R=DL*RT/(DL1+DL2);
                   11833:                        }else if(DL1!=0)
                   11834:                                R=DL/(2*DL1);
                   11835:                        else if(DL2!=0)
                   11836:                                R=DL/(2*DL2);
                   11837:                        if(DL2!=0)      L=cons([P2[0]+R*XD2,P2[1]+R*YD2],L);
                   11838:                        if(DL1!=0)      L=cons([P3[0]-R*XD1,P3[1]-R*YD1],L);
                   11839:                        L=cons([P3[0],P3[1]],L);
                   11840:                }
                   11841:                if(CL0==1) L=cons(-1,cdr(L));
                   11842:                if(L!=0) L=reverse(L);
                   11843:                if(SF) return L;
                   11844:                if(type(SS)==4)
                   11845:                        S=xybezier(L|opt=SS[0],cmd=SS[1],verb=Vb);
                   11846:                else
                   11847:                        S=xybezier(L|opt=SS,verb=Vb);
                   11848:        }
                   11849:        if(getopt(dviout)!=1) return S;
                   11850:        xyproc(S|dviout=1);
                   11851: }
                   11852:
                   11853: def saveproc(S,Out)
                   11854: {
                   11855:        if(type(Out)==4){
                   11856:                Out=cons(S,Out);
                   11857:                return Out;
                   11858:        }else{
                   11859:                str_tb(S,Out);
                   11860:                return Out;
                   11861:        }
                   11862: }
                   11863:
1.18      takayama 11864: def xygrid(X,Y)
                   11865: {
                   11866:        for(RR=[],I=0,Z=X;I<2;I++){
1.19      takayama 11867:                U=Z[2];L=LL=[];M=Z[3];
                   11868:                if(Z[1]==1||Z[1]==-1){
1.18      takayama 11869:                        if(type(M)==4) L=M;
                   11870:                        else{
1.19      takayama 11871:                                if(U*(-dlog(1-1/20)/dlog(10))>=M){
1.18      takayama 11872:                                        L=cons([1,2,1/10],L);
1.19      takayama 11873:                                        LL=cons([1,2,1/2],LL);
                   11874:                                }else if(U*(-dlog(1-1/10)/dlog(10))>=M)
1.18      takayama 11875:                                        L=cons([1,2,1/5],L);
                   11876:                                else if(U*(-dlog(1-1/4)/dlog(10))>=M)
                   11877:                                        L=cons([1,2,1/2],L);
1.19      takayama 11878:                                if(U*(-dlog(1-1/50)/dlog(10))>=M){
1.18      takayama 11879:                                        L=cons([2,5,1/10],L);
1.19      takayama 11880:                                        LL=cons([2,5,1/2],LL);
                   11881:                                }else if(U*(-dlog(1-1/25)/dlog(10))>=M)
1.18      takayama 11882:                                        L=cons([2,5,1/5],L);
                   11883:                                else if(U*(-dlog(1-1/10)/dlog(10))>=M)
                   11884:                                        L=cons([2,5,1/2],L);
1.19      takayama 11885:                                if(U*(-dlog(1-1/100)/dlog(10))>=M){
1.18      takayama 11886:                                        L=cons([5,10,1/10],L);
1.19      takayama 11887:                                        LL=cons([5,10,1/2],LL);
                   11888:                                }
1.18      takayama 11889:                                else if(U*(-dlog(1-1/50)/dlog(10))>=M)
                   11890:                                        L=cons([5,10,1/5],L);
                   11891:                                else if(U*(-dlog(1-1/20)/dlog(10))>=M)
                   11892:                                        L=cons([5,10,1/2],L);
1.19      takayama 11893:                                L=cons(L,cons(LL,[[[1,10,1]]]));
1.18      takayama 11894:                        }
                   11895:                        R=scale(L|scale=U);
1.19      takayama 11896:                        if(Z[1]==-1){
                   11897:                                for(LL=[];R!=[];R=cdr(R)){
                   11898:                                        for(L=[],T=car(R);T!=[];T=cdr(T)) L=cons(U-car(T),L);
                   11899:                                        LL=cons(reverse(L),LL);
                   11900:                                }
                   11901:                                R=reverse(LL);
                   11902:                        }
1.18      takayama 11903:                }else if(Z[1]==0){
                   11904:                        if(type(M)==4){
                   11905:                                R=scale(M|f=x,scale=U);
                   11906:                        }else{
                   11907:                                V=0;
                   11908:                                if(U/10>=M) V=1/10;
                   11909:                                else if(U/5>=M) V=1/5;
                   11910:                                else if(U/2>=M) V=1/2;
                   11911:                                R=[];
                   11912:                                if(V>0){
                   11913:                                        UU=U*V;
                   11914:                                        for(R=[],J=UU;J<U;J+=UU) R=cons(J,R);
                   11915:                                }
1.19      takayama 11916:                                if(V==1/10) L=[U/2];
                   11917:                                else L=[];
                   11918:                                R=cons(R,cons(L,[[0,U]]));
1.18      takayama 11919:                        }
                   11920:                }else if(type(Z[1])==4){
                   11921:                        R=Z[1];
1.19      takayama 11922:                        if(length(R)==0||type(R[0])!=4) R=[[],[],R];
1.18      takayama 11923:                }else return 0;
1.19      takayama 11924:                K=length(R);
                   11925:                S=newvect(K);
                   11926:                for(J=0;J<K;J++){
                   11927:                        for(S[J]=[],JJ=0;JJ<=Z[0];JJ+=U){
                   11928:                                for(P=R[J];P!=[];P=cdr(P))
                   11929:                                        if(car(P)+JJ<=Z[0]) S[J]=cons(car(P)+JJ,S[J]);
                   11930:                        }
                   11931:                }
                   11932:                for(J=0;J<K;J++) S[J]=lsort(S[J],[],1);
                   11933:                for(U=[],J=K-1;J>0;J--){
                   11934:                        U=lsort(S[J],U,0);S[J-1]=lsort(S[J-1],U,1);
1.18      takayama 11935:                }
1.19      takayama 11936:                RR=cons(vtol(S),RR);
1.18      takayama 11937:                Z=Y;
                   11938:        }
                   11939:        if((Raw=getopt(raw))==1) return RR;
                   11940:        SS=[];
                   11941:        if(type(Sf=getopt(shift))==7){
                   11942:                Sx=Sf[0];Sy=Sf[1];
                   11943:        }else Sx=Sy=0;
                   11944:        for(I=0;I<2;I++){
                   11945:                for(S0=[],L=RR[I];L!=[];L=cdr(L)){
                   11946:                        for(S=[],T=car(L);T!=[];T=cdr(T)){
                   11947:                                if(S!=[]) S=cons(0,S);
                   11948:                                if(I==0){
                   11949:                                        S=cons([X[0]+Sx,car(T)+Sy],S);
                   11950:                                        S=cons([Sx,car(T)+Sy],S);
                   11951:                                }else{
                   11952:                                        S=cons([car(T)+Sx,Y[0]+Sy],S);
                   11953:                                        S=cons([car(T)+Sx,Sy],S);
                   11954:                                }
                   11955:                        }
                   11956:                        S0=cons(S,S0);
                   11957:                }
                   11958:                SS=cons(reverse(S0),SS);
                   11959:        }
                   11960:        SS=reverse(SS);
                   11961:        if(Raw==2) return SS;
                   11962:        if(length(Y)<5) T=[["",""]];
                   11963:        else if(type(Y[4])==4) T=[Y[4]];
                   11964:        else T=[Y[4],Y[4]];
                   11965:        if(length(X[4])==4) T=cons([""],T);
                   11966:        else if(type(X[4])==4) T=cons(X[4],T);
                   11967:        else T=cons([X[4]],T);
                   11968:        for(Sx=Sy=[],I=0;I<2;I++){
                   11969:                TT=T[I];
                   11970:                for(V=SS[I];V!=[];V=cdr(V)){
                   11971:                        Op=car(TT);
                   11972:                        if(length(TT)>1) TT=cdr(TT);
                   11973:                        if(car(V)==[]) continue;
                   11974:                        if(Op=="") S=xylines(car(V));
                   11975:                        else S=xylines(car(V)|opt=Op);
                   11976:                        if(I==0) Sx=cons(S,Sx);
                   11977:                        else Sy=cons(S,Sy);
                   11978:                }
                   11979:        }
                   11980:        for(S="",Sx=reverse(Sx), Sy=reverse(Sy);Sx!=[]&&Sy!=[];){
                   11981:                if(Sx!=[]){
                   11982:                        S+=car(Sx);Sx=cdr(Sx);
                   11983:                }
                   11984:                if(Sy!=[]){
                   11985:                        S+=car(Sy);Sy=cdr(Sy);
                   11986:                }
                   11987:        }
                   11988:        return S;
                   11989: }
                   11990:
                   11991:
1.22      takayama 11992: def addIL(I,L)
1.18      takayama 11993: {
1.22      takayama 11994:        if(I==0){
                   11995:                for(R=[];L!=[];L=cdr(L)) R=addIL(car(L),R);
                   11996:                return reverse(R);
1.18      takayama 11997:        }
1.22      takayama 11998:        if(type(In=getopt(in))==1){
                   11999:                if(In==-1){
                   12000:                        J=JJ=I[1];I=I[0];
                   12001:                        for(R=[];L!=[];L=cdr(L)){
                   12002:                                J=lmin([car(L)[0],JJ]);
                   12003:                                if(J>I) R=cons([I,J],R);
                   12004:                                I=lmax([car(L)[1],I]);
                   12005:                        }
                   12006:                        if(I<JJ) R=cons([I,JJ],R);
                   12007:                        return reverse(R);
                   12008:                }else{
                   12009:                        for(;L!=[];L=cdr(L)){
                   12010:                                if(car(L)[0]>I) return 0;
                   12011:                                if(car(L)[1]>=I){
                   12012:                                        if(In==3) return car(L);
                   12013:                                        if(In==1||(I!=car(L)[0]&&I!=car(L)[1])) return 1;
                   12014:                                        return 2;
                   12015:                                }
                   12016:                        }
                   12017:                        return 0;
                   12018:                }
                   12019:        }
                   12020:        I0=car(I);I1=I[1];
                   12021:        for(F=0,R=[];L!=[];L=cdr(L)){
                   12022:                if(I0>car(L)[1]){
                   12023:                        R=cons(car(L),R);
                   12024:                        continue;
                   12025:                }
                   12026:                if(I0<=car(L)[1]){
                   12027:                        I0=lmin([I0,car(L)[0]]);
                   12028:                        if(I1<car(L)[0]){
                   12029:                                R=cons([I0,I1],R);
                   12030:                                for( ;L!=[];L=cdr(L)) R=cons(car(L),R);
                   12031:                                F=1;
                   12032:                                break;
                   12033:                        }
                   12034:                        I1=lmax([I1,car(L)[1]]);
                   12035:                }
                   12036:        }
                   12037:        if(!F) R=cons([I0,I1],R);
                   12038:        return reverse(R);
1.18      takayama 12039: }
                   12040:
                   12041: def xy2curve(F,N,Lx,Ly,Lz,A,B)
                   12042: {
1.22      takayama 12043:        Raw=getopt(raw);
                   12044:        if(type(Gap=getopt(gap))==4){
                   12045:                MG=Gap[1];Gap=car(Gap);
                   12046:        }else MG=3;
                   12047:        if(type(Gap)!=1 && Gap!=0) Gap=0.7;
                   12048:        if(type(Dvi=getopt(dviout))<1) Dvi=0;
                   12049:        OL=[["dviout",Dvi]];
                   12050:        if(type(Opt=getopt(opt))<1) Opt=0;
                   12051:        else OL=cons(["opt",Opt],OL);
                   12052:        if(type(Sc=getopt(scale))!=1 && type(Sc)!=4) Sc=[1,1,1];
                   12053:        else if(type(Sc)!=4) Sc=[Sc,Sc,Sc];
                   12054:        else if(length(Sc)!=3) Sc=[Sc[0],Sc[1],Sc[1]];
                   12055:        M=diagm(3,Sc);
                   12056:        if(A!=0||B!=0){
                   12057:                if(type(A)==6) M=A;
                   12058:                else M=mrot([0,-B,-A]|deg=1)*M;
                   12059:                V=M*newvect(3,[x,y,z]);
                   12060:                Fx=compdf(V[0],[x,y,z],F);Fy=compdf(V[1],[x,y,z],F);Fz=compdf(V[2],[x,y,z],F);
                   12061:        }else{
                   12062:                for(I=0;I<3;I++){
                   12063:                        if(type(T=F[I])!=4) T=f2df(T);
                   12064:                        if(type(T)==4) T=cons(car(T)*Sc[I],cdr(T));
                   12065:                        else T*=Sc[I];
                   12066:                        if(I==0) Fx=T;
                   12067:                        else if(I==1) Fy=T;
                   12068:                        else Fz=T;
                   12069:                }
                   12070:        }
                   12071:        if(Raw==5||!Gap)
                   12072:                return (Dvi||!Gap)? xygraph([Fy,Fz],N,Lx,Ly,Lz|option_list=OL):[Fx,Fy,Fz];
1.18      takayama 12073:        R=xygraph([Fy,Fz],N,Lx,Ly,Lz|raw=2);
1.22      takayama 12074:        R0=cdr(car(R));R1=R[1];
                   12075:        for(LT=[];R0!=[];R0=cdr(R0),R1=cdr(R1))
                   12076:                if(car(R0)!=0) LT=cons([R1[0],R1[1]],LT);
                   12077:        LT=reverse(LT);
1.19      takayama 12078:        if(N<0){
                   12079:                Be=xylines(car(R)|curve=1,proc=3,close=-1);
                   12080:                LT=reverse(cdr(LT));
                   12081:                LT=reverse(cdr(LT));
                   12082:        }
                   12083:        else Be=xylines(car(R)|curve=1,proc=3);
1.18      takayama 12084:        Be=cdr(cdr(Be));
1.22      takayama 12085:        Be=lbezier(car(Be));
                   12086:        if(Raw==4) return [Be,LT,Lx];
                   12087:        X=ptcombz(Be,0,0);
                   12088:        Var=(length(Lx)==3)?car(Lx):x;
                   12089:        if(type(Eq=getopt(eq))!=1) Eq=0.01;
                   12090:        if(TikZ==1){
                   12091:                Gap/=10;Eq/=10;
1.18      takayama 12092:        }
                   12093:        for(R=[],XT=X;XT!=[];XT=cdr(XT)){
                   12094:                V=car(XT);
1.22      takayama 12095:                U=LT[V[0][0]];
                   12096:                T=U[0]*V[1][0]+U[1]*(1-V[1][0]);
                   12097:                VV=myfdeval(Fx,[Var,T]);
                   12098:                U=LT[V[0][1]];
1.18      takayama 12099:                T=U[0]*V[1][1]+U[1]*(1-V[1][1]);
1.22      takayama 12100:                VV-=myfdeval(Fx,[Var,T]);
                   12101:                if(abs(VV)<Eq) continue;
                   12102:                I=(VV<0)?0:1;
                   12103:                R=cons([V[0][I],V[1][I],V[0][1-I],V[1][1-I]],R);
1.18      takayama 12104:        }
                   12105:        R=qsort(R);
1.22      takayama 12106:        if(Raw==3) return [Be,R];
                   12107:     Db=newvect(L=length(Be));
                   12108:        for(I=0;I<L;I++) Db[I]=[];
                   12109:        for(TR=R;TR!=[];TR=cdr(TR)){
                   12110:        V1=ptbezier(Be,[I=car(TR)[0],P=car(TR)[1]])[1];
                   12111:                V2=ptbezier(Be,[car(TR)[2],car(TR)[3]])[1];
                   12112:                T=dsqrt(1-dvangle(V1,V2)^2);
                   12113:                if(T<1/MG) T=MG;
                   12114:                GP=Gap/T;
                   12115:                W=GP/dnorm(V1);
                   12116:                Db[I]=addIL([P-W,P+W],Db[I]);
                   12117:                if(P-W<0 && I>0) Db[I-1]=addIL([P-W+1,1],Db[I-1]);
                   12118:                if(P+W>1 && I+1<L) Db[I+1]=addIL([0,P+W-1],Db[I+1]);
                   12119:        }
                   12120:        Db=vtol(Db);
                   12121:        for(Bf=[];Be!=[];Be=cdr(Be),Db=cdr(Db)){
                   12122:                if(car(Db)==[]) Bf=cons(car(Be),Bf);
                   12123:                else{
                   12124:                        D=addIL([0,1],car(Db)|in=-1);
                   12125:                        for(;D!=[];D=cdr(D))
                   12126:                                Bf=cons(tobezier(car(Be)|inv=car(D)),Bf);
                   12127:                }
                   12128:        }
                   12129:        Bf=reverse(Bf);
                   12130:        if(Raw==2) return Bf;
                   12131:        OL=[];
                   12132:        if(Opt){
                   12133:                if(type(Opt)==4&&length(Opt)>1) OL=[["opt",Opt[0]],["cmd",Opt[1]]];
                   12134:                else OL=[["opt",Opt]];
                   12135:        }else OL=[];
                   12136:        S=xybezier(lbezier(Bf|inv=1)|option_list=OL);
                   12137:        if(Raw==1||!Dvi) return S;
                   12138:        return xyproc(S|dviout=Dvi);
                   12139: }
                   12140:
                   12141: def rungeKutta(F,N,Lx,Y,IY)
                   12142: {
                   12143:        if((Pr=getopt(prec))==1){
                   12144:                One=eval(exp(0));
                   12145:        }else{
                   12146:                One=1;Pr=0;
                   12147:        }
                   12148:        if((FL=getopt(last))!=1) FL=0;
                   12149:        if(length(Lx)>2){
                   12150:                V=car(Lx);Lx=cdr(Lx);
                   12151:        }else V=x;
                   12152:        if(Pr==0) Lx=[deval(Lx[0]),deval(Lx[1])];
                   12153:        else Lx=[eval(Lx[0]),eval(Lx[1])];
                   12154:        if(type(Y)==4){
                   12155:                if((Sing=getopt(single))==1||type(F)!=4)
                   12156:                        F=append(cdr(Y),[F]);
                   12157:                L=length(Y);
                   12158:                for(TF=[];F!=[];F=cdr(F))
                   12159:                        TF=cons(f2df(car(F)),TF);
                   12160:                F=reverse(TF);
                   12161:        }else{
                   12162:                L=1;
                   12163:                F=f2df(F);
                   12164:        }
                   12165:        if(getopt(val)==1) V1=1;
                   12166:        else V1=0;
                   12167:        H=(Lx[1]-Lx[0])/N;H2=H/2;
                   12168:        FV=findin(V,vars(F));
                   12169:        K=newvect(4);
                   12170:        if(L==1){
                   12171:                R=[[T=Lx[0],S=IY]];
                   12172:                if(!H) return R;
                   12173:                for(;;){
                   12174:                        for(I=0;I<4;I++){
                   12175:                                if(I==0)      W=[[V,T],[Y,S]];
                   12176:                                else if(I==3) W=[[V,T+H],[Y,S+H*K[2]]];
                   12177:                                else          W=[[V,T+H2],[Y,S+H2*K[I-1]]];
                   12178:                                if(FV<0) W=cdr(W);
                   12179:                                K[I]=Pr?myfeval(F,W)*One:myfdeval(F,W);
                   12180:                        }
                   12181:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                   12182:                        if(!FL) R=cons([deval(T),S],R);
                   12183:                        if((T+H-Lx[1])*H>0) break;
                   12184:                }
                   12185:        }else{
                   12186:                T=Lx[0];
                   12187:                R=[cons(T,V1?[car(IY)]:IY)];
                   12188:                S=ltov(IY);
                   12189:                if(!H) return R;
                   12190:                for(;;){
                   12191:                        for(I=0;I<4;I++){
                   12192:                                if(I==0)      W=cons([V,T   ],lpair(Y,vtol(S)));
                   12193:                                else if(I==3) W=cons([V,T+H ],lpair(Y,vtol(S+H*K[2])));
                   12194:                                else          W=cons([V,T+H2],lpair(Y,vtol(S+H2*K[I-1])));
                   12195:                                if(FV<0) W=cdr(W);
                   12196:                                for(TK=[],TF=F;TF!=[];TF=cdr(TF)){
                   12197:                                        TK=cons(Pr?myfeval(car(TF),W)*One:myfdeval(car(TF),W),TK);
                   12198:                                }
                   12199:                                K[I]=ltov(reverse(TK));
                   12200:                        }
                   12201:                        S+=(K[0]+2*K[1]+2*K[2]+K[3])*H/6;T+=H;
                   12202:                        TS=vtol(S);
                   12203:                        if(V1) TS=[car(TS)];
                   12204:                        if(!FL) R=cons(cons(deval(T),TS),R);
                   12205:                        if((T+H-Lx[1])*H>0) break;
                   12206:                }
                   12207:        }
                   12208:        return FL?(V1?S[0]:S):reverse(R);
1.18      takayama 12209: }
                   12210:
1.6       takayama 12211: def xy2graph(F0,N,Lx,Ly,Lz,A,B)
                   12212: {
1.18      takayama 12213:        /* (x,y,z) -> (z sin B + x cos A cos B + y sin A cos B,
                   12214:            -x sin A + y cos A, z cos B - x cos A sin B - y sin A sin B) */
1.6       takayama 12215:        if((Proc=getopt(proc))==1||Proc==2){
                   12216:                OPT0=[["proc",3]];
                   12217:        }else{
                   12218:                Proc=0;OPT0=[];
                   12219:        }
                   12220:        if(type(DV=getopt(dviout))==4){
                   12221:                S=["ext","shift","cl","dviout"];
                   12222:                OL=delopt(getopt(),S);
                   12223:                OL=cons(["proc",1],OL);
                   12224:                R=xy2graph(F0,N,Lx,Ly,Lz,A,B|option_list=OL);
                   12225:                OL=delopt(getopt(),S|inv=1);
                   12226:                return execdraw(R,DV|optilon_list=OL);
                   12227:        }
                   12228:        if(N==0 || N>100 || N<-100) N=-16;
                   12229:        if(N<0){
                   12230:                N=-N;N1=-1;N2=NN+1;
                   12231:        }else{
                   12232:                N1=0;N2=NN=N;
                   12233:        }
                   12234:
                   12235:        Ratio=Ratio2=1;
                   12236:        if(type(Sc=Sc0=getopt(scale))!=1 && type(Sc)!=4) Sc=1;
                   12237:        if(type(Sc)==4){
                   12238:                Ratio=Sc[1]/Sc[0];
                   12239:                if(length(Sc)>2) Ratio2=Sc[2]/Sc[0];
                   12240:                Sc=Sc[0];
                   12241:        }
                   12242:        if(type(Vw=getopt(view))!=1) Vw=0;
                   12243:        if(type(Raw=getopt(raw))!=1) Raw=0;
                   12244:        if(type(M1=getopt(dev))==1) M2=M1;
                   12245:        else if(type(M1)==4){
                   12246:                M2=M1[1];M1=M1[0];
                   12247:        }else M1=0;
                   12248:        if(type(M3=getopt(acc))!=1 || (M3<0.5 && M3>100)) M3=1;
                   12249:        if(M1<=0) M1=16;
                   12250:        if(M2<=0) M2=16;
                   12251:        OL=[["para",1],["scale",Sc]];
                   12252:        if(Raw==1) OL=cons(["raw",1],OL);
                   12253:        if(type(Prec=getopt(prec))>=0) OL=cons(["prec",Prec],OL);
                   12254:        L=newvect(4,[[Lx[1],Ly[0]],[Lx[1],Ly[1]],[Lx[0],Ly[1]],[Lx[0],Ly[0]]]);
                   12255:        Lx=[deval(Lx[0]),deval(Lx[1])];
                   12256:        Ly=[deval(Ly[0]),deval(Ly[1])];
                   12257:        Lz=[deval(Lz[0]),deval(Lz[1])];
                   12258:        A=(A0=A)%360;
                   12259:        F00=F0;
                   12260:        if(type(F0)<4){
                   12261:                FC=f2df(F0);
                   12262:                if(findin(z,Vars=vars(FC))>=0 && findin(x,Vars)<0 && findin(y,Vars)<0)
                   12263:                        F0=[w,[z,0,x+y*@i],[w,os_md.abs,FC]];
                   12264:        }
                   12265:        if(type(Org=getopt(org))==4){   /* shift origin */
                   12266:                Lx=[Lx[0]-Org[0],Lx[1]-Org[0]];
                   12267:                Ly=[Ly[0]-Org[1],Ly[1]-Org[1]];
                   12268:                Lz=[Lz[0]-Org[2],Lz[1]-Org[2]];
                   12269:                F0=mysubst(F0,[[x,x+Org[0]],[y,y+Org[1]]]);
                   12270:                if(type(F0)==4){
                   12271:                        F0=cons(F0[0]-Org[2],cdr(F0));
                   12272:                }
                   12273:                else F0-=Org[2];
                   12274:        }else Org=[0,0,0];
                   12275:        Cpx=getopt(cpx);
                   12276:        if(type(Cpx)<0){
                   12277:                if(str_str(rtostr(F0),"@i")>=0) Cpx=1;
                   12278:                else Cpx=0;
                   12279:        }
                   12280:        if(A<0) A+=360;
                   12281:        if(A<90){
                   12282:                Sh=1;F1=F0;Cx=x-Org[0];Cy=y-Org[1];
                   12283:        }else if(A<180){        /* x -> y, y -> -x */
                   12284:                Sh=2;A-=90; F1=mulsubst(F0,[[x,-y],[y,x]]);
                   12285:                LL=Ly;Ly=[-Lx[1],-Lx[0]];Lx=LL;Cx=y-Org[1];Cy=-x+Org[0];
                   12286:        }else if(A<270){
                   12287:                Sh=3;A-=180; F1=subst(F0,[[x,-x],[y,-y]]);
                   12288:                Lx=[-Lx[1],-Lx[0]];Ly=[-Ly[1],-Ly[0]];Cx=-x+Org[0];Cy=-y+Org[1];
                   12289:        }else{
                   12290:                Sh=4;A-=270;F1=mulsubst(F0,[[x,y],[y,-x]]);
                   12291:                LL=Lx;Lx=[-Ly[1],-Ly[0]];Ly=LL;Cx=-y+Org[1];Cy=x-Org[0];
                   12292:        }
                   12293:        A=@pi*A/180; B=@pi*B/180;
                   12294:        if(A==0) A=@pi/3;
                   12295:        if(B==0) B=@pi/12;
                   12296:        NN=N*M2;
                   12297:        Ac=dcos(deval(A)); As=dsin(deval(A));
                   12298:        if(Ac<=0.087 || As<=0.087){
                   12299:                mycat(["Unsuitable angle",A0,"(6-th argument)!"]);
                   12300:                return -1;
                   12301:        }
                   12302:        Bc=Ratio*dcos(deval(B)); Bs=dsin(deval(B));
                   12303:        if(Bc<0){
                   12304:                mycat("Unsuitable angle (7-th argument)!");
                   12305:                return -1;
                   12306:        }
                   12307:        /*
                   12308:                z = f(x,y)  => X=-As*x+Ac*y, Y= Bc*f(x,y)-Bsc*x-Bss*y
                   12309:                Out X-coord is in [X0,X1], dvided by Dev segments
                   12310:                J-th segment of Y-coord : ZF[J]==1 =>  [Z0[0],Z1[J]]
                   12311:        */
                   12312:        Bsc=Bs*Ac;Bss=Bs*As;
                   12313:        if(Ratio2!=1){
                   12314:                if(Sh%2==1){
                   12315:                        Ac*=Ratio2;Bss*=Ratio2;
                   12316:                }else{
                   12317:                        As*=Ratio2;Bsc*=Ratio2;
                   12318:                }
                   12319:        }
                   12320:        CX=-As*Cx+Ac*Cy;CY=Bc*(z-Org[2])-Bsc*Cx-Bss*Cy;
                   12321:        if(type(Dvi=getopt(dviout))!=1 && getopt(trans)==1) return [CX*Sc,CY*Sc];
                   12322:        if(type(N1=getopt(inf))==1){
                   12323:                if(Proc) Dvi=N1;
                   12324:                else if(Dvi<=0) Dvi=-N1;
                   12325:        }
                   12326:        X0=-As*Lx[1]+Ac*Ly[0];X1=-As*Lx[0]+Ac*Ly[1];
                   12327:        F1=mysubst(F1,[@pi,deval(@pi)]);
                   12328:        Tf=type(F1=f2df(F1|opt=0));
                   12329:        if(Tf!=4)       F=Bc*F1-Bsc*x-Bss*y;
                   12330:        else    F=append([Bc*F1[0]-Bsc*x-Bss*y],cdr(F1));
                   12331:        Dx=(Lx[1]-Lx[0])/NN; Dy=(Ly[1]-Ly[0])/NN;
                   12332:        if(type(Err=getopt(err))==1)
                   12333:                F=mysubst(F,[[x,x+Err*Dx/1011.23],[y,y+Err*Dy/1101.34]]);
                   12334:        Out=(Proc)?[]:str_tb(0,0);
                   12335:        Dev=N*M1;
                   12336:        XD=(X1-X0)/Dev;
                   12337:        OLV=newvect(2,[OL,OL]);
                   12338:        if(type(Ura=getopt(opt))==4 || type(Ura)==7){
                   12339:                if(type(Ura)==7) Ura=[Ura,Ura];
                   12340:                else{
                   12341:                        OLV[0]=cons(["opt",Ura[0]],OL);
                   12342:                        OLV[1]=cons(["opt",Ura[1]],OL);
                   12343:                }
                   12344:        }
                   12345:        for(KC=0; KC<=1; KC++){         /* draw curves */
                   12346:                Z0=newvect(Dev+1); Z1=newvect(Dev+1); ZF=newvect(Dev+1);
                   12347:        for(I=0; I<=NN; I++){
                   12348:                        FV=I%M2;
                   12349:                        if(KC==0){
                   12350:                                X=x; Y=Ly[1]-I*Dy; LX=Lx; DD=Dx; G=mysubst(F,[y,Y]);
                   12351:                                if(!FV){
                   12352:                                        if(!Proc) str_tb(["%y=",rtostr(Y),"\n"],Out);
                   12353:                                        else Out=cons([-2,"y="+rtostr(Y)],Out);
                   12354:                                }
                   12355:                        }else{
                   12356:                                X=Lx[1]-I*Dx; Y=x; LX=Ly; DD=Dy; G=mysubst(F,[[x,X],[y,Y]]);
                   12357:                                if(!FV){
                   12358:                                        if(!Proc) str_tb(["%x=",rtostr(X),"\n"],Out);
                   12359:                                        else Out=cons([-2,"x="+rtostr(X)],Out);
                   12360:                                }
                   12361:                        }
                   12362:                        XX=-As*X+Ac*Y; A1=coef(XX,1,x); A0=coef(XX,0,x); /* XX = A1*x + A0, x = (XX-A0)/A1 */
                   12363:                        if(!FV && Vw==1){
                   12364:                                if(Proc) Out=cons(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1,proc=3),Out);
                   12365:                                else str_tb(xygraph([XX,G],N,LX,[X0,X1],Lz|scale=Sc,para=1),Out);
                   12366:                                continue;
                   12367:                        }
                   12368:                        V=VT=LX[1];
                   12369:                        J0=(subst(XX,x,LX[0])-X0)/XD; J1=(subst(XX,x,LX[1])-X0)/XD;
                   12370:                        if(J0<J1){
                   12371:                                J0=ceil(J0); J1=floor(J1); JD=1;        /* fixed x:  y: dec => (x,z):(dec,inc) */
                   12372:                        }else{
                   12373:                                J0=floor(J0); J1=ceil(J1); JD=-1;       /* fixed y:  x: dec => (x,z):(inc,inc) */
                   12374:                        }
                   12375:                        for(FF=1,J=J1;;J-=JD){
                   12376:                                V1=VT;
                   12377:                                VT=(X0+J*XD-A0)/A1;GG=mysubst(G,[x,VT]);
                   12378:                                if(Cpx>=1) VV=myeval(GG);
                   12379:                                else VV=(Tf==4)? mydeval(GG):deval(GG);         /* J -> V */
                   12380:                                if(ZF[J]==0 || VV<=Z0[J] || VV>=Z1[J]){                  /* visible */
                   12381:                                        if(FF==0){
                   12382:                                                V0=(VT+V1)/2;
                   12383:                                                if(!FV && Vw==-1 && Raw!=1){    /* draw doted line */
                   12384:                                                        K=ceil(M3*(V-V0)/(M2*DD));
                   12385:                                                        if(N1<0) K=-K;
                   12386:                                                        OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"],["scale",Sc],["para",1]]);
                   12387:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|
                   12388:                                                                option_list=OPT),Out);
                   12389:                                                }
                   12390:                                                V=V0;
                   12391:                                        }
                   12392:                                        if(ZF[J]==0){
                   12393:                                                ZF[J]=1; Z0[J]=Z1[J]=VV;
                   12394:                                        }else if(VV<=Z0[J]) Z0[J]=VV;
                   12395:                                        else Z1[J]=VV;
                   12396:
                   12397:                                        if(VV>=Z1[J]) FF=1;
                   12398:                                        else if(VV<=Z0[J]) FF=-1;
                   12399:                                }else{
                   12400:                                        if(FF!=0){
                   12401:                                                V0=(VT+V1)/2;
                   12402:                                                K=ceil(M3*(V-V0)/(M2*DD));
                   12403:                                                if(N1<0) K=-K;
                   12404:                                                if(!FV){
                   12405:                                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   12406:                                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   12407:                                                }
                   12408:                                                V=V0;
                   12409:                                        }
                   12410:                                        FF=0;
                   12411:                                }
                   12412:                                if(J==J0) break;
                   12413:                        }
                   12414:                        if(FV) continue;
                   12415:                        V0=LX[0];K=ceil(M3*(V-V0)/(M2*DD));
                   12416:                        if(N1<0) K=-K;
                   12417:                        if(FF!=0){
                   12418:                                if(Raw!=1){
                   12419:                                        OPT=append(OPT0,OLV[(1-FF)/2]);
                   12420:                                        Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   12421:                        }else if(Vw==-1 && Raw!=1){
                   12422:                                OPT=append(OPT0,[["opt",(TikZ)?"dotted":"~*=<3pt>{.}"]]);
                   12423:                                Out=saveproc(xygraph([XX,G],K,[V0,V],[X0-1,X1+1],Lz|option_list=OPT),Out);
                   12424:                                }
                   12425:                        }
                   12426:                }
                   12427:        }
                   12428:        OptSc=(Sc==1)?[]:[["scale",Sc]];
                   12429:        if(type(LZ=getopt(ax))==4){             /* draw box */
                   12430:                FC=0;
                   12431:                if(length(LZ)==3) FC=LZ[2];
                   12432:                P0=newvect(2,[-As*Lx[1]+Ac*Ly[1],Bc*(LZ[0]-Org[0])-Bsc*Lx[1]-Bss*Ly[1]]);
                   12433:                Vx=newvect(2,[As*(Lx[1]-Lx[0]),Bsc*(Lx[1]-Lx[0])]);
                   12434:                Vy=newvect(2,[Ac*(Ly[0]-Ly[1]),Bss*(Ly[1]-Ly[0])]);
                   12435:                Vz=newvect(2,[0,Bc*(LZ[1]-LZ[0])]);
                   12436:                OL=OL0=append(OPT0,OL);
                   12437:                if(TikZ && type(Ura)==4 && length(Ura)>2) OL0=cons(["opt",Ura[2]],OL);
                   12438:                LL=[[P0+Vz,P0+Vx+Vz],[P0,P0+Vx]];
                   12439:                if(Bs>0){
                   12440:                        LL=cons([P0+Vy+Vz,Pz=P0+Vx+Vy+Vz],LL);
                   12441:                        LL=cons([P0+Vx+Vz,Pz],LL);
                   12442:                        PP=Pz-Vz;
                   12443:                }
                   12444:                else{
                   12445:                        LL=cons([P0+Vy,Pz=P0+Vx+Vy+Vz],LL);
                   12446:                        LL=cons([P0+Vx,Pz],LL);
                   12447:                        PP=Pz+Vz;
                   12448:                }
                   12449:                J=ceil((PP[0]-X0)/XD+0.5);
                   12450:                LL=append([[P0+Vy,P0+Vy+Vz],[P0+Vy,P0+Vy+Vz],[P0+Vx,P0+Vx+Vz],[P0,P0+Vz],
                   12451:                        [P0+Vz,P0+Vy+Vz],[P0,P0+Vy]],LL);
                   12452:                for(LL=reverse(LL);LL!=[];LL=cdr(LL)) Out=saveproc(xylines(car(LL)|option_list=OL0),Out);
                   12453:                if(Dev>4) Dev2=ceil(Dev/2);
                   12454:                if(FC<0 && Raw!=1){
                   12455:                        if(TikZ){
                   12456:                                if(type(Ura)==4 && length(Ura)>2)
                   12457:                                        OL1=cons(["opt",Ura[2]+",dotted"],OL);
                   12458:                                else OL1=cons(["opt","dotted"],OL);
                   12459:                        }else OL1=cons(["opt","@{.}"],OL);
                   12460:                        if(FC==-8) FC=0;
                   12461:                }
                   12462:                for(I=0;I<3;I++){               /* box with hidden part */
                   12463:                        if(I==1) Pz=PP-Vx;
                   12464:                        else if(I==2) Pz=PP-Vy;
                   12465:                        LP=Pz-PP;
                   12466:                        for(FV=-1,K=0;K<=Dev2; K++){
                   12467:                                PPx=PP[0]+(K/Dev2)*LP[0]; PPy=PP[1]+(K/Dev2)*LP[1];
                   12468:                                J=ceil((PPx-X0)/XD);
                   12469:                                if(K!=Dev2 && (J<0||J>Dev)) continue;
                   12470:                                if(K!=Dev2 && (ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){    /* visible */
                   12471:                                        if(FV!=1){
                   12472:                                                FV=1;
                   12473:                                                PPP=[PPx,PPy];
                   12474:                                        }
                   12475:                                }else{
                   12476:                                        if(FV!=0){
                   12477:                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   12478:                                                FV=0;
                   12479:                                        }
                   12480:                                }
                   12481:                        }
                   12482:                }
                   12483:                if(FC!=0 && Raw!=1){    /* show coordinate*/
                   12484:                        if(iand(FC,4)){
                   12485:                                Sub=1;
                   12486:                                if(TikZ){
                   12487:                                         S0="\\scriptsize";S1="";
                   12488:                                }else{
                   12489:                                         S0="{}_{"; S1="}";
                   12490:                                }
                   12491:                        }else Sub=0;
                   12492:                        if(iand(FC,2))
                   12493:                                LLL=[[1,0,P0+Vx,(TikZ)?"right":"+!L"],[3,0,P0+Vy,(TikZ)?"left":"+!R"]];
                   12494:                        else LL=[];
                   12495:                        if(Bs>0){
                   12496:                                LLL=cons([0,0,P0,(TikZ)?"below":"+!U"],LLL);
                   12497:                                LLL=cons([2,1,P0+Vx+Vy+Vz,(TikZ)?"above":"+!D"],LLL);
                   12498:                        }else{
                   12499:                                LLL=cons([2,0,P0+Vx+Vy,(TikZ)?"below":"+!U"],LLL);
                   12500:                                LLL=cons([0,1,P0+Vz,(TikZ)?"above":"+!D"],LLL);
                   12501:                        }
                   12502:                        for(TLL=LLL;TLL!=[];TLL=cdr(TLL)){
                   12503:                                TL=car(TLL);LL=L[(Sh+TL[0])%4];
                   12504:                                if(Cpx==0 || Cpx==3){
                   12505:                                        S=ltotex([LL[0],LL[1],LZ[TL[1]]]|opt="coord");
                   12506:                                        SS="("+rtostr(LL[0]) +","+rtostr(LL[1])+","+rtostr(LZ[TL[1]])+")";
                   12507:                                }else{
                   12508:                                        S=ltotex([LL[0]+LL[1]*@i,LZ[TL[1]]]|opt="coord",cpx=Cpx);
                   12509:                                        SS="("+rtostr(LL[0])+"+"+rtostr(LL[1])+"i,"+ rtostr(LZ[TL[1]])+")";
                   12510:                                }
                   12511:                                if(TikZ) S="$"+S+"$";
                   12512:                                if(Sub) S=S0+S+S1;
                   12513:                                if(!TikZ) S="$"+S+"$";
                   12514:                                if(Proc) Out=cons([2,OptSc,[TL[2][0],TL[2][1]],[[TL[3],S]],SS],Out);
                   12515:                                else str_tb(xyput([TL[2][0],TL[2][1],[TL[3],S]]|option_list=OptSc),Out);
                   12516:                        }
                   12517:                }
                   12518:        }
                   12519:        if(type(Pt=getopt(pt))==4){             /* option pt=[] */
                   12520:                if(type(Pt[0])<4) Pt=[[Pt]];
                   12521:                if(length(Pt)>1&&type(Pt[1])!=4) Pt=[Pt];
                   12522:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   12523:                        PP=car(PT);
                   12524:                        if(type(PP)==4 && length(PP)==3 && type(PP[0])<2 && type(PP[2])<2) PP=[PP];
                   12525:                        P=car(PP);
                   12526:                        if(type(P)==7) Q=[P,0];
                   12527:                        else if(P==1) Q=["_",0];
                   12528:                        else Q=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   12529:                        if(length(PP)>1 && type(PP[1])==4 && length(PP[1])==3){         /* draw line */
                   12530:                                PP=cdr(PP);P=car(PP);
                   12531:                                if(type(P)==7) Q1=P;
                   12532:                                else if(P==1) Q="_";
                   12533:                                else Q1=mysubst([CX,CY],[[x,deval(P[0])],[y,deval(P[1])],[z,deval(P[2])]]);
                   12534:                                if(length(PP)<2 || PP[1]==0 || iand(PP[1],1)) OL2="";
                   12535:                                else OL2=(TikZ)?"dotted":"@{.}";
                   12536:                                if(length(PP)>2 && type(PP[2])==7){
                   12537:                                        if(OL2=="") OL2=PP[2];
                   12538:                                        else{
                   12539:                                                if(TikZ)  OL2=OL2+",";
                   12540:                                                OL2=OL2+PP[2];
                   12541:                                        }
                   12542:                                }
                   12543:                                OL1=OL;
                   12544:                                if(OL2!="") OL1=cons(["opt",OL2],OL1);
                   12545:                                if(length(PP)<2 || PP[1]>=0)
                   12546:                                        Out=saveproc(xylines([Q,Q1]|option_list=OL1),Out);
                   12547:                                else{
                   12548:                                        LP0=Q1[0]-Q[0];LP1=Q1[1]-Q[1];
                   12549:                                        for(FV=-1,K=0;K<=Dev2; K++){
                   12550:                                                PPx=Q[0]+(K/Dev2)*LP0; PPy=Q[1]+(K/Dev2)*LP1;
                   12551:                                                J=ceil((PPx-X0)/XD);
                   12552:                                                if(K!=Dev2 && (J<0 || J>Dev || ZF[J]==0 || PPy<Z0[J] || PPy>Z1[J])){
                   12553:                                                        /* visible */
                   12554:                                                        if(FV!=1){
                   12555:                                                                FV=1;
                   12556:                                                                PPP=[PPx,PPy];
                   12557:                                                        }
                   12558:                                                }else{
                   12559:                                                        if(FV!=0){
                   12560:                                                                if(FV==1) Out=saveproc(xylines([PPP,[PPx,PPy]]|option_list=OL1),Out);
                   12561:                                                                FV=0;
                   12562:                                                        }
                   12563:                                                }
                   12564:                                        }
                   12565:                                }
                   12566:                                continue;
                   12567:                        }
                   12568:                        if(length(PP)==1) S="$\\bullet$";
                   12569:                        else if(type(PP[1])==7) S=PP[1];
                   12570:                        else if(type(PP[1])==4){
                   12571:                                if(length(PP[1])>1 && type(PP[1][1])!=7)
                   12572:                                         S=cons(car(PP),cons("$\\bullet$",cdr(cdr(PP))));
                   12573:                                else S=PP[1];
                   12574:                        }else S="$\\bullet$";
                   12575:                        if(length(PP)<=2){
                   12576:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S]],Out);
                   12577:                                else str_tb(xyput([Q[0],Q[1],S]|option_list=OptSc),Out);
                   12578:                        }else if(!TikZ){
                   12579:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],[S,"",PP[2]]],Out);
                   12580:                                else str_tb(xyput([Q[0],Q[1],S,"",PP[2]]|option_list=OptSc),Out);
                   12581:                        }else{
                   12582:                                if(Proc) Out=cons([2,OptSc,[Q[0],Q[1]],cons(S,cdr(cdr(PP)))],Out);
                   12583:                                else str_tb(xyput(append([Q[0],Q[1],S],cdr(cdr(PP)))|option_list=OptSc),Out);
                   12584:                        }
                   12585:                }
                   12586:        }
                   12587:        if(Proc){
                   12588:                S=reverse(Out);
                   12589:                if(Proc==1||Proc==3){
                   12590:                        for(W=[],I=0;I<2;I++) for(J=0;J<2;J++) for(K=0;K<2;K++)
                   12591:                                W=cons(mysubst([CX*Sc,CY*Sc],[[x,Lx[I]],[y,Ly[J]],[z,Lz[K]]]),W);
                   12592:                        W=ptbbox(W);
                   12593:                        S=cons([0,W[0],W[1],(TikZ)?1:1/10],S);
                   12594:                }
                   12595:        }else S=str_tb(0,Out);
                   12596:        if(type(Dvi)!=1||(Proc&&abs(Dvi)<2)) return S;
                   12597:        Lout=[];
                   12598:        if(abs(Dvi)>=2){
                   12599:                /* show title */
                   12600:                L0=[];
                   12601:                Title=getopt(title);
                   12602:                if(type(Title)!=7)
                   12603:                                 Title=(type(F00)==4)?("\\texttt{"+verb_tex_form(F00)+"}"):my_tex_form(F00);
                   12604:                if(type(Title)==7){
                   12605:                        T=my_tex_form(L[3][0])+"\\le x\\le "+my_tex_form(L[1][0])+",\\,"+
                   12606:                                my_tex_form(L[3][1])+"\\le y\\le "+my_tex_form(L[1][1])+")";
                   12607:                        if(Proc){
                   12608:                                if(Cpx>=1) L0=[[5,[["eq",1]],"|"+Title+"|\\quad(z=x+yi,\\ "+T]];
                   12609:                                else L0=[[5,[["eq",1]],"z="+Title+"\\ \\ ("+T]];
                   12610:                        }else{
                   12611:                                if(Cpx>=1) dviout("|"+Title+"|\\quad(z=x+yi,\\ "+T|eq=1,keep=1);
                   12612:                                else dviout("z="+Title+"\\ \\ ("+T|eq=1,keep=1);
                   12613:                        }
                   12614:                }
                   12615:                A=rint(deval(180*A/@pi))+90*(Sh-1);
                   12616:                if(A>=180) A-=180;
                   12617:                B=rint(deval(180*B/@pi));
                   12618:                if(abs(Dvi)>=3){
                   12619:                        T="\\text{angle } ("+my_tex_form(A)+"^\\circ,"+my_tex_form(B)+"^\\circ)";
                   12620:                        if(Ratio!=1 || Ratio2!=1) T=T+"\\quad\\text{ratio }1:"
                   12621:                                +my_tex_form(sint(Ratio2,2))+":"+my_tex_form(sint(Ratio,2));
                   12622:                        if(Proc) L0=cons([5,[["eq",1]],T],L0);
                   12623:                        else  dviout(T|eq=1,keep=1);
                   12624:                }
                   12625:                SS="% range "+rtostr([L[3][0],L[1][0]])+"x"+rtostr([L[3][1],L[1][1]])+
                   12626:                        "  angle ("+ rtostr(A) +","+ rtostr(B)+")  dev=";
                   12627:                if(M1==M2) SS=SS+rtostr(M1);
                   12628:                else SS=SS+rtostr([M1,M2]);
                   12629:                if(M3!=1) SS=SS+"  acc="+rtostr(M3);
                   12630:                if(type(Sc0)>=0) SS=SS+"  scale="+rtostr(Sc0);
                   12631:                if(Proc){
                   12632:                        S=cons([5,[],SS],S);
                   12633:                        for(;L0!=[];L0=cdr(L0)) S=cons(car(L0),S);
                   12634:                        return S;
                   12635:                }
                   12636:                if(Dvi>0){
                   12637:                        dviout(SS|keep=1);
                   12638:                        dviout(xyproc(S)|eq=8);
                   12639:                }else Lout=[SS,S];
                   12640:        }else{
                   12641:                if(Dvi>0) dviout(xyproc(S));
                   12642:                else Lout=[S];
                   12643:        }
                   12644:        if(getopt(trans)==1) return cons([CX*Sc,CY*Sc],Lout);
                   12645:        if(Dvi<0) return Lout;
                   12646: }
                   12647:
1.20      takayama 12648: def orthpoly(N)
                   12649: {
                   12650:        F=0;
                   12651:        if(type(P=getopt(pol))==7){
                   12652:                for(L=["Le","Ge","Tc","2T","Ja","He","La","Se"];L!=[];L=cdr(L),F++)
                   12653:                        if(str_str(P,car(L)|end=2)==0) break;
                   12654:        }else P=0;
                   12655:        if(type(D=N)==4) D=N[0];
                   12656:        if(!isint(D)||D<0) return 0;
                   12657:        if(F==0) return seriesHG([-D,D+1],[1],(1-x)/2,D);
                   12658:        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));
                   12659:        if(F==2) return seriesHG([-D,D],[1/2],(1-x)/2,D);
                   12660:        if(F==3){
                   12661:                if(D==0) return 0;
                   12662:                return orthpoly([D-1,1]|pol="Ge");
                   12663:        }
                   12664:        if(F==4) return red(seriesHG([-D,D+N[1]],[N[2]],x,D));
                   12665:        if(F==5){
                   12666:                for(S=I=1;I<=D;I+=2) S*=I;
                   12667:                if(iand(D,1)) return seriesHG([-(D-1)/2],[3/2],x^2/2,D-1)*x*S*(-1)^((D-1)/2);
                   12668:                else return seriesHG([-D/2],[1/2],x^2/2,D)*S*(-1)^(D/2);
                   12669:        }
                   12670:        if(F==6){
                   12671:                NN=(type(N)==4)?N[1]:0;
                   12672:                return red(seriesHG([-D],[NN+1],x,D)*binom(D+NN,D));
                   12673:        }
                   12674:        if(F==7){
                   12675:                NN=N[1];
                   12676:                for(S=1,I=1;I<=D;I++) S+=(-1)^I*binom(D,I)*binom(D+I,I)*sftpow(x,I)/sftpow(NN,I);
                   12677:                return S;
                   12678:        }
                   12679:        return 0;
                   12680: }
                   12681:
                   12682: def schurpoly(L)
                   12683: {
                   12684:        N=length(L);
                   12685:        for(R=[],I=1;L!=[];L=cdr(L),I++) R=cons(car(L)+N-I,R);
                   12686:        L=reverse(R);
                   12687:        if(type(X=getopt(var))!=4){
                   12688:                V=(type(X)>1)?X:"x";
                   12689:                for(X=[],I=0;I<N;I++) X=cons(makev([V,N-I]),X);
                   12690:        }
                   12691:        M=newmat(N,N);
                   12692:        for(I=0;I<N;I++)
                   12693:                for(J=0;J<N;J++) M[I][J]=X[I]^L[J];
                   12694:        P=det(M);
                   12695:        for(I=0;I<N;I++)
                   12696:                for(J=I+1;J<N;J++) P=sdiv(P,X[I]-X[J]);
                   12697:        return P;
                   12698: }
                   12699:
1.6       takayama 12700: def fouriers(A,B,X)
                   12701: {
1.20      takayama 12702:        if((Y=getopt(y))==0||type(Y)>0) Y=deval(Y);
                   12703:        else Y=0;
                   12704:        if((V=getopt(const))==0||type(V)>0){
                   12705:                V=myfeval(V,Y);
                   12706:                K=1;
                   12707:        }else K=0;
1.6       takayama 12708:        if(A!=[]&&type(car(A))>1){
1.20      takayama 12709:                for(C=[],I=A[1];I>=K;I--) C=cons(myf2eval(car(A),I,Y),C);
                   12710:                if(K) C=cons(0,C);
1.6       takayama 12711:                A=C;
                   12712:        }
1.20      takayama 12713:        if(K){
                   12714:                if(A!=[]) A=cdr(A);
                   12715:                A=cons(V,A);
                   12716:        }
1.6       takayama 12717:        if(B!=[]&&type(car(B))>1){
1.20      takayama 12718:                for(C=[],I=B[1];I>0;I--) C=cons(myf2eval(car(B),I,Y),C);
1.6       takayama 12719:                B=C;
                   12720:        }
1.20      takayama 12721:        L=length(B)+1;
                   12722:        if(length(A)>=L) L=length(A)+1;
                   12723:        if(type(Sum=getopt(sum))>0){
                   12724:                if(Sum==1) Sum=1-x;
                   12725:                else if(Sum==2) Sum=[(z__)/(3.1416*x),[z__,os_md.mysin,3.1416*x]];
                   12726:                else Sum=f2df(Sum);
                   12727:                C=[];
                   12728:                if(A!=[]){
                   12729:                        C=cons(car(A),C);
                   12730:                        A=cdr(A);
                   12731:                }
                   12732:                for(I=1;A!=[];A=cdr(A),I++) C=cons(car(A)*myf2eval(Sum,I/L,L),C);
                   12733:                A=reverse(C);
                   12734:                for(C=[],I=1;B!=[];B=cdr(B),I++) C=cons(car(B)*myf2eval(Sum,I/L,L),C);
                   12735:                B=reverse(C);
                   12736:        }
1.6       takayama 12737:        if(getopt(cpx)==1){
1.20      takayama 12738:                if(type(X=eval(X))>1) return todf([os_md.fouriers,[["cpx",1]]],[[A],[B],[X]]);
1.6       takayama 12739:                V=dexp(@i*X);
                   12740:                for(C=A,P=1,I=0;C!=[];C=cdr(C),I++){
1.20      takayama 12741:                        R+=S*car(C)*P;
1.6       takayama 12742:                        P*=V;
                   12743:                }
                   12744:                V=dexp(-@i*X);
                   12745:                for(C=B,P=1,I=0;C!=[];C=cdr(C),I++){
                   12746:                        P*=V;
                   12747:                        R+=car(C)*P;
                   12748:                }
                   12749:                return R;
                   12750:        }
                   12751:        if(type(X=eval(X))>1) return todf(os_md.fouriers,[[A],[B],[X]]);
                   12752:        for(C=A,I=0;C!=[];C=cdr(C),I++)
                   12753:                R+=car(C)*mycos(I*X);
                   12754:        for(C=B,I=1;C!=[];C=cdr(C),I++)
                   12755:                R+=car(C)*mysin(I*X);
                   12756:        return R;
                   12757: }
                   12758:
                   12759:
                   12760: def myexp(Z)
                   12761: {
                   12762:        if(type(Z=eval(Z))>1) return todf(os_md.myexp,[Z]);
                   12763:        if((Im=imag(Z))==0) return dexp(Z);
                   12764:        return dexp(real(Z))*(dcos(Im)+@i*dsin(Im));
                   12765: }
                   12766:
                   12767: def mycos(Z)
                   12768: {
                   12769:        if(type(Z=eval(Z))>1) return todf(os_md.mycos,[Z]);
                   12770:        if((Im=imag(Z))==0) return dcos(Z);
                   12771:        V=myexp(Z*@i);
                   12772:        return (V+1/V)/2;
                   12773: }
                   12774:
                   12775: def mysin(Z)
                   12776: {
                   12777:        if(type(Z=eval(Z))>1) return todf(os_md.mysin,[Z]);
                   12778:        if((Im=imag(Z))==0) return dsin(Z);
                   12779:        V=myexp(Z*@i);
                   12780:        return (1/V-V)*@i/2;
                   12781: }
                   12782:
                   12783: def mytan(Z)
                   12784: {
                   12785:        if(type(Z=eval(Z))>1) return todf(os_md.mytan,[Z]);
1.17      takayama 12786:        if((Im=imag(Z))==0) return dtan(Z);
1.6       takayama 12787:        V=myexp(2*Z*@i);
                   12788:        return @i*(1-V)/(1+V);
                   12789: }
                   12790:
                   12791: def mylog(Z)
                   12792: {
                   12793:        if(type(Z=eval(Z))>1) return todf(os_md.mylog,[Z]);
                   12794:        if((Im=imag(Z))==0) return dlog(Z);
                   12795:        return dlog(dabs(Z))+@i*myarg(Z);
                   12796: }
                   12797:
                   12798: def mypow(Z,R)
                   12799: {
                   12800:        if(type(Z=eval(Z))>1||type(R=eval(R))>1) return todf(os_md.mypow,[Z,R]);
                   12801:        if(Z==0) return 0;
                   12802:        if(isint(2*R)){
                   12803:                if(R==0) return 1;
                   12804:                if(isint(R)) return Z^R;
                   12805:                V=dsqrt(Z);
                   12806:                if(R==1/2) return V;
                   12807:                return Z^(R-1/2)*V;
                   12808:        }
                   12809:        return myexp(R*mylog(Z));
                   12810: }
                   12811:
                   12812: def myarg(Z)
                   12813: {
                   12814:        if(type(Z=map(eval,Z))==4){
                   12815:                if(length(Z)!=2) return todf(os_md.myarg,[Z]);
                   12816:                Re=Z[0];Im=Z[1];
                   12817:        }else if(type(Z)>1){
                   12818:                return todf(os_md.myarg,[Z]);
                   12819:        }else {
                   12820:                Im=imag(Z);Re=real(Z);
                   12821:        }
                   12822:        if(Re==0) return (Im<0)?-deval(@pi)/2:deval(@pi)/2;
                   12823:        V=datan(Im/Re);
                   12824:        if(Re>0) return V;
                   12825:        return (V>0)?(V-deval(@pi)):(V+deval(@pi));
                   12826: }
                   12827:
                   12828: def myatan(Z)
                   12829: {
                   12830:        if(type(Z=eval(Z))>1) return todf(os_md.myatan,[Z]);
                   12831:        if((Im=imag(Z))==0) return datan(Z);
                   12832:        mylog((1-Z*@i)/(1+Z*@i))*@i/2;
                   12833: }
                   12834:
                   12835: def myasin(Z)
                   12836: {
                   12837:        if(type(Z=eval(Z))>1) return todf(os_md.myasin,[Z]);
                   12838:        return deval(@pi/2)-myacos(Z);
                   12839: }
                   12840:
                   12841: def frac(X)
                   12842: {
                   12843:        if(type(X=eval(X))>1) return todf(os_md.frac,[X]);
                   12844:        return (ntype(X)==3)? pari(frac,X):(X-floor(X));
                   12845: }
                   12846:
                   12847: def myacos(Z)
                   12848: {
                   12849:        if(type(Z=eval(Z))>1) return todf(os_md.myacos,[Z]);
                   12850:        if(imag(Z)==0 && Z<=1 && Z>=-1) return dacos(Z);
                   12851:        return mylog(Z-dsqrt(Z^2-1))*@i;
                   12852: }
                   12853:
                   12854: def arg(Z)
                   12855: {
                   12856:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.arg,[Z]);
                   12857:     return (type(Z)==4)?pari(arg,Z[0],Z[1]):arg(sqrt,Z);
                   12858: }
                   12859:
                   12860: def sqrt(Z){
                   12861:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.sqrt,[Z]);
                   12862:        R=(type(Z)==4)?Z[1]:Z;
                   12863:        if(ntype(R)==0){
                   12864:                if(R==0) return 0;
                   12865:                if(R>0){
                   12866:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R));
                   12867:                }else{
                   12868:                        R=-R;
                   12869:                        if(pari(issquare,R)) return pari(isqrt,nm(R))/pari(isqrt,dn(R))*@i;
                   12870:                }
                   12871:     }
                   12872:        return (type(Z)==4)?pari(sqrt,Z[0],Z[1]):pari(sqrt,Z);
                   12873: }
                   12874:
                   12875: def gamma(Z)
                   12876: {
                   12877:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.gamma,[Z]);
                   12878:     return (type(Z)==4)?pari(gamma,Z[0],Z[1]):pari(gamma,Z);
                   12879: }
                   12880:
                   12881: def lngamma(Z)
                   12882: {
                   12883:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.lngamma,[Z]);
                   12884:     return (type(Z)==4)?pari(lngamma,Z[0],Z[1]):pari(lngamma,Z);
                   12885: }
                   12886:
                   12887: def digamma(Z)
                   12888: {
                   12889:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.digamma,[Z]);
                   12890:     return (type(Z)==4)?pari(digamma,Z[0],Z[1]):pari(digamma,Z);
                   12891: }
                   12892:
                   12893: def dilog(Z)
                   12894: {
                   12895:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.dilog,[Z]);
                   12896:     return (type(Z)==4)?pari(dilog,Z[0],Z[1]):pari(dilog,Z);
                   12897: }
                   12898:
                   12899: def erfc(Z)
                   12900: {
                   12901:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.erfc,[Z]);
                   12902:        return (type(Z)==4)?pari(erfc,Z[0],Z[1]):pari(erfc,Z);
                   12903: }
                   12904:
                   12905: def zeta(Z)
                   12906: {
                   12907:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.zeta,[Z]);
                   12908:     return (type(Z)==4)?pari(zeta,Z[0],Z[1]):pari(zeta,Z);
                   12909: }
                   12910:
                   12911: def eta(Z)
                   12912: {
                   12913:        if(vars(Z=map(eval,Z))!=[]) return todf(os_md.eta,[Z]);
                   12914:     return (type(Z)==4)?pari(eta,Z[0],Z[1]):pari(eta,Z);
                   12915: }
                   12916:
                   12917: def jell(Z)
                   12918: {
                   12919:        if(vars(Z=map(eval,V))>1) return todf(os_md.jell,[Z]);
                   12920:     return (type(Z)==4)?pari(jell,Z[0],Z[1]):jell(jell,Z);
                   12921: }
                   12922:
                   12923: def evals(F)
                   12924: {
                   12925:        if(type(F)==7){
                   12926:                if(type(Del=getopt(del))!= 7) return eval_str(F);
                   12927:                S=strtoascii(Del);K=length(S);
                   12928:                if(K==0) return [eval_str(F)];
                   12929:                Raw=getopt(raw);
                   12930:                F=strtoascii(F);L=[];T1=0;
                   12931:                do{
                   12932:                        T2=str_str(F,S|top=T1);
                   12933:                        if(T2<0) T2=10000;
                   12934:                        FT=str_cut(F,T1,T2-1);
                   12935:                        L=cons((Raw==1)?FT:evals(FT),L);
                   12936:                        T1=T2+K;
                   12937:                }while(T2!=10000);
                   12938:                return reverse(L);
                   12939:        }
                   12940:        if(type(F)==4){
                   12941:                if(type(S=car(F))==7){
                   12942:                        S+="(";
                   12943:                        for(I=0,FT=cdr(F); FT!=[]; I++,FT=cdr(FT)){
                   12944:                                if(type(ST=car(FT))!=7) ST=rtostr(ST);
                   12945:                                if(I>0) S=S+","+ST;
                   12946:                                else S=S+ST;
                   12947:                        }
                   12948:                        S=S+")";
                   12949:                        return eval_str(S);
                   12950:                }else return call(S,cdr(F));
                   12951:        }
                   12952:        return F;
                   12953: }
                   12954:
                   12955: def myval(F)
                   12956: {
                   12957:        if(type(F)!=4){
                   12958:                F=f2df(sqrt2rat(F));
                   12959:                if(type(F)!=4) return F;
                   12960:        };
                   12961:        if(length(F)==1) V=car(F);
                   12962:        else for(V=car(F),F=cdr(F); F!=[];){
                   12963:                FT=car(F);
                   12964:                if(type(G=FT[1])==2){
                   12965:                        if(length(FT)>2){
                   12966:                                FT2=myval(FT[2]);
                   12967:                                if(length(FT)>3) FT3=myval(FT[3]);
                   12968:                        };
                   12969:                        X=red(FT2/@pi);Vi=-red(FT2*@i/@pi);W=red(FT2/@e);
                   12970:                        if(G==os_md.mypow && FT3==1/2){
                   12971:                                G=os_md.sqrt;
                   12972:                                FT=[FT[0],G,FT[2]];
                   12973:                        }
                   12974:                        if((T=findin(G,
                   12975:                                  [sin,os_md.mysin,cos,os_md.mycos,tan,os_md.mytan]))>=0
                   12976:                                  &&(isint(6*X)||isint(4*X))){
                   12977:                                if(T==2||T==3){
                   12978:                                        T=0;X=1/2-X;
                   12979:                                }
                   12980:                                X=X-floor(X/2)*2;
                   12981:                                if(T==0||T==1){
                   12982:                                        if(X>1){
                   12983:                                                S=-1;X-=1;
                   12984:                                        }else S=1;
                   12985:                                        if(X>1/2) X=1-X;
                   12986:                                        if(X==0) R=0;
                   12987:                                        else if(X==1/6) R=1/2;
                   12988:                                        else if(X==1/4) R=2^(1/2)/2;
                   12989:                                        else if(X==1/3) R=3^(1/2)/2;
                   12990:                                        else R=1;
                   12991:                                        R*=S;
                   12992:                                }else{
                   12993:                                        if(X>1) X-=1;
                   12994:                                        if(X>1/2){
                   12995:                                                S=-1;V=1-X;
                   12996:                                        }else S=1;
                   12997:                                        if(X==0) R=0;
                   12998:                                        else if(X==1/6) R=3^(1/2)/3;
                   12999:                                        else if(X==1/4) R=1;
                   13000:                                        else if(X==1/3) R=3^(1/2);
                   13001:                                        else R=2^512;
                   13002:                                        R*=S;
                   13003:                                }
                   13004:                        }else if((G==exp||G==os_md.myexp)&&(isint(FT2)||isint(6*Vi)||isint(4*Vi))){
                   13005:                                if(isint(FT2)) R=@e^FT2;
                   13006:                                else R=myval([z+w*@i,[z,cos,Vi*@pi],[w,sin,Vi*@pi]]);
                   13007:                        }else if((G==pow||G==os_md.mypow) && (isint(FT3)||FT2==1||FT2==0)){
                   13008:                                if(FT2==0) R=0;
                   13009:                                else if(FT2==1) R=1;
                   13010:                                else R=FT2^FT3;
                   13011:                        }else if(G==os_md.abs&&ntype(P=eval(FT2))<4){
                   13012:                                R=FT2;
                   13013:                                if(P<0) R=-R;
                   13014:                        }else if((G==os_md.sqrt||G==dsqrt)&&type(FT2)<2&&ntype(FT2)==0)
                   13015:                                R=sqrtrat(FT2);
                   13016:                        else if((G==os_md.mylog||G==dlog)&&(FT2==@e||FT2==1))
                   13017:                                R=(FT2==1)?0:1;
                   13018:                        else if(length(FT)==3) R=eval((*G)(myeval(FT2)));
                   13019: #ifdef USEMODULE
                   13020:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   13021: #else
                   13022:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   13023: #endif
                   13024:                }
                   13025:                else if(G==0) R=FT[2];
                   13026: #ifdef USEMODULE
                   13027:                        else R=eval(call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]));
                   13028: #else
                   13029:                        else R=eval(call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]));
                   13030: #endif
                   13031:                V=mysubst(V,[FT[0],R]);
                   13032:                F=mysubst(cdr(F),[FT[0],R]);
                   13033:        }
                   13034:        if(type(V)<4 && !iscoef(V,os_md.iscrat)) V=eval(V);
                   13035: #if 0
                   13036:        return (type(V)<4)?myeval(V):mtransbys(os_md.myeval,V,[]);
                   13037: #else
                   13038:        return V;
                   13039: #endif
                   13040: }
                   13041:
                   13042: /* -1:空  0:整数 1:有理数 2:Gauss整数 3:Gauss有理数 4:それ以外の複素数 */
                   13043: /* def vntype(F)
                   13044: {
                   13045:        if((T=type(F))<2){
                   13046:                if(T<0) return -1;
                   13047:                if((Tn=ntype(F))==0){
                   13048:                        return (isint(F))?0:1;
                   13049:                }
                   13050:                if(Tn==4){
                   13051:                        if(ntype(real(F))==0&&ntype(real(F))==0)
                   13052:                                return (isint(F)&&isint(F))?2:3;
                   13053:                        return 4;
                   13054:                }
                   13055:        }
                   13056:        if(T==2){
                   13057:                V=vars(F);
                   13058:                if((VV=lsort(V,[@e,@pi],1))==[]){
                   13059:                        FT=mycoef(
                   13060:                }else{
                   13061:                        if(length(VV)==1){
                   13062:                        }else
                   13063:                }
                   13064:        }else if(T==3){
                   13065:
                   13066:        }
                   13067: }
                   13068: */
                   13069:
                   13070:
                   13071: def myeval(F)
                   13072: {
                   13073:        if(type(F)!=4)  V=F;
                   13074:        else if(length(F)==1) V=car(F);
                   13075:        else for(V=car(F),F=cdr(F); F!=[];){
                   13076:                FT=car(F);
                   13077:                if(type(G=FT[1])==2){
                   13078:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   13079: #ifdef USEMODULE
                   13080:                        else R=call(G,map(os_md.myeval,cdr(cdr(FT))));
                   13081: #else
                   13082:                        else R=call(G,map(myeval,cdr(cdr(FT))));
                   13083: #endif
                   13084:                }
                   13085:                else if(G==0) R=myeval(FT[2]);
                   13086: #ifdef USEMODULE
                   13087:                        else R=call(G[0],map(os_md.myeval,cdr(cdr(FT)))|option_list=G[1]);
                   13088: #else
                   13089:                        else R=call(G[0],map(myeval,cdr(cdr(FT)))|option_list=G[1]);
                   13090: #endif
                   13091:                V=mysubst(V,[FT[0],R]);
                   13092:                F=mysubst(cdr(F),[FT[0],R]);
                   13093:        }
                   13094:        return (type(V)<4)?eval(V):mtransbys(eval,V,[]);
                   13095: }
                   13096:
                   13097: def mydeval(F)
                   13098: {
                   13099:        if(type(F)!=4) V=F;
                   13100:        else if(length(F)==1) V=car(F);
                   13101:        else for(V=car(F),F=cdr(F); F!=[]; ){
                   13102:                FT=car(F);
                   13103:                if(type(G=FT[1])==2){
                   13104:                        if(length(FT)==3) R=(*G)(myeval(FT[2]));
                   13105: #ifdef USEMODULE
                   13106:                        else R=call(G,map(os_md.mydeval,cdr(cdr(FT))));
                   13107: #else
                   13108:                        else R=call(G,map(mydeval,cdr(cdr(FT))));
                   13109: #endif
                   13110:                }
                   13111:                else if(G==0) R=mydeval(FT[2]);
                   13112: #ifdef USEMODULE
                   13113:                        else R=call(G[0],map(os_md.mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   13114: #else
                   13115:                        else R=call(G[0],map(mydeval,cdr(cdr(FT)))|option_list=G[1]);
                   13116: #endif
                   13117:                V=mysubst(V,[FT[0],R]);
                   13118:                F=mysubst(cdr(F),[FT[0],R]);
                   13119:        }
                   13120:        return (type(V)<4)?deval(V):mtransbys(deval,V,[]);
                   13121: }
                   13122:
                   13123: def myfeval(F,X)
                   13124: {
                   13125:        if(type(X)==4){
                   13126:                if(isvar(X[0])&&length(X)==2)
                   13127:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   13128:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   13129:                        for(Y=X;Y!=[];Y=cdr(Y))
                   13130:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   13131:                        return myeval(F);
                   13132:                }
                   13133:        }
                   13134:        return myeval(mysubst(F,[x,X]));
                   13135: }
                   13136:
                   13137: def myf2eval(F,X,Y)
                   13138: {
                   13139:        return myeval(mysubst(F,[[x,X],[y,Y]]));
                   13140: }
                   13141:
                   13142: def myf3eval(F,X,Y,Z)
                   13143: {
                   13144:        return myeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   13145: }
                   13146:
                   13147: def myfdeval(F,X)
                   13148: {
                   13149:        if(type(X)==4){
                   13150:                if(isvar(X[0])&&length(X)==2)
                   13151:                        return mydeval(mysubst(F,[X[0],X[1]]));
                   13152:                if(type(X[0])==4&&isvar(X[0][0])&&length(X[0])==2){
                   13153:                        for(Y=X;Y!=[];Y=cdr(Y))
                   13154:                                F=mysubst(F,[car(Y)[0],car(Y)[1]]);
                   13155:                        return mydeval(F);
                   13156:                }
                   13157:        }
                   13158:        return mydeval(mysubst(F,[x,X]));
                   13159: }
                   13160:
                   13161: def myf2deval(F,X,Y)
                   13162: {
                   13163:        return mydeval(mysubst(F,[[x,X],[y,Y]]));
                   13164: }
                   13165:
                   13166: def myf3deval(F,X,Y,Z)
                   13167: {
                   13168:        return mydeval(mysubst(F,[[x,X],[y,Y],[z,Z]]));
                   13169: }
                   13170:
                   13171: def df2big(F)
                   13172: {
                   13173:        AG=[[os_md.mysin,sin],[os_md.mycos,cos],[os_md.mytan,tan],[os_md.myasin,asin],
                   13174:                [os_md.acos,acos],[os_md,atan,atan],[os_md.myexp,exp],[os_md.mylog,log],[os_md.mypow,pow]];
                   13175:        if(getopt(inv)!=1) return mysubst(F,AG);
                   13176:        else return mysubst(F,AG|inv=1);
                   13177:
                   13178: }
                   13179:
                   13180: def f2df(F)
                   13181: {
                   13182:        if(type(Opt=getopt(opt))!=1) Opt=0;
                   13183:        if(iand(Opt,1)){
                   13184:                if(Opt>0) F=map(eval,F);
                   13185:                else F=map(deval,F);
                   13186:        }
                   13187:        Cpx=getopt(cpx);
                   13188:        if(type(F)==4 && iand(Opt,2)==0) return F;
                   13189:        K=getopt(level);
                   13190:        if(type(K)!=1) K=0;
                   13191:        AG=[sin,cos,tan,asin,acos,atan,exp,sinh,cosh,tanh,log,pow];
                   13192:        AGd=[os_md.mysin,os_md.mycos,os_md.mytan,os_md.myasin,os_md.myacos,
                   13193:                os_md.myatan,os_md.myexp,os_md.myexp,os_md.myexp,os_md.myexp,
                   13194:                os_md.mylog,os_md.sqrt,os_md.myexp];
                   13195:        for(R=[],I=0,Arg=vars(F);Arg!=[];Arg=cdr(Arg)){
                   13196:                Fn=functor(car(Arg));
                   13197:                if(vtype(Fn)!=3) continue;
                   13198:                V=args(car(Arg));
                   13199:                for(PAG=AG,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd)){
                   13200:                        if(Fn==car(PAG)){
                   13201:                                if(K==0) L="z__";
                   13202:                                else L="z"+rtostr(K)+"__";
                   13203:                                if(I==0) VC=makev([L]);
                   13204:                                else VC=makev([L,I]);
                   13205:                                I++;
                   13206:                                VC0=VC;
                   13207:                                if(Fn==sinh || Fn==cosh || Fn==tanh){
                   13208:                                        VC=makev([L,I++]);
                   13209:                                        if(Fn==sinh)
                   13210:                                                R=cons([VC0,0,(VC^2-1)/(2*VC)],R);
                   13211:                                        else if(Fn==cosh)
                   13212:                                                R=cons([VC0,0,(VC^2+1)/(2*VC)],R);
                   13213:                                        else
                   13214:                                                R=cons([VC0,0,(VC^2-1)/(VC^2+1)],R);
                   13215:                                }
                   13216:                                if(Fn==pow && (V[1]!=1/2||Cpx==1)){
                   13217: #if 0
                   13218:                                        R0=f2df(V[1]*((type(V[0])==1)?dlog(V[0]):log(V[0]))|level=K+1);
                   13219:                                        PAGd=cdr(PAGd);
                   13220: #else
                   13221:                                        R=cons([VC,os_md.mypow,V[0],V[1]],R);
                   13222:                                        F=mysubst(F,[car(Arg),VC0]);
                   13223:                                        Arg=cons(0,vars(F));
                   13224:                                        break;
                   13225: #endif
                   13226:                                }else R0=f2df(V[0]|level=K+1);
                   13227:                                R=cons([VC,car(PAGd),R0],R);
                   13228:                                F=mysubst(F,[car(Arg),VC0]);
                   13229:                                Arg=cons(0,vars(F));
                   13230:                                break;
                   13231:                        }
                   13232:                }
                   13233:        }
                   13234:        if(R==[])       return F;
                   13235:        if(Cpx==1){
                   13236:                for(PAG=P,PAGd=AGd;PAG!=[];PAG=cdr(PAG),PAGd=cdr(PAGd))
                   13237:                        R=mysubst(R,[car(PADd),car(PAG)]);
                   13238:        }
                   13239:        return cons(F,reverse(R));
                   13240: }
                   13241:
                   13242: def todf(F,V)
                   13243: {
                   13244:        if(type(V)!=4) V=[V];
                   13245:        for(R=[];V!=[];V=cdr(V)){
                   13246:                R=cons(f2df(car(V)),R);
                   13247:        }
                   13248:        V=reverse(R);
                   13249:        Z=makenewv([F,V]);
                   13250:        return [Z,cons(Z,cons(F,V))];
                   13251: }
                   13252:
                   13253: def compdf(F,V,G)
                   13254: {
                   13255:        FL=["abs","floor","rint","zeta","gamma","arg","real","imag","conj"];
                   13256:        FS=[os_md.abs,floor,rint,os_md.zeta,os_md.gamma,os_md.myarg,real,imag,conj];
                   13257:        if(type(F)==7){
                   13258:                if(str_str(F,"|")==0){
                   13259:                        F="abs("+str_cut(F,1,str_len(F)-2)+")";
                   13260:                }else if(str_str(F,"[")==0){
                   13261:                        F="floor("+str_cut(F,1,str_len(F)-2)+")";
                   13262:                }
                   13263:                I=str_str(F,"(");
                   13264:                Var=x;
                   13265:                if(I>0){
                   13266:                        J=str_pair(F,I+1,"(",")");
                   13267:                        if(J<0) return 0;
                   13268:                        Var=eval_str(str_cut(F,I+1,J-1));
                   13269:                        Var=f2df(Var);
                   13270:                        F0=str_cut(F,0,I-1);
                   13271:                }
                   13272:                if((I=findin(F0,FL))<0&&(I=findin(F,FL))<0) F=f2df(eval_str(F));
                   13273:                else F=[z__,[z__,FS[I],Var]];
                   13274:        }
                   13275:        if(type(F)!=4) F=f2df(F);
                   13276:        if(type(G)!=4) G=f2df(G);
1.20      takayama 13277:        if(V==G) return F;      /* subst(F(V),V,G) */
1.6       takayama 13278:        VF=vars(F);VG=vars(G);
1.20      takayama 13279:        if(type(V)==4){
                   13280:                for(VT=[],VV=V;VV!=[];VV=cdr(VV)){
                   13281:                        if(findin(car(VV),VF)>=0){
                   13282:                                X=makenewv(append(VF,VG));
                   13283:                                VF=cons(X,VF);
                   13284:                                F=mysubst(F,[car(VV),X]);
                   13285:                                VT=cons(X,VT);
                   13286:                        }else VT=cons(car(VV),VT);
                   13287:                }
                   13288:                for(V=reverse(VT);V!=[];V=cdr(V),G=cdr(G)) F=compdf(F,car(V),car(G));
                   13289:                return F;
                   13290:        }
1.6       takayama 13291:        for(E=I=0;I<30;I++){
                   13292:                for(J=0;J<30;J++){
                   13293:                        X=makev(["z__",I,J]);
                   13294:                        if(findin(X,VF)<0 && findin(X,VG)<0){
                   13295:                                E=1;break;
                   13296:                        }
                   13297:                }
                   13298:                if(E) break;
                   13299:        }
                   13300:        if(!E) return 0;
                   13301:        if(type(G)<4) return mysubst(F,[V,G]);
                   13302:        if(type(F)<4) F=[F]; /* return compdf([X,[X,0,F]],V,G); */
                   13303:        F=mysubst(F,[V,X]);
                   13304:        if(isvar(G[0])){
                   13305:                G=mysubst(G,[G[0],X]);
                   13306:                if(length(G)==2&&type(G[1])==4&&G[1][0]==X) G=G[1];
                   13307:                G=cons(G,cdr(F));
                   13308:        }
                   13309:        else G=cons([X,0,G],cdr(F));
                   13310:        return cons(car(F),G);
                   13311: }
                   13312:
                   13313: def fzero(F,LX)
                   13314: {
                   13315:        if(length(LX)==3){
                   13316:                V=LX[0];LX=cdr(LX);
                   13317:        }else V=x;
                   13318:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   13319:        if(getopt(zero)==1){
                   13320:                if(getopt(cont)==1) CT=1;
                   13321:                else CT=0;
                   13322:                if(getopt(trans)!=1 && type(F)<4) F=f2df(F);
                   13323:                F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   13324:                if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   13325:                V1=myeval(mysubst(F,[V,X1=LX1]));
                   13326:                V2=myeval(mysubst(F,[V,X2=LX2]));
                   13327:                if(V1>0){
                   13328:                        V0=V1;V1=V2;V2=V0;
                   13329:                        X0=X1;X1=X2;X2=X0;
                   13330:                }
                   13331:                if(V1<0 && V2>0){
                   13332:                        D=(V2-V1)*1024;
                   13333:                        for(I=0; I<Dev; I++){
                   13334: /*     mycat([D,X1,V1,X2,V2]) ; */
                   13335:                                if(iand(I,1)) X0=(X1+X2)/2;
                   13336:                                else X0=(V2*X1-V1*X2)/(V2-V1);
                   13337:                                V0=myeval(mysubst(F,[V,X0]));
                   13338:                                if(V0==0||V0==V1||V0==V2) return [X0,V0];
                   13339:                                if(V0<0){
                   13340:                                        if(!CT && V0+D<0) return [];
                   13341:                                        V1=V0;X1=X0;
                   13342:                                }else{
                   13343:                                        if(!CT && V0>D) return [];
                   13344:                                        V2=V0;X2=X0;
                   13345:                                }
                   13346:                        }
                   13347:                        X0=(V2*X1-V1*X2)/(V2-V1);
                   13348:                        return [X0,myeval(mysubst(F,[V,X0]))];
                   13349:                }
                   13350:                if(V0==0) return [X0,V0];
                   13351:                if(V1==0) return [X1,V1];
                   13352:                return [];
                   13353:        }
                   13354:        if(type(F)<4) F=f2df(F);
                   13355:        F=mysubst(F,[[@pi,deval(@pi)],[@e,deval(@e)]]);
                   13356:        L=[];
                   13357:        if(type(F)<4){
                   13358:                if(type(F)==3) F=nm(red(F));
                   13359:                if((Deg=deg(F,V))<=2){
                   13360:                        if(Deg==2){
                   13361:                                D=(C1=coef(F,1,V))^2-4*(C2=coef(F,2,V))*coef(F,0,V);
                   13362:                                if(D>=0){
                   13363:                                        R=dsqrt(D);
                   13364:                                        if((S=(-C1+R)/(2*C2))>=LX1&&S<=LX2) L=[[S,mysubst(F,[V,S])]];
                   13365:                                        if(D!=0 && (S=(-C1-R)/(2*C2))>=LX1&&S<=LX2) L=cons([S,mysubst(F,[V,S])],L);
                   13366:                                }
                   13367:                                L=qsort(L);
                   13368:                        }else if(Deg==1&&(S=-coef(F,0,V)/coef(F,1,V))>=LX1&&S<=LX2)
                   13369:                                L=[[S,mysubst(F,[V,S])]];
                   13370:                        return L;
                   13371:                }
                   13372:                for(L=[];S!=[];S=cdr(S))
                   13373:                        if(car(S)>=LX1&&car(S)<=LX2) L=cons([car(S),mysubst(F,[V,car(S)])],L);
                   13374:                return qsort(L);
                   13375:        }
                   13376:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   13377:                Div = 2^(10);
                   13378:        W=(LX2-LX1)/Div;
                   13379:        for(I=V2=0;I<=Div;I++){
                   13380:                X1=X2;X2=LX1+I*W;V1=V2;
                   13381:                if((V2=myeval(mysubst(F,[V,X2])))==0)
                   13382:                        L=cons([X2,V2],L);
                   13383:                if(V1*V2<0){
                   13384:                        L0=fzero(F,[V,X1,X2]|zero=1,trans=1);
                   13385:                        if(L0!=[]) L=cons(L0,L);
                   13386:                }
                   13387:        }
                   13388:        return reverse(L);
                   13389: }
                   13390:
                   13391: def fmmx(F,LX)
                   13392: {
                   13393:        if(length(LX)==3){
                   13394:                V=LX[0];LX=cdr(LX);
                   13395:        }else V=x;
                   13396:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   13397:        FT=F;
                   13398:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(FT);
                   13399:        FT=mysubst(FT,[[@pi,eval(@pi)],[@e,eval(@e)]]);
                   13400:        if(type(G=getopt(dif))>=1){
                   13401:                if(G==1) G=os_md.mydiff(F,V);
                   13402:                L=fzero(G,[V,LX1,LX2]|option_list=getopt());
                   13403:                R=[[LX1,myeval(mysubst(FT,[V,LX1]))]];
                   13404:                for(I=0;L!=[];L=cdr(L),I++){
                   13405:                        X=car(L)[0];
                   13406:                        if(X==LX1) continue;
                   13407:                        R=cons([X,myeval(mysubst(FT,[V,X]))],R);
                   13408:                }
                   13409:                if(X!=LX2)      R=cons([LX2,myeval(mysubst(FT,[V,LX2]))],R);
                   13410:                if(getopt(mmx)!=1) return reverse(R);
                   13411:                for(Mi=Ma=car(R);R!=[];R=cdr(R)){
                   13412:                        if(car(R)[1]>Ma[1]) Ma=car(R);
                   13413:                        else if(car(R)[1]<Mi[1]) Mi=car(R);
                   13414:                }
                   13415:                return [Mi,Ma];
                   13416:        }
                   13417:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   13418:                Div = 2^(10);
                   13419:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   13420:        W=(LX2-LX1)/Div;
                   13421:        for(I=V2=V3=0;I<=Div;I++){
                   13422:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   13423:                V3=myeval(mysubst(FT,[V,X3]));
                   13424:                if(I==0) L=[[X3,V3]];
                   13425:                if(I<2) continue;
                   13426:                if((V1-V2)*(V2-V3)<0){
                   13427:                        X02=X2;V02=V2;X03=X3;V03=V3;
                   13428:                        for(J=0; J<Dev && X1!=X3; J++){
                   13429:                                X12=(X1+X2)/2;V12=myeval(mysubst(FT,[V,X12]));
                   13430:                                if((V1-V12)*(V12-V2)<=0){
                   13431:                                        X3=X2;V3=V2;X2=X12;V2=V12;continue;
                   13432:                                }
                   13433:                                X23=(X2+X3)/2;V23=myeval(mysubst(FT,[V,X23]));
                   13434:                                if((V12-V2)*(V2-V23)<=0){
                   13435:                                        X1=X12;V1=V12;X3=X23;V3=V23;continue;
                   13436:                                }
                   13437:                                if((V2-V23)*(V23-V3)<=0){
                   13438:                                        X1=X2;V1=V2;X2=X23;V2=V23;continue;
                   13439:                                }
                   13440:                        }
                   13441:                        L=cons([X2,V2],L);
                   13442:                        X2=X02;V2=V02;X3=X03;V3=V03;
                   13443:                }
                   13444:        }
                   13445:        L=cons([LX2,myeval(mysubst(FT,[V,LX2]))],L);
                   13446:        if(getopt(mmx)!=1) return L;
                   13447:        for(Mi=Ma=car(L);L!=[];L=cdr(L)){
                   13448:                if(car(L)[1]>Ma[1]) Ma=car(L);
                   13449:                else if(car(L)[1]<Mi[1]) Mi=car(L);
                   13450:        }
                   13451:        return [Mi,Ma];
                   13452: }
                   13453:
                   13454: def flim(F,L)
                   13455: {
                   13456:        FD=f2df(F);
                   13457:        Lim0=4;Lim=12;FS=1;
                   13458:        if(type(Pc=getopt(prec))==1){
                   13459:                if((Pc>1&&Pc<31)||Pc>-5) Lim+=Pc;
                   13460:        }
                   13461:        if(type(Pc=getopt(init))==1 && Pc>0) FS*=Pc;
                   13462:        if(type(L)==7) L=[L];
                   13463:        else if(type(L)<2){
                   13464:                K=flim(F,["+",L]|option_list=getopt());
                   13465:                if(K=="") return K;
                   13466:                K1=flim(F,["-",L]|option_list=getopt());
                   13467:                if(K1=="") return K1;
                   13468:                if(type(K)==7||type(K1)==7){
                   13469:                        if(K!=K1) return "";
                   13470:                        return K;
                   13471:                }
                   13472:                if(abs(K)<10^(-5)){
                   13473:                        if(abs(K1)<10^(-5)) return (K1+K)/2;
                   13474:                        else return "";
                   13475:                }
                   13476:                if(abs((K1-K)/K)<10^(-4)) return (K1+K)/2;
                   13477:                return "";
                   13478:        }
                   13479:        if(type(L)!=4||type(L[0])!=7) return "";
                   13480:        if(L[0]=="-"||L[0]=="-infty"){
                   13481:                FS=-FS;
                   13482:        }else if(L[0]!="+"&&L[0]!="infty") return "";
                   13483:        FI=(length(L)==1)?1:0;
                   13484:        for(Inf=0,I=Lim0;I<Lim;I++){
                   13485:                D1=FS*8^I;D2=8*D1;
                   13486:                if(FI==0){
                   13487:                        D1=1/D1;D2=1/D2;
                   13488:                }
                   13489:                if(D1>D2){
                   13490:                        D=D1;D1=D2;D1=D;
                   13491:                        X1=D1;X2=D2;
                   13492:                }
                   13493:                if(FI==0){
                   13494:                        D1+=L[1];D2+=L[1];
                   13495:                }
                   13496:                K=fmmx(FD,[D1,D2]|mmx=1,mesh=16,dev=4);
                   13497:                if(I>Lim0){
                   13498:                        if(DF<K[1][1]-K[0][1]&&DF>10^(-8)&&DF<10^7){
                   13499:                                if(I>Lim0+1){
                   13500:                                        if(Inf==0) return "";
                   13501:                                }else Inf=1;
                   13502:                        }else if(Inf==1) return "";
                   13503:                }
                   13504:                DF=K[1][1]-K[0][1];
                   13505:        }
                   13506:        if(Inf==1){
                   13507:                if(K[0][1]>10^8) return "+";
                   13508:                else if(K[1][1]<-10^8) return "-";
                   13509:                return "";
                   13510:        }
                   13511:        V=(myfeval(FD,D1)+1.0)-1.0;
                   13512:        if(V!=0 && abs(V)<10^(-9)) return 0;
                   13513:        return V;
                   13514: }
                   13515:
                   13516: def fcont(F,LX)
                   13517: {
                   13518:        if(length(LX)==3){
                   13519:                V=LX[0];LX=cdr(LX);
                   13520:        }else V=x;
                   13521:        LX1=eval(LX[0]);LX2=eval(LX[1]);
                   13522:        if(getopt(trans)!=1 && type(F)<4) FT=f2df(F);
                   13523:        if(type(Div=getopt(mesh))!=1 || Div<=0)
                   13524:                Div = 2^(10);
                   13525:        if(type(Dev=getopt(dev))!=1 || Dev<2) Dev=16;
                   13526:        W=(LX2-LX1)/Div;
                   13527:        if((Df=getopt(dif))!=1){
                   13528:                Df=0;
                   13529:        }else{
                   13530:                if(Dev==16) Dev=6;
                   13531:                WD=W/2^(Dev+1);
                   13532:        }
                   13533:        F=FT;
                   13534:        C=2;
                   13535:        for(I=V2=V3=0;I<=Div;I++){
                   13536:                X1=X2;X2=X3;X3=LX1+I*W;V1=V2;V2=V3;
                   13537:                V3=myeval(mysubst(F,[V,X3]));
                   13538:                if(Df){
                   13539:                        if(I==Div) break;
                   13540:                        V3=(myeval(mysubst(F,[V,X3+WD]))-V3)/WD;
                   13541:                }
                   13542:                if(I==0) L=[[X3,V3]];
                   13543:                if(I<2) continue;
                   13544:                if(C*dabs(2*V2-V1-V3) > dabs(V1-V3)){
                   13545:                        X01=X1;V01=V1;X02=X2;V02=V2;X03=X3;V03=V3;
                   13546:                        for(J=0; X01!=X03; J++){
                   13547:                                if(dabs(V01-V02)>dabs(V02-V03)){
                   13548:                                        X03=X02;V03=V02;
                   13549:                                }else{
                   13550:                                        X01=X02;V01=V02;
                   13551:                                }
                   13552:                                if(J==Dev) break;
                   13553:                                X02=(X01+X02)/2;
                   13554:                                V02=myeval(mysubst(F,[V,X02]));
                   13555:                                if(Df) V02=(myeval(mysubst(F,[V,WD]))-V02)/WD;
                   13556:                                if(C*dabs(2*V02-V01-V03) < dabs(V01-V03)) break;
                   13557:                        }
                   13558:                        if(J==Dev||X01==X03) L=cons([X01,X03,V03-V01],L);
                   13559:                }
                   13560:        }
                   13561:        return reverse(L);
                   13562: }
                   13563:
                   13564: def xygraph(F,N,LT,LX,LY)
                   13565: {
                   13566:        if((Proc=getopt(proc))!=1&&Proc!=2&&Proc!=3) Proc=0;
                   13567:        if(type(DV=getopt(dviout))==4){
                   13568:                OL=delopt(getopt(),["dviout","shift","ext","cl"]);
                   13569:                OL=cons(["proc",1],OL);
                   13570:                R=xygraph(F,N,LT,LX,LY|option_list=OL);
                   13571:                OL=delopt(getopt(),["shift","ext","cl"]|inv=1);
                   13572:                return execdraw(R,DV|optilon_list=OL);
                   13573:        }
                   13574:        if(N==0) N=32;
                   13575:        if(N<0){
                   13576:                N=-N;
                   13577:                N1=-1; N2=N+1;
                   13578:        }else{
                   13579:                N1=0; N2=N;
                   13580:        }
                   13581:        if(length(LT)==3 && isvar(LT[0])==1){
                   13582:                TT=LT[0]; LT=cdr(LT);
                   13583:                F=mysubst(F,[TT,x]);
                   13584:        }
                   13585:        if(LX==0) LX=LT;
                   13586:        if((Acc=getopt(Acc))!=1) Acc=0;
                   13587:        if(Acc){
                   13588:                LX=[eval(LX[0]),eval(LX[1])];
                   13589:                LY=[eval(LY[0]),eval(LY[1])];
                   13590:                LT=[eval(LT[0]),eval(LT[1])];
                   13591:        }else{
                   13592:                LX=[deval(LX[0]),deval(LX[1])];
                   13593:                LY=[deval(LY[0]),deval(LY[1])];
                   13594:                LT=[deval(LT[0]),deval(LT[1])];
                   13595:        }
                   13596:        TD=(LT[1]-LT[0])/N;
                   13597:        if(type(Mul=getopt(scale))!=1){
                   13598:                if(type(Mul)==4){
                   13599:                        MulX=Mul[0]; MulY=Mul[1];
                   13600:                }else MulX=MulY=1;
                   13601:        }else MulX=MulY=Mul;
                   13602:        if(type(Org=getopt(org))==4){
                   13603:                Orgx=Org[0];Orgy=Org[1];
                   13604:        }else Orgx=Orgy=0;
                   13605:        if(type(F)!=4 || (getopt(para)!=1 && length(F)>1 && type(F[0])<4 && type(F[1])==4)) {
                   13606:                if(getopt(rev)!=1){
                   13607:                        F1=x; /* LX[0]+(LX[1]-LX[0])*(x-LT[0])/(TD*N); */
                   13608:                        F2=F;
                   13609:                }else{
                   13610:                        F1=F;
                   13611:                        F2=x; /* LY[0]+(LY[1]-LY[0])*(x-LT[0])/(TD*N); */
                   13612:                }
                   13613:        }else{
                   13614:                F1=F[0]; F2=F[1];
                   13615:        }
                   13616:        if(F1==0 || F2==0) LT=[];
                   13617:        if(length(LT)==2){
                   13618:                if(Acc){
                   13619:                        for(LTT=[],I=N2;I>=N1;I--)
                   13620:                                LTT=cons(eval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   13621:                }else{
                   13622:                        for(LTT=[],I=N2;I>=N1;I--)
                   13623:                                LTT=cons(deval(LT[0]+I*(LT[1]-LT[0])/N),LTT);
                   13624:                }
                   13625:                LT=LTT;
                   13626:        }
                   13627:        Cpx=getopt(cpx);
                   13628:        if(Cpx!=1 && (str_str(rtostr(F1),"@i")>=0 || str_str(rtostr(F2),"@i")>=0))
                   13629:                Cpx=1;
                   13630:        if(type(Cpx)<0) Cpx=0;
                   13631:        if(!Acc){
                   13632:                if(type(F1)<4) F1=f2df(F1);
                   13633:                if(type(F2)<4) F2=f2df(F2);
                   13634:        }
                   13635:        if(type(Err=getopt(err))==1){
                   13636:                F1=mysubst(F1,[x,x+Err*TD/1001.23]);
                   13637:                F2=mysubst(F2,[x,x+Err*TD/1001.23]);
                   13638:        }
                   13639:        if(type(F1)==4 || type(F2)==4){
                   13640:                Dn=1;
                   13641:        }else Dn=dn(F1)*dn(F2);
                   13642:        for(V=[],PT=LT;PT!=[]; PT=cdr(PT)){
                   13643:                T=car(PT);
                   13644:                if(myfeval(Dn,T)==0){
                   13645:                        V=cons(0,V); continue;
                   13646:                }
                   13647:                if(Cpx>0||Acc){
                   13648:                        X=myfeval(F1,T);Y=myfeval(F2,T);
                   13649:                }else{
                   13650:                        X=myfdeval(F1,T);Y=myfdeval(F2,T);
                   13651:                }
                   13652:                if((N1==0||(PT!=LT&&length(PT)!=1)) && (X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1]))
                   13653:                        V=cons(0,V);
                   13654:                else
                   13655:                        V=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],V);
                   13656:        }
                   13657:        V=reverse(V);
                   13658:        Gap0=Gap=Arg=0;
                   13659:        if(type(Prec=getopt(prec))<0)
                   13660:                Level=0;
                   13661:        else if(Prec==0) Level=4;
                   13662:        else if(type(Prec)==1){
                   13663:                Level=Prec;
                   13664:                if(Level<0){
                   13665:                        Level=-Level;
                   13666:                        Gap0=1;
                   13667:                }
                   13668:        }else if(type(Prec)==4){
                   13669:                Level=Prec[0];
                   13670:                if(length(Prec)>1) Arg=Prec[1];
                   13671:                if(length(Prec)>2) Gap0=Prec[2];
                   13672:        }
                   13673:        if(Level>0){
                   13674:                if(Level>16) Level=16;
                   13675:                if(Arg<=0) Arg=30;
                   13676:                else if(Arg>120) Arg=120;
                   13677:                Arg=Acc?eval(@pi*Arg/180):deval(@pi*Arg/180);
                   13678:                SL=dcos(Arg);
                   13679:        }
                   13680:        if(Gap0>0){
                   13681:                if(Gap0<2) Gap0=16;
                   13682:                else if(Gap0>512) Gap0=512;
                   13683:                Gap=((MulX*(LX[1]-LX[0]))^2+(MulY*(LY[1]-LY[0]))^2)/(Gap0^2);
                   13684:        }
                   13685:        for(I=0;I<Level;I++){
                   13686:                for(F=K=G=0,NV=NLT=[],PLT=LT,PV=V;PLT!=[];K++,PLT=cdr(PLT),PV=cdr(PV)){
                   13687:                        TG=0;D0=D1;CLT0=CLT;CV0=CV;CV=car(PV);CLT=car(PLT);
                   13688:                        if(length(PV)>1){
                   13689:                                if((CV1=car(cdr(PV)))!=0 && CV!=0)
                   13690:                                        D1=[CV[0]-CV1[0],CV[1]-CV1[1]];
                   13691:                                else D1=0;
                   13692:                        }else K=-1; /* ? */
                   13693:                        if(K>0 &&(((D1==0||D0==0)&&(CV0!=0||CV!=0||CV1!=0)) || dvangle(D0,D1)<SL ||
                   13694:                          (Gap>0 && type(D0)==4 && (TG=(D0[0]^2+D0[1]^2-Gap)>0)))){
                   13695:                                G++;T1=(CLT0+CLT)/2;
                   13696:                                if(F==0 && (CV0!=0 || CV!=0)){
                   13697:                                        if(myfdeval(Dn,T1)==0){
                   13698:                                                NV=cons(0,NV); NLT=cons(T1,NLT);
                   13699:                                        }
                   13700:                                        if(Cpx>0||Acc){
                   13701:                                                X=myfeval(F1,T1);Y=myfeval(F2,T1);
                   13702:                                        }else{
                   13703:                                                X=myfdeval(F1,T1);Y=myfdeval(F2,T1);
                   13704:                                        }
                   13705:                                        if(K==1 && N1<0){
                   13706:                                                NV=[];NLT=[];
                   13707:                                        }
                   13708:                                        if((K>1||N1==0)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   13709:                                                NV=cons(0,NV);NLT=cons(T1,NLT);F=0;
                   13710:                                        }else{
                   13711:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T1,NLT);
                   13712:                                        }
                   13713:                                }
                   13714:                                NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   13715:                                if(!TG&&(CV0!=0||CV1!=0)){
                   13716:                                        T2=(car(cdr(PLT))+CLT)/2;
                   13717:                                        if(myfdeval(Dn,T2)==0){
                   13718:                                                NV=cons(0,NV); NLT=cons(CLT,NLT);
                   13719:                                        }
                   13720:                                        if(Cpx>0||Acc){
                   13721:                                                X=myfeval(F1,T2);Y=myfeval(F2,T2);
                   13722:                                        }else{
                   13723:                                                X=myfdeval(F1,T2);Y=myfdeval(F2,T2);
                   13724:                                        }
                   13725:                                        if((N1==0||length(PV)!=2)&&(X<LX[0]||X>LX[1]||Y<LY[0]||Y>LY[1])){
                   13726:                                                NV=cons(0,NV);NLT=cons(T1,NLT);
                   13727:                                        }else{
                   13728:                                                NV=cons([MulX*(X-Orgx),MulY*(Y-Orgy)],NV);NLT=cons(T2,NLT);
                   13729:                                        }
                   13730:                                }
                   13731:                                if(length(PV)==2 && N1==-1)     break;
                   13732:                                F=1;
                   13733:                        }else{
                   13734:                                F=0;NV=cons(CV,NV);NLT=cons(CLT,NLT);
                   13735:                        }
                   13736:                }
                   13737:                V=reverse(NV);LT=reverse(NLT);
                   13738:                if(G==0) break;
                   13739:        }
                   13740:        if(Gap>0){
                   13741:                for(NV=[],PV=V;PV!=[];PV=cdr(PV)){
                   13742:                        NV=cons(P0=car(PV),NV);
                   13743:                        if(length(PV)>1 && P0!=0 && PV[1]!=0
                   13744:                          && (P0[0]-PV[1][0])^2+(P0[1]-PV[1][1])^2>Gap) NV=cons(0,NV);
                   13745:                }
                   13746:                V=reverse(NV);
                   13747:        }
1.18      takayama 13748:        if((Raw=getopt(raw))==1) return V;
                   13749:        if(Raw==2) return [V,LT];
1.6       takayama 13750:        OL=[["curve",1]];OLP=[];
                   13751:        if(type(C=getopt(ratio))==1){
                   13752:                OL=cons(["ratio",C],OL);OLP=cons(["ratio",C],OLP);
                   13753:        }
                   13754:        if(Acc==1) OL=cons(["Acc",1],OL);
                   13755:        if(N1<0) OL=cons(["close",-1],OL);
                   13756:        if(type(Opt=getopt(opt))!=7 && type(Opt)!=4){
                   13757:                if(Opt==0) return xylines(V|option_list=cons(["opt",0],OL));
                   13758:        }
                   13759:        OL=cons(["opt",(Proc)?0:Opt],OL);
                   13760:        if(type(Opt)>=0) OLP=cons(["opt",Opt],OLP);
                   13761:        if(type(Vb=getopt(verb))==1||type(Vb)==4){
                   13762:                OL=cons(["verb",Vb],OL);OLP=cons(["verb",Vb],OL);
                   13763:        }
                   13764:        if(Proc){
                   13765:                S=(Proc==1)?
                   13766:                        [[0,[MulX*(LX[0]-Orgx),MulX*(LX[1]-Orgx)],[MulY*(LY[0]-Orgy),MulY*(LY[1]-Orgy)],
                   13767:                        (TikZ)?1:1/10]]:[];
                   13768:                S=cons([1,OLP,xylines(V|option_list=OL)],S);
                   13769:                if(Proc==3) return car(S);
                   13770:        }else S=xylines(V|option_list=OL);
                   13771:        if(type(Pt=getopt(pt))==4){
                   13772:                if(type(Pt[0])!=4) Pt=[Pt];
                   13773:                if(length(Pt)>1 && type(Pt[1])!=4) Pt=[Pt];
                   13774:                for(PT=Pt;PT!=[];PT=cdr(PT)){
                   13775:                        PP=car(PT);
                   13776:                        if(type(PP[0])!=4) PP=[PP];
                   13777:                        P=car(PP);PP=cdr(PP);
                   13778:                        Qx=MulX*(P[0]-Orgx);Qy=MulY*(P[1]-Orgy);
                   13779:                        if(length(PP)>0 && type(PP[0])==4){             /* draw line */
                   13780:                                P=car(PP);
                   13781:                                Q1x=MulX*(P[0]-Orgx);Q1y=MulY*(P[1]-Orgy);
                   13782:                                if(length(PP)<1 || car(PP)==0 || iand(car(PP),1))
                   13783:                                         OL=["opt",(TikZ)?"-":"@{-}"];
                   13784:                                else OL=["opt",(TikZ)?".":"@{.}"];
                   13785:                                if(Proc) S=cons([1,OL,[[Qx,Qy],[Q1x,Q1y]]],S);
                   13786:                                else S=S+xylines([[Qx,Qy],[Q1x,Q1y]]|optilon_list=OL);
                   13787:                                continue;
                   13788:                        }
                   13789:                        if(length(PP)==0 || type(car(PP))!=7)  SS="$\\bullet$";
                   13790:                        else SS=car(PP);
                   13791:                        if(length(PP)<=1){
                   13792:                                if(Proc) S=cons([2,[],[Qx,Qy],[SS]],S);
                   13793:                                else S=S+xyput([Qx,Qy,SS]);
                   13794:                        }else{
                   13795:                                if(Proc) S=cons([2,[],[Qx,Qy],[[SS],"",PP[1]]],S);
                   13796:                                S=S+xyput([Qx,Qy,SS,"",PP[1]]);
                   13797:                        }
                   13798:                }
                   13799:        }
                   13800:        if(type(Ax=getopt(ax))==4){  /* draw axis */
                   13801:                Adx0=Ady0=0; Adx1=Ady1=0.1;
                   13802:                if(!TikZ){
                   13803:                        if(!XYcm) Adx1=Ady1=1;
                   13804:                        LOp="@{-}"; LxOp="+!U"; LyOp="+!R";
                   13805:                }else{
                   13806:                        LOp="-"; LxOp="below"; LyOp="left";
                   13807:                }
                   13808:                LOp0=LOp1=LOp;
                   13809:                LxOO=(Ax[1]==LY[0])?LxOp:(TikZ)?"below left":"+!UR";
                   13810:                if(type(AxOp=getopt(axopt))>0){
                   13811:                        if(type(AxOp)==1){
                   13812:                                if(AxOp>0)      Adx1=Ady1=AxOp;
                   13813:                                else if(AxOp<0){
                   13814:                                        Adx1=Ady1=0; Adx0=Ady0=AxOp;
                   13815:                                }
                   13816:                        }else if(type(AxOp)==4){
                   13817:                                if(type(T=car(AxOp))==4 && length(AxOp)>1){
                   13818:                                        if(type(T)==7){
                   13819:                                                LxOp=T; LyOp=AxOp[1];
                   13820:                                        }else if(type(T)==4){
                   13821:                                                Ay0=T[0]; Ay1=T[1]; Ax0=AxOp[1][0]; Ax1=AxOp[1][1];
                   13822:                                                if(length(T)>2) LxOp=T[2];
                   13823:                                                if(length(AxOp[1])>2) LyOp=AxOp[1][2];
                   13824:                                        }
                   13825:                                }
                   13826:                                if(length(AxOp)>2 && type(AxOp[2])==7) LxOO=AxOp[2];
                   13827:                                if(length(AxOp)>3 && type(AxOp[3])==7) LOp0=AxOp[3];
                   13828:                                if(length(AxOp)>4 && type(AxOp[4])==7) LOp1=AxOp[4];
                   13829:                        }
                   13830:                        if(type(AxOp)==7) LOp0=AxOp;
                   13831:                }
                   13832:                if(Ax[0]>=LX[0] && Ax[0]<=LX[1]){       /* draw marks on x-axis */
                   13833:                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp0]]:[],
                   13834:                                [MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],[MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]],S);
                   13835:                        else S=S+xyarrow([MulX*(Ax[0]-Orgx),MulY*(LY[0]-Orgy)],
                   13836:                                [MulX*(Ax[0]-Orgx),MulY*(LY[1]-Orgy)]|opt=LOp0);
                   13837:                        if(length(Ax)>2){
                   13838:                                D=Ax[2];
                   13839:                                if(type(D)==1 && D>0){
                   13840:                                        I0=ceil((LX[0]-Ax[0])/D); I1=floor((LX[1]-Ax[0])/D);
                   13841:                                        for(DD=[],I=I0; I<=I1; I++){
                   13842:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   13843:                                                else if(Ax[4]==0) DD=cons([I*D,I*D+Ax[0]],DD);
                   13844:                                                else if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   13845:                                                else if(Ax[4]==2) DD=cons([I*D,I],DD);
                   13846:                                        }
                   13847:                                        D=DD;
                   13848:                                }
                   13849:                                if(type(D)==4){
                   13850:                                        for(;D!=[]; D=cdr(D)){
                   13851:                                                T=car(D);
                   13852:                                                if(type(T)==4) T=car(T);
                   13853:                                                X=MulX*(T+Ax[0]-Orgx); Y=MulY*(Ax[1]-Orgy);
                   13854:                                                if(T!=0){
                   13855:                                                        if(Proc) S=cons([3,(type(LOp1)>=0)?[["opt",LOp1]]:[],[X,Y+Ady0],[X,Y+Ady1]],S);
                   13856:                                                        else S=S+xyarrow([X,Y+Ady0],[X,Y+Ady1]|opt=LOp1);
                   13857:                                                }
                   13858:                                                if(type(car(D))==4){
                   13859:                                                        Arg=[(T==0)?LxOO:LxOp,D[0][1]];
                   13860:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[Arg]],S);
                   13861:                                                        else S=S+xyput([X,Y+Ady0,Arg]);
                   13862:                                                }
                   13863:                                        }
                   13864:                                }
                   13865:                        }
                   13866:                }
                   13867:                if(Ax[1]>=LY[0] && Ax[1]<=LY[1]){       /* draw marks on y-axis */
                   13868:                        if(Proc) S=cons([3,[["opt",LOp0]],
                   13869:                                        [MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   13870:                                        [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]],S);
                   13871:                        else S=S+xyarrow([MulX*(LX[0]-Orgx),MulY*(Ax[1]-Orgy)],
                   13872:                                [MulX*(LX[1]-Orgx),MulY*(Ax[1]-Orgy)]|opt=LOp0);
                   13873:                        if(length(Ax)>3){
                   13874:                                D=Ax[3];
                   13875:                                if(type(D)==1 && D>0){
                   13876:                                        I0=ceil((LY[0]-Ax[1])/D); I1=floor((LY[1]-Ax[0])/D);
                   13877:                                        for(DD=[],I=I0; I<=I1; I++){
                   13878:                                                if(length(Ax)<5) DD=cons(I*D,DD);
                   13879:                                                else if(I!=0){
                   13880:                                                        if(Ax[4]==0) DD=cons([I*D,I*D+Ax[1]],DD);
                   13881:                                                        if(Ax[4]==1) DD=cons([I*D,I*D],DD);
                   13882:                                                        if(Ax[4]==2) DD=cons([I*D,I],DD);
                   13883:                                                }
                   13884:                                        }
                   13885:                                        D=DD;
                   13886:                                }
                   13887:                                if(type(D)==4){
                   13888:                                        for(;type(D)==4&&D!=[]; D=cdr(D)){
                   13889:                                                T=car(D);
                   13890:                                                if(type(T)==4) T=car(T);
                   13891:                                                X=MulX*(Ax[0]-Orgx); Y=MulY*(T+Ax[1]-Orgy);
                   13892:                                                if(T!=0){
                   13893:                                                        if(Proc) S=cons([3,(type(LOp0)>=0)?[["opt",LOp1]]:[],
                   13894:                                                                [X+Adx0,Y],[X+Adx1,Y]],S);
                   13895:                                                        else S=S+xyarrow([X+Adx0,Y],[X+Adx1,Y]|opt=LOp1);
                   13896:                                                }
                   13897:                                                if(type(car(D))==4){
                   13898:                                                        if(Proc) S=cons([2,[],[X,Y+Ady0],[[LyOp,D[0][1]]]],S);
                   13899:                                                        else S=S+xyput([X,Y+Ady0,[LyOp,D[0][1]]]);
                   13900:                                                }
                   13901:                                        }
                   13902:                                }
                   13903:                        }
                   13904:                }
                   13905:        }
                   13906:        if(Proc) return reverse(S);
                   13907:        if(getopt(dviout)!=1) return S;
                   13908:        xyproc(S|dviout=1);
                   13909: }
                   13910:
                   13911: def xyarrow(P,Q)
                   13912: {
                   13913:        Cmd = ["fill","filldaw","shade","shadedraw","clip ","pattern","path ","node","coordinate"];
                   13914:        if(type(P)<4) return "%\n";
                   13915:        SS=getopt(opt);
                   13916:        if(!TikZ){
                   13917:                if(type(Q)<4) return "";
                   13918:                S="{"+xypos(P)+" \\ar";
                   13919:                if(type(SS)==7) S=S+SS;
                   13920:                return S+" "+xypos(Q)+"};\n";
                   13921:        }
                   13922:        if(type(SS)==4 && length(SS)>1){
                   13923:                if(length(SS)>2) SU=SS[2];
                   13924:                ST=SS[1];
                   13925:                SS=SS[0];
                   13926:        }
                   13927:        if(type(SS)!=7) SS="->";
                   13928:        if(type(ST)!=7) ST=" -- ";
                   13929:        if(type(SU)!=7) SU="";
                   13930:        if(type(S=getopt(cmd))==7) S="\\"+S;
                   13931:        else S="\\draw";
                   13932:        if(type(Q)!=4){
                   13933:                if(Q>0 && Q<=length(Cmd)) S="\\"+Cmd[Q-1]+"";
                   13934:                if(SS!="-") S=S+"["+SS+"]";
                   13935:                if(SU!="") SU="["+SU+"]";
                   13936:                return S+xypos(P)+ST+SU+";\n";
                   13937:        }
1.8       takayama 13938:        if(SS!="-"&&SS!="") S=S+"["+SS+"]";
1.6       takayama 13939:        if(length(P)<3 && length(Q)<3)
                   13940:                return S+xypos(P)+ST+xypos(Q)+SU+";\n";
                   13941:        if(length(P)==2) P=[P[0],P[1],"","_0"];
                   13942:        else if(length(P)==3 || (length(P)==4 && P[3]==""))
                   13943:                P=[P[0],P[1],P[2],"_0"];
                   13944:        else if(P[3]=="")
                   13945:                P=[P[0],P[1],P[2],"_0",P[4]];
                   13946:        if(length(Q)==2) Q=[Q[0],Q[1],"","_1"];
                   13947:        else if(length(Q)==3 || (length(Q)==4 && Q[3]==""))
                   13948:                Q=[Q[0],Q[1],Q[2],"_1"];
                   13949:        else if(Q[3]=="")
                   13950:                Q=[Q[0],Q[1],Q[2],"_1",Q[4]];
                   13951:        return S+xypos(P)+" "+xypos(Q)+"("+P[3]+")"+ST+"("+Q[3]+")"+SU+";\n";
                   13952: }
                   13953:
                   13954: def xyarrows(P,Q,R)
                   13955: {
                   13956:        PQ=newvect(4);
                   13957:        PQ[0]=(type(P[0])!=4)?f2df(P[0]):P[0];
                   13958:        PQ[1]=(type(P[1])!=4)?f2df(P[1]):P[1];
                   13959:        PQ[2]=(type(Q[0])!=4)?f2df(Q[0]):Q[0];
                   13960:        PQ[3]=(type(Q[1])!=4)?f2df(Q[1]):Q[1];
                   13961:        if(type(R[0])!=4) R=[R];
                   13962:        TR=R[0];NX=TR[2];X=X0=TR[0];DX=(TR[1]-TR[0])/NX;
                   13963:        if(length(R)==2){
                   13964:                TR=R[1];NY=TR[2];Y=TR[0];DY=(TR[1]-TR[0])/NY;
                   13965:        }else{
                   13966:                NY=1;Y=DY=0;
                   13967:        }
                   13968:        if(type(L=getopt(abs))!=1) L=0;
                   13969:        if(type(Sc=getopt(scale))!=1) Sc=0;
                   13970:        OL=[];
                   13971:        if(type(Opt=getopt(opt))==7) OL=cons(["opt",Opt],OL);
                   13972:        Tb=str_tb(0,0);
                   13973:        for(J=0;J<NY;Y+=DY,J++){
                   13974:                for(I=0,X=X0;I<NX;I++,X+=DX){
                   13975:                        PX=myf2eval(PQ[0],X,Y);PY=myf2eval(PQ[1],X,Y);
                   13976:                        VX=myf2eval(PQ[2],X,Y);VY=myf2eval(PQ[3],X,Y);
                   13977:                        if(L>0){
                   13978:                                C=dnorm([VX,VY]);
                   13979:                                if(C!=0){
                   13980:                                        VX*=L/C;VY*=L/C;
                   13981:                                }
                   13982:                        }
                   13983:                        if(Sc){
                   13984:                                VX*=Sc;VY*=Sc;
                   13985:                        }
                   13986:                        if(VX||VY) str_tb(xyarrow([PX,PY],[PX+VX,PY+VY]|optilon_list=OL),Tb);
                   13987:                }
                   13988:        }
                   13989:        return str_tb(0,Tb);
                   13990: }
                   13991:
                   13992: def polroots(L,V)
                   13993: {
                   13994:        INIT=1;
                   13995:        if(type(CF=getopt(comp))!=1) CF=0;
                   13996:        OL=getopt();
                   13997:        if(CF>32){
                   13998:                CF-=64;
                   13999:                INIT=0;
                   14000:        }else OL=cons(["comp",CF+64],delopt(OL,"comp"));
                   14001:        if(type(V)==4&&length(V)==1){
                   14002:                L=L[0];V=V[0];
                   14003:        }
                   14004:        Lim=Lim2=[];
                   14005:        if(type(L)<4){
                   14006:                if(type(Lim=getopt(lim))==4){
1.17      takayama 14007:                        if(type(Lim[0])!=4){
                   14008:                                if(!isvar(Lim[0])) Lim=cons(V,[Lim]);
                   14009:                                Lim=[Lim];
                   14010:                        }
                   14011:                        if(!isvar(Lim[0][0])) Lim=[cons(V,Lim)];
1.6       takayama 14012:                        Lim=delopt(Lim,V|inv=1);
                   14013:                        if(Lim!=[]){
                   14014:                                Lim=Lim[0];
                   14015:                                if(length(Lim)==3) Lim2=Lim[2];
                   14016:                                Lim=Lim[1];
                   14017:                        }
                   14018:                }else{
                   14019:                        Lim=Lim2=[];
                   14020:                }
                   14021:                if((CF==-2||CF==-1||CF==2)&&iscoef(L,os_md.israt)){     /* Rat+Comp, Rat+Real or Rat */
                   14022:                        S=(CF==-1)?getroot(L,V|cpx=1):getroot(L,V);
                   14023:                        for(RR=[],F=x;S!=[];S=cdr(S)){
                   14024:                                if(findin(V,vars(C=car(S)))<0){         /* Rational solution */
                   14025:                                        if(type(C)<2){
                   14026:                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   14027:                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   14028:                                        }
                   14029:                                        if(F!=C) RR=cons(F=C,RR);
                   14030:                                }else if(CF<0){                                         /* Irrational solution */
                   14031:                                        if((R=pari(roots,mysubst(C,[V,x])))!=0){
                   14032:                                                for(R=vtol(R);R!=[];R=cdr(R))
                   14033:                                                        if((C=car(R))!=F && ntype(C)<CF+6){
                   14034:                                                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   14035:                                                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   14036:                                                                RR=cons(F=C,RR);
                   14037:                                                        }
                   14038:                                        }
                   14039:                                }
                   14040:                        }
                   14041:                        return qsort(RR);
                   14042:                }
                   14043:                R=pari(roots,subst(L,V,x));
                   14044:                if(R==0){
                   14045:                        R=[0];
                   14046:                        if(CF==1){
                   14047:                                for(R=[0],I=mydeg(L,V);I>1; I--)
                   14048:                                        R=cons(0,R);
                   14049:                        }
                   14050:                        return R;
                   14051:                }
                   14052:                if(CF==1){              /* Complex */
                   14053:                        if(Lim==[]&&Lim2==[]) return vtol(R);
                   14054:                        for(L=[],I=length(R)-1;I>=0;I--){
                   14055:                                C=R[I];
                   14056:                                if(Lim!=[]&&(real(C)<Lim[0]||real(C)>Lim[1])) continue;
                   14057:                                if(Lim2!=[]&&(imag(C)<Lim2[0]||imag(C)>Lim2[1])) continue;
                   14058:                                L=cons(C,L);
                   14059:                        }
                   14060:                        return L;
                   14061:                }
                   14062:                for(L=[],F=x,I=length(R)-1;I>=0;I--){   /* Real */
                   14063:                        if(ntype(R[I])<4 && F!=R[I]){
                   14064:                                if(Lim!=[] && (R[I]<Lim[0]||R[I]>Lim[1])) continue;
                   14065:                                L=cons(F=R[I],L);
                   14066:                        }
                   14067:                }
                   14068:                return qsort(L);
                   14069:        }
                   14070:        if(SS==0&&INIT==1){
                   14071:                SS=polroots(L,V|option_list=OL);
                   14072:                if(SS!=0) return SS;
1.18      takayama 14073:                for(C=0;SS==0&&C<5;C++){
1.6       takayama 14074:                        I=(C==0)?1:(iand(random(),0xff)-0x80);
                   14075:                        for(LL=[],K=length(L)-1;K>=0;K--){
                   14076:                                for(Q=0,J=length(L)-1;J>=0;J--)
                   14077:                                        Q+=L[J]*(I+K)^J;
                   14078:                                LL=cons(Q,LL);
                   14079:                        }
                   14080:                        SS=polroots(LL,V|option_list=OL);
                   14081:                        if(SS!=0) return SS;
                   14082:                }
                   14083:                return SS;
                   14084:        }
                   14085:        C=2^(-32);
                   14086:        if(type(getopt(err))==1) C=err;
                   14087:        if((N=length(V))!=length(L)) return [];
                   14088:        if(N==1) return polroots(L[0],V[0]|option_list=OL);
                   14089:        for(L1=[],I=1;I<N;I++){
                   14090:                Res=res(V[0],L[I-1],L[I]);
                   14091:                if(type(Res)<2) return Res;
                   14092:                L1=cons(res(V[0],L[I-1],L[I]),L1);
                   14093:        }
                   14094:        R=polroots(L1,V1=cdr(V)|option_list=OL);
                   14095:        if(type(R)<2) return R;
                   14096:        for(SS=[];R!=[];R=cdr(R)){
                   14097:                RS=(N==2)?[car(R)]:car(R);
                   14098:                for(I=0,L0=L[0];I<N-1;I++) L0=mysubst(L0,[V1[I],RS[I]]);
1.17      takayama 14099:                if(L0==0) return 0;
1.6       takayama 14100:                S0=polroots(L0,V[0]|option_list=OL);
                   14101:                if(type(S0)<2) return S0;
                   14102:                for(S=S0;S!=[];S=cdr(S)){
                   14103:                        S0=cons(car(S),RS);
                   14104:                        for(LT=cdr(L);LT!=[];LT=cdr(LT)){
                   14105:                                for(I=0,TV=car(LT);I<N;I++) TV=mysubst(TV,[V[I],S0[I]]);
                   14106:                                if(abs(TV)>C) break;
                   14107:                        }
                   14108:                        if(LT==[]) SS=cons(S0,SS);
                   14109:                }
                   14110:        }
                   14111:        return reverse(SS);
                   14112: }
                   14113:
                   14114: def ptcommon(X,Y)
                   14115: {
                   14116:        if(length(X)!=2 || length(Y)!=2) return 0;
                   14117:        if(type(X[1])==4){ /* X is a line */
                   14118:                if((In=getopt(in))==-1||In==-2||In==-3){
                   14119:                        X0=(X[0][0]+X[1][0])/2;X1=(X[0][1]+X[1][1])/2;
                   14120:                        X=[[X0,X1],[X0+X[1][1]-X[0][1],X1-X[1][0]+X[0][0]]];
                   14121:                        if(In==-1&&type(Y[1])==4) return ptcommon(Y,X|in=-2);
                   14122:                        /* for the second line */
                   14123:                        if(In==-3) In=1;
                   14124:                        else In=0;
                   14125:                }else if(In==2||In==3){
                   14126:                        X=(X[1][0]-X[0][0])+(X[1][1]-X[0][1])*@i;
                   14127:                        if(X==0) return 0;
                   14128:                        Y=(Y[1][0]-Y[0][0])+(Y[1][1]-Y[0][1])*@i;
                   14129:                        X=myarg(Y/X);
                   14130:                        return (In==2)?X:(X*180/deval(@pi));
                   14131:                }else if(In!=1) In=0;
                   14132:                if(type(Y[0])<=3){
                   14133:                        if(In==1){
                   14134:                                return [(Y[1]*X[0][0]+Y[0]*X[1][0])/(Y[0]+Y[1]),
                   14135:                                (Y[1]*X[0][1]+Y[0]*X[1][1])/(Y[0]+Y[1])];
                   14136:                        }
                   14137:                        XX=X[1][0]-X[0][0];YY=X[1][1]-X[0][1];
                   14138:                        Arg=(length(Y)<2)?0:Y[1];
                   14139:                        Arg=deval(Arg);
                   14140:                        if(Arg!=0){
                   14141:                                S=dcos(Arg)*XX-dsin(Arg)*YY;
                   14142:                                YY=dsin(Arg)*XX+dcos(Arg)*YY;
                   14143:                                XX=S;
                   14144:                        }
                   14145:                        S=dnorm([XX,YY]);
                   14146:                        if(S!=0){
                   14147:                                XX*=Y[0]/S;YY*=Y[0]/S;
                   14148:                        }
                   14149:                        return [X[1][0]+XX,X[1][1]+YY];
                   14150:                }
                   14151:                S=[X[0][0]+(X[1][0]-X[0][0])*x_,X[0][1]+(X[1][1]-X[0][1])*x_];
                   14152:                if(type(Y[1])==4){ /* Y is a line */
                   14153:                        T=[Y[0][0]+(Y[1][0]-Y[0][0])*y_-S[0],
                   14154:                                Y[0][1]+(Y[1][1]-Y[0][1])*y_-S[1]];
                   14155:                        R=lsol(T,[x_,y_]);
                   14156:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   14157:                                if(!In || (R[0][1]>=0&&R[0][1]<=1&&R[1][1]>=0&&R[1][1]<=1) )
                   14158:                                        return subst(S,x_,R[0][1],y_,R[1][1]);
                   14159:                        }
                   14160:                        if((type(R[0])>0&&type(R[0])<4)||(type(R[1])>0&&type(R[1])<4)) return 0;
                   14161:                        if(!In) return 1;
                   14162:                        I=(X[0][0]==X[1][0]&&Y[0][0]==Y[1][0]&&X[0][0]==Y[0][0])?1:0;
                   14163:                        if(X[0][I]<=X[1][I]){
                   14164:                                X0=X[0][I];X1=X[1][I];
                   14165:                        }else{
                   14166:                                X1=X[0][I];X0=X[1][I];
                   14167:                        }
                   14168:                        return ((Y[0][I]<X0 && Y[1][I]<X0)||(Y[0][I]>X1&&Y[1][I]>X1))?0:1;
                   14169:                }else if(Y[1]==0){ /* orth */
                   14170:                        T=[Y[0][0]+(X[1][1]-X[0][1])*y_-S[0],
                   14171:                                Y[0][1]-(X[1][0]-X[0][0])*y_-S[1]];
                   14172:                        R=lsol(T,[x_,y_]);
                   14173:                        if(type(R[0])==4&&type(R[1])==4&&R[0][0]==x_&&R[1][0]==y_){
                   14174:                                if(!In||(R[0][1]>=0&&R[0][1]<=1))
                   14175:                                        return subst(S,x_,R[0][1],y_,R[1][1]);
                   14176:                        }
                   14177:                        return (X[0]==X[1])?0:1;
                   14178:                }else if(type(Y[1])==1 && Y[1]>0){ /* circle */
                   14179:                        T=(S[0]-Y[0][0])^2+(S[1]-Y[0][1])^2-Y[1]^2;
                   14180:                        D=mycoef(T,1,x_)^2-4*mycoef(T,0,x_)*mycoef(T,2,x_);
                   14181:                        if(D==0){
                   14182:                                V=mycoef(T,1,x_)/(2*mycoef(T,2,x_));
                   14183:                                if(!in||(V>=0&&V<=1)) return [subst(S,x_,V)];
                   14184:                        }
                   14185:                        else if((type(D)==1&&D>0)){
                   14186:                                D=dsqrt(D);
                   14187:                                V=-(mycoef(T,1,x_)+D)/(2*mycoef(T,2,x_));
                   14188:                                if(!In||(V>=0&&V<=1)) L=[subst(S,x_,V)];
                   14189:                                else L=[];
                   14190:                                V=(D-mycoef(T,1,x_))/(2*mycoef(T,2,x_));
                   14191:                                if(!In||(V>=0&&V<=1)) L=cons(subst(S,x_,V),L);
                   14192:                                if(length(L)>0) return L;
                   14193:                        }
                   14194:                }
                   14195:                return 0;
                   14196:        }
                   14197:        if(type(Y[1])==4 || X[1]==0) return ptcommon(Y,X);
                   14198:        /* X is a circle */
                   14199:        if(Y[1]==0){    /* tangent line */
                   14200:                if(Y[0][0]==X[0][0]+X[1] || Y[0][0]==X[0][0]-X[1]) L=[[Y[0][0],X[0][1]]];
                   14201:                else L=[];
                   14202:                P=(Y[0][0]+x_-X[0][0])^2+(Y[0][1]+x_*y_-X[0][1])^2-X[1]^2;
                   14203:                Q=mycoef(P,1,x_)^2-4*mycoef(P,2,x_)*mycoef(P,0,x_);
                   14204:                for(R=polroots(Q,y_);R!=[];R=cdr(R)){
                   14205:                        X0=-subst(mycoef(P,1,x_)/(2*mycoef(P,2,x_)),y_,car(R));
                   14206:                        L=cons([Y[0][0]+X0,Y[0][1]+car(R)*X0],L);
                   14207:                }
                   14208:        }else{ /* Y is a circle */
                   14209:                P=(x_-X[0][0])^2+(y_-X[0][1])^2-X[1]^2;
                   14210:                Q=(x_-Y[0][0])^2+(y_-Y[0][1])^2-Y[1]^2;
                   14211:                V=(X[0][0]!=Y[0][0])?[x_,y_]:[y_,x_];
                   14212:                R=subst(P,V[0],T=lsol(P-Q,V[0]));
                   14213:                if(type(T[0])<4) return (T[0]==0)?1:0;
                   14214:                S=polroots(R,V[1]);
                   14215:                for(L=[];S!=[];S=cdr(S)){
                   14216:                        R=subst(T,V[1],car(S));
                   14217:                        if(V[0]==x_) L=cons([R,car(S)],L);
                   14218:                        else L=cons([S,R],L);
                   14219:                }
                   14220:        }
                   14221:        if(length(L)!=0) return L;
                   14222:        return 0;
                   14223: }
                   14224:
                   14225: def tobezier(L)
                   14226: {
                   14227:        if((Div=getopt(div))==1||Div==2){
                   14228:                if(length(L)!=4) return [tobezier(L|inv=[0,1/2]),tobezier(L|inv=[1/2,1])];
                   14229:                if(type(L)==4) L=ltov(L);
                   14230:                if(type(L[0])==4)
                   14231:                        L=[ltov(L[0]),ltov(L[1]),ltov(L[2]),ltov(L[3])];
                   14232:                S=[(L[0]+3*L[1]+3*L[2]+L[3])/8];
                   14233:                T=[L[3]];
                   14234:                S=cons((L[0]+2*L[1]+L[2])/4,S);
                   14235:                T=cons((L[2]+L[3])/2,T);
                   14236:                S=cons((L[0]+L[1])/2,S);
                   14237:                T=cons((L[1]+2*L[2]+L[3])/4,T);
                   14238:                S=cons(L[0],S);
                   14239:                T=cons((L[0]+3*L[1]+3*L[2]+L[3])/8,T);
                   14240:                return [S,T];
                   14241:        }
                   14242:        if(Div>2&&Div<257){
                   14243:                L=tobezier(L);
                   14244:                for(R=[],I=Div-1;I>=0;I--)
                   14245:                        R=cons(tobezier(L|inv=[I/Div,(I+1)/Div]),R);
                   14246:                return R;
                   14247:        }
                   14248:        if((V=getopt(inv))==1 || type(V)>3){
                   14249:                if(type(L[0])>3 && type(V)>3) L=tobezier(L);
                   14250:                if(type(V)>3 && length(V)>2) V2=V[2];
                   14251:                if(type(V2)!=2) V2=t;
                   14252:                if(type(V)>3) L=subst(L,V2,(V[1]-V[0])*V2+V[0]);
                   14253:                N=mydeg(L,V2);
                   14254:                for(R=[],I=0;I<=N;I++){
                   14255:                        RT=mycoef(L,I,V2);
                   14256:                        R=cons(RT/binom(N,I),R);
                   14257:                        L-=RT*V2^I*(1-V2)^(N-I);
                   14258:                }
                   14259:                return reverse(R);
                   14260:        };
                   14261:        N=length(L)-1;
                   14262:        V=newvect(2);
                   14263:        for(I=0;I<=N;I++,L=cdr(L)){
                   14264:                if(type(X=car(L))==4) X=ltov(X);
                   14265:                V+=X*binom(N,I)*t^I*(1-t)^(N-I);
                   14266:        }
                   14267:        return V;
                   14268: }
                   14269:
                   14270: def cutf(F,X,VV)
                   14271: {
                   14272:        if(type(car(V=VV))==2){
                   14273:                Y=[car(V),X];
                   14274:                V=cdr(V);
                   14275:        }else Y=X;
                   14276:        if(type(X)>1){
                   14277:                Y=(type(Y)==4)?Y[0]:x;
                   14278:                V1=makenewv(F);
                   14279:                if(X==Y||Y==x){
                   14280:                        V2=makenewv([F,V1]);
                   14281:                        F=mysubst(F,[Y,V2]);
                   14282:                        V=cons(V2,V);
                   14283:                }
                   14284:                return [V1,[V1,os_md.cutf,[F],X,[V]]];
                   14285:        }
                   14286:        if(car(V)!=[] && X<car(V)[0]) return myfeval(car(V)[1],Y);
                   14287:        for(V=cdr(V); ;V=R){
                   14288:                if((R=cdr(V))==[]){
                   14289:                        if(car(V)!=[] && car(V)[0]<X) return myfeval(car(V)[1],Y);
                   14290:                        return myfeval(F,Y);
                   14291:                }
1.20      takayama 14292:                if(car(V)==[]||X>car(V)[0]) continue;
1.6       takayama 14293:                if(X==car(V)[0]) return car(V)[1];
                   14294:                return myfeval(F,Y);
                   14295:        }
                   14296: }
                   14297:
1.12      takayama 14298: def fsum(F,L)
1.6       takayama 14299: {
1.12      takayama 14300:        if(getopt(df)==1){
                   14301:                F=f2df(F);
                   14302:        }else Sub=getopt(subst);
1.6       takayama 14303:        if(type(L[0])==2){
                   14304:                X=L[0];
                   14305:                L=cdr(L);
                   14306:        }else X=0;
                   14307:        V=(length(L)>2)?L[2]:1;
                   14308:        for(R=0,I=L[0];;I+=V){
                   14309:                if(V==0||(I-L[1])*V>0) return R;
1.12      takayama 14310:                R+=(Sub==1)?subst(F,X?X:x,I):os_md.myfeval(F,X?[X,I]:I);
1.6       takayama 14311:        }
                   14312: }
                   14313:
                   14314: def periodicf(F,L,X)
                   14315: {
                   14316:        if(type(L)==4) L=[eval(L[0]),eval(L[1])];
                   14317:        else L=eval(L);
                   14318:        if(isvar(X)){
1.20      takayama 14319:                Y=makenewv([X,F]);
                   14320:                Z=makenewv([X,Y,F]);
1.16      takayama 14321:                return [Z,[Z,os_md.periodicf,[mysubst(F,[x,Y])],(type(L)==4)?[L]:L,[[Y,X]]]];
                   14322:        }
                   14323:        if(type(X)==4){
                   14324:                V=X[0];
                   14325:                X=X[1];
                   14326:        }else V=x;
                   14327:        if(type(F)==5){
                   14328:                X=eval(X);
                   14329:                return myfeval(F[floor(X/L)%length(F)],[V,X-floor(X/L)*L]);
1.6       takayama 14330:        }
                   14331:        if(type(L)==4){
                   14332:                X-=floor((X-L[0])/(L[1]-L[0]))*(L[1]-L[0]);
                   14333:                return myfeval(F,[V,X]);
                   14334:        }
                   14335: }
                   14336:
                   14337: def cmpf(X)
                   14338: {
                   14339:        if(type(X)>3){
                   14340:                if(type(L)==7) return [S_Fc,Dx,S_Ic,S_Ec,S_EC,S_Lc];
                   14341:                S_Lc=0;
                   14342:                if(type(S_Fc=X[0])!=4) S_Fc=f2df(S_Fc);
                   14343:                S_Ic=X[1];
                   14344:                if(length(S_Ic)>2){
                   14345:                        S_Fc=mysubst(S_Fc,[S_Ic[0],x]);
                   14346:                        S_Ic=cdr(S_Ic);
                   14347:                }
                   14348:                S_Dc=(type(S_Ic[0])==7)?1:0;
                   14349:                if(type(S_Ic[1])==7) S_Dc=ior(S_Dc,2);
                   14350:                if(type(S_Ec=getopt(exp))!=1) S_Ec=0;
                   14351:                if(S_Ec<=0){
                   14352:                        S_EC=-S_Ec;
                   14353:                        if(S_EC==0) S_EC=1;
                   14354:                        if(S_Dc==3) S_EC*=2;
                   14355:                        else S_EC/=4;
                   14356:                        if(type(F=X[0])==3&&vars(F)==[x]&&(D=deg(nm(F),x))==deg(dn(F),x)-2){
                   14357:                                S_Lc=S_EC*coef(nm(F),D,x)/coef(dn(F),D+2,x);
                   14358:                        }
                   14359:                }else{
                   14360:                        S_EC=S_Ec;
                   14361:                        if(S_Dc==3) S_EC*=12;
                   14362:                        else S_EC/=6;
                   14363:                }
                   14364:                if(type(S_Fc)==3) S_Fc=red(S_Fc);
                   14365:                S_EC=1/S_EC;
                   14366:                return [z_,[z_,os_md.cmpf,x]];
                   14367:        }
                   14368:        if(X<=0 && iand(S_Dc,1)) return S_Lc;
                   14369:        if(X>=1 && iand(S_Dc,2)) return S_Lc;
                   14370:        if(S_Dc==3){
                   14371:                if(S_Ec>0){
                   14372:                        Y0=dexp(1/X)*S_EC;
                   14373:                        Y1=dexp(1/(1-X))*S_EC;
                   14374:                        return myfeval(S_Fc,Y1-Y0)*(Y0/X^2+Y1/(1-X)^2);
                   14375:                }
                   14376:                return myfeval(S_Fc,S_EC/(1-X)-S_EC/X)*(S_EC/(1-X)^2+S_EC/X^2);
                   14377:        }
                   14378:        if(S_Dc==1){
                   14379:                if(S_Ec>0){
                   14380:                        Y=dexp(1-1/X);
                   14381:                        R=myfeval(S_Fc,S_EC*(Y-1)+I[1])*Y;
                   14382:                }
                   14383:                else R=myfeval(S_Fc,I[1]+(1-1/X)*S_EC);
                   14384:                return R*S_EC/X^2;
                   14385:        }
                   14386:        if(S_Dc==2){
                   14387:                if(S_Ec>0){
                   14388:                        Y=dexp(X/(1-X));
                   14389:                        R=myfeval(S_Fc,S_EC*(Y-1)+S_Ic[0])*Y;
                   14390:                }else R=myfeval(S_Fc,S_EC*X/(1-X)+S_Ic[0]);
                   14391:                return R*S_EC/(1-X)^2;
                   14392:        }
                   14393:        X=S_Ic[0]+(S_Ic[1]-S_Ic[0])*X;
                   14394:        return myfeval(S_Fc,X)/(S_Ic[1]-Ic[0]);
                   14395: }
                   14396:
                   14397: def fresidue(P,Q)
                   14398: {
                   14399:        if(iscoef(Q,os_md.israt)) S=fctr(Q);
                   14400:        else S=[[Q,1]];
                   14401:        for(R=[];S!=[];S=cdr(S)){
                   14402:                T=car(S);
                   14403:                if((D=mydeg(T[0],z))==0) continue;
                   14404:                L=[];
                   14405:                if(iscoef(T[0],os_md.iscrat)) L=getroot(T[0],z|cpx=2);
                   14406:                if(findin(z,vars(L))>=0) L=[];
                   14407:                if(L==[]) L=polroots(T[0],z|comp=-1);
                   14408:                for(;L!=[];L=cdr(L)){
                   14409:                        QQ=Q;
                   14410:                        for(I=T[1]; I>1;I--) QQ=mydiff(QQ,z);
                   14411:                        for(U=0,W=I=T[1];I>0;I--,W++){
                   14412:                                QQ=diff(QQ,z);
                   14413:                                U+=subst(QQ,z,L[0])*(z-L[0])^(W-T[1])/fac(W);
                   14414:                        }
                   14415:                        UD=mydiff(U,z);
                   14416:                        for(I=T[1],K=1,PP=P; I>1;I--,K++)
                   14417:                                PP=diff(PP,z)*U-K*PP*UD;
                   14418:                        QQ=subst(PP,z,L[0])/subst(U,z,L[0])^K;
                   14419: /*                     if(D==2) QQ=sqrt2rat(QQ); */
                   14420:                        R=cons([L[0],sqrt2rat(QQ)],R);
                   14421:                }
                   14422:        }
                   14423:        if(type(L=getopt(cond))==4){
                   14424:                for(S=[];R!=[];R=cdr(R)){
                   14425:                        Z=car(R);
                   14426:                        for(LL=L;LL!=[];LL=cdr(LL)){
                   14427:                                X=real(car(Z));Y=imag(car(Z));
                   14428:                                if(myf3eval(car(LL),X,Y,car(Z))<=0) break;
                   14429:                        }
                   14430:                        if(LL==[]) S=cons(Z,S);
                   14431:                }
                   14432:                R=reverse(S);
                   14433:        }
                   14434:        if((Sum=getopt(sum))==1||Sum==2){
                   14435:                for(S=0;R!=[];R=cdr(R)) S+=car(R)[1];
                   14436:                if(Sum==2) S*=2*@pi*@i;
                   14437:                return sqrt2rat(S);
                   14438:        }
                   14439:        return R;
                   14440: }
                   14441:
                   14442: def fint(F,D,V)
                   14443: {
                   14444:        if(((L=length(V))==2 || (L==3&&isvar(V[0])<3))
                   14445:          && (type(V[L-1])==7||(type(V[L-1])<3&&type(eval(V[L-1]))<2)))
                   14446:   /* real integral */
                   14447:                return areabezier([F,D,V]|option_list=getopt());
                   14448:   /* complex integral */
                   14449:        if(L>1&&type(V[1])==4&&type(V[1][1])<4){
                   14450:                if(type(V[0])==4&&type(V[0][0])<2){
                   14451:                        for(R=[],VT=car(V),VV=cdr(V);VV!=[];VV=cdr(VV),VT=VU){
                   14452:                                if((VU=car(VV))==-1) VU=car(V);
                   14453:                                R=cons([ptcommon([VT,VU],[t,1-t]|in=1),[0,1]],R);
                   14454:                        }
                   14455:                        V=reverse(R);
                   14456:                }
                   14457:                else if(L==2) V=[V];
                   14458:        }
                   14459:        Opt=cons(["cpx",1],getopt());
                   14460:        for(R=0;V!=[];V=cdr(V)){
                   14461:                VT=car(V);
                   14462:                X=car(VT)[0];XD=red(diff(X,t));
                   14463:                Y=car(VT)[1];YD=red(diff(Y,t));
                   14464:                F=mysubst(F,[[x,X],[y,Y],[z,X+@i*Y]]);
                   14465:                if(type(F)==4)
                   14466:                        FF=cons(F[0]*(XD+@i*YD),cdr(F));
                   14467:                else FF=red(F*(XD+@i*YD));
                   14468:                R+=areabezier([FF,D,cons(t,VT[1])]|option_list=Opt);
                   14469:        }
                   14470:        return R;
                   14471: }
                   14472:
                   14473: def areabezier(V)
                   14474: {
                   14475:        if(getopt(cpx)==1){
                   14476:                Opt=delopt(getopt(),"cpx");
                   14477:                F=V[0];
                   14478:                if(!isvar(Var=V[2][0])) Var=x;
                   14479:                if(type(F)==3 && vars(F)==[Var] && imag(dn(F))!=0){
                   14480:                        F=(nm(F)*conj(dn(F)))/(dn(F)*conj(dn(F)));
                   14481:                        V0=red(real(nm(F))/dn(F));
                   14482:                        R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14483:                        V0=red(imag(nm(F))/dn(F));
                   14484:                        return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14485:                }
                   14486:                if(getopt(Acc)!=1) F=f2df(F);
                   14487:                V0=compdf([o,[o,real,o_]],o_,F);
                   14488:                R=areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14489:                V0=compdf([o,[o,imag,o_]],o_,F);
                   14490:                return R+@i*areabezier([V0,V[1],V[2]]|option_list=Opt);
                   14491:        }
                   14492:        if(type(V[0])!=4 || vars(V[0][0])!=0){
                   14493:                Mx=[-2.0^(512),2.0^(512)];
                   14494:                I=length(V[2]);
                   14495:                if(type(V[2][I-1])==7||type(V[2][I-2])==7){     /* infinite interval */
                   14496:                        if(type(Ec=getopt(exp))==1) R=cmpf([V[0],V[2]]|exp=Ec);
                   14497:                        else R=cmpf([V[0],V[2]]);
                   14498:                        V=[R,V[1],[0,1]];
                   14499:                }
                   14500:                if(type((Int=getopt(int)))==1 && type(V[0])<4 && (V1=V[1])>=0){
                   14501:                        if(Int==2&&iand(V1,1)) V1++;
                   14502:                        if(!V1) V1=32;
                   14503:                        Opt=cons(["raw",1],getopt());
                   14504:                        W=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   14505:                        SS=W[0][1];
                   14506:                        for(S0=S1=0,I=0,L=W;L!=[] && I<=V1;I++, L=cdr(L)){
                   14507:                                if(iand(I,1)) S1+=car(L)[1];
                   14508:                                else S0+=car(L)[1];
                   14509:                                if (I==V1) SS+=car(L)[1];
                   14510:                        }
                   14511:                        VV=deval(V[2][1]-V[2][0]);
                   14512:                        if(Int==2)
                   14513:                                return (2*S0+4*S1-SS)*VV/(3*V1);
                   14514:                        else
                   14515:                                return (2*S0+2*S1-SS)*VV/(2*V1);
                   14516:                }
                   14517:                Opt=cons(["opt",0],getopt());
                   14518:                V=xygraph(V[0],V[1],V[2],Mx,Mx|option_list=Opt);
                   14519:        }
                   14520:        if(type(V[0][0])!=4) V=os_md.lbezier(V);
                   14521:        for(S=0; V!=[]; V=cdr(V)){
                   14522:                B=tobezier(car(V));
                   14523:                P=intpoly(B[1]*diff(B[0],t),t);
                   14524:                S+=mysubst(P,[t,1]);
                   14525:        }
                   14526:        return S;
                   14527: }
                   14528:
                   14529: def velbezier(V,L)
                   14530: {
                   14531:        if(L==0) L=[t,0,1];
                   14532:        else L=[(length(L)==3)?L[2]:t,L[0],L[1]];
                   14533:        for(R=[],II=length(V)-1;II>=0;II--){
                   14534:                S=fmmx(diff(V[II],L[0]|dif=1),L|dif=1);
                   14535:                for(U=0;S!=[];S=cdr(S)) if((T=abs(car(S)[1]))>U) U=T;
                   14536:                R=cons(U,R);
                   14537:        }
                   14538:        return R;
                   14539: }
                   14540:
                   14541: def ptbezier(V,L)
                   14542: {
                   14543:        if(type(V[0])==4&&type(V[0][0])!=4)  V=lbezier(V);
                   14544:        K=length(V);
                   14545:        if(type(L)<2){
                   14546:                if(L<0) return K;
                   14547:                if(L>=K-1) L=[K-1,1];
                   14548:                else{
                   14549:                        L0=floor(L);
                   14550:                        if(L0>=K-1) L0=K-1;
                   14551:                        L=[L0,L-L0];
                   14552:                }
                   14553:        }
                   14554:        if(L[0]>=0) B=V[L[0]];
                   14555:        else B=V[K+L[0]];
                   14556:        B=tobezier(B);
                   14557:        BB=[diff(B[0],t),diff(B[1],t)];
                   14558:        return [subst(B,t,L[1]),subst(BB,t,L[1])];
                   14559: }
                   14560:
                   14561: def ptcombezier(P,Q,T)
                   14562: {
                   14563:        if(type(T)<2){
                   14564:                if(T<2) T=20;           /*  default */
                   14565:                return ptcombezier(P,Q,[0,0,1,T]);
                   14566:        }
                   14567:        V=T[2]/2;;
                   14568:        PB=tobezier(P|div=1);
                   14569:        PP=[ptbbox(PB[0]),ptbbox(PB[1])];
                   14570:        QB=tobezier(Q|div=1);
                   14571:        QQ=[ptbbox(QB[0]),ptbbox(QB[1])];
                   14572:        for(L=[],I=0;I<2;I++){
                   14573:                for(J=0;J<2;J++){
                   14574:                        if(!iscombox(PP[I],QQ[J])) continue;
                   14575:                        if(T[3]<=1) return
                   14576:                                [[T[0]+(I+0.5)*V,T[1]+(J+0.5)*V,
                   14577:                                        [(PP[I][0][0]+PP[I][0][1])/2,(PP[I][1][0]+PP[I][1][1])/2]]];
                   14578:                        else{
                   14579: #if 0
                   14580:                                U=PB[I][0];V=PB[I][length(PB[I])-1];
                   14581:                                if(abs(A=(U[0]-V[0]))>abs(B=(U[1]-V[I])))
                   14582:                                        M=mat([1,0],[-B/A,1]);
                   14583:                                else if(U!=V)
                   14584:                                        M=mat([1,-A/B],[0,1]);
                   14585:                                else continue;
                   14586:                                if(!iscombox(ptbox(ptaffine(M,PB[I])),ptbox(ptaffine(M,QB[J])))) continue;
                   14587: #endif
                   14588:
                   14589:                                LN=ptcombezier(PB[I],QB[J],[T[0]+I*V,T[1]+J*V,V,T[3]-1]);
                   14590: #if 0
                   14591:                                L=append(LN,L);
                   14592: #else
                   14593:                                if(LN!=[]){
                   14594:                                        if(L==[]) L=LN;
                   14595:                                        else for(VV=3*V/2^T[3];LN!=[];LN=cdr(LN)){
                   14596:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   14597:                                                        if(abs(car(LN)[0]-car(LT)[0])<VV&&abs(car(LN)[1]-car(LT)[1])<VV) break;
                   14598:                                                }
                   14599:                                        }
                   14600:                                }
                   14601:                                if(length(L)>32){               /* Too many points */
                   14602:                                        I=J=2;
                   14603:                                }
                   14604: #endif
                   14605:                        }
                   14606:                }
                   14607:        }
                   14608:        return L;
                   14609: }
                   14610:
                   14611:
                   14612: def ptcombz(P,Q,T)
                   14613: {
                   14614:        if(P==Q) Q=0;
                   14615:        if(type(P[0][0])!=4) P=P0=lbezier(P);
                   14616:        if(Q==0){
                   14617:                Q=P;F=1;
                   14618:        }
                   14619:        else if(type(Q[0][0])!=4) Q=lbezier(Q);
                   14620:        for(R=[],I=0,Q0=Q;P!=[];P=cdr(P),I++){
                   14621:                for(J=0,Q=Q0;Q!=[];Q=cdr(Q),J++){
                   14622:                        if(F==1&&I<J+2) break;
                   14623:                        if((RT=ptcombezier(car(P),car(Q),T))!=[]){
                   14624:                                RT=cons([I,J],RT);
                   14625:                                R=cons(RT,R);
                   14626:                        }
                   14627:                }
                   14628:        }
                   14629:        if((Red=getopt(red))==1||Red==2){
                   14630:                if(type(M=getopt(prec))!=1) M=12;
                   14631:                for(F=0,T=P0;T!=[];T=cdr(T)){
                   14632:                        for(S=car(T);S!=[];S=cdr(S)){
                   14633:                                if(type(ST=car(S))==4 && type(ST[0])<2){
                   14634:                                        if(F++==0){
                   14635:                                                X0=X1=ST[0];Y0=Y1=ST[1];
                   14636:                                        }else{
                   14637:                                                if(ST[0]<X0) X0=ST[0];
                   14638:                                                if(ST[0]>X1) X1=ST[0];
                   14639:                                                if(ST[1]<Y0) Y0=ST[1];
                   14640:                                                if(ST[1]>Y1) Y1=ST[1];
                   14641:                                        }
                   14642:                                }
                   14643:                        }
                   14644:                }
                   14645:                V0=(X1-X0)/2^M;V1=(Y1-Y2)/2^M;
                   14646:                for(RR=[],RT=R;RT!=[];RT=cdr(RT))
                   14647:                        for(S=cdr(car(RT));S!=[];S=cdr(S)) RR=cons(car(S)[2],RR);
                   14648:                RR=ltov(RR);L=length(RR);
                   14649:                for(I=0;I<L;I++)
                   14650:                        for(K=1,J=I+1;K!=0&&J<L;J++)
                   14651:                                if(abs(RR[I][0]-RR[J][0])<V0 && abs(RR[I][1]-RR[J][1])<V1) RR[I]=K=0;
                   14652:                R0=[];
                   14653:                I=L-1;
                   14654:                if(Red==2){
                   14655:                        for(;I>=0;I--) if(RR[I]!=0) R0=cons(RR[I],R0);
                   14656:                }else{
                   14657:                        for(RT=R;RT!=[];RT=cdr(RT)){
                   14658:                                R00=[car(RT)[0]];
                   14659:                                for(S=cdr(car(RT));S!=[];S=cdr(S),I--)
                   14660:                                        if(RR[L-I-1]!=0) R00=cons(car(S),R00);
                   14661:                                if(length(R00)>1) R0=cons(reverse(R00),R0);
                   14662:                        }
                   14663:                }
                   14664:                return R0;
                   14665:        }
                   14666:        return reverse(R);
                   14667: }
                   14668:
                   14669: def draw_bezier(ID,IDX,B)
                   14670: {
                   14671:        if(getopt(init)==1){
                   14672:                S_FDot=0;
                   14673:                return;
                   14674:        }
                   14675:        if(type(Col=getopt(col))!=1&&Col!=0) Col=0;
                   14676:        Dot=0;
                   14677:        if(type(Opt=getopt(opt))==7){
                   14678:                if(!Col){
                   14679:                        Col=drawopt(Opt,0);
                   14680:                        if(Col==-1) Col=0;
                   14681:                }
                   14682:                T=drawopt(Opt,3);
                   14683:                if(iand(T,2)){
                   14684:                        M=iand(T,1)?1/8:1/4;
                   14685:                        for(C=Col,Col=I=0;I<20;I+=8)
                   14686:                                Col+=ishift(0xff-(floor((0xff-iand(0xff,ishift(C,I)))*M)),-I);
                   14687:                }
                   14688:                if(iand(T,4)) Dot=2;            /* 2 or 3 or 4 or 6 */
                   14689:                else if(iand(T,8)) Dot=4;
                   14690:        }
                   14691:        if(type(B)==4 && (type(B[0])==4||type(B[0])==5) && type(B[0][0])<2) B=lbezier(B);
                   14692:        else if(type(B)==5) B=[vtol(B)];
                   14693:        for(;B!=[];B=cdr(B)){
                   14694:                if(vars(F=car(B))==[]){
                   14695: #if 1
                   14696:                        if(length(F)<3&&!Dot){          /* line or point */
                   14697:                                if(length(F)>0){
                   14698:                                        G=[rint(F[0][0]),rint(F[0][1])];
                   14699:                                        if(length(F)==1) draw_obj(ID,IDX,G,Col);
                   14700:                                        else{
                   14701:                                                G=[G[0],G[1],rint(F[1][0]),rint(F[1][1])];
                   14702:                                                draw_obj(ID,IDX,G,Col);
                   14703:                                        }
                   14704:                                }
                   14705:                                continue;
                   14706:                        }
                   14707: #endif
                   14708:                        if(length(F)<2) continue;
                   14709:                        F=tobezier(F);
                   14710:                }
                   14711:                N=velbezier(F,0);
                   14712:                N=(N[0]>N[1])?N[0]:N[1];
                   14713:                if(!N) N=1;
                   14714:                for(I=0;I<=N;I++,S_FDot++){
                   14715:                        if(Dot!=iand(S_FDot,Dot)) continue;
                   14716:                        G=subst(F,t,I/N);
                   14717:                        G=[rint(G[0]),rint(G[1])];
                   14718:                        if(G!=G0){
                   14719:                                draw_obj(ID,IDX,G,Col);
                   14720:                                G0=G;
                   14721:                        }
                   14722:                }
                   14723:        }
                   14724:        if(S_FDot-->=2^32) S_FDot=0;
                   14725:        return 0;
                   14726: }
                   14727:
1.29      takayama 14728:
                   14729: /*
                   14730: def redbezier(L)
                   14731: {
                   14732:        V=newvect(4);ST=0;
                   14733:        for(R=[],I=0,T=L;T=[];T=cdr(T){
                   14734:                if(type(car(T))<4){
                   14735:                        F=0;
                   14736:                        if(I==3)
                   14737:                        if(car(T)==0){
                   14738:                        }else if(car(T)==1){
                   14739:                        }else if(car(T)==-1){
                   14740:                                if(I<3) V[I++]=ST;
                   14741:                        }
                   14742:                }else if(I==3){
                   14743:                        if(R==[] || car(R)!=1){
                   14744:                                R=cons(V[0],R);
                   14745:                                if(ST==0) ST=V[0];
                   14746:                        }
                   14747:                        for(J=1;J<3;J++) R=cons(V[J],R);
                   14748:                        while((T=cdr(T))!=[]){
                   14749:                                R=cons(car(T),R);
                   14750:                                if(type(car(R))<4)
                   14751:                        }
                   14752:                }else{
                   14753:                        if(ST==0) ST=car(T);
                   14754:                        V[I++]= car(T);
                   14755:                }
                   14756:        }
                   14757: }
                   14758: */
                   14759:
1.6       takayama 14760: def lbezier(L)
                   14761: {
                   14762:        if((In=getopt(inv))==1||In==2||In==3){
                   14763:                for(F=0,R=[];L!=[];L=cdr(L)){
                   14764:                        LT=car(L);
                   14765:                        if(F==car(LT)) R=cons(1,R);
                   14766:                        else{
                   14767:                                if(R!=[]&&F!=0) R=cons(0,R);
                   14768:                                R=cons(G=car(LT),R);
                   14769:                                if(In==3) In==2;
                   14770:                        }
                   14771:                        for(LT=cdr(LT);LT!=[];LT=cdr(LT))
                   14772:                                R=cons(car(LT),R);
                   14773:                        if((F=car(R))==G&&In==1){
                   14774:                                R=cons(-1,cdr(R));
                   14775:                                F=0;
                   14776:                        }
                   14777:                }
                   14778:                if(In==3 && car(R)==G) R=cons(-1,cdr(R));
                   14779:                return reverse(R);
                   14780:        }
                   14781:        for(F=0,RT=R=[];L!=[];L=cdr(L)){
                   14782:                if(type(T=car(L))==4||type(T)==5){
                   14783:                        if(F==0){
                   14784:                                FT=T;F=1;
                   14785:                        }
                   14786:                        RT=cons(T,RT);
                   14787:                }else if(T==0){
                   14788:                        if(RT==[]) R=cons(reverse(RT),R);
                   14789:                        RT=[];F=0;
                   14790:                }else if(T==1){
                   14791:                        if(RT!=[]){
                   14792:                                R=cons(reverse(RT),R);
                   14793:                                RT=[car(RT)];
                   14794:                        }else{
                   14795:                                RT=[];F=0;
                   14796:                        }
                   14797:                }else if(T==-1){
                   14798:                        RT=cons(FT,RT);
                   14799:                        R=cons(reverse(RT),R);
                   14800:                        RT=[];F=0;
                   14801:                }
                   14802:        }
                   14803:        if(RT!=[]) R=cons(reverse(RT),R);
                   14804:        return reverse(R);
                   14805: }
                   14806:
                   14807:
                   14808: def xybezier(L)
                   14809: {
                   14810:        if(L==0 || (LS=length(L))==0) return "";
                   14811:        Out=str_tb(0,0);
                   14812:        if(type(VF=getopt(verb))==4){
                   14813:                if(type(car(VF))>3){
                   14814:                        VFS=VF;VF=1;
                   14815:                }else{
                   14816:                        VFS=cdr(VF);VF=car(VF);
                   14817:                }
                   14818:        }else VFS=["$\\bullet$","$\\times$"];
                   14819:        if(VF!=1 && VF!=2) VF=0;
                   14820:        if(!TikZ){
                   14821:                if(VF) Ob=str_tb(0,0);
                   14822:                T="\n**\\crv{";
                   14823:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+Opt;
                   14824:                L00=Q=L[I0=0];S=S1="";
                   14825:                for(F=0,I=1;I<=LS;I++){
                   14826:                        P=Q;Q=(I==LS)?0:L[I];
                   14827:                        if(type(Q)==4){
                   14828:                                if(F==0){
                   14829:                                        S1="";L0=P;F=1;
                   14830:                                        continue;
                   14831:                                }else if(F==1)
                   14832:                                        F=2;
                   14833:                                else if(F==2){
                   14834:                                        S1=S1+"&";
                   14835:                                }
                   14836:                                S1=S1+xypos(P);
                   14837:                                if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   14838:                        }else{
                   14839:                                if(Q==0){
                   14840:                                        if(F>0){
                   14841:                                                str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   14842:                                                if(VF){
                   14843:                                                        str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   14844:                                                        if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   14845:                                                }
                   14846:                                                F=0;
                   14847:                                        }
                   14848:                                }else if(Q==1){
                   14849:                                        str_tb("{"+xypos(L0)+";"+xypos(P)+T+S1+"}};\n",Out);
                   14850:                                        if(VF){
                   14851:                                                str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   14852:                                                if(VF==1) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   14853:                                        }
                   14854:                                        F=1;
                   14855:                                }else if(Q==-1){
                   14856:                                        if(F==2)
                   14857:                                                S1=S1+"&";
                   14858:                                        str_tb("{"+xypos(L0)+";"+xypos(L00)+T+S1+xypos(P)+"}};\n",Out);
                   14859:                                        if(VF)  str_tb(xyput([L[0][0],L[0][1],VFS[0]]),Ob);
                   14860:                                        F=0;
                   14861:                                }
                   14862:                                if(F==1){
                   14863:                                        if(I<LS-1 && type(L[I+1])<2){
                   14864:                                                if(L[I+1]==-1){
                   14865:                                                        str_tb("{"+xypos(P)+";"+xypos(L00)+T+"}};\n",Out);
                   14866:                                                }
                   14867:                                                if(VF)  str_tb(xyput([P[0][0],P[0][1],VFS[0]]),Ob);
                   14868:                                                F=0;
                   14869:                                        }
                   14870:                                }
                   14871:                                while(++I<LS && type(L[I])<2);
                   14872:                                if(I>=LS) break;
                   14873:                                if(F==1){
                   14874:                                        Q=P;I--;F=0;
                   14875:                                }else L00=Q=L[I];
                   14876:                        }
                   14877:                }
                   14878:        }else{
                   14879:                if(type(T=getopt(cmd))==7){
                   14880:                        if(T!="") T="\\"+T;
                   14881:                }else T="\\draw";
                   14882:                if((Rel=getopt(relative))==1)   VF=0;
                   14883:                if(VF) Ob=str_tb(0,0);
                   14884:                if(type(Opt=getopt(opt))==7 && Opt!="") T=T+"["+Opt+"]";
                   14885:                Out=str_tb(T,0);
                   14886:                Q=L[0];
                   14887:                for(F=M=0,I=1;I<=LS;I++){
                   14888:                        P=Q; Q=(I==LS)?0:L[I];
                   14889:                        if(++M>XYLim){
                   14890:                                str_tb("\n",Out);M=1;
                   14891:                        }
                   14892:                        if(type(Q)==4 || type(Q)==5 || type(Q)==7){
                   14893:                                if(F==0){
                   14894:                                        str_tb(" ",Out);
                   14895:                                        F=1;
                   14896:                                }else if(F==1){
                   14897:                                        str_tb(" .. controls ",Out);
                   14898:                                        F=2;
                   14899:                                }else if(F==2){
                   14900:                                        str_tb(" and ",Out);
                   14901:                                        F=2;
                   14902:                                }
                   14903:                                PP=xypos(P);
                   14904:                                if(Rel==1 && F==2) PP="+"+PP;
                   14905:                                str_tb(PP,Out);
                   14906:                                if(VF&&((F<2)||length(VFS)>1))
                   14907:                                        str_tb(xyput([P[0],P[1],(F<2)?VFS[0]:VFS[1]]),Ob);
                   14908:                        }else{
                   14909: /*                             if(I<LS-1) VF=0; */
                   14910:                                if(Q==0||Q==1){
                   14911:                                        PP=xypos(P);
                   14912:                                        if(Rel==1) PP="+"+PP;
                   14913:                                        str_tb(((F==0)?" ":((F==1)?" -- ":" .. "))+PP,Out);
                   14914:                                        if(VF) str_tb(xyput([P[0],P[1],VFS[0]]),Ob);
                   14915:                                        F=Q;
                   14916:                                }else if(Q==-1){
                   14917:                                        PP=xypos(P);
                   14918:                                        if(Rel==1) PP="+"+PP;
                   14919:                                        if(F==1)
                   14920:                                                str_tb("..controls "+PP+" .. cycle",Out);
                   14921:                                        else if(F==2)
                   14922:                                                str_tb(" and "+PP+" .. cycle",Out);
                   14923:                                        if(VF&&length(VFS)>1) str_tb(xyput([P[0],P[1],VFS[1]]),Ob);
                   14924:                                        F=0;
                   14925:                                }
                   14926:                                if(F==1){
                   14927:                                        if(I<LS-1){
                   14928:                                                if(L[I+1]==-1){
                   14929:                                                        str_tb(" -- cycle",Out);
                   14930:                                                        I=I+1;
                   14931:                                                        F=0;
                   14932:                                                }
                   14933:                                                else if(type(L[I+1])<2) F=0;
                   14934:                                        }
                   14935:                                }
                   14936:                                while(++I<LS && type(L[I])<2);
                   14937:                                if(I>=LS) break;
                   14938:                                Q=L[I];
                   14939:                        }
                   14940:                }
                   14941:                str_tb(";\n",Out);
                   14942:        }
                   14943:        if(VF)  str_tb(str_tb(0,Ob),Out);
                   14944:        return str_tb(0,Out);
                   14945: }
                   14946:
                   14947: def xybox(L)
                   14948: {
                   14949:        K=length(L);
                   14950:        P=L[0];Q=L[1];
                   14951:        if(K==2)
                   14952:                LL=[ P, [P[0],Q[1]], Q, [Q[0],P[1]] ];
                   14953:        else{
                   14954:                R=L[2];
                   14955:                LL=[ P, R, Q, [P[0]+Q[0]-R[0],P[1]+Q[1]-R[1]] ];
                   14956:        }
                   14957:        Opt=getopt();
                   14958:        SS=getopt(opt);
1.8       takayama 14959:        FL=getopt(color);
                   14960:        if(TikZ&&type(SS)<1&&K==2){
                   14961:                if(type(FL)==4){
                   14962:                        F=FL[0];
                   14963:                        if(length(FL)>1) CMD=FL[1];
                   14964:                }else if(type(FL)==7) F=FL;
                   14965:                else F="";
                   14966:                F=cons(F,["rectangle"]);
                   14967:                if(CMD) return xyarrow(P,Q|opt=F,cmd=CMD);
                   14968:                else return xyarrow(P,Q|opt=F);
                   14969:        }
1.6       takayama 14970:        if(type(SS)!=7&&!TikZ) Opt=cons(["opt","@{-}"],Opt);
                   14971:        Opt=cons(["close",1],Opt);
                   14972:        return xylines(LL|option_list=Opt);
                   14973: }
                   14974:
                   14975: def xyang(S,P,Q,R)
                   14976: {
                   14977:        Opt=getopt();
                   14978:        if(type(Prec=getopt(prec))!=1) Prec=0;
                   14979:        if(type(Q)>2){
                   14980:                if(R==1||R==-1){                                /* 直角 */
                   14981:                        P1=ptcommon([Q,P],[-S,0]);
                   14982:                        S*=R;
                   14983:                        P2=ptcommon([P,P1],[S,@pi/2]);
                   14984:                        P3=ptcommon([P1,P2],[S,@pi/2]);
                   14985:                        return xylines([P1,P2,P3]|option_list=Opt);
                   14986:                }else if((AR=abs(R))==0||AR==2||AR==3||AR==4){  /* 矢印 */
                   14987:                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   14988:                        if(R<0) Ang+=3.14159;
                   14989:                        ANG=[0.7854,0.5236,1.0472];
                   14990:                        X=(AR==0)?1.5708:ANG[AR-2];
                   14991:                        U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   14992:                        V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];      /* 矢先 */
                   14993:                        V=(X==0)?[U,V]:[U,P,V];
                   14994:                        if(getopt(ar)==1) V=append([Q,P,0],V);          /* 心棒 */
                   14995:                        return xylines(V|option_list=Opt);
                   14996:                }else if(AR>4&&AR<9){
                   14997:                        Ang=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   14998:                        ANG=[0.7854,0.5236,0.3927,0.2618];
                   14999:                        X=ANG[AR-5];
                   15000:                        U=[P[0]+S*dcos(Ang+X),P[1]+S*dsin(Ang+X)];
                   15001:                        V=[P[0]+S*dcos(Ang-X),P[1]+S*dsin(Ang-X)];
                   15002:                        W=ptcommon([P,U],[P,Q]|in=-2);
                   15003:                        W1=[(U[0]+P[0]+W[0])/3,(U[1]+P[1]+W[1])/3];
                   15004:                        W2=[(V[0]+P[0]+W[0])/3,(V[1]+P[1]+W[1])/3];
                   15005:                        L=[U,W1,P,1,W2,V];
                   15006:                        if(getopt(ar)==1) L=append([Q,P,0],L);
                   15007:                        if(type(Sc=getopt(scale))>0){
                   15008:                                if(type(Sc)==1) Sc=[Sc,Sc];
                   15009:                                L=ptaffine(diagm(2,Sc),L);
                   15010:                        }
                   15011:                        Opt=getopt(opt);
                   15012:                        if(type(Opt)>0) OL=[["opt",Opt]];
                   15013:                        else OL=[];
                   15014:                        if(getopt(proc)==1)     return append([2,OL],L);
                   15015:                        S=xybezier(L|optilon_list=OL);
                   15016:                        if(getopt(dviout)!=1) return S;
                   15017:                        dviout(S);
                   15018:                        return 1;
                   15019:                }
                   15020:        }
                   15021:        if(type(Q)<3){
                   15022:                X=deval(Q); Y=deval(R);
                   15023:        }else{
                   15024:                X=myarg([Q[0]-P[0],Q[1]-P[1]]);
                   15025:                Y=myarg([R[0]-P[0],R[1]-P[1]]);
                   15026:        }
                   15027:        if(Prec>2) N=8;
                   15028:        else if(Prec==2) N=6;
                   15029:        else if(Prec==1) N=4;
                   15030:        else N=3;
                   15031:        U=deval(@pi)*2/N;
                   15032:        if(X==Y||Y-X>6.28318){
                   15033:                for(L=[],I=N-1;I>=0;I--) L=cons([P[0]+S*dcos(I*U),P[1]+S*dsin(I*U)],L);
                   15034:                return xylines(L|option_list=append([["curve",1],["close",1]],Opt));
                   15035:        }
                   15036:        for(M=1;(Y-X)/M>U;M++);
                   15037:        for(L=[],I=M+1;I>-2;I--){
                   15038:                Ang=X+(Y-X)*I/M;
                   15039:                L=cons([P[0]+S*dcos(Ang),P[1]+S*dsin(Ang)],L);
                   15040:        }
                   15041:        if(getopt(ar)!=1) return xylines(L|option_list=append([["curve",1],["close",-1]],Opt));
                   15042:        OL=delopt(Opt,["dviout","opt","proc"]);
                   15043:        S=xylines(L|option_list=append([["curve",1],["close",-1],["opt",0]],OL));
                   15044:        T=xylines([P,L[1]]|option_list=cons(["opt",0],OL));
                   15045:        S=ptaffine("close",[S,T]);                      /* connect curves */
                   15046:        if(getopt(opt)==0) return S;
                   15047:        OL=(type(SS=getopt(opt))>1)?[["opt",SS]]:[];
                   15048:        if(type(T=getopt(proc))==1 && T>=1 && T<=3) return [1,OL,S];
                   15049:        if(OL==[]) S=xybezier(S);
                   15050:        else S=(type(SS)==7)? xybezier(S|opt=SS):xybezier(S|opt=SS[0],cmd=SS[1]);
                   15051:        if(getopt(dviout)==1) return xyproc(S|dviout=1);
                   15052:        return S;
                   15053: }
                   15054:
                   15055: def xyoval(P,L,R)
                   15056: {
                   15057:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   15058:                if(length(Arg)>2)
                   15059:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180,@pi*Arg[2]/180];
                   15060:                else
                   15061:                        Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   15062:        }
                   15063:        if(type(Arg)==4){
                   15064:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   15065:                if(length(Arg)>2) Arg2=deval(Arg[2]);
                   15066:                if(Arg1<Arg0 || Arg0<-7) return 0;
                   15067:        }
                   15068:        if(type(Prec=getopt(prec))!=0) Prec=0;
                   15069:        if((Ar=getopt(ar))!=1) Ar=0;
                   15070:        L=xyang(L,[0,0],Arg0,Arg1|prec=Prec,opt=0,ar=Ar);
                   15071:        Sc=getopt(scale);
                   15072:        if(type(Sc=getopt(scale))<1) Sc=[1,1];
                   15073:        else if(type(Sc)==1) Sc=[Sc,Sc];
                   15074:        M=mat([1,0],[0,R]);
                   15075:        L=ptaffine(M,L|shift=P);
                   15076:        M=mat([Sc[0],0],[0,Sc[1]]);
                   15077:        L=ptaffine(M,L|arg=Arg2);
                   15078:        if((Opt=getopt(opt))==0) return L;
                   15079:        Opt=(type(Opt)>1)? [["opt2",Opt]]:[];
                   15080:        if(getopt(proc)==1) return [1,Opt,L];
                   15081:        S=xybezier(L|option_list=getopt());
                   15082:        if(getopt(dviout)==1){
                   15083:                xyproc(S|dviout=1);
                   15084:                return 1;
                   15085:        }
                   15086:        return S;
                   15087: }
                   15088:
                   15089: def xycirc(P,R)
                   15090: {
                   15091:        ST=getopt(opt);
                   15092:        if(type(ST)<0) ST="";
                   15093:        if(type(Arg=getopt(arg))!=4 && type(Arg=getopt(deg))==4){
                   15094:                Arg=[@pi*Arg[0]/180,@pi*Arg[1]/180];
                   15095:        }
                   15096: /*                                                             Is it OK?
                   15097:        if(TikZ==0 && XYcm==1){
                   15098:                R*=10; P=[P[0]*10,P[1]*10];
                   15099:        }
                   15100: */
                   15101:        if(type(Arg)==4){
                   15102:                Arg0=deval(Arg[0]); Arg1=deval(Arg[1]);
                   15103:                if(Arg1<=Arg0 || Arg0<-7 || Arg1-Arg0>7) return 0;
                   15104:                if(type(ST)==7)
                   15105:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   15106:         [P[1]-R-1,P[1]+R+1]|opt=ST);
                   15107:                else
                   15108:                        S=xygraph([R*cos(x)+P[0],R*sin(x)+P[1]],-4,[Arg0,Arg1],[P[0]-R-1,P[0]+R+1],
                   15109:         [P[1]-R-1,P[1]+R+1]);
                   15110:                if(getopt(close)==1){
                   15111:                        S=S+xyline([0,0],
                   15112:                                [deval(subst(R*cos(x)+P[0],x,Arg0)),deval(subst(R*sin(x)+P[0],x,Arg0))]);
                   15113:                        S=S+xyline([0,0],
                   15114:                                [deval(subst(R*cos(x)+P[0],x,Arg1)),deval(subst(R*sin(x)+P[0],x,Arg1))]);
                   15115:                }
                   15116:                return S;
                   15117:        }
                   15118:        if(TikZ){
                   15119:                SP="";
                   15120:                if(length(P)>2) SP=P[2];
                   15121:                if(type(SP)!=7) SP="$"+my_tex_form(SP)+"$";
                   15122:                if(R==0){
                   15123:                        if(ST!="") ST=ST+",";
                   15124:                        return "\\node ["+ST+"circle,draw]"+xypos([P[0],P[1]])+ "{"+SP+"};\n";
                   15125:                }
1.8       takayama 15126:                if(type(R)!=7) R=rtostr(deval(R));
1.6       takayama 15127:                if(ST!="") ST="["+ST+"]";
                   15128:                S="\\draw "+ST+xypos([P[0],P[1]])+" circle [radius="+R+"]";
                   15129:                if(SP!="") S=S+" node at"+xypos([P[0],P[1]])+" {"+SP+"}";
                   15130:                return S+";\n";
                   15131:        }
                   15132:        S="{"+xypos([P[0],P[1]]);
                   15133:        if(length(P)>2){
                   15134:                SP=P[2];
                   15135:                if(type(P)!=7) SP=my_tex_form(SP);
                   15136:                S=S+" *+{"+SP+"}";
                   15137:        }
                   15138:        S =S+" *\\cir";
                   15139:        if(R!=0){
1.8       takayama 15140:                R=deval(R);
1.6       takayama 15141:                S=S+"<"+rtostr(R)+((XYcm)?"cm>":"mm>");
                   15142:        }
                   15143:        S = S+"{";
                   15144:        if(type(ST)==7) S=S+ST;
                   15145:     return S+"}};\n";
                   15146: }
                   15147:
1.33      takayama 15148: def xypoch(W,H,R1,R2)
                   15149: {
                   15150:        if(H>R1||2*H>R2){
                   15151:                errno(0);
                   15152:                return;
                   15153:        }
                   15154:        if(type(Ar=getopt(ar))!=1) Ar=TikZ?0.25:2.5;
                   15155:        T1=dasin(H/R1);S1=R1*dcos(T1);
                   15156:        T2=dasin(H/R2);S2=R2*dcos(T2);
                   15157:        T3=dasin(2*H/R2);S3=R2*dcos(T3);
                   15158:        S=xyline([R1,0],[W-R1,0]);
                   15159:        S+=xyang(R1,[W,0],-@pi,@pi-T1);
                   15160:        S+=xyline([S2,H],[W-S1,H]);
                   15161:        S+=xyang(R2,[0,0],T2,2*@pi-T3);
                   15162:        S+=xylines([[S3,-2*H],[W-H-R2,-2*H],[W-H-R2,2*H],[W-S3,2*H]]);
                   15163:        S+=xyang(R2,[W,0],-@pi+T2,@pi-T3);
                   15164:        S+=xyline([W-T2,-H],[W-T2,-H]);
                   15165:        S+=xyang(R1,[0,0],0,2*@pi-T1);
                   15166:        S+=xyline([W-S2,-H],[S1,-H]);
                   15167:        if(Ar>0){
                   15168:                S+=xyang(Ar,[W/2,0],[0,0],8);
                   15169:                S+=xyang(Ar,[W/2,-2*H],[0,-2*H],8);
                   15170:                S+=xyang(Ar,[W/2-Ar,-H],[W,-H],8);
                   15171:                S+=xyang(Ar,[W/2-Ar,H],[W,H],8);
                   15172:                S+=xyang(Ar,[W-S3,2*H],[W-H-R2,2*H],8);
                   15173:        }
                   15174:        S+=xyput([R1,0,"$\\bullet$"]);
                   15175:        S+=xyput([0,0,"$\\times$"]);
                   15176:        S+=xyput([W,0,"$\\times$"]);
                   15177:        if(TikZ) S=str_subst(S,";\n\\draw","\n");
                   15178:        return S;
                   15179: }
                   15180:
1.6       takayama 15181: def ptaffine(M,L)
                   15182: {
                   15183:        if(type(L)!=4&&type(L)!=5){
                   15184:                erno(0);return L;
                   15185:        }
                   15186:        if(type(M)==7){ /* connect lists */
                   15187:                if(M=="reverse"){
                   15188:                        for(LO=LR=[],F=0,LT=L; LT!=[]; LT=cdr(LT)){
                   15189:                                if(type(P=car(LT))==4 || type(P)==7){
                   15190:                                        LR=cons(P,LR);
                   15191:                                        continue;
                   15192:                                }else{
                   15193:                                        if(P==-1){
                   15194:                                                LL=reverse(LR);
                   15195:                                                LO=append(reverse(cons(-1,cdr(LL))),LO);
                   15196:                                                LO=cons(car(LL),LO);
                   15197:                                                LR=[];
                   15198:                                        }else if(P==1){
                   15199:                                                LR=cons(car(LR),cons(1,cdr(LR)));
                   15200:                                        }else if(P==0 || length(LT)==1){
                   15201:                                                        if(LO!=[] && car(LO)!=0 && (type(car(LO))==4 || car(LO)==1))
                   15202:                                                                LO=cons(0,LO);
                   15203:                                                        LO=append(LR,LO);
                   15204:                                                        if(length(LT)>1&&length(LO)>0&&car(LO)!=0) LO=cons(0,LO);
                   15205:                                                        LR=[];
                   15206:                                        }
                   15207:                                }
                   15208:                        }
                   15209:                        return append(LR,LO);
                   15210:                }
                   15211:                if(type(L[0][0])!=4) L=[L];
                   15212:                LO=[];
                   15213:                if(M=="connect" || M=="close" || M=="loop"){
                   15214:                        Top=car(car(L));
                   15215:                        for(K=1,LL=L; LL!=[]; LL=cdr(LL)){
                   15216:                                for(F=0,LT=car(LL); LT!=[]; LT=cdr(LT),F++){
                   15217:                                        if((LTT=car(LT))==0) LTT=1;
                   15218:                                        if(F==0 && LO!=[]){
                   15219:                                                LO0=car(LO);
                   15220:                                                if(car(LO)!=1&&length(LO)>1) LO=cons(1,LO);
                   15221:                                                if(LTT==LO0) continue;
                   15222:                                                else LO=cons(1,cons(LTT, LO));
                   15223:                                        }else LO=cons(LTT, LO);
                   15224:                                }
                   15225:                        }
                   15226:                        if(M!="connect"){
                   15227:                                if(Top==car(LO) || car(LO)==1 || M=="loop")
                   15228:                                        LO=cons(-1,cdr(LO));
                   15229:                                else
                   15230:                                        LO=cons(-1,cons(1,LO));
                   15231:                        }
                   15232:                        return reverse(LO);
                   15233:                }
                   15234:                if(M=="union"){
                   15235:                        for(LL=reverse(L); LL!=[]; LL=cdr(LL)){
                   15236:                                if(LO!=[]) LO=cons(0,LO);
                   15237:                                LO=append(car(LL),LO);
                   15238:                        }
                   15239:                        L=LO;
                   15240:                }
                   15241:                return L;
                   15242:        }
                   15243:        if(type(Arg=getopt(deg))==1)
                   15244:                Arg=@pi*Arg/180;
                   15245:        else Arg=getopt(arg);
                   15246:        if(type(Arg)==2) Arg=deval(Arg);
                   15247:        if(type(Arg)==1)
                   15248:                M=M*mat([dcos(Arg),-dsin(Arg)],[dsin(Arg),dcos(Arg)]);
                   15249:        if(type(Sft=getopt(org))==4){
                   15250:                Sft=ltov(Sft);
                   15251:                Sft-=M*Sft;
                   15252:        }else Sft=ltov([0,0]);
                   15253:        if(type(V=getopt(shift))==4)
                   15254:                Sft+=ltov(V);
                   15255:        if(getopt(proc)==1){
                   15256:                if(Sft!=0&&ltov(Sft)!=[0,0]) Sft=[["shift",vtol(Sft)]];
                   15257:                else Sft=[];
                   15258:                for(LO=[],LT=L;LT!=[];LT=cdr(LT)){
                   15259:                        if(type(car(T=car(LT)))<2){
                   15260:                                if((P=car(T))==0){      /* exedraw 0 */
                   15261:                                        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]]];
                   15262:                                        V=ptbbox(ptaffine(M,V|option_list=Sft));
                   15263:                                        L1=cdr(cdr(cdr(T)));
                   15264:                                        LO=cons(append([0,V[0],V[1]],L1),LO);
                   15265:                                        continue;
                   15266:                                }else if(P==1){ /* exedraw 1 */
                   15267:                                        L1=[];
                   15268:                                        for(TT=cdr(cdr(T));TT!=[];TT=cdr(TT)){
                   15269:                                                D=car(TT);
                   15270:                                                if(type(D[0][0])==4){
                   15271:                                                        for(L2=[],DT=D;DT!=[];DT=cdr(DT))
                   15272:                                                                L2=cons(ptaffine(M,car(DT)|option_list=Sft),L2);
                   15273:                                                        L1=cons(reverse(L2),L1);
                   15274:                                                }else L1=cons(ptaffine(M,D|option_list=Sft),L1);
                   15275:                                        }
                   15276:                                        LO=cons(append([1,T[1]],reverse(L1)),LO);
                   15277:                                        continue;
                   15278:                                }else if(P>=2 && P<=5){
                   15279:                                        L1=ptaffine(M,cdr(cdr(T))|optilon_list=Sft);
                   15280:                                        LO=cons(append([P,T[1]],L1),LO);
                   15281:                                        continue;
                   15282:                                }
                   15283:                        }
                   15284:                        LO=cons(T,LO);
                   15285:                }
                   15286:                return reverse(LO);
                   15287:        }
                   15288:        F=0;
                   15289:        if(type(L)==4){
                   15290:                for(LT=L; LT!=[]; LT=cdr(LT)){
                   15291:                        if((T=type(car(LT)))==4||T==5){
                   15292:                                F=1; break;
                   15293:                        }
                   15294:                }
                   15295:        }
                   15296:        if(F==0) return (Sft==0)?ptaffine(M,[L])[0]:ptaffine(M,[L]|shift=vtol(Sft))[0];
                   15297:        for(LO=[],LT=L; LT!=[]; LT=cdr(LT)){
                   15298:                if(((T=type(P=car(LT)))!=4 && T!=5)||type(P[0])>3) LO=cons(P,LO);
                   15299:                else{
                   15300:                        if(T==4) P=ltov(P);
                   15301:                        V=M*P;
                   15302:                        if(Sft!=0) V+=Sft;
                   15303:                        if(T==4) V=vtol(V);
                   15304:                        LO=cons(V,LO);
                   15305:                }
                   15306:        }
                   15307:        return reverse(LO);
                   15308: }
                   15309:
                   15310: def ptlattice(M,N,X,Y)
                   15311: {
                   15312:        if(type(S=getopt(scale))!=1) S=1;
                   15313:        if(type(Cond=getopt(cond))!=4) Cond=[];
                   15314:        Line=getopt(line);
                   15315:        if(Line==1 || Line==2) F=newmat(M,N);
                   15316:        else Line=0;
                   15317:        if(type(Org=getopt(org))==4) Org=ltov(Org);
                   15318:        else Org=newvect(length(X));
                   15319:        X=ltov(X); Y=ltov(Y);
                   15320:        for(L=[],I=M-1;I>=0;I--){
                   15321:                for(P0=P1=0,J=N-1;J>=0;J--){
                   15322:                        P=Org+I*X+J*Y;
                   15323:                        for(C=Cond; C!=[]; C=cdr(C))
                   15324:                                if(subst(car(C),x,P[0],y,P[1])<0) break;
                   15325:                        if(C!=[]) continue;
                   15326:                        if(Line) F[I][J]=1;
                   15327:                        else L=cons(vtol(S*P),L);
                   15328:                }
                   15329:        }
                   15330:        if(Line==0) return L;
                   15331:        for(I=M-1;I>=0;I--){
                   15332:                for(T0=0,T1=J=N-1;J>=0;J--){
                   15333:                        if((K=F[I][J])!=0){
                   15334:                                if(T0==0) T0=J;
                   15335:                                else T1=J;
                   15336:                        }
                   15337:                        if(K==0 || T1==0){
                   15338:                                if(T1<T0){
                   15339:                                        L=cons(vtol(S*(Org+I*X+T0*Y)), L);
                   15340:                                        L=cons(vtol(S*(Org+I*X+T1*Y)), L);
                   15341:                                        L=cons(0,L);
                   15342:                                }
                   15343:                                T0=0; T1=N-1;
                   15344:                        }
                   15345:                }
                   15346:        }
                   15347:        for(J=N-1;J>=0;J--){
                   15348:                for(T0=0,T1=I=M-1;I>=0;I--){
                   15349:                        if((K=F[I][J])!=0){
                   15350:                                if(T0==0) T0=I;
                   15351:                                else T1=I;
                   15352:                        }
                   15353:                        if(K==0 || T1==0){
                   15354:                                if(T1<T0){
                   15355:                                        L=cons(vtol(S*(Org+T0*X+J*Y)), L);
                   15356:                                        L=cons(vtol(S*(Org+T1*X+J*Y)), L);
                   15357:                                        L=cons(0,L);
                   15358:                                }
                   15359:                                T0=0; T1=M-1;
                   15360:                        }
                   15361:                }
                   15362:        }
                   15363:        return cdr(L);
                   15364: }
                   15365:
                   15366: def ptpolygon(N,R)
                   15367: {
                   15368:        if(type(S=getopt(scale))!=1) S=1;
                   15369:        if(type(Org=getopt(org))!=4) Org=[0,0];
                   15370:        Pi=deval(@pi);
                   15371:        if(type(Arg=getopt(deg))==1)
                   15372:                Arg=Pi*Arg/180;
                   15373:        else Arg=getopt(arg);
                   15374:        if(type(Arg)==2) Arg=deval(Arg);
                   15375:        if(type(Arg)!=1) Arg=0;
                   15376:        Arg -= Pi*(1/2+1/N);
                   15377:        D=Pi*2/N;
                   15378:        for(L=[],I=N-1; I>=0; I--)
                   15379:                L=cons([S*(Org[0]+R*dcos(Arg+I*D)),S*(Org[1]+R*dsin(Arg+I*D))],L);
                   15380:        return L;
                   15381: }
                   15382:
                   15383: def ptwindow(L,X,Y)
                   15384: {
                   15385:        if(type(S=getopt(scale))==1){
                   15386:                X=[S*X[0],S*X[1]]; Y=[S*Y[0],S*Y[1]];
                   15387:        }
                   15388:        for(R=[],LT=L;LT!=[];LT=cdr(LT)){
                   15389:                P=car(LT);
                   15390:                if(P[0]<X[0] || P[0]>X[1] || P[1]<Y[0] || P[1]>Y[1])
                   15391:                        R=cons(0,R);
                   15392:                else R=cons(P,R);
                   15393:        }
                   15394:        return reverse(R);
                   15395: }
                   15396:
                   15397: def lninbox(L,W)
                   15398: {
                   15399:        if(L[0]==L[1]) return 0;
                   15400:        R=newvect(2);C=newvect(2);
                   15401:        for(J=0;J<2;J++){
                   15402:                C[J]=L[1][J]-L[0][J];
                   15403:                if(C[J]!=0){
                   15404:                        R[J]=[(W[J][0]-L[0][J])/C[J],(W[J][1]-L[0][J])/C[J]];
                   15405:                        if(R[J][0]>R[J][1]) R[J]=[R[J][1],R[J][0]];
                   15406:                }
                   15407:        }
                   15408:        if(R[0]==0) R[0]=R[1];
                   15409:        if(R[1]==0) R[1]=R[0];
                   15410:        S0=(R[0][0]<R[1][0])?R[1][0]:R[0][0];
                   15411:        S1=(R[0][1]<R[1][1])?R[0][1]:R[1][1];
                   15412:        if(getopt(in)==1){
                   15413:                if(S0<0) S0=0;
                   15414:                if(S1>1) S1=1;
                   15415:        }
                   15416:        if(S0>S1) return 0;
                   15417:        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]];
                   15418: }
                   15419:
                   15420: def ptbbox(L)
                   15421: {
                   15422:        J=length(L[0]);
                   15423:        if((Box=getopt(box))==1){
                   15424:                for(R=[],I=0;I<J;I++){
                   15425:                        P=car(LT=L)[I][0];Q=car(LT)[I][1];
                   15426:                        for(;LT!=[];LT=cdr(LT)){
                   15427:                                if((type(T=car(LT))==4 || type(T)==5) && length(T)==J){
                   15428:                                        if(T[I][0]<P) P=T[I][0];
                   15429:                                        if(T[I][1]>Q) Q=T[I][1];
                   15430:                                }
                   15431:                        }
                   15432:                        R=cons([P,Q],R);
                   15433:                }
                   15434:        }else if(type(Box)==4) return ptbbox([ptbbox(L),Box]|box=1);
                   15435:        else{
                   15436:                for(R=[],I=0;I<J;I++){
                   15437:                        P=Q=car(LT=L)[I];LT=cdr(LT);
                   15438:                        for(;LT!=[];LT=cdr(LT)){
                   15439:                                if((type(T=car(LT))==4||type(T)==5) && type(T[0])<2 && length(T)==J){
                   15440:                                        if((V=T[I])<P) P=V;
                   15441:                                        else if(V>Q) Q=V;
                   15442:                                }
                   15443:                        }
                   15444:                        R=cons([P,Q],R);
                   15445:                }
                   15446:        }
                   15447:        return reverse(R);
                   15448: }
                   15449:
                   15450: def iscombox(S,T)
                   15451: {
                   15452:        for(;S!=[];S=cdr(S),T=cdr(T))
                   15453:                if(car(S)[0]>car(T)[1] || car(S)[1]<car(T)[0]) return 0;
                   15454:        return 1;
                   15455: }
                   15456:
                   15457: def ptcopy(L,V)
                   15458: {
                   15459:        if(type(V[0])!=4) V=[V];
                   15460:        for(F=0,LL=[]; V!=[]; V=cdr(V)){
                   15461:                if(F)   LL=append(LL,[0]);
                   15462:                F++;
                   15463:                LL=append(LL,ptaffine(1,L|shift=car(V)));
                   15464:        }
                   15465: }
                   15466:
                   15467: def    average(L)
                   15468: {
1.32      takayama 15469:        if(getopt(opt)=="co"){
                   15470:                S0=average(L[0]);V0=car(S0);
                   15471:                S1=average(L[1]);V1=car(S1);
                   15472:                L0=os_md.m2l(L[0]|flat=1);
                   15473:                L1=os_md.m2l(L[1]|flat=1);
                   15474:                for(S=0;L0!=[];L0=cdr(L0),L1=cdr(L1))
                   15475:                        S+=(car(L0)-V0)*(car(L1)-V1);
                   15476:                S/=S0[1]*S1[1]*S0[2];
                   15477:                S=[S,S0,S1];
                   15478:        }else{
                   15479:                L=os_md.m2l(L|flat=1);
                   15480:                M0=M1=car(L);
                   15481:                for(I=SS=0, LT=L; LT!=[]; LT=cdr(LT), I++){
                   15482:                        S+=(V=car(LT));
                   15483:                        SS+=V^2;
                   15484:                        if(V<M0)                M0=V;
                   15485:                        else if(V>M1)   M1=V;
                   15486:                }
                   15487:                SS=dsqrt(SS/I-S^2/I^2);
                   15488:                S=[deval(S/I),SS,I,M0,M1];
1.6       takayama 15489:        }
1.8       takayama 15490:        if(isint(N=getopt(sint))) S=sint(S,N);
                   15491:        return S;
1.6       takayama 15492: }
                   15493:
                   15494: def m2ll(M)
                   15495: {
                   15496:        for(R=[],I=size(M)[0]-1; I>=0; I--)
                   15497:                R=cons(vtol(M[I]),R);
                   15498:        return R;
                   15499: }
                   15500:
                   15501: def madjust(M,W)
                   15502: {
                   15503:        if(type(Null=getopt(null))<0) Null=0;
                   15504:        if(type(M)==4 && type(M[0])==4){
                   15505:                M=lv2m(M|null=Null);
                   15506:                return m2ll(madjust(M,W|null=Null));
                   15507:        }
                   15508:        S=size(M);
                   15509:        if(W<0){
                   15510:                W=-W;
                   15511:                T0=ceil(S[0]/W);
                   15512:                T1=S[1]*W;
                   15513:                N=newmat(T0,T1);
                   15514:                for(I=0; I<T0; I++){
                   15515:                        for(K=0; K<W; K++){
                   15516:                                II=K*T0+I;
                   15517:                                for(J=0; J<S[1]; J++)
                   15518:                                        N[I][S[1]*K+J]=(II<S[0])?M[II][J]:Null;
                   15519:                        }
                   15520:                }
                   15521:        }else{
                   15522:                T1=W;
                   15523:                T0=S[0]*(D=ceil(S[1]/T1));
                   15524:                N=newmat(T0,T1);
                   15525:                for(K=0; K<D; K++){
                   15526:                        for(J=0; J<W;J++){
                   15527:                                JJ=W*K+J;
                   15528:                                for(I=0; I<S[0]; I++)
                   15529:                                        N[S[0]*K+I][J]=(JJ<S[1])?M[I][JJ]:Null;
                   15530:                        }
                   15531:                }
                   15532:        }
                   15533:        return N;
                   15534: }
                   15535:
                   15536: def texcr(N)
                   15537: {
                   15538:        if(!isint(N) || N<0 || N>127) return N;
                   15539:        S=(iand(N,8))? "\\allowdisplaybreaks":"";
                   15540:        if(iand(N,2))  S=S+"\\\\";
                   15541:        if(iand(N,16)) S=S+"\\pause";
                   15542:        if(iand(N,1))  S=S+"\n";
                   15543:        if(iand(N,4))  S=S+"& ";
                   15544:        else if(!iand(N,1)) S=S+" ";
                   15545:        if(iand(N,64)) S=S+"=";
                   15546:        if(iand(N,32)) S=","+S;
                   15547:        return S;
                   15548: }
                   15549:
                   15550: def ltotex(L)
                   15551: {
                   15552:        /* extern TeXLim;       */
                   15553:
                   15554:        if(type(L)==5)
                   15555:                L = vtol(L);
                   15556:        if(type(L) != 4)
                   15557:                return my_tex_form(L);
                   15558:        Opt=getopt(opt);
                   15559:        Pre=getopt(pre);
                   15560:        if(type(Var=getopt(var))<1) Var=0;
                   15561:     Cr2="\n";
                   15562:        if(type(Cr=getopt(cr))==4){
                   15563:                Cr2=Cr[1];Cr=Cr[0];
                   15564:        }
                   15565:        if(isint(Cr)) Cr=texcr(Cr);
                   15566:        if(type(Cr)!=7) Cr="\\\\\n & "; /* Cr=7 */
                   15567:        if(type(Opt)==7) Opt=[Opt];
                   15568:        if(type(Opt)!=4)
                   15569:                Op = -1;
                   15570:        else{
                   15571:                Op=findin(Opt[0],["spt","GRS","Pfaff","Fuchs","vect","cr","text","spts","spts0",
                   15572:                        "dform","tab", "graph","coord"]);
                   15573:                Opt=cdr(Opt);
                   15574:        }
                   15575:        if(Op==0){      /* spt */
                   15576:                Out = str_tb("\\left\\{\n ",0);
                   15577:                for(CC=0; L!=[]; L=cdr(L), CC++){
                   15578:                        if(CC>0) str_tb(",\\, ",Out);
                   15579:                        TP=car(L);
                   15580:                        if(Op!=0)
                   15581:                                str_tb(my_tex_form(TP),Out);
                   15582:                        else if(TP[0]==1)
                   15583:                                str_tb(my_tex_form(TP[1]),Out);
                   15584:                        else
                   15585:                                str_tb(["[", my_tex_form(TP[1]), "]_", rtotex(TP[0])],Out);
                   15586:                }
                   15587:                str_tb("%\n\\right\\}\n",Out);
                   15588:        }else if(Op==1){ /* GRS */
                   15589:                Out = string_to_tb("\\begin{Bmatrix}\n");
                   15590:                if(type(Pre)==7) str_tb(Pre,Out);
                   15591:                MC=length(M=ltov(L));
                   15592:                for(ML=0, I=length(M); --I>=0; ){
                   15593:                        if(length(M[I]) > ML)  ML=length(M[I]);
                   15594:                }
                   15595:                for(I=0; I<ML; I++){
                   15596:                        for(CC=J=0; J<MC; J++, CC++){
                   15597:                                if(length(M[J]) <= I){
                   15598:                                        if(CC > 0) str_tb(" & ",Out);
                   15599:                                }else if(M[J][I][0] <= 1){
                   15600:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   15601:                                        else
                   15602:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   15603:                                }else
                   15604:                                        str_tb([((!CC)?" [":" & ["), my_tex_form(M[J][I][1]), "]_",
                   15605:                                         rtotex(M[J][I][0])], Out);
                   15606:                        }
                   15607:                        str_tb((I<ML-1)?"\\\\\n":"\n", Out);
                   15608:                }
                   15609:                str_tb("\\end{Bmatrix}",Out);
                   15610:        }else if(Op==2){ /* Pfaff */
                   15611:                V=monototex(Opt[0]);
                   15612:                Out = string_to_tb("d"+V+"= \\Biggl(");
                   15613:                Opt=cdr(Opt);
                   15614:                II=length(Opt);
                   15615:                for(I=0; I<II; I++){
                   15616:                         str_tb([(I>0)?" + ":" ",mtotex(L[I]),"\\frac{d",monototex(Opt[I]),"}{",
                   15617:                         my_tex_form(Opt[I]),(I==II-1)?"}\n":"}\n\\\\&\n"],Out);
                   15618:                }
                   15619:                str_tb(["\\Biggr)",V,"\n"],Out);
                   15620:        }else if(Op==3){ /* Fuchs */
                   15621:                Out = string_to_tb("\\frac{d");
                   15622:                V=my_tex_form(Opt[0]);
                   15623:                str_tb([V,"}{d",my_tex_form(Opt[1]),"}="] ,Out);
                   15624:                Opt=cdr(Opt); Opt=cdr(Opt);
                   15625:                II=length(Opt);
                   15626:                for(I=0; I<II; I++){
                   15627:                         str_tb([(I>0)?" +":"\\Biggl(", " \\frac{",
                   15628:                         my_tex_form(L[I]),"}{", my_tex_form(Opt[I]),"}\n"],Out);
                   15629:                }
                   15630:                str_tb(["\\Biggr)",V,"\n"],Out);
                   15631:        }else if(Op==4){        /* vect */
                   15632:                Out=str_tb(mtotex(matc(L)|lim=0,var=Var),0);
                   15633:        }else if(Op==5 || Op==6){       /* cr or text */
                   15634:                Out = str_tb(0,0);
                   15635:                if(type(Lim=getopt(lim))!=1) Lim=0;
                   15636:                else if(Lim<30&&Lim>0) Lim=TeXLim;
                   15637:                Str=getopt(str);
                   15638:                if(length(Opt)==1 && (car(Opt)=="spts" || car(Opt)=="spts0") && type(Str)!=1)
                   15639:                        Str=2;
                   15640:                for(K=I=0; L!=[]; I++, L=cdr(L)){
                   15641:                        LT=car(L);
                   15642:                        if((!Lim||Op==6)&&I>0) str_tb((Op==5)?Cr:"\n",Out);
                   15643:                        if(Op==6){
                   15644:                                if(type(LT)==7){
                   15645:                                        str_tb([LT," "],Out);
                   15646:                                        I=-1;
                   15647:                                        continue;
                   15648:                                }
                   15649:                                str_tb("$",Out);
                   15650:                        }
                   15651:                        KK=0;
                   15652:                        if(Str>0 && type(LT)==4 && Opt!=[])
                   15653:                                S=ltotex(LT|opt=car(Opt),lim=0,str=Str,cr=Cr2,var=Var);
                   15654:                        else if(type(LT)==6){
                   15655:                                if(Lim>0){
                   15656:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   15657:                                        KK=S[1];
                   15658:                                        S=S[0];
                   15659:                                }else S=mtotex(LT|var=Var,lim=0);
                   15660:                        }else if(type(LT)==3 || type(LT)==2)
                   15661:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   15662:                        else S=my_tex_form(LT);
                   15663:                        if(Op!=6&&I>0&&Lim){
                   15664:                                if(Lim<0){
                   15665:                                        if(I%(-Lim)==0)
                   15666:                                                str_tb((Op==5)?Cr:"\n",Out);
                   15667:                                }else if((K+=(KK=(KK)?KK:texlen(S)))>Lim){
                   15668:                                        str_tb((Op==5)?Cr:"\n",Out);
                   15669:                                        K=KK;
                   15670:                                }
                   15671:                        }
                   15672:                        str_tb(S,Out);
                   15673:                        if(Op==6) str_tb("$",Out);
                   15674:                }
                   15675:        }else if(Op==7||Op==8){ /* spts, spts0 */
                   15676:                if(type(Lim=getopt(lim))!=1 || (Lim<30 && Lim!=0))
                   15677:                        Lim=TeXLim;
                   15678:                Str=getopt(str);
                   15679:                Out = str_tb(0,0);
                   15680:                for(K=0; L!=[]; L=cdr(L)){
                   15681:                        LT=car(L);
                   15682:                        KK=0;
                   15683:                        if(type(LT)==7 && Str==1) S=LT;
                   15684:                        else if(type(LT)==3 || type(LT)==2)
                   15685:                                S=fctrtos(LT|TeX=2,lim=0,var=Var);
                   15686:                        else if(type(LT)==6){
                   15687:                                if(Lim){
                   15688:                                        S=mtotex(LT|var=Var,lim=0,len=1);
                   15689:                                        KK=S[1];
                   15690:                                        S=S[0];
                   15691:                                }else S=mtotex(LT|var=Var,lim=0);
                   15692:                        }else
                   15693:                                S=my_tex_form(LT);
                   15694:                        if(Lim!=0){
                   15695:                                if(!KK) KK=texlen(S);
                   15696:                                if(K>0 && K+KK>Lim){
                   15697:                                        str_tb(Cr,Out);
                   15698:                                        K=0;
                   15699:                                }
                   15700:                        }
                   15701:                        if(K>0){
                   15702:                                str_tb((Op==7)?"\\ ":" ",Out);
                   15703:                                if(type(LT)>3 && type(LT)<7)    str_tb("%\n",Out);
                   15704:                        }
                   15705:                        str_tb(S,Out);
                   15706:                        K+=KK;
                   15707:                        if(OP==7)       K++;
                   15708:                }
                   15709:        }else if(Op==9){        /* dform */
                   15710:                Out=str_tb(0,0);
                   15711:                for(I=0;L!=[];L=cdr(L),I++){
                   15712:                        for(J=0,LT=car(L); LT!=[]; LT=cdr(LT),J++){
                   15713:                                if(J==0){
                   15714:                                        if((V=car(LT))==0)      continue;
                   15715:                                        if(I>0){
                   15716:                                                if(type(V)==1){
                   15717:                                                        if(V<0){
                   15718:                                                                str_tb("-",Out);
                   15719:                                                                V=-V;
                   15720:                                                        }
                   15721:                                                        else    str_tb("+",Out);
                   15722:                                                        if(V==1 && length(LT)>1) continue;
                   15723:                                                        str_tb(monototex(V),Out);
                   15724:                                                        continue;
                   15725:                                                }
                   15726:                                                else    str_tb("+",Out);
                   15727:                                        }
                   15728:                                }else if(J>0)   str_tb((J>1)?"\\wedge d":"\\,d",Out);
                   15729:                                V=monototex(car(LT));
                   15730:                                if(V<"-" || V>=".")     str_tb(V,Out);
                   15731:                                else str_tb(["(",V,")"],Out);
                   15732:                        }
                   15733:                }
                   15734:        }else if(Op==10 && type(L)==4 && type(car(L))==4){      /* tab */
                   15735:                if(type(Null=getopt(null))<0) Null="";
                   15736:                if(getopt(vert)==1){
                   15737:                        M=lv2m(L|null=Null);
                   15738:                        L=m2ll(mtranspose(M));
                   15739:                }
                   15740:                if(type(W=getopt(width))==1)
                   15741:                        L=madjust(L,W|null=Null);
                   15742:                LV=ltov(L);
                   15743:                S=length(LV);
                   15744: #if 1
                   15745:                if(type(T=getopt(left))==4){
                   15746:                        T=str_times(T,S);
                   15747:                        for(L=[],I=0;I<S;I++){
                   15748:                                L=cons(cons(car(T),LV[I]),L);
                   15749:                                T=cdr(T);
                   15750:                        }
                   15751:                        LV=reverse(L);
                   15752:                }
                   15753:                if(type(T=getopt(right))==4){
                   15754:                        T=str_times(T,S);
                   15755:                        for(L=[],I=0;I<S;I++){
                   15756:                                L=cons(append(LV[I],[car(T)]),L);
                   15757:                                T=cdr(T);
                   15758:                        }
                   15759:                        LV=reverse(L);
                   15760:                }
                   15761:                for(I=CS=0; I<S; I++)
                   15762:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   15763:                if(type(T=getopt(top))==4){
                   15764:                        LV=cons(str_times(T,CS),vtol(LV));
                   15765:                        S++;
                   15766:                }
                   15767:                if(type(T=getopt(last))==4){
                   15768:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   15769:                        S++;
                   15770:                }
                   15771: #else
                   15772:                for(I=CS=0; I<S; I++)
                   15773:                        if(length(LV[I])>CS) CS=length(LV[I]);
                   15774: #endif
                   15775:                if(type(Title=getopt(title))!=7) Title="";
                   15776:                if(type(Vline=getopt(vline))!=4) Vline=[0,CS];
                   15777:                else Vline=subst(Vline,z,CS);
                   15778:                for(VV=[],VT=Vline;VT!=[];VT=cdr(VT)){
                   15779:                        if(type(T=car(VT))==4 && T[1]>0){
                   15780:                                for(I=T[0];I<=CS;I+=T[1]) VV=cons(I,VV);
                   15781:                        }else VV=cons(T,VV);
                   15782:                }
                   15783:                Vline=qsort(VV);
                   15784:                Out=str_tb("\\begin{tabular}{",0);
                   15785:                if(type(Al=getopt(align))==7 && str_len(Al)>1){
                   15786:                        str_tb(Al,Out);
                   15787:                }else{
                   15788:                        if(type(Al)!=7 || str_len(Al)<1) Al="r";
                   15789:                        for(I=0;I<=CS;I++){
                   15790:                                if(I!=0) str_tb(Al,Out);
                   15791:                                while(Vline!=[] && car(Vline)==I){
                   15792:                                        str_tb("|",Out);
                   15793:                                        Vline=cdr(Vline);
                   15794:                                }
                   15795:                        }
                   15796:                }
                   15797:                str_tb("}",Out);
                   15798:                if(Title!="")
                   15799:                        str_tb("\n\\multicolumn{"+rtostr(CS)+"}{c}{"+Title+"}\\\\",Out);
                   15800:                if(type(Hline=getopt(hline))!=4) Hline=[0,S];
                   15801:                else Hline=subst(Hline,z,S);
                   15802:                for(VV=[],VT=Hline;VT!=[];VT=cdr(VT)){
                   15803:                        if(type(T=car(VT))==4 && T[1]>0){
1.14      takayama 15804:                                for(I=T[0];I<=S;I+=T[1]) VV=cons(I,VV);
1.6       takayama 15805:                        }else VV=cons(T,VV);
                   15806:                }
                   15807:                Hline=qsort(VV);
                   15808:                while(Hline!=[] && car(Hline)==0){
                   15809:                        str_tb(" \\hline\n",Out);
                   15810:                        Hline=cdr(Hline);
                   15811:                }
                   15812: /*
                   15813:                if(type(getopt(left))==4) CS++;
                   15814:                if(type(getopt(right))==4) CS++;
                   15815:                if(type(T=getopt(top))==4){
                   15816:                        LV=cons(str_times(T,CS),vtol(LV));
                   15817:                        S++;
                   15818:                }
                   15819:                if(type(T=getopt(last))==4){
                   15820:                        LV=append(vtol(LV),[str_times(T,CS)]);
                   15821:                        S++;
                   15822:                }
                   15823:                if(type(T=getopt(left))==4){
                   15824:                        T=str_times(T,S);
                   15825:                        for(L=[],I=0;I<S;I++){
                   15826:                                L=cons(cons(car(T),LV[I]),L);
                   15827:                                T=cdr(T);
                   15828:                        }
                   15829:                        LV=reverse(L);
                   15830:                }
                   15831:                if(type(T=getopt(right))==4){
                   15832:                        T=str_times(T,S);
                   15833:                        for(L=[],I=0;I<S;I++){
                   15834:                                L=cons(append(LV[I],[car(T)]),L);
                   15835:                                T=cdr(T);
                   15836:                        }
                   15837:                        LV=reverse(L);
                   15838:                }
                   15839: */
                   15840:                for(I=0; I<S; I++){
                   15841:                        for(C=0,LT=LV[I];C<CS; C++){
                   15842:                                if(LT!=[]){
                   15843:                                        P=car(LT);
                   15844:                                        if(type(P)!=7) P="$"+my_tex_form(P)+"$";
                   15845:                                        if(P!="") str_tb(P,Out);
                   15846:                                        LT=cdr(LT);
                   15847:                                }
                   15848:                                if(C<CS-1) str_tb("& ",Out);
                   15849:                        }
                   15850:                        str_tb("\\\\",Out);
                   15851:                        while(Hline!=[] && car(Hline)==I+1){
                   15852:                                str_tb(" \\hline",Out);
                   15853:                                Hline=cdr(Hline);
                   15854:                        }
                   15855:                        str_tb("\n",Out);
                   15856:                }
                   15857:                str_tb("\\end{tabular}\n",Out);
                   15858:        }else if(Op==11){       /* graph */
1.10      takayama 15859:                if(type(Strip=getopt(strip))!=1) Strip=0;
                   15860:                if(type(MX=getopt(max))!=1)  MX=0;
                   15861:                if(type(ML=getopt(mult))!=1) ML=0;
                   15862:                if((REL=getopt(relative))!=1) REL=0;
                   15863:                CL=getopt(color);
                   15864:                OL=delopt(getopt(),["color","strip","mult"]);
                   15865:                if(ML==1&&type(CL)==4){
                   15866:                        LL=L[1];L=L[0];K=length(L);S=T="";
                   15867:                        if(!MX){
                   15868:                                MX=vector(length(L[0]));
                   15869:                                for(LT=L;LT!=[];LT=cdr(LT)){
                   15870:                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   15871:                                                if(REL==1) MX[I]+=car(LTT);
                   15872:                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   15873:                                        }
                   15874:                                }
                   15875:                                MX=lmax(MX);
                   15876:                                OL=cons(["max",MX],OL);
                   15877:                        }
                   15878:                        if(REL==1) MX=newvect(length(L[0]));
                   15879:                        for(I=0;I<K;I++){
                   15880:                                for(R=[],J=length(L[I]);--J>=0;){
                   15881:                                        if(REL==1){
                   15882:                                                R=cons([MX[J],V=MX[J]+L[I][J]],R);
                   15883:                                                MX[J]=V;
                   15884:                                        }else R=cons([(!I)?0:L[I-1][J],L[I][J]],R);
                   15885:                                }
                   15886:                                OP=cons(["color",CL[I]],OL);
                   15887:                                S+=ltotex([R,LL]|option_list=cons(["value",0],cons(["strip",(!I)?1:2],OP)));
                   15888:                                T+=ltotex([R,LL]|option_list=cons(["strip",3],OP));
                   15889:                        }
                   15890:                        return(!Strip)?xyproc(S+T):(S+T);
                   15891:                }else if(!TikZ) CL=0;
                   15892:                if(type(Line=getopt(line))!=1){
                   15893:                        if(type(Line)==4){
                   15894:                                if(type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   15895:                                        Opt=Line[1]; Line=Line[0];
                   15896:                                }else if(ML==1){
                   15897:                                        OL=delopt(OL,"line");
                   15898:                                        LL=L[1];L=L[0];K=length(L);S="";
                   15899:                                        if(!MX){
1.15      takayama 15900:                                                MX=newvect(length(L[0]));
1.10      takayama 15901:                                                for(LT=L;LT!=[];LT=cdr(LT)){
                   15902:                                                        for(I=0,LTT=car(LT);LTT!=[];I++,LTT=cdr(LTT)){
                   15903:                                                                if(REL==1) MX[I]+=car(LTT);
                   15904:                                                                else if(MX[I]<car(LTT)) MX[I]=car(LTT);
                   15905:                                                        }
                   15906:                                                }
                   15907:                                                MX=lmax(MX);
                   15908:                                                OL=cons(["max",MX],OL);
                   15909:                                        }
1.15      takayama 15910:                                        for(I=0;I<K;I++)
                   15911:                                                S+=ltotex([L[I],LL]|option_list
1.10      takayama 15912:                                                        =cons(["line",Line[I]],cons(["strip",(!I)?1:2],OL)));
                   15913:                                        return(!Strip)?xyproc(S):S;
                   15914:                                }
                   15915:                        }else Line=0;
                   15916:                }else Opt="@{-}";
                   15917:                Width=8; Hight=3; WRet=1/2; HMerg=(getopt(horiz)==1)?0.3:0.2;
1.6       takayama 15918:                if(!TikZ){
1.7       takayama 15919:                        Width*=10; Hight*=10; HMerg*=10;
1.6       takayama 15920:                }
1.10      takayama 15921:                VMerg=HMerg;
                   15922:                if(type(Shift=getopt(shift))!=1)
                   15923:                        Shift=0;
1.6       takayama 15924:                if(type(V=getopt(size))==4){
                   15925:                        Width=V[0];Hight=V[1];
                   15926:                        if(length(V)>2) WRet=V[2];
1.10      takayama 15927:                        if(length(V)>3) VMerg=VMerg=V[3];
                   15928:                        if(length(V)>4) HMerg=V[4];
1.6       takayama 15929:                }
                   15930:                Val=getopt(value);
                   15931:                if(!isint(Val)) Val=-1;
                   15932:                if(type(Line=getopt(line))!=1){
                   15933:                        if(type(Line)==4 && type(Line[0])==1 && (type(Line[1])==7 || type(Line[1])==1)){
                   15934:                                Opt=Line[1]; Line=Line[0];
                   15935:                        }else   Line=0;
                   15936:                }else Opt="@{-}";
                   15937:                if(type(car(L))==4){
                   15938:                        LL=L[1]; L=L[0];
                   15939:                }else LL=[];
                   15940:                if(Line==-1){
                   15941:                        for(Sum=0, LT=L; LT!=[]; LT=cdr(LT)){
                   15942:                                if((S=car(LT))<=0) return 0;
                   15943:                                Sum+=S;
                   15944:                        }
1.16      takayama 15945:                        for(R=[],LT=L;LT!=[];LT=cdr(LT)) R=cons(car(LT)/Sum,R);
1.6       takayama 15946:                        R=reverse(R);
                   15947:                        Opt0=Opt*2/3;
1.10      takayama 15948:                        Out=str_tb((Strip>0)?0:xyproc(1),0);
1.16      takayama 15949:                        if(type(CL)!=4) str_tb(xylines(ptpolygon(6,Opt)|close=1,curve=1),Out);
1.6       takayama 15950:                        for(S=0,RT=R,LT=LL;RT!=[];RT=cdr(RT)){
1.16      takayama 15951:                                SS=S+RT[0];
                   15952:                                if(type(CL)==4){
                   15953:                                        str_tb(xyang(Opt,[0,0],(0.25-SS)*6.2832,(0.25-S)*6.2832|ar=1,opt=car(CL)),Out);
                   15954:                                        if(length(CL)>0) CL=cdr(CL);
                   15955:                                }else str_tb(xyline([0,0],[Opt*dsin(S*6.2832),Opt*dcos(S*6.2832)]),Out);
                   15956:                                T=(S+SS)/2;
                   15957:                                S=SS;
1.6       takayama 15958:                                if(LT!=[]){
1.16      takayama 15959:                                        str_tb(xyput([Opt0*dsin(T*6.2832),Opt0*dcos(T*6.2832),car(LT)]),Out);
1.6       takayama 15960:                                        LT=cdr(LT);
                   15961:                                }
                   15962:                        }
1.10      takayama 15963:                        if(!Strip) str_tb(xyproc(0),Out);
1.6       takayama 15964:                        return str_tb(0,Out);
                   15965:                }
                   15966:                if(MX==0){
                   15967:                        for(MX=0,LT=L; LT!=[]; LT=cdr(LT))
                   15968:                                if(car(LT)>MX) MX=car(LT);
                   15969:                }
                   15970:                MX-=Shift;
                   15971:                S=length(L);
                   15972:                WStep=Width/S;
                   15973:                WWStep=WStep*WRet;
1.10      takayama 15974:                HStep=(Hight<0)?-Hight:Hight/MX;
1.7       takayama 15975:                if(LL!=[]&&length(LL)==S-1) WS2=WStep/2;
                   15976:                else WS2=0;
1.10      takayama 15977:                Out=str_tb((Strip>0)?0:xyproc(1),0);
                   15978:                Hori=getopt(horiz);
                   15979:                if(Strip<2){
                   15980:                        if(Hori==1)  str_tb(xyline([0,0],[0,Width-WStep+WWStep]),Out);
                   15981:                        else str_tb(xyline([0,0],[Width-WStep+WWStep,0]),Out);
                   15982:                }
1.6       takayama 15983:                for(I=0,LT=L;LT!=[]; LT=cdr(LT),I++){
1.10      takayama 15984:                        XP=WStep*I; XPM=XP+WWStep/2;
                   15985:                        if(type(LTT=car(LT))==4){
                   15986:                                YP0=(car(LTT)-Shift)*HStep;YP=(LTT[1]-Shift)*HStep;
                   15987:                                VL=LTT[1];
                   15988:                                if(REL) VL-=LTT[0];
                   15989:                        }else{
                   15990:                                YP0=0;YP=(LTT-Shift)*HStep;VL=LTT;
                   15991:                        }
                   15992:                        if(Hori==1){
                   15993:                                if(Line!=0){
                   15994:                                        if(I>0)
                   15995:                                                str_tb(xyarrow([XPM,YP],[XPM-WStep,YPP]|opt=Opt),Out);
                   15996:                                        if(Val!=0)
                   15997:                                                str_tb(xyput([YP+HMerg, XPM,car(LT)]),Out);
                   15998:                                        if(Line==2)
                   15999:                                                str_tb(xyput([YP,XPM,"$\\bullet$"]),Out);
                   16000:                                        YPP=YP;
                   16001:                                }else if(YP!=0 || Val==1){
                   16002:                                        if(Strip!=3){
                   16003:                                                if(CL) str_tb(xybox([[YP,XP+WWStep], [YP0,XP]]|color=CL),Out);
                   16004:                                                else str_tb(xybox([[YP,XP+WWStep],[YP0,XP]]),Out);
                   16005:                                        }
                   16006:                                        if(Val!=0) str_tb(xyput([(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),XPM,VL]),Out);
                   16007:                                }
                   16008:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([-VMerg,XPM+WS2,LL[I]]),Out);
                   16009:                        }else{
                   16010:                                if(Line!=0){
                   16011:                                        if(I>0)
                   16012:                                                str_tb(xyarrow([XPM-WStep,YPP],[XPM,YP]|opt=Opt),Out);
                   16013:                                        if(Val!=0)
                   16014:                                                str_tb(xyput([XPM,YP+HMerg,car(LT)]),Out);
                   16015:                                        if(Line==2)
                   16016:                                                str_tb(xyput([XPM,YP,"$\\bullet$"]),Out);
                   16017:                                        YPP=YP;
                   16018:                                }else if(YP!=0 || Val==1){
                   16019:                                        if(Strip!=3){
                   16020:                                                if(CL) str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]|color=CL),Out);
                   16021:                                                else str_tb(xybox([[XP,YP0],[XP+WWStep,YP]]),Out);
                   16022:                                        }
                   16023:                                        if(Val!=0) str_tb(xyput([XPM,(YP<0||REL==1)?(YP-HMerg):(YP+HMerg),VL]),Out);
1.6       takayama 16024:                                }
1.10      takayama 16025:                                if(LL!=[]&&I<length(LL)&&Strip<2) str_tb(xyput([XPM+WS2,-VMerg,LL[I]]),Out);
1.6       takayama 16026:                        }
                   16027:                }
1.10      takayama 16028:                if(!Strip)str_tb(xyproc(0),Out);
1.6       takayama 16029:        }else if(Op==12){       /* coord */
                   16030:                Out=str_tb("(",0);
                   16031:                for(LT=L;;){
                   16032:                        X=car(LT);
                   16033:                        if(type(X)>3 || imag(X)==0)     str_tb(my_tex_form(X),Out);
                   16034:                        else{
                   16035:                                XR=real(X);XI=imag(X);
                   16036:                                S=monototex(imag(X));
                   16037:                                if(S=="1") S="";
                   16038:                                else if(S=="- 1") S="-";
                   16039:                                if(getopt(cpx)==2) S=S+"\\sqrt{-1}";
                   16040:                                else S=S+"i";
                   16041:                                if(XR!=0){
                   16042:                                        if(str_char(S,0,"-")==0) S=monototex(XR)+S;
                   16043:                                        else S=monototex(XR)+"+"+S;
                   16044:                                }
                   16045:                                str_tb(S,Out);
                   16046:                        }
                   16047:                        if((LT=cdr(LT))==[]) break;
                   16048:                        else str_tb(",",Out);
                   16049:                }
                   16050:                str_tb(")",Out);
                   16051:        }
                   16052:        else    return my_tex_form(L);
                   16053:        S = str_tb(0,Out);
                   16054:        return (getopt(small)==1)?smallmattex(S):S;
                   16055: }
                   16056:
                   16057:
                   16058: def str_tb(L,TB)
                   16059: {
                   16060:        if(type(TB) == 0) TB = "";
                   16061:        if(L == 0)
                   16062:                return (type(TB) == 7)?string_to_tb(TB):tb_to_string(TB);
                   16063:        if(type(L) == 7)
                   16064:                L = [L];
                   16065:        else if(type(L) != 4){
                   16066:                erno(0);
                   16067:                return 0;
                   16068:        }
                   16069:        if(type(TB) <= 7)
                   16070:                 TB = string_to_tb((type(TB)==7)?TB:"");
                   16071:        for(; L != []; L = cdr(L))
                   16072:                write_to_tb(car(L), TB);
                   16073:        return TB;
                   16074: }
                   16075:
                   16076: /*
                   16077: def redgrs(M,T)
                   16078: {
                   16079:        L = [zzz];
                   16080:        for(I=S=0,Eq=[],MT=M; MT!=[]; I++, MT=cdr(MT)){
                   16081:                for(J=LS=0, N=car(MT); N!=[]; N=cdr(N)){
                   16082:                        X = makev([z,I,z,J]);
                   16083:                        L=cons(X,L);
                   16084:                        LS += X;
                   16085:                        S += car(N)[1]*X;
                   16086:                }
                   16087:                Eq = cons(LS-zzz,Eq);
                   16088:        }
                   16089:        Eq = cons(S-T,Eq);
                   16090:        Sol= lnsol(Eq,L);
                   16091:        for(LS=[],S=Sol; S!=[]; S=cdr(S)){
                   16092:                T=car(S);
                   16093:                if(type(S)!=4) return 0;
                   16094:                LS=cons(car(S)[0],LS);
                   16095:        }
                   16096: }
                   16097: */
                   16098:
                   16099: /* T=0 : all reduction
                   16100:                =1 : construction procedure
                   16101:                =2 : connection coefficient
                   16102:                =3 : operator
                   16103:                =4 : series expansion
                   16104:                =5 : expression by TeX
                   16105:                =6 : Fuchs relation
                   16106:                =7 : All
                   16107:                =8 : basic
                   16108:                =9 : ""
                   16109:                =10: irreducible
                   16110:                =11: recurrence */
                   16111: def getbygrs(M, TT)
                   16112: {
                   16113:        /* extern TeXEq;        */
                   16114:
                   16115:        if(type(M)==7) M=s2sp(M);
                   16116:        if(type(M) != 4 || TT =="help"){
                   16117:                mycat(
                   16118: ["getbygrs(m,t) or getbygrs(m,[t,s_1,s_2,...]|perm=?,var=?,pt=?,mat=?)\n",
                   16119: " m: generalized Riemann scheme or spectral type\n",
                   16120: " t: reduction, construct, connection, series, operator, TeX, Fuchs, irreducible, basic, recurrence,\n",
                   16121: "    All\n",
                   16122: " s: TeX dviout simplify short general operator irreducible top0 x1 x2 sft\n",
                   16123: "Ex: getbygrs(\"111,21,111\", [\"All\",\"dviout\",\"operator\",\"top0\"])\n"]);
                   16124:                return 0;
                   16125:        }
                   16126:        if(type(TT) == 4){
                   16127:                T  = TT[0];
                   16128:                T1 = cdr(TT);
                   16129:        }else{
                   16130:                T  = TT;
                   16131:                T1 = [];
                   16132:        }
                   16133:        if(type(T) == 7)
                   16134:                T = findin(T,["reduction","construct","connection", "operator", "series",
                   16135:                         "TeX", "Fuchs", "All", "basic", "", "irreducible", "recurrence"]);
                   16136:        TeX   = findin("TeX", T1);
                   16137:        Simp  = findin("simplify", T1);
                   16138:        Short = findin("short", T1);
                   16139:        Dviout= findin("dviout", T1);
                   16140:        General=findin("general", T1);
                   16141:        Op     =findin("operator", T1);
                   16142:        Irr    =findin("irreducible", T1);
                   16143:        Top0   =findin("top0",T1);
                   16144:        X1     =findin("x1",T1);
                   16145:        X2     =findin("x2",T1);
                   16146:        Sft    =findin("sft",T1);
                   16147:        Title = getopt(title);
                   16148:        Mat   = getopt(mat);
                   16149:        if(Mat!=1 || T<0 ||(T!=0&&T!=1&&T!=5&&T!=6&&T!=8&&T!=10&&T!=9)) Mat = 0;
                   16150:        if(findin("keep",T1) >= 0)
                   16151:                Keep = Dviout = 1;
                   16152:        else Keep = 0;
                   16153:        if(Dviout >= 0 || T == 5) TeX = 1;
                   16154:        for(J = 0, MM = M; J == 0 && MM != []; MM = cdr(MM)){
                   16155:                for(MI = car(MM); MI != []; MI = cdr(MI)){
                   16156:                        if(type(car(MI)) != 1 || car(MI) <= 0){
                   16157:                                J = 1; break;
                   16158:                        }
                   16159:                }
                   16160:        }
                   16161:
                   16162:        /* spectral type -> GRS */
                   16163:        if(J == 0){
                   16164:                for(R = [], S = J = 0, MM = M; MM != []; MM = cdr(MM), J++){
                   16165:                        MT = qsort(car(MM));
                   16166:                        R = cons(reverse(MT), R);
                   16167:                        if(J == 1){
                   16168:                                S = length(MT)-1;
                   16169:                                if(MT[S] > MT[0]) S = 0;
                   16170:                        }
                   16171:                }
                   16172:                M = reverse(R);
                   16173:                R = getopt(var);
                   16174:                if(type(R)<1){
                   16175:                        for(R = [], I = J-1; I >= 0; I--)
                   16176:                                R = cons(asciitostr([97+I]), R);
                   16177:                }
                   16178:                Sft=(Sft>=0)?1:0;
                   16179:                if(General < 0)
                   16180:                        Sft=-Sft-1;
                   16181:                M = sp2grs(M,R,Sft|mat=Mat);
                   16182:        }
                   16183:        for(M0=[],MM=M;MM!=[];MM=cdr(MM)){      /* change "?" -> z_z */
                   16184:                for(M1=[],Mm=car(MM);Mm!=[];Mm=cdr(Mm)){
                   16185:                        Mt=car(Mm);
                   16186:                        if(type(Mt)==4 && Mt[1]=="?"){
                   16187:                                M1=cons([Mt[0],z_z],M1);
                   16188:                                continue;
                   16189:                        }else if(type(Mt)==7 && Mt=="?"){
                   16190:                                M1=cons(z_z,M1);
                   16191:                                continue;
                   16192:                        }
                   16193:                        M1=cons(Mt,M1);
                   16194:                }
                   16195:                M0=cons(reverse(M1),M0);
                   16196:        }
                   16197:        M = fspt(reverse(M0),5);  /* short -> long */
                   16198:        if(findin(z_z,vars(M))>=0)
                   16199:                M=subst(M,z_z,lsol(chkspt(M|mat=Mat)[3],z_z));  /* Fuchs relation */
                   16200:        NP = length(M);
                   16201:        Perm = getopt(perm);
                   16202:        if(type(Perm) == 4)
                   16203:                M = mperm(M,Perm,0);
                   16204:        if(T == 9){  /* "" */
                   16205:                if(Short >= 0)
                   16206:                        M = chkspt(M|opt=4,mat=Mat);
                   16207:                return M;
                   16208:        }
                   16209:        R = [0,M];
                   16210:        ALL = [R];
                   16211:
                   16212:        while(type(R = redgrs(R[1]|mat=Mat)) == 4)
                   16213:                ALL = cons(R, ALL);
                   16214:        if(R < 0)
                   16215:                return 0;
                   16216:
                   16217:        /* TeX */
                   16218:        if(TeX >= 0 && !chkfun("print_tex_form", "names.rr"))
                   16219:                return 0;
                   16220:        if(Dviout >= 0 && type(Title) == 7)
                   16221:                dviout(Title|keep=1);
                   16222:        if(T == 7 && Dviout >= 0){
                   16223:                S=["keep","simplify"];
                   16224:                if(Top0 >= 0)
                   16225:                        S = cons("top0",S);
                   16226:                getbygrs(M,cons(5,S)|title="\\noindent Riemann Scheme",mat=Mat);
                   16227:                Same = 0;
                   16228:                if(R > 0){
                   16229:                        MM = getbygrs(M,8|mat=Mat);    /* basic GRS */
                   16230:                        MS = chkspt(MM|opt=0,mat=Mat); /* spectral type */
                   16231:                        if(M != MM)
                   16232:                                 getbygrs(MM,cons(5,S)|title="Basic Riemann Scheme",mat=Mat);
                   16233:                        else{
                   16234:                                 dviout("This is a basic Riemann Scheme.\n\n\\noindent"|keep=1);
                   16235:                                 Same = 1;
                   16236:                        }
                   16237:                        dviout(MS|keep=1);
                   16238:                }
                   16239:                if(chkspt(ALL[0][1]|mat=Mat)[3] != 0)
                   16240:                        getbygrs(M,cons(6,S)|title="Fuchs condition",mat=Mat);
                   16241:                if(Same == 0){
                   16242:                        M1 = M[1];
                   16243:                        if(M1[length(M1)-1][0]==1 && Mat!=1){
                   16244:                                M1=M[2];
                   16245:                                if(M1[length(M1)-1][0] == 1){
                   16246:                                        getbygrs(M,cons(2,S)|title="Connection formula");
                   16247:                                        if(M1[length(M[0][0])-1][0] == 1 && R==0)
                   16248:                                                getbygrs(M,cons(11,S)|title="Recurrence relation shifting the last exponents at $\\infty$, 0, 1");
                   16249:                                }
                   16250:                                getbygrs(M,cons(1,S)|title="Integral representation");
                   16251:                                getbygrs(M,cons(4,S)|title="Series expansion");
                   16252:                        }
                   16253:                        if(Irr < 0){
                   16254:                                TI="Irreduciblity $\\Leftrightarrow$ any value of the following linear forms $\\notin\\mathbb Z$";
                   16255:                                if(R > 0)
                   16256:                                        TI += " + fundamental irreducibility";
                   16257:                                getbygrs(M,cons(10,S)|title=TI,mat=Mat);
                   16258:                                dviout("which coorespond to the decompositions"|keep=1);
                   16259:                                sproot(chkspt(M|opt=0),"pairs"|dviout=1,keep=1);
                   16260:                        }
                   16261:                }
                   16262:                if(Op >= 0 && Mat!=1) getbygrs(M,cons(3,S)|title="Operator");
                   16263:                dviout(" ");
                   16264:                return 1;
                   16265:        }
                   16266:        if(T == 0 && TeX >= 0){
                   16267:                T = 1; TeX = 16;
                   16268:        }
                   16269: /* Fuchs */
                   16270:        Fuc = chkspt(ALL[0][1]|Mat=mat)[3];
                   16271:        if(Fuc == 0) Simp = -1;
                   16272:        if(type(Fuc) == 1){
                   16273:                print("Violate Fuchs condition");
                   16274:                return 0;
                   16275:        }
                   16276:        if(T == 6){
                   16277:                if(Dviout >= 0) dviout(Fuc|eq=0,keep=Keep);
                   16278:                return (TeX >= 0)?my_tex_form(Fuc):Fuc;
                   16279:        }
                   16280:        Fuc = [Fuc];
                   16281: /* Generelized Riemann scheme */
                   16282:        if(T == 5){
                   16283:                M = ltov(M);
                   16284:                for(ML=0, I=0; I<NP; I++){
                   16285:                        L = length(M[I]);
                   16286:                        if(L > ML) ML = L;
                   16287:                }
                   16288:                Out = string_to_tb("P\\begin{Bmatrix}\nx=");
                   16289:                if(Top0 < 0)
                   16290:                        write_to_tb("\\infty & ",Out);
                   16291:                Pt = getopt(pt);
                   16292:                if(type(Pt) == 4){
                   16293:                        for(J = 3; J < NP; J++){
                   16294:                                str_tb(["& ",rtotex(car(Pt))],Out);
                   16295:                                Pt = cdr(Pt);
                   16296:                        }
                   16297:                }
                   16298:                else if(X2>=0)
                   16299:                        str_tb("0 & x_2",Out);
                   16300:                else
                   16301:                        str_tb((X1>=0)?"x_1 & x_2":"0 & 1",Out);
                   16302:                for(J = 3; J < NP; J++)
                   16303:                        str_tb(["& x_",rtotex(J)],Out);
                   16304:                if(Top0 >= 0)
                   16305:                        write_to_tb("& \\infty",Out);
                   16306:                write_to_tb("\\\\\n",Out);
                   16307:                for(I = 0; I < ML; I++){
                   16308:                        for(CC = 0, J = (Top0 >= 0)?1:0; ; J++, CC++){
                   16309:                                if(J == NP){
                   16310:                                        if(Top0 < 0) break;
                   16311:                                        J = 0;
                   16312:                                }
                   16313:                                if(length(M[J]) <= I){
                   16314:                                        if(CC > 0) write_to_tb(" & ",Out);
                   16315:                                }else if(M[J][I][0] <= 1){
                   16316:                                        if(M[J][I][0] == 0) str_tb(" & ",Out);
                   16317:                                        else
                   16318:                                                str_tb([(!CC)?" ":" & ", my_tex_form(M[J][I][1])], Out);
                   16319:                                }else{
                   16320:                                        str_tb([((!CC)?"[":" & ["), my_tex_form(M[J][I][1]),
                   16321:                                                (Mat==1)?"]_{":"]_{("],Out);
                   16322:                                        str_tb([my_tex_form(M[J][I][0]),(Mat==1)?"}":")}"],Out);
                   16323:                                }
                   16324:                                if(Top0 >= 0 && J == 0)
                   16325:                                        break;
                   16326:                        }
                   16327:                        if(I == 0)
                   16328:                                str_tb("&\\!\\!;x",Out);
                   16329:                        str_tb("\\\\\n",Out);
                   16330:                }
                   16331:                str_tb("\\end{Bmatrix}",Out);
                   16332:                Out = str_tb(0,Out);
                   16333:                if(Dviout >= 0)
                   16334:                        dviout(Out|eq=0,keep=Keep);
                   16335:                return Out;
                   16336:        }
                   16337:
                   16338: /* Reduction */
                   16339:        if(T == 0){
                   16340:                if(Simp >= 0)
                   16341:                        ALL = simplify(ALL,Fuc,4);
                   16342:                return reverse(ALL);
                   16343:        }
                   16344:        LA = length(ALL) - 1;
                   16345:        NP = length(ALL[0][1]);
                   16346:
                   16347: /* irreducible */
                   16348:        if(T == 10){
                   16349:                for(IR=[], I = 0; I < LA; I++){
                   16350:                        AI = ALL[I]; AIT = AI[1];
                   16351:                        K = AI[0][0];
                   16352:                        P = -AIT[0][K][1];
                   16353:                        P -= cterm(P);
                   16354:                        IR = cons(P, IR);
                   16355:                        for(J = 0; J < NP; J++){
                   16356:                                K = AI[0][J];
                   16357:                                for(L = length(AIT[J]) - 1; L >= 0 ; L--){
                   16358:                                        if(L == K || AIT[J][L][0] <= AIT[J][K][0])
                   16359:                                                continue;
                   16360:                                        P = AIT[J][L][1] - AIT[J][K][1];
                   16361:                                        Q = cterm(P);
                   16362:                                        if(dn(Q)==1)
                   16363:                                                P -= Q;
                   16364:                                        IR = cons(P,IR);
                   16365:                                }
                   16366:                        }
                   16367:                }
                   16368:                P=Fuc[0];
                   16369:                Q=cterm(P);
                   16370:                if(type(Q)==1 && dn(Q)==1){
                   16371:                        for(F=0,V=vars(P);V!=[];V=cdr(V)){
                   16372:                                R=mycoef(P,1,car(V));
                   16373:                                if(type(R)!=1 || Q%R!=0){
                   16374:                                        F=1; break;
                   16375:                                }
                   16376:                        }
                   16377:                        if(F==0){
                   16378:                                P-=Q;
                   16379:                                Simp=0;
                   16380:                        }
                   16381:                }
                   16382:                if(Simp >= 0){
                   16383:                        IR=simplify(IR,[P],4);
                   16384:                        for(R=[]; IR!=[]; IR=cdr(IR)){
                   16385:                                P=car(IR);
                   16386:                                Q=cterm(P);
                   16387:                                if(dn(Q)==1) P-=Q;
                   16388:                                R=cons(P,R);
                   16389:                        }
                   16390:                        IR=R;
                   16391:                }
                   16392:                for(R=[]; IR!=[]; IR=cdr(IR)){
                   16393:                        P=car(IR);
                   16394:                        if(str_len(rtostr(P)) > str_len(rtostr(-P)))
                   16395:                                P = -P;
                   16396:                        R = cons(P,R);
                   16397:                }
                   16398:                R = ltov(R);
                   16399: #ifdef USEMODULE
                   16400:                R = qsort(R,os_md.cmpsimple);
                   16401: #else
                   16402:                R = qsort(R,cmpsimple);
                   16403: #endif
                   16404:                R = vtol(R);
                   16405:                if(TeX >= 0){
                   16406:                        Out = string_to_tb("");
                   16407:                        for(I=L=K=0; R!=[]; R=cdr(R),I++){
                   16408:                                K1 = K;
                   16409:                                RS = my_tex_form(car(R));
                   16410:                                K = nmono(car(R));
                   16411:                                L += K;
                   16412:                                if(I){
                   16413:                                        if(K1 == K && L < 30)
                   16414:                                                str_tb("\\quad ",Out);
                   16415:                                        else{
                   16416:                                                L = K;
                   16417:                                                str_tb((TeXEq==5)?["\\\\%\n &"]:["\\\\%\n "],Out);
                   16418:                                        }
                   16419:                                }
                   16420:                                str_tb(RS,Out);
                   16421:                        }
                   16422:                        R = Out;
                   16423:                        if(Dviout>=0){
                   16424:                                dviout(R|eq=0,keep=Keep);
                   16425:                                return 1;
                   16426:                        }
                   16427:                }
                   16428:                return R;
                   16429:        }
                   16430:
                   16431:        AL = []; SS = 0;
                   16432:        for(I = 0; I <= LA; I++){
                   16433:                AI = ALL[I]; AIT = AI[1];  /* AIT: GRS */
                   16434:                if(I > 0){
                   16435:                        for(S = J = 0; J < NP; J++){
                   16436:                                GE = AIT[J][AI0[J]][1];
                   16437:                                S += GE;
                   16438:                                if(J == 0)
                   16439:                                        SS = [];
                   16440:                                else
                   16441:                                        SS = cons(GE,SS);
                   16442:                        }
                   16443:                        SS = cons(1-Mat-S, reverse(SS));
                   16444:                }
                   16445:                AI0 = AI[0];
                   16446:                AL = cons([SS, cutgrs(AIT)], AL);
                   16447:        }
                   16448:        AL = reverse(AL);
                   16449:        AD = newvect(NP);
                   16450:        ALT = AL[0][1];
                   16451:        for(J = 1; J < NP; J++){
                   16452:                /* AD[J] = ALT[J][0][1];   [J][?][1] <- [J][?][0]: max */
                   16453:                for(MMX=0, K = KM = length(ALT[J])-1; K >= 0; K--){
                   16454:                        if(MMX <= ALT[J][K][0]){
                   16455:                                 if(J == 1 && MMX == ALT[J][K][0])
                   16456:                                         continue;
                   16457:                                 KM = K;
                   16458:                                 MMX = ALT[J][K][0];
                   16459:                        }
                   16460:                }
                   16461:                AD[J] = ALT[J][KM][1];
                   16462:        }
                   16463:        AL = cdr(AL);
                   16464:        AL = cons([vtol(AD), ALT], AL);
                   16465:        AL = cons([0, mcgrs(ALT, [vtol(-AD)]|mat=Mat)], AL);
                   16466:        if(Simp >= 0 && T != 3)
                   16467:                AL = simplify(AL,Fuc,4);
                   16468: /* Basic */
                   16469:        if(T == 8){
                   16470:                ALT = AL[0][1];
                   16471:                if(TeX >= 0){
                   16472:                        if(Dviout >= 0){
                   16473:                                return getbygrs(ALT,["TeX","dviout","keep"]);
                   16474:                        }
                   16475:                        return getbygrs(ALT,"TeX");
                   16476:                }
                   16477:                if(Short >= 0)
                   16478:                        ALT = chkspt(ALT|opt=4);
                   16479:                return ALT;
                   16480:        }
                   16481:
                   16482: /* Construct */
                   16483:        if(T == 1){
                   16484:                if(TeX >= 0){
                   16485:                        L = length(AL);
                   16486:                        I = Done = 0; Out0=Out1=""; NM = DN = [];
                   16487:                        if(TeX != 16){
                   16488:                                AL11=AL[L-1][1][1];
                   16489:                                AT = AL11[length(AL11)-1];
                   16490:                                if(type(AT) == 4){
                   16491:                                        PW = (AT[0] > 1)?"":AT[1];
                   16492:                                }else PW = AT;
                   16493:                        }
                   16494:                        Out = string_to_tb("");
                   16495:                        while(--L >= 0){
                   16496:                                if(TeX == 16){
                   16497:                                        if(Done)
                   16498:                                                write_to_tb(":\\ ", Out);
                   16499:                                        write_to_tb(getbygrs(AL[L][1],(Top0>=0)?["TeX", "top0"]:"TeX"|mat=Mat), Out);
                   16500:                                        Done = 1;
                   16501:                                        if(L != 0) write_to_tb((TeXEq==5)?
                   16502:                                                "\\\\%\n&\\leftarrow ":"\\\\%\n\\leftarrow ", Out);
                   16503:                                }
                   16504:                                ALT = AL[L][0];
                   16505:                                if(TeX != 16){
                   16506:                                        V1 = (I==0)?"x":V2;
                   16507:                                        V2 = /* (I==0 && L<=2)?"s": */
                   16508:                                                 "s_"+rtotex(I);
                   16509:                                }else V1=V2="x";
                   16510:                                JJ = (type(ALT) == 4)?length(ALT):0;
                   16511:                                if(I > 0 && L > 0)
                   16512:                                        write_to_tb("\n ", Out);
                   16513:                                for(Outt = "", J = 1; J < JJ; J++){
                   16514:                                        if(ALT[J] == 0) continue;
                   16515:                                        if(J == 1)      Outt += V1;
                   16516:                                        else if(J == 2) Outt += "(1-"+V1+")";
                   16517:                                        else            Outt += "(x_"+rtotex(J)+"-"+V1+")";
                   16518:                                        Outt += "^"+ rtotex(ALT[J]);
                   16519:                                }
                   16520:                                if(TeX != 16) write_to_tb(Outt, Out);
                   16521:                                else if(Outt != "")
                   16522:                                        str_tb(["\\mathrm{Ad}\\Bigl(",Outt,"\\Bigr)"], Out);
                   16523:                                if(JJ == 0){
                   16524:                                        if(I != 0)
                   16525:                                                Out1 = "ds_"+rtotex(I-1)+Out1;
                   16526:                                        continue;
                   16527:                                }
                   16528:                                if(ALT[0] == 0) continue;
                   16529:                                Out0 += "\\int_p^{"+V1+"}";
                   16530:                                if(TeX == 16)
                   16531:                                        str_tb(["mc_",rtotex(ALT[0])], Out);
                   16532:                                else{
                   16533:                                        str_tb(["(",V1,"-",V2,")^",rtotex(-1+ALT[0])], Out);
                   16534:                                        AL11=AL[L-1][1][1];
                   16535:                                        AT = AL11[length(AL11)-1];
                   16536:                                        if(type(AT) == 4) AT = AT[1];
                   16537:                                        DN = cons(ALT[0]+AT+1,DN);
                   16538:                                        NM = cons(AT+1,cons(ALT[0],NM));
                   16539:                                }
                   16540:                                if(L != 2) Out1 += "d"+V2;
                   16541:                                I++;
                   16542:                        }
                   16543:                        if(R){
                   16544:                                if(I == 0) Ov = "x";
                   16545:                                else Ov = "s_"+rtotex(I-1);
                   16546:                                Out1 = "u_B("+Ov+")"+Out1;
                   16547:                        }
                   16548:                        if(TeX != 16){
                   16549:                                Out0 = string_to_tb(Out0);
                   16550:                                str_tb([Out, Out1], Out0);
                   16551:                                Out = Out0;
                   16552:                                NM = simplify(NM, Fuc, 4);
                   16553:                                DN = simplify(DN, Fuc, 4);
                   16554:                                DNT = lsort(NM,DN,"reduce");
                   16555:                                NMT = DNT[0]; DNT = DNT[1];
                   16556:                                if(NMT != [] && PW != ""){
                   16557:                                        write_to_tb((TeXEq==5)?"\\\\\n &\\sim\\frac{\n"
                   16558:                                                :"\\\\\n \\sim\\frac{\n", Out);
                   16559:                                        for(PT = NMT; PT != []; PT = cdr(PT))
                   16560:                                                str_tb(["  \\Gamma(",my_tex_form(car(PT)), ")\n"], Out);
                   16561:                                        write_to_tb(" }{\n", Out);
                   16562:                                        for(PT = DNT; PT != []; PT = cdr(PT))
                   16563:                                                write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   16564:                                        write_to_tb(" }", Out);
                   16565:                                        if(R > 0) write_to_tb("C_0", Out);
                   16566:                                        write_to_tb("x^"+rtotex(PW) +"\\ \\ (p=0,\\ x\\to0)", Out);
                   16567:                                }
                   16568:                        }else
                   16569:                                Out = str_tb(0, Out);
                   16570:                        if(Dviout >= 0){
                   16571:                                dviout(Out|eq=0,keep=Keep);
                   16572:                                return 1;
                   16573:                        }
                   16574:                        return O;
                   16575:                }
                   16576:                if(Short >= 0){
                   16577:                        for(ALL = [] ; AL != []; AL = cdr(AL)){
                   16578:                                 AT = car(AL);
                   16579:                                 ALL = cons([AT[0], chkspt(AT[1]|opt=4)], ALL);
                   16580:                        }
                   16581:                        AL = reverse(ALL);
                   16582:                }
                   16583:                return AL;  /* AL[0][1] : reduced GRS, R==0 -> rigid */
                   16584:        }
                   16585:
                   16586:        if(T == 2 || T == 4 || T == 11){
                   16587:                for(I = (T==2)?2:1; I >= (T==11)?0:1; I--){
                   16588:                        ALT = M[I];
                   16589:                        if(ALT[length(ALT)-1][0] != 1){
                   16590:                                mycat(["multiplicity for",I,":",ALT[length(ALT)-1][1],
                   16591:                                        "should be 1"]);
                   16592:                                return;
                   16593:                        }
                   16594:                }
                   16595:        }
                   16596:        LA++;
                   16597:        NM = DN = [];
                   16598:
                   16599: /* Three term relation */
                   16600:        if(T == 11){
                   16601:                if(R > 0){
                   16602:                        print("This is not rigid\n");
                   16603:                        return 0;
                   16604:                }
                   16605:                for(I = 0; I <= LA; I++){
                   16606:                        if(I > 0){
                   16607:                                AI = AL[I][0];  /* operation */
                   16608:                                if(AI[0] != 0){
                   16609:                                        DN = cons(simplify(AI1+1,Fuc,4),DN);
                   16610:                                        NM = cons(simplify(AI1+AI[0]+1,Fuc,4),NM);
                   16611:                                }
                   16612:                        }
                   16613:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   16614:                }
                   16615:                DNT = lsort(NM,DN,"reduce");
                   16616:                if(TeX < 0) return DNT;
                   16617:                NMT = DNT[0]; DNT = DNT[1];
                   16618:                Out = str_tb("u_{0,0,0}-u_{+1,0,-1}=\\frac{","");
                   16619:                for(PT = NMT; PT != []; PT = cdr(PT))
                   16620:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   16621:                str_tb(["}\n{"],Out);
                   16622:                for(PT = DNT; PT != []; PT = cdr(PT))
                   16623:                        str_tb(["(",my_tex_form(car(PT)),")"], Out);
                   16624:                write_to_tb("}u_{0,+1,-1}",Out);
                   16625:                if(Dviout >= 0){
                   16626:                        dviout(Out|eq=0,keep=Keep);
                   16627:                        return 1;
                   16628:                }
                   16629:                return Out;
                   16630:        }
                   16631:
                   16632:        AD=newvect(NP);
                   16633:        for(I = 0; I <= LA; I++){
                   16634:                if(I > 0){
                   16635:                        AI = AL[I][0];  /* operation */
                   16636:                        if(T == 2 && AI[0] != 0){
                   16637:                                DN = cons(simplify(-AI2,Fuc,4), cons(simplify(AI1+1,Fuc,4),DN));
                   16638:                                NM = cons(simplify(-AI2-AI[0],Fuc,4), cons(simplify(AI1+AI[0]+1,Fuc,4),
                   16639:                                 NM));
                   16640:                        }
                   16641:                        for(J = 1; J < NP; J++)
                   16642:                                AD[J] += simplify(AI[J],Fuc,4);
                   16643:                }
                   16644:                if(T == 2){
                   16645:                        ALT = AL[I][1][1]; AI1 = ALT[length(ALT)-1][1];
                   16646:                        ALT = AL[I][1][2]; AI2 = ALT[length(ALT)-1][1];
                   16647:                        if(I == 0){
                   16648:                                 C3 = AI1; C4 = AI2;
                   16649:                        }
                   16650:                }
                   16651:        }
                   16652:
                   16653: /* Connection */
                   16654:        if(T == 2){
                   16655:                DNT = lsort(NM,DN,"reduce");
                   16656:                NMT = DNT[0]; DNT = DNT[1];
                   16657:                if(TeX < 0) return [NMT,DNT,AD];
                   16658:                C0 = M[1][length(M[1])-1][1];
                   16659:                C1 = M[2][length(M[2])-1][1];
                   16660:                M =  AL[0][1];
                   16661:                C3 = M[1][length(M[1])-1][1];
                   16662:                C4 = M[2][length(M[2])-1][1];
                   16663:                Out = str_tb(["c(0\\!:\\!", my_tex_form(C0),
                   16664:                        " \\rightsquigarrow 1\\!:\\!", my_tex_form(C1),")"], "");
                   16665:                if(R > 0 && AMSTeX == 1 && (TeXEq == 4 || TeXEq == 5)){
                   16666:                        write_to_tb("\\\\\n", Out);
                   16667:                        if(TeXEq == 5) write_to_tb(" &", Out);
                   16668:                }
                   16669:                write_to_tb("=\\frac{\n",Out);
                   16670:                for(PT = NMT; PT != []; PT = cdr(PT))
                   16671:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n", Out);
                   16672:                write_to_tb(" }{\n",Out);
                   16673:                for(PT = DNT; PT != []; PT = cdr(PT))
                   16674:                        write_to_tb("  \\Gamma("+my_tex_form(car(PT))+")\n",Out);
                   16675:                write_to_tb(" }", Out);
                   16676:                for(J = 3; J < length(AD); J++){
                   16677:                        if(AD[J] == 0) continue;
                   16678:                        str_tb(["\n (1-x_", rtotex(J), "^{-1})^", rtotex(AD[J])], Out);
                   16679:                }
                   16680:                if(R != 0)
                   16681:                        str_tb(["\n c_B(0\\!:\\!", my_tex_form(C3),
                   16682:                                " \\rightsquigarrow 1\\!:\\!", my_tex_form(C4), ")"], Out);
                   16683:                Out = tb_to_string(Out);
                   16684:                if(Dviout >= 0){
                   16685:                        dviout(Out|eq=0,keep=Keep);
                   16686:                        return 1;
                   16687:                }
                   16688:                return Out;
                   16689:        }
                   16690:
                   16691: /*  Series */
                   16692:        if(T == 4){
                   16693:                AL11 = AL[0][1][1];
                   16694:                V = AL11[length(AL11)-1][1];
                   16695:                S00 = -V; S01 = (R==0)?[]:[[0,0]];
                   16696:                S1 = S2 = [];
                   16697:                for(Ix = 1, ALL = cdr(AL); ALL != []; ){
                   16698:                        ALT = ALL[0][0];
                   16699:                        if(ALT[0] != 0){ /* mc */
                   16700:                                for(Sum = [], ST = S01; ST != []; ST = cdr(ST))
                   16701:                                        Sum = cons(car(ST)[0], Sum);
                   16702:                                S1 = cons(cons(S00+1,Sum), S1);
                   16703:                                S2 = cons(cons(S00+1+ALT[0],Sum),S2);
                   16704:                                S00 += ALT[0];
                   16705:                        }
                   16706:                        ALL = cdr(ALL);
                   16707:                        for(I = 1; I < length(ALT); I++){  /* addition */
                   16708:                                if(I == 1){
                   16709:                                        S00 += ALT[1];
                   16710:                                        if(ALL == [])
                   16711:                                                S00 = [S00];
                   16712:                                }else{
                   16713:                                        if(ALT[I] == 0)
                   16714:                                                continue;
                   16715:                                        if(ALL != []){
                   16716:                                                S1 = cons([-ALT[I],Ix],S1);
                   16717:                                                S2 = cons([1,Ix],S2);
                   16718:                                                S01= cons([Ix,I],S01);
                   16719:                                                Ix++;
                   16720:                                        }else
                   16721:                                                S00 = cons([ALT[I],I],S00);
                   16722:                                }
                   16723:                        }
                   16724:                }
                   16725:                S00 = reverse(S00);
                   16726:                S01 = qsort(S01); S1 = qsort(S1); S2 = qsort(S2);
                   16727:                if(Simp >= 0){
                   16728:                         S00 = simplify(S00,Fuc,4);
                   16729:                         S01 = simplify(S01,Fuc,4);
                   16730:                         S1  = simplify(S1,Fuc,4);
                   16731:                         S2  = simplify(S2,Fuc,4);
                   16732:                         SS  = lsort(S1,S2,"reduce");
                   16733:                         S1 = SS[0]; S2 = SS[1];
                   16734:                }
                   16735:
                   16736:                if(TeX >= 0){
                   16737:                                                 /* Top linear power */
                   16738:                        TOP = Ps = Sm = "";
                   16739:                        for(TOP = Ps = Sm = "", ST = cdr(S00); ST != []; ST = cdr(ST)){
                   16740:                                SP = car(ST);
                   16741:                                if(SP[0] != 0){
                   16742:                                        if(SP[1] == 2)
                   16743:                                                TOP += "(1-x)^"+rtotex(SP[0]);
                   16744:                                        else
                   16745:                                                TOP += "(1-x/x_"+rtotex(SP[1])+")^"+rtotex(SP[0]);
                   16746:                                }
                   16747:                        }
                   16748:                                                 /* Top power */
                   16749:                        PW = my_tex_form(car(S00));
                   16750:                        if(PW == "0")
                   16751:                                PW = "";
                   16752:                        NP = length(AL[0][1]);
                   16753:                        PWS = newvect(NP);
                   16754:                        for(I = 0; I < NP; I++)
                   16755:                                PWS[I] = "";
                   16756:                        for(S = S01, I = 0; S != []; S = cdr(S), I++){
                   16757:                                SI = rtotex(car(S)[0]);
                   16758:                                if(I > 0) Sm += ",\\ ";
                   16759:                                Sm += "n_"+SI+"\\ge0";
                   16760:                                if(PW != "")
                   16761:                                        PW += "+";
                   16762:                                PW += "n_"+SI;
                   16763:                                if(car(S)[1] > 2)
                   16764:                                        PWS[car(S)[1]] += "-n_"+rtotex(car(S)[0]);
                   16765:                                else if(car(S)[1] == 0)
                   16766:                                        Ps = "C_{n_0}"+Ps;
                   16767:                        }
                   16768:                        for(I = 3; I < NP; I++){
                   16769:                                if(PWS[I] != "")
                   16770:                                        Ps += "x_"+rtotex(I)+"^{"+PWS[I]+"}";
                   16771:                        }
                   16772:                        Out = str_tb([TOP, Ps, "x^{", PW, "}"], "");
                   16773:                                 /* Gamma factor */
                   16774:                        for(I = 0, SS = S1; I <= 1; I++, SS = S2){
                   16775:                                PW = string_to_tb("");
                   16776:                                for(PW1=""; SS != [] ; SS = cdr(SS)){
                   16777:                                        for(J = 0, SST = car(SS); SST != [];  SST = cdr(SST), J++){
                   16778:                                                if(J == 0){
                   16779:                                                        JJ = (car(SST) == 1)?((length(SST)==2)?(-1):0):1;
                   16780:                                                        if(JJ > 0)
                   16781:                                                                str_tb(["(", my_tex_form(car(SST)), ")_{"], PW);
                   16782:                                                        else if(JJ == 0)
                   16783:                                                                PW1 = "(";
                   16784:                                                }else{
                   16785:                                                        if(JJ > 0){
                   16786:                                                                if(J > 1) write_to_tb("+", PW);
                   16787:                                                                str_tb(["n_", rtotex(car(SST))], PW);
                   16788:                                                        }else{
                   16789:                                                                if(J > 1) PW1 += "+";
                   16790:                                                                PW1 += "n_"+rtotex(car(SST));
                   16791:                                                        }
                   16792:                                                }
                   16793:                                        }
                   16794:                                        if(JJ > 0) write_to_tb("}", PW);
                   16795:                                        else PW1 += (JJ == 0)?")!":"!";
                   16796:                                }
                   16797:                                if(I == 0)
                   16798:                                        Out0 = "\\frac";
                   16799:                                Out0 += "{"+tb_to_string(PW)+PW1+"}";
                   16800:                                PW = string_to_tb(""); PW1 = "";
                   16801:                        }
                   16802:                        if(Out0 == "\\frac{}{}")
                   16803:                                Out0 = "";
                   16804:                        Out = "\\sum_{"+Sm+"}"+Out0 + Top + tb_to_string(Out);
                   16805:                        if(length(S01) == 1){
                   16806:                                Out = str_subst(Out, "{n_"+SI+"}", "n");
                   16807:                                Out = str_subst(Out, "n_"+SI, "n");
                   16808:                        }
                   16809:                        if(Dviout >= 0)
                   16810:                                dviout(Out|eq=0,keep=Keep);
                   16811:                        return Out;
                   16812:                }
                   16813:                return [cons(S00, S01), S1, S2];
                   16814:        }
                   16815:
                   16816: /* Operator */
                   16817:        if(T==3){
                   16818:                Fuc0 = car(Fuc);
                   16819:                if(Fuc0 != 0){  /* Kill Fuchs relation */
                   16820:                        for(V = vars(Fuc0); V != []; V = cdr(V)){
                   16821:                                VT = car(V);
                   16822:                                if(deg(Fuc0,VT) == 1){
                   16823:                                        AL = mysubst(AL, [VT, -red(coef(Fuc0,0,VT)/coef(Fuc0,1,VT))]);
                   16824:                                        break;
                   16825:                                }
                   16826:                        }
                   16827:                        if(V == []){
                   16828:                                print("Fuchs condition has no variable with degree 1");
                   16829:                                return 0;
                   16830:                        }
                   16831:                }
                   16832:                L = newvect(NP);
                   16833:                Pt = getopt(pt);
                   16834:                for(I = NP-1; I >= 1; I--){
                   16835:                        if(type(Pt) == 4)
                   16836:                                L[I] = Pt[I-1];
                   16837:                        else if(I >= 3 || X1 >= 0 || (X2 >= 0 && I >= 2))
                   16838:                                L[I] = makev(["x_", I]);
                   16839:                        else L[I] = I-1;
                   16840:                }
                   16841:                if(R){  /* non-rigid basic */
                   16842:                        MM = AL[0][1];  /* Riemann scheme */
                   16843:                        for(OD = 0, MT = car(MM); MT != []; MT = cdr(MT))
                   16844:                                OD += car(MT)[0];
                   16845:                        for(V = DN = [], M = MM; M != []; M = cdr(M)){
                   16846:                                MT = car(M);  /* exponents */
                   16847:                                for(K = KM = 0, NT = []; ; K++){
                   16848:                                        for(J = 0, P = 1, MTT = MT; MTT != []; MTT = cdr(MTT)){
                   16849:                                                if(J == 0 && car(MTT)[1] == 0)
                   16850:                                                        KM = car(MTT)[0];
                   16851:                                                for(KK = car(MTT)[0] - K -1; KK >= 0;  KK--)
                   16852:                                                        P *= (dx-car(MTT)[1]-KK);
                   16853:                                        }
                   16854:                                        if(P == 1) break;
                   16855:                                        NT = cons(P,NT);
                   16856:                                }
                   16857:                                V = cons(reverse(NT), V);
                   16858:                                DN = cons(KM, DN);
                   16859:                        }
                   16860:                        V  = ltov(reverse(V));   /* conditions for GRS */
                   16861:                        DN = ltov(reverse(DN));  /* dims of local hol. sol. */
                   16862:                        for(J = OD; J >= 0; J--){
                   16863:                                for(I = Q = 1; I < NP; I++){
                   16864:                                        if(J > DN[I])
                   16865:                                                Q *= (x-L[I])^(J-DN[I]);
                   16866:                                }
                   16867:                                K = mydeg(Q,x);
                   16868:                                if(J == OD){
                   16869:                                        P = Q*dx^J;
                   16870:                                        DM = K;
                   16871:                                }else{
                   16872:                                        for(I = DM-OD+J-K; I >= 0; I--){
                   16873:                                                X = makev(["r",J,"_",I]);
                   16874:                                                P += Q*x^I*X*dx^J;
                   16875:                                        }
                   16876:                                }
                   16877:                        }
                   16878:                        for(R = [], I = 0; I < NP; I++){
                   16879:                                Q = toeul(P, [x,dx], (I==0)?"infty":L[I]);  /* Euler at I-th pt */
                   16880:                                for(VT = V[I], J=0; VT != [] ; VT = cdr(VT), J++){
                   16881:                                         if(car(VT) != 0)
                   16882:                                                 R = cons(rpdiv(coef(Q,J,x), car(VT), dx)[0], R); /* equations */
                   16883:                                }
                   16884:                        }
                   16885:                        for(RR = RRR = [], I = OD-1; I>=0; I--){
                   16886:                                 RR = [];
                   16887:                                 for(RT = R; RT != [] ; RT = cdr(RT)){
                   16888:                                         if( (VT = mycoef(car(RT), I, dx)) != 0)
                   16889:                                                 RR = cons(VT, RR);   /* real linear eqs */
                   16890:                                 }
                   16891:                                 J = mydeg(mycoef(P,I,dx),x);
                   16892:                                 for(S = 0, VVV = []; J >= 0; J--){
                   16893:                                         X = makev(["r",I,"_",J]);
                   16894:                                         VVV = cons(X, VVV);     /* unknowns */
                   16895:                                 }
                   16896:                                 RR = lsol(RR,VVV);
                   16897:                                 LN = length(RR);
                   16898:                                 for(K=0; K<LN; K++){
                   16899:                                         RRT = RR[K];
                   16900:                                         if(type(RRT) != 4) continue;
                   16901:                                         R = mysubst(R,RRT);
                   16902:                                         P = mysubst(P,RRT);
                   16903:                                 }
                   16904:                        }
                   16905:                }else  /* Rigid case */
                   16906:                        P = dx^(AL[0][1][0][0][0]);
                   16907:  /* additions and middle convolutions */
                   16908:                for(ALT = AL; ALT != []; ALT = cdr(ALT)){
                   16909:                        AI = car(ALT)[0];
                   16910:                        if(type(AI) != 4) continue;
                   16911:                        V = ltov(AI);
                   16912:                        if(V[0] != 0) P = mc(P,x,V[0]);
                   16913:                        for(I = 1; I < NP; I++){
                   16914:                                if(V[I] != 0)
                   16915:                                        P = sftexp(P,x,L[I],-V[I]);
                   16916:                        }
                   16917:                }
                   16918:                P = (Simp>=0)? simplify(P,Fuc,4|var=[dx]):simplify(P,Fuc,4);
                   16919:                if(TeX >= 0){
                   16920:                        Val = 1;
                   16921:                        if(mydeg(P,dx) > 2 && AMSTeX == 1 && TeXEq > 3)
                   16922:                                Val = (TeXEq==5)?3:2;
                   16923:                        Out = fctrtos(P|var=[dx,"\\partial"],TeX=Val);
                   16924:                        if(Dviout < 0) return Out;
                   16925:                        dviout(Out|eq=0,keep=Keep);
                   16926:                        return 1;
                   16927:                }
                   16928:                return P;
                   16929:        }
                   16930:        return 0;
                   16931: }
                   16932:
                   16933: def mcop(P,M,S)
                   16934: {
                   16935:        for(V=[],ST=S;ST!=[];ST=cdr(ST))
                   16936:                if(isvar(VT=car(ST))) V=cons(vweyl(VT),V);
                   16937:        V=reverse(V);
                   16938:        N=length(V);
                   16939:        for(MT=M;MT!=[];MT=cdr(MT)){
                   16940:                T=car(MT);
                   16941:                if(T[0]!=0)
                   16942:                        P=mc(P,V[0],T[0]);
                   16943:                for(TT=cdr(T),ST=cdr(S);ST!=[];TT=cdr(TT),ST=cdr(ST))
                   16944:                        if(car(TT)!=0) P=sftpexp(P,V,S[0]-ST[0],-car(TT));
                   16945:        }
                   16946:        return P;
                   16947: }
                   16948:
                   16949: /* option: zero, all, raw */
                   16950: def shiftop(M,S)
                   16951: {
                   16952:        if(type(M)==7)  M=s2sp(M);
                   16953:        if(type(S)==7)  S=s2sp(S);
                   16954:        Zero=getopt(zero);
                   16955:        NP=length(M);
                   16956:        for(V=L=[],I=NP-1; I>=0; I--){
                   16957:                V=cons(strtov(asciitostr([97+I])),V);
                   16958:                if(I>2) L=cons(makev(["y_", I-1]),L);
                   16959:                else L=cons(I-1,L);
                   16960:        }
                   16961:        if(type(M[0][0])==4){
                   16962:                F=1;RS=M;SS=S;
                   16963:                R=chkspt(M);
                   16964:                if(R[2]!=2 || R[3]!=0){
                   16965:                        mycat("GRS is not valid!");return 0;
                   16966:                }
                   16967:                for(; S!=[]; S=cdr(S)){
                   16968:                        if(nmono(S[0][0])!=1) break;
                   16969:                        if(isint(S[0][1]-S[0][0])==0) break;
                   16970:                }
                   16971:                if(S!=[]){
                   16972:                        mycat("Error in shift!"); return 0;
                   16973:                }
                   16974:        }else{
                   16975:                F=0;
                   16976:                RS=sp2grs(M,V,[1,length(M[0]),1]);
                   16977:                for(SS=S0=[],I=0; I<NP; I++){
                   16978:                        for(J=F=0; J<length(M[I]); J++){
                   16979:                                if(I==0 && J==length(M[0])-1) break;
                   16980:                                if((U=S[I][J])!=0){
                   16981:                                        if(isint(U)!=1){
                   16982:                                                mycat("Error in shift!"); return 0;
                   16983:                                        }
                   16984:                                        VT=RS[I][J][1];
                   16985:                                        SS=cons([VT,VT+U],SS);
                   16986:                                }else if(I>0 && Zero==1 && F==0){
                   16987:                                        RS=mysubst(RS,[RS[I][J][1],0]);
                   16988:                                        F=J+1;
                   16989:                                }
                   16990:                        }
                   16991:                        if((F>0 && J==2) || (I==0 && J==1)){
                   16992:                                J=(I==0)?0:2-F; VT=RS[I][J][1];
                   16993:                                S0=cons([VT,strtov(asciitostr([strtoascii(rtostr(VT))[0]]))],S0);
                   16994:                        }
                   16995:                }
                   16996:        }
                   16997:        RS1=mysubst(RS,SS);
                   16998:        if(F==1){
                   16999:                R=chkspt(RS1);
                   17000:                if(R[2]!=2 || R[3]!=0){
                   17001:                        mycat("Error in shift!");
                   17002:                        return 0;
                   17003:                }
                   17004:        }
                   17005:        R=getbygrs(RS,1); R1=getbygrs(RS1,1);
                   17006:        RT=R[0][1][0];
                   17007:        if(length(RT)!=1 || RT[0][0]!=1){
                   17008:                mycat("Not rigid!");
                   17009:                return 0;
                   17010:        }
                   17011:        P=dx;Q=Q1=1;
                   17012:        for(RT = R, RT1=R1; RT != []; RT = cdr(RT), RT1=cdr(RT1)){
                   17013:                V=car(RT)[0]; V1=car(RT1)[0];
                   17014:                if(type(V) != 4) continue;
                   17015:
                   17016:                if(V[0] != 0){
                   17017:                        P = mc(P,x,V[0]);  /* middle convolution */
                   17018:                        QT = mc(Q,x,V[0]);
                   17019:                }else QT=Q;
                   17020:                D0=mydeg(Q,dx);D0T=mydeg(QT,dx);
                   17021:                C0=red(mycoef(Q,D0,dx)/mycoef(QT,D0T,dx));
                   17022:                if(C0!=1) QT=red(C0*QT);
                   17023:
                   17024:                if(V1[0] != 0) Q1T = mc(Q1,x,V1[0]);
                   17025:                else Q1T=Q1;
                   17026:                D1=mydeg(Q1,dx);D1T=mydeg(Q1T,dx);
                   17027:                C1=red(mycoef(Q1,D1,dx)/mycoef(Q1T,D1T,dx));
                   17028:                if(C1!=1) Q1T=red(C1*Q1T);
                   17029:                DD=(V[0]-V1[0])+(D0-D0T)-(D1-D1T);
                   17030:                if(DD>0){
                   17031:                        QT=muldo(dx^DD,QT,[x,dx]);
                   17032:                        D0T+=DD;
                   17033:                }else if(DD<0){
                   17034:                        Q1T=muldo(dx^(-DD),Q1T,[x,dx]);
                   17035:                        D1T-=DD;
                   17036:                }
                   17037:                C=mylcm(dn(QT),dn(Q1T),x);
                   17038:                if(C!=1){
                   17039:                        QT=red(C*QT); Q1T=red(C*Q1T);
                   17040:                }
                   17041:                Q=QT;Q1=Q1T;
                   17042:                for(I = 1; I < NP; I++){
                   17043:                        if(V[I]!=0){
                   17044:                                P = sftexp(P,x,L[I],-V[I]);  /* addition u -> (x-L[I])^V[I]u */
                   17045:                                QT = sftexp(QT,x,L[I],-V[I]);
                   17046:                        }
                   17047:                        if(V1[I]!=0)
                   17048:                                Q1T = sftexp(Q1T,x,L[I],-V1[I]);
                   17049:                }
                   17050:                C=red(mycoef(QT,D0T,dx)*mycoef(Q1,D1T,dx)/(mycoef(Q,D0T,dx)*mycoef(Q1T,D1T,dx)));
                   17051:                Q=red(dn(C)*QT);Q1=red(nm(C)*Q1T);
                   17052:                for(I = 1; I < NP; I++){
                   17053:                        if((J=V[I]-V1[I])!=0){
                   17054:                                if(J>0) Q1*=(x-L[I])^J;
                   17055:                                else Q*=(x-L[I])^(-J);
                   17056:                        }
                   17057:                        while((QT=tdiv(Q,x-L[I]))!=0){
                   17058:                                if((Q1T=tdiv(Q1,x-L[I]))!=0){
                   17059:                                        Q=QT;Q1=Q1T;
                   17060:                                }else break;
                   17061:                        }
                   17062:                }
                   17063:        }
                   17064:        P1=mysubst(P,SS);
                   17065:        if(type(S0)==4 && S0!=[]){
                   17066:                P=mysubst(P,S0); Q=mysubst(Q,S0);
                   17067:                P1=mysubst(P1,S0); Q1=mysubst(Q1,S0);
                   17068:                RS=mysubst(RS,S0); RS1=mysubst(RS1,S0);
                   17069:        }
                   17070:        R=mygcd(Q1,P1,[x,dx]);
                   17071:        if(findin(dx,vars(R[0]))>=0){
                   17072:                mycat("Some error!");
                   17073:                return 0;
                   17074:        }
                   17075:        Q=muldo(R[1]/R[0],Q,[x,dx]);
                   17076:        R=divdo(Q,P,[x,dx]);
                   17077:        Q=red(R[1]/R[2]);
                   17078:        R=fctr(nm(Q));
                   17079:        QQ=Q/R[0][0];
                   17080:        R1=fctr(dn(QQ));
                   17081:        for(RR=cdr(R1); RR!=[]; RR=cdr(RR)){
                   17082:                VT=vars(car(RR)[0]);
                   17083:                if(findin(x,VT)<0 && findin(dx,VT)<0){
                   17084:                        for(I=car(RR)[1];I>0;I--) QQ=red(QQ*car(RR)[0]);
                   17085:                }
                   17086:        }
                   17087:        Raw=getopt(raw);
                   17088:        Dviout=getopt(dviout);
                   17089:        if(Dviout==1) Raw=4;
                   17090:        if(Raw!=1){
                   17091:                for(RR=cdr(R); RR!=[]; RR=cdr(RR)){
                   17092:                        VT=vars(car(RR)[0]);
                   17093:                        if(findin(x,VT)<0 && findin(dx,VT)<0){
                   17094:                                for(I=car(RR)[1];I>0;I--) QQ=red(QQ/car(RR)[0]);
                   17095:                        }
                   17096:                }
                   17097:        }
                   17098:        if(Raw==2||Raw==3||Raw==4){
                   17099:                R=mygcd(QQ,P,[x,dx]);  /* R[0]=R[1]*QQ + R[2]*P */
                   17100:                Q1=red(R[0]/R[2]);
                   17101:                for(Q=1,RR=cdr(fctr(nm(Q1))); RR!=[]; RR=cdr(RR)){
                   17102:                        VT=vars(car(RR)[0]);
                   17103:                        if(findin(x,VT)<0){
                   17104:                                for(I=car(RR)[1];I>0;I--) Q*=car(RR)[0];
                   17105:                        }
                   17106:                }
                   17107:                if(Raw==3) QQ=[QQ,Q];
                   17108:                else if(Raw==4)    /* Q=Q*R[1]/R[0]*QQ+Q/R[0]*P */
                   17109:                        QQ=[QQ,Q,red(R[1]*Q/R[0])];
                   17110:                else QQ=Q;
                   17111:        }
                   17112:        F=getopt(all);
                   17113:        if(Dviout==1){
                   17114:                Pre = " x=\\infty & 0 & 1";
                   17115:                for(I=3; I<NP; I++) Pre = Pre+"& "+rtostr(L[I]);
                   17116:                Pre = Pre+"\\\\\n";
                   17117:                PW=str_tb(ltotex(RS|opt="GRS",pre=Pre),0);
                   17118:                str_tb(
                   17119: "=\\{u\\mid Pu=0\\}\\\\\n&\\underset{Q_2}{\\overset{Q_1}{\\rightleftarrows}}\n",PW);
                   17120:                str_tb([ltotex(RS1|opt="GRS",pre=Pre),"\\\\\n"],PW);
                   17121:                R=fctrtos(QQ[0]|TeX=3,var=[dx,"\\partial"]);
                   17122:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   17123:                str_tb(["Q_1&=",R,"\\\\\n"],PW);
                   17124:                R=fctrtos(QQ[2]|TeX=3,var=[dx,"\\partial"]);
                   17125:                if(type(R)==4)  R="\\frac1{"+R[1]+"}"+R[0];
                   17126:                str_tb(["Q_2&=",R,"\\\\\n"],PW);
                   17127:                str_tb(["Q_2Q_1&\\equiv ",fctrtos(QQ[1]|TeX=3),"\\mod W(x)P"],PW);
                   17128:                if(F==1)
                   17129:                        str_tb(["\\\\\nP&=",fctrtos(P|TeX=3,var=[dx,"\\partial"])],PW);
                   17130:                dviout(str_tb(0,PW)|eq=0,title="Shift Operator");
                   17131:        }
                   17132:        if(F==1) return [QQ,P,RS,P1,RS1];
                   17133:        else if(F==0) return QQ;
                   17134:        return [QQ,P,RS];
                   17135: }
                   17136:
                   17137: def conf1sp(M)
                   17138: {
                   17139:        if(type(M)==7) M=s2sp(M);
                   17140:        L0 = length(M);
                   17141:        L1 = length(M[L0-1]);
                   17142:        X2 = getopt(x2);
                   17143:        Conf= getopt(conf);
                   17144:        if(Conf != 0)
                   17145:                Conf = -1;
                   17146:        if((X2==1 || X2==-1) && Conf != 0){
                   17147:                X1 = 0;
                   17148:                X = x_1;
                   17149:        }else{
                   17150:                X1 = 1;
                   17151:                X = x_2;
                   17152:        }
                   17153:        G = sp2grs(M,a,[L0,L1]);
                   17154:        for(I = 0; I < L0-1; I++){
                   17155:                V = makev([a,I-Conf,0]);
                   17156:                G = subst(G,V,0);
                   17157:        }
                   17158:        L2 = length(M[1]);
                   17159:        for(I=J=S0=S1=0; I < L2; I++){
                   17160:                S1 += G[1][I][0];
                   17161:                while(S0 < S1){
                   17162:                        S0 += G[0][J][0];
                   17163:                        if((V=G[0][J][1]) != 0)
                   17164:                                G = mysubst(G,[V,V-G[1][I][1]]);
                   17165:                        J++;
                   17166:                }
                   17167:                if(S0 > S1){
                   17168:                        print("Error in data!");
                   17169:                        return 0;
                   17170:                }
                   17171:        }
                   17172:        if(Conf==0){
                   17173:                for(L=[], I=L0-2; I>=0; I--)
                   17174:                        L=cons(I,L);
                   17175:                L=cons(L0-1,L);
                   17176:                P = getbygrs(G,["operator","x2"]|perm=L);
                   17177:        }else if(X1)
                   17178:                P = getbygrs(mperm(G,[[1,2]],[]), ["operator","x2"]);
                   17179:        else
                   17180:                P = getbygrs(G,["operator","x1"]);
                   17181:        if(Conf==0)
                   17182:                P=nm(mysubst(P,[X,c]));
                   17183:        else{
                   17184:                P = nm(mysubst(P,[X,1/c]));
                   17185:                if(X2==-1){
                   17186:                        for(I=2; I<L0; I++){
                   17187:                                V=makev(["x_",I]); VC=makev([c,I]);
                   17188:                                P = nm(mysubst(P,[V,1/VC]));
                   17189:                        }
                   17190:                }
                   17191:        }
                   17192:        for(I = 1; I < L2; I++){
                   17193:                X = G[1][I][1];
                   17194:                P = nm(mysubst(P,[X,X/c]));
                   17195:        }
                   17196:        VS = vars(P);
                   17197:        while(VS!=[]){
                   17198:                V = car(VS);
                   17199:                if(str_chr(rtostr(V),0,"r")==0){
                   17200:                        CV = mycoef(P,1,V);
                   17201:                        D = mymindeg(CV,c);
                   17202:                        if(D > 0) P = mysubst(P,[V,V/c^D]);
                   17203:                        CV = mycoef(P,1,V);
                   17204:                        DD = mydeg(CV,dx);
                   17205:                        CVV = mycoef(CV,DD,dx);
                   17206:                        CD1 = mydeg(CVV,x);
                   17207:                        CD  = (X==x1)?0:CD1;
                   17208:                        while(CD>=0 && CD<=CD1){
                   17209:                                CC = mycoef(CVV,CD,x);
                   17210:                                if(type(CC)==1){
                   17211:                                        VT = mycoef(mycoef(mycoef(P,DD,dx),CD,x),0,V)/CC;
                   17212:                                        if(VT != 0) P = mysubst(P,[V,V-VT]);
                   17213:                                        break;
                   17214:                                }
                   17215:                                if(X==x1) CD++;
                   17216:                                else CD--;
                   17217:                        }
                   17218:                        while(subst(P,c,0,V,0) == 0)
                   17219:                                P = red(mysubst(P,[V,c*V])/c);
                   17220:                }
                   17221:                VS =cdr(VS);
                   17222:        }
                   17223:        return P;
                   17224: }
                   17225:
1.34    ! takayama 17226: def confexp(S)
        !          17227: {
        !          17228:        V=x;E=[];
        !          17229:        for(P=0,Q=[],ST=S;ST!=[];ST=cdr(ST)){
        !          17230:                Q=cons(car(ST)[0],Q);
        !          17231:                P+=car(ST)[1]/(V-car(ST)[0]);
        !          17232:                P=red(P);
        !          17233:        }
        !          17234:        P=red(P*polbyroot(Q,V));
        !          17235:        Q=cdr(reverse(Q));
        !          17236:        for(I=(length(W=Q));I>=0;I--){
        !          17237:                C=mycoef(P,I,V);
        !          17238:                P-=C*polbyroot(W,V);
        !          17239:                W=cdr(W);
        !          17240:                E=cons(red(C),E);
        !          17241:        }
        !          17242:        return reverse(E);
        !          17243: }
        !          17244:
1.6       takayama 17245: def pgen(L,VV)
                   17246: {
                   17247:        if(type(L[0])<4) L=[L];
                   17248:        if(type(L)==4) L=ltov(L);
                   17249:        K=length(L);
                   17250:        V=newvect(K);
                   17251:        if(type(Sum=getopt(sum))!=1) Sum=0;
                   17252:        if((Num=getopt(num))!=1) Num=0;
                   17253:        if((Sep=getopt(sep))!=1) Sep=0;
                   17254:        if(type(Shift=getopt(shift))!=1) Shift=0;
                   17255:        for(;;){
                   17256:                for(PP=1,R=[],II=K-1; II>=0; II--){
                   17257:                        R=cons(V[II]+Shift,R);
                   17258:                        if(II>0 && Sep==1) R=cons("_",R);
                   17259:                        PP*=L[II][0]^V[II];
                   17260:                }
                   17261:                P+=makev(cons(VV,R)|num=Num)*PP;
                   17262:                for(I=0;I<K;){
                   17263:                        if(++V[I]<=L[I][1]){
                   17264:                                if(Sum>0){
                   17265:                                         for(S=II=0;II<K;) S+=V[II++];
                   17266:                                         if(S>Sum){
                   17267:                                                 V[I++]=0;
                   17268:                                                 continue;
                   17269:                                         }
                   17270:                                }
                   17271:                        }else{
                   17272:                                V[I++]=0;
                   17273:                                continue;
                   17274:                        }
                   17275:                        break;
                   17276:                }
                   17277:                if(I>=K) return P;
                   17278:        }
                   17279: }
                   17280:
                   17281: def diagm(M,A)
                   17282: {
                   17283:        return mgen(M,0,A,1);
                   17284: }
                   17285:
                   17286: def mgen(M,N,A,S)
                   17287: {
                   17288:        if(M==0 && N==0){
                   17289:                mycat([
                   17290: "mgen(m,n,a,s|sep=1) : generate a matrix of size m x n\n",
                   17291: " n : a number or \"diagonal\", \"highdiag\", \"lowdiag\",\"skew\",\"symmetric\",\"perm\" = 0,-1,-2,..\n",
                   17292: " a : a symbol or list (ex. a, [a], [a,b,c], [1,2,3])\n",
                   17293: " s : 0 or 1 (shift of suffix)\n"
                   17294:                ]);
                   17295:                return 0;
                   17296:        }
                   17297:        if(type(N)==7) N=-findin(N,["diag","highdiag","lowdiag","skew","symmetric","perm"]);
                   17298:        Sep=(getopt(sep)==1)?1:0;
                   17299:        if(S < 0 || S > 2)
                   17300:                S = 0;
                   17301:        if(M+S > 30 || N+S > 30){
                   17302:                erno(1);
                   17303:                return;
                   17304:        }
                   17305:        if(N==-5){
                   17306:                NM=newmat(M,M);
                   17307:                for(I=0;I<M;I++,A=cdr(A)) NM[I][car(A)-S]=1;
                   17308:                return NM;
                   17309:        }
                   17310:        if(type(A) == 4)
                   17311:                L = length(A)-1;
                   17312:        else
                   17313:                L = -1;
                   17314:        if(N <= 0 && N >= -2){
                   17315:                MM = newmat(M,M);
                   17316:                J = K = 0;
                   17317:                if(N == -1){
                   17318:                        K = 1; M--;
                   17319:                }else if(N == -2){
                   17320:                        J = 1; M--;
                   17321:                }
                   17322:                for(I = 0; I < M; I++){
                   17323:                        if(L >= 0)
                   17324:                                MM[I+J][I+K] = A[(I > L)?L:I];
                   17325:                        else if(type(A)==7 || isvar(A))
                   17326:                                MM[I+J][I+K] = makev([A,S+I]|sep=Sep);
                   17327:                        else
                   17328:                                 MM[I+J][I+K] = A;
                   17329:                }
                   17330:                return MM;
                   17331:        }
                   17332:        K = N;
                   17333:        if(K < 0) N = M;
                   17334:        MM = newmat(M,N);
                   17335:        for(I = 0; I < M; I++){
                   17336:                if(L >= 0)
                   17337:                        AA = rtostr(A[(I > L)?L:I]);
                   17338:                else
                   17339:                        AA = rtostr(A)+rtostr(I+S);
                   17340:                if(AA>="0" && AA<=":"){
                   17341:                        erno(0); return;
                   17342:                }
                   17343:                for(J = 0; J < N; J++){
                   17344:                        if(K < 0){
                   17345:                                if(I > J) continue;
                   17346:                                if(K == -3 && I == J) continue;
                   17347:                        }
                   17348:                        MM[I][J] = makev([AA,J+S]|sep=Sep);
                   17349:                }
                   17350:        }
                   17351:        if(K < 0){
                   17352:                for(I = 0; I < M; I++){
                   17353:                        for(J = 0; J < I; J++)
                   17354:                                MM[I][J] = (K == -4)?MM[J][I]:-MM[J][I];
                   17355:                }
                   17356:        }
                   17357:        return MM;
                   17358: }
                   17359:
                   17360: def newbmat(M,N,R)
                   17361: {
                   17362:        S  = newvect(M);
                   17363:        T  = newvect(N);
                   17364:        IM = length(R);
                   17365:        for(I = 0; I < IM; I++){
                   17366:                RI = R[I];
                   17367:                JM = length(RI);
                   17368:                for(J = 0; J < JM; J++){
                   17369:                        RIJ = RI[J];
                   17370:                        if(type(RIJ) == 6){
                   17371:                                S[I] = size(RIJ)[0];
                   17372:                                T[J] = size(RIJ)[1];
                   17373:                        }
                   17374:                }
                   17375:        }
                   17376:        for(I = K = 0; I < M; I++){
                   17377:                if(S[I] == 0)
                   17378:                        S[I] = 1;
                   17379:                K += S[I];
                   17380:        }
                   17381:        for(J = L = 0; J < N; J++){
                   17382:                if(T[J] == 0)
                   17383:                        T[J] = 1;
                   17384:                L += T[J];
                   17385:        }
                   17386:        M = newmat(K,L);
                   17387:        if(type(Null=getopt(null))>0){
                   17388:                for(I=0;I<K;I++){
                   17389:                        for(J=0;J<L;J++) M[I][J]=Null;
                   17390:                }
                   17391:        }
                   17392:        for(I0 = II = 0; II < IM; I0 += S[II++]){
                   17393:                RI = R[II];
                   17394:                JM = length(RI);
                   17395:                for(J0 = JJ = 0; JJ < JM; J0 += T[JJ++]){
                   17396:                        if((RIJ = RI[JJ]) == 0)
                   17397:                                continue;
                   17398:                        Type = type(RIJ);
                   17399:                        for(I = 0; I < S[II]; I++){
                   17400:                                for(J = 0; J < T[JJ]; J++){
                   17401:                                        if(Type == 6)
                   17402:                                                M[I0+I][J0+J] = RIJ[I][J];
                   17403:                                        else if(Type == 4 || Type == 5)
                   17404:                                                M[I0+I][J0+J] = (I>0)?RIJ[I]:RIJ[J];
                   17405:                                        else
                   17406:                                                M[I0+I][J0+J] = RIJ;
                   17407:                                }
                   17408:                        }
                   17409:                }
                   17410:        }
                   17411:        return M;
                   17412: }
                   17413:
                   17414: def unim(S)
                   17415: {
                   17416:        if(!Rand++) random(currenttime());
                   17417:        if(!isint(Wt=getopt(wt))||Wt<0||Wt>10) Wt=2;
                   17418:        if(!isint(Xa=getopt(abs)) || Xa<1)
                   17419:                Xa=9;
                   17420:        if((Xaa=Xa)>10) Xaa=10;
                   17421:        if(Xaa%2) Xaa++;
                   17422:        Xh=Xaa/2;
                   17423:        if(type(S0=SS=S)==4){
                   17424:                Int=(getopt(int)==1)?1:0;
                   17425:                U=[1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4];
                   17426:                M=newmat(S[0],S[1]);
                   17427:                SS=cdr(S);SS=cdr(SS);
                   17428:                if(Rk=length(SS)) L=SS;
                   17429:                else{
                   17430:                        L=[0];
                   17431:                        I=(S[0]>S[1])?S[1]:S[0];
                   17432:                        if(I<=2) return 0;
                   17433:                        if(!isint(Rk=getopt(rank))||Rk<1||Rk>S[0]||Rk>S[1])
                   17434:                                Rk=random()%(I-1)+2;
                   17435:                        for(I=1;I<Rk;){
                   17436:                                P=random()%(S[1]+Wt)-Wt;
                   17437:                                if(P<=0) P=1;
                   17438:                                if(findin(P,L)!=0){
                   17439:                                        L=cons(P,L);
                   17440:                                        I++;
                   17441:                                }
                   17442:                        }
                   17443:                }
                   17444:                L=ltov(qsort(L));
                   17445:                M[0][L[0]]=1;
                   17446:                for(I=1;I<Rk;I++){
                   17447:                        P=Int?1:U[random()%length(U)];
                   17448:                        if(P>Xa) P=Xa;
                   17449:                        M[I][L[I]]=(random()%2)?P:(-P);
                   17450:                }
                   17451:                for(I=0;I<Rk;I++){
                   17452:                        if(I!=0&&abs(M[I][L[I]])>1) M[K=random()%I][KK=L[I]]=1;
                   17453:                        I0=(I==0)?1:L[I]+1;
                   17454:                        I1=(I==Rk-1)?S[1]:L[I+1];
                   17455:                        for(J=I0;J<I1;J++){
                   17456:                                for(K=1;K<=Xa;K++){
                   17457:                                        P=random()%(I+1);
                   17458:                                        if((random()%2)==1) M[P][J]++;
                   17459:                                        else M[P][J]--;
                   17460:                                }
                   17461:                        }
                   17462:                }
                   17463:                S=M;
                   17464:                Res=(getopt(res)==1)?dupmat(S):0;
                   17465:        }
                   17466:        Conj=0;
                   17467:        if(type(S)<2){
                   17468:                if(S<2||S>20) return 0;
                   17469:                if(getopt(conj)==1){
                   17470:                        M=S+Wt;
                   17471:                        if(M>15) M=10;
                   17472:                        M0=floor((M-1)/2);
                   17473:                        for(R=[],I=0;I<S;I++) R=cons(random()%M-M0,R);
                   17474:                        R=qsort(R);
                   17475:                        M=diagm(S,R);
                   17476:                        if(getopt(diag)!=1){
                   17477:                                for(I=1;I<S;I++)
                   17478:                                        if(M[I-1][I-1]==M[I][I] && random()%2) M[I-1][I]=1;
                   17479:                        }
                   17480:                        if(M[0][0]==M[S-1][S-1]){
                   17481:                                for(I=1;I<S;I++) if(M[I-1][I]==1) break;
                   17482:                                if(I==S){
                   17483:                                        if(M[0][0]>0) M[0][0]--;
                   17484:                                        else M[S-1][S-1]++;
                   17485:                                }
                   17486:                        }
                   17487:                        if(getopt(res)==1) RR=diagm(S,[1]);
                   17488:                        S1=S;
                   17489:                        Res=dupmat(S=M);
                   17490:                        if(isint(I=getopt(int))&&I>1&&random()%I==0){
                   17491:                                K=S[0][0];L=K+1;
                   17492:                                for(I=1;I<S1;I++){
                   17493:                                        if(S[I][I]>L && S[I-1][I]==0 && (I==S1-1||S[I][I+1]==0)){
                   17494:                                                L=S[I][I];
                   17495:                                                if(RR){
                   17496:                                                        RR[I][I]=L-K;RR[0][I]=1;
                   17497:                                                }
                   17498:                                                S[0][I]=1;
                   17499:                                                if(!(random()%3)) break;
                   17500:                                        }
                   17501:                                }
                   17502:                                if(random()%3==0){
                   17503:                                        for(I=0;I<S1-1;I++){
                   17504:                                                if(iand(S[I][I],1)&&S[I][I+1]==1){
                   17505:                                                        for(J=I+2;J<S1&&S[I][J]==0;J++);
                   17506:                                                        if(J<S1) continue;
                   17507:                                                        for(J=I-1;J>=0&&S[J][I]==0;J--);
                   17508:                                                        if(J>=0) continue;
                   17509:                                                        S[I][I+1]=2;
                   17510:                                                        for(J=0;J<S1;J++) RR[I][J]*=2;
                   17511:                                                        break;
                   17512:                                                }
                   17513:                                        }
                   17514:                                }
                   17515:                        }
                   17516:                }else{
                   17517:                        M=diagm(S,[1]);
                   17518:                        S1=S;
                   17519:                }
                   17520:        }
                   17521:        if(type(S)==6){
                   17522:                M=dupmat(S);
                   17523:                S=size(S);
                   17524:                S1=S[1];S=S[0];
                   17525:                Nt=1;
                   17526:                if(getopt(conj)==1&&S==S1) Conj=1;
                   17527:        }
                   17528:        if(!isint(Ct=getopt(time)))
                   17529:                Ct=(S>3||S1>3)?100:200;
                   17530:        if(getopt(both)==1){
                   17531:                OL=delopt(getopt(),"both");
                   17532:                M=unim(mtranspose(M)|option_list=OL);
                   17533:                M=mtranspose(M);
                   17534:        }
                   17535:        Mx=20;
                   17536:        for(I=K=LL=0;I<Ct+Mx;I++){
                   17537:                P=random()%S;Q=random()%S;
                   17538:                if(3*K>Ct) T=random()%Xaa-Xh;
                   17539:                else if(5*K<Ct) T=random()%2-1;
                   17540:                else T=random()%4-2;
                   17541:                if(T>=0) T++;
                   17542:                if(P==Q) continue;
                   17543:                for(G=0,J=S1-1;J>=0;J--){
                   17544:                        if((H=abs(M[Q][J]+M[P][J]*T))>Xa&&(!Conj||J!=P)) break;
                   17545:                        if(K<Mx&&!Conj) G=igcd(G,H);
                   17546:                }
                   17547:                if(K<Mx && G>1) J=1;
                   17548:                if(J>0) continue;
                   17549:                if(J<0&&Conj==1){
                   17550:                        for(J=S1-1;J>=0;J--)
                   17551:                                if(J!=Q&&abs(M[J][P]-M[J][Q]*T)>Xa) break;
                   17552:                        if(J<0&&abs(M[Q][P]-M[Q][Q]*T+M[P][P]*T-M[P][Q]*T^2)>Xa) J=1;
                   17553:                        if(J<0&&M[P][P]==M[Q][Q]){
                   17554:                                LF=0;
                   17555:                                for(L=S1-1;J>=0;J--) if(L!=Q&&M[J][Q]!=0) LF++;
                   17556:                                for(L=S1-1;J>=0;J--) if(L!=P&&M[P][J]!=0) LF++;
                   17557:                                        if(!LF) J=1;
                   17558:                        }
                   17559:                }
                   17560:                if(J<0){
                   17561:                        for(J=S1-1;J>=0;J--)
                   17562:                                M[Q][J]+=M[P][J]*T;
                   17563:                        if(Conj==1)
                   17564:                                for(J=S1-1;J>=0;J--) M[J][P]-=M[J][Q]*T;
                   17565:                        if(RR) for(J=S1-1;J>=0;J--) RR[Q][J]+=RR[P][J]*T;
                   17566:                        K++;
                   17567:                }
                   17568:                if(K%5==0){
                   17569:                        if(!Nt) M=mtranspose(M);
                   17570:                        else if(!Conj&&K%2==0){
                   17571:                                for(F=0;F<S;F++){
                   17572:                                        if((V=lgcd(M[F]))>1){
                   17573:                                                for(L=0;L<S1;L++) M[F][L]/=V;
                   17574:                                        }
                   17575:                                }
                   17576:                        }
                   17577:                }
                   17578:                if(I>Ct){
                   17579:                        for(L=S-1;L>=0;L--){
                   17580:                                for(F=0,J=S1-1;J>=0;J--)
                   17581:                                        if(M[L][J]!=0) F++;
                   17582:                                if(F<2){
                   17583:                                        F=-1;break;
                   17584:                                }
                   17585:                                else F=0;
                   17586:                        }
                   17587:                        if(F<0 && LL++<5){
                   17588:                                I=(CT-CT%2)/2;K=1;
                   17589:                        }
                   17590:                        if(I>Ct) break;
                   17591:                }
                   17592:        }
                   17593:        if(RR){
                   17594:                for(I=F=0;I<S1;I++){
                   17595:                        V=Res[I][I];
                   17596:                        for(J=I+1;J<S1;J++){
                   17597:                                if(Res[J][J]!=V) break;
                   17598:                                for(LP=0;LP<2;LP++){
                   17599:                                        if(J==S1-1||Res[J][J+1]==0){
                   17600:                                                if(I==0||Res[I-1][I]==0){
                   17601:                                                        for(VL=VS=[],K=0;K<S1;K++){
                   17602:                                                                VL=cons(RR[K][J],VL);VS=cons(RR[K][I],VS);
                   17603:                                                        }
                   17604:                                                        VR=ldev(VL,VS);
                   17605:                                                        if(VR[0]){
                   17606:                                                                for(K=S1-1,VN=VR[1];K>=0;K--,VN=cdr(VN))
                   17607:                                                                        RR[K][J]=car(VN);
                   17608:                                                                F=1;
                   17609:                                                        }
                   17610:                                                }
                   17611:                                        }
                   17612:                                        K=I;I=J;J=K;
                   17613:                                }
                   17614:                        }
                   17615:                        if(F&&I==S1-1){
                   17616:                                F=0;I=-1;
                   17617:                        }
                   17618:                }
                   17619:                if(getopt(int)==1){
                   17620:                        N=mtranspose(M);
                   17621:                        for(F=I=0;I<S1;I++) if(lgcd(M[I])>1||lgcd(N[I])>1) F++;
                   17622:                        if(F){
                   17623:                                for(F=I=0;I<S1;I++){
                   17624:                                        if(Res[I][I]==-1) F=ior(F,1);
                   17625:                                        else if(Res[I][I]==1) F=ior(F,2);
                   17626:                                }
                   17627:                                C=0;
                   17628:                                if(!iand(F,1)) C=1;
                   17629:                                else if(!iand(F,2)) C=-1;
                   17630:                                if(C){
                   17631:                                        for(I=0;I<S1;I++){
                   17632:                                                M[I][I]+=C;Res[I][I]+=C;
                   17633:                                        }
                   17634:                                }
                   17635:                        }
                   17636:                }
                   17637:                if(getopt(rep)!=1){
                   17638:                        for(Lp=0;Lp<5;Lp++){
                   17639:                                F=(M==Res||abs(lmax(RR))>Xa*10||abs(lmin(RR))>Xa*10)?1:0;
                   17640:                                for(I=0;!F&&I<S1&&Lp<4;I++){
                   17641:                                        for(K=L=J=0;J<S1;J++){
                   17642:                                                if(M[I][J]) K++;
                   17643:                                                if(M[J][I]) L++;
                   17644:                                        }
                   17645:                                        if(K<2||L<2) F=1;
                   17646:                                }
                   17647:                                if(!F) break;
                   17648:                                R=unim(S0|option_list=cons(["rep",1],getopt()));
                   17649:                                M=R[0];Res=R[1];RR=R[3];
                   17650:                        }
                   17651:                }
                   17652:        }
                   17653:        if(Res==0) return M;
                   17654:        if(RR){
                   17655:                for(I=K=V=0;I<S1;I++){
                   17656:                        for(J=0;J<S1;J++){
                   17657:                        if(RR[J][I]>0) V++;
                   17658:                                else if(RR[J][I]<0) V--;
                   17659:                        }
                   17660:                        if(I<S1-1&&Res[I][I+1]!=0) continue;
                   17661:                        if(V<0){
                   17662:                                for(;K<=I;K++) RR=colm(RR,K,-1);
                   17663:                        }
                   17664:                        K=I+1;V=0;
                   17665:                }
                   17666:        }
                   17667:        if(getopt(rep)!=1){
                   17668:                if((F=getopt(dviout))==1){
                   17669:                        if(getopt(conj)==1){
                   17670:                                if(RR) show([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   17671:                        }else{
                   17672:                                if(type(Lim=getopt(lim))==1)
                   17673:                                         mtoupper(M,0|step=1,opt=7,dviout=1,pages=1,lim=Lim);
                   17674:                                else mtoupper(M,0|step=1,opt=7,dviout=1,pages=1);
                   17675:                        }
                   17676:                }else if(F==-1){
                   17677:                        if(getopt(conj)==1){
                   17678:                                if(RR) return ltotex([Res,"=",myinv(RR),M,RR]|opt="spts0",str=1,lim=200);
                   17679:                        }else{
                   17680:                                if(type(Lim=getopt(lim))==1)
                   17681:                                         return mtoupper(M,0|step=1,opt=7,pages=1,lim=Lim,dviout=-1);
                   17682:                                else return mtoupper(M,0|step=1,opt=7,pages=1,dviout=-1);
                   17683:                        }
                   17684:                }
                   17685:        }
                   17686:        if(RR==0) return[M,Res];
                   17687:        return [M,Res,myinv(RR),RR];
                   17688: }
                   17689:
                   17690: def pfrac(F,X)
                   17691: {
                   17692:        F = red(F);
                   17693:        FN = nm(F);
                   17694:        FD = dn(F);
                   17695:        if(mydeg(FD,X) == 0)
                   17696:                return [[F,1,1]];
                   17697:        R = rpdiv(FN,FD,X);
                   17698:        FN = R[0]/R[1];
                   17699:        R0 = R[2]/R[1];
                   17700:        FC = fctr(FD);
                   17701:        RT=[];
                   17702:        if(getopt(root)==2){
                   17703:                for(FE=[],FT=FC;FT!=[];FT=cdr(FT)){
                   17704:                        if(mydeg(P=car(FT)[0],X)==4 && vars(P)==[X] && pari(issquare,C=mycoef(P,4,X))){
                   17705:                                if((S=mycoef(P,3,X)/4/C)!=0) P=subst(P,X,X-S);
                   17706:                                if(mycoef(P,1,X)==0 && pari(issquare,C0=mycoef(P,0,X))){
                   17707:                                        C=sqrtrat(C);C0=sqrtrat(C0);C1=2*C*C0-mycoef(P,2,X);
                   17708:                                        if(C1>0){
                   17709:                                                FE=cons([C*(X+S)^2-C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   17710:                                                FE=cons([C*(X+S)^2+C1^(1/2)*(X+S)+C0,car(FT)[1]],FE);
                   17711:                                                RT=cons(C1,RT);
                   17712:                                                continue;
                   17713:                                        }
                   17714:                                }
                   17715:                        }
                   17716:                        FE=cons(car(FT),FE);
                   17717:                }
                   17718:                FC=reverse(FE);
                   17719:        }
                   17720:        N = Q = 0;
                   17721:        L = [];
                   17722:        for(I = length(FC)-1; I >= 0; I--){
                   17723:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   17724:                for(K=1; K<=FC[I][1]; K++){
                   17725:                        for(J=P=0; J < D; J++){
                   17726:                                V = makev(["zz_",++N]);
                   17727:                                P = P*X + V;
                   17728:                                L = cons(V,L);
                   17729:                        }
                   17730:                        Q += P/(FC[I][0]^K);
                   17731:                        Q = red(Q);
                   17732:                }
                   17733:        }
                   17734:        L=reverse(L);
                   17735:        Q = nm(red(red(Q*FD)-FN));
                   17736:        Q = ptol(Q,X);
                   17737:        S = lsol(Q,L);
                   17738:        R = (R0==0)?[]:[[R0,1,1]];
                   17739:        for(N=0,I=length(FC)-1; I >= 0; I--){
                   17740:                if((D = mydeg(FC[I][0],X)) == 0)  continue;
                   17741:                for(K=1; K<=FC[I][1]; K++){
                   17742:                        for(P=J=0; J < D; N++,J++)
                   17743:                                P = P*X + S[N][1];
                   17744:                        if(P!=0) R = cons([P,FC[I][0],K],R);
                   17745:                }
                   17746:        }
                   17747:        for(;RT!=[];RT=cdr(RT)){
                   17748:                RTT=car(RT);
                   17749:                R=mtransbys(os_md.substblock,R,[RTT^(1/2),(RTT^(1/2))^2,RTT]);
                   17750:        }
                   17751:        TeX=getopt(TeX);
                   17752:        if((Dvi=getopt(dviout))==1||TeX==1){
                   17753:                V=strtov("0");
                   17754:                for(S=L=0,RR=R;RR!=[];RR=cdr(RR),L++){
                   17755:                        RT=car(RR);
                   17756:                        S+=(RT[0]/RT[1]^RT[2])*V^L;
                   17757:                }
                   17758:                if(TeX!=1) fctrtos(S|var=[V,""],dviout=1);
                   17759:                else return fctrtos(S|var=[V,""],TeX=3);
                   17760:        }
                   17761:        return reverse(R);
                   17762: }
                   17763:
                   17764: def cfrac(X,N)
                   17765: {
                   17766:        F=[floor(X)];
                   17767:        if(N<0){
                   17768:                Max=N=-N;
                   17769:        }
                   17770:        X-=F[0];
                   17771:        if(Max!=1)
                   17772:                M=mat([F[0],1],[1,0]);
                   17773:        for(;N>0 && X!=0;N--){
                   17774:                X=1/X;
                   17775:                F=cons(Y=floor(X),F);
                   17776:                X-=Y;
                   17777:                if(Max){
                   17778:                        M0=M[0][0];M1=M[1][0];
                   17779:                        M=M*mat([Y,1],[1,0]);
                   17780:                        if(M[0][0]>Max) return M0/M1;
                   17781:                }
                   17782:        }
                   17783:        return (Max==0)?reverse(F):M[0][0]/M[1][0];
                   17784: }
                   17785:
                   17786: def sqrt2rat(X)
                   17787: {
                   17788:        if(type(X)>3) return X;
                   17789:        X=red(X);
                   17790:        if(getopt(mult)==1){
                   17791:                for(V=vars(X);V!=[];V=cdr(V)){
                   17792:                        T=funargs(F=car(V));
                   17793:                        if(type(T)==4&&length(T)>1){
                   17794:                                Y=T[1];
                   17795:                                Z=sqrt2rat(Y);
                   17796:                                if(Y!=Z){
                   17797:                                        if(length(T)==2){
                   17798:                                                T0=T[0];
                   17799:                                                X=subst(X,F,T0(Z));
                   17800:                                        }else if(T[0]==pow)
                   17801:                                                X=subst(X,F,Y^T[2]);
                   17802:                                }
                   17803:                        }
                   17804:                }
                   17805:        }
                   17806:        for(V=vars(X);V!=[];V=cdr(V)){  /* r(x)^(1/2+n) -> r(x)^n*r(x)^(1/2) */
                   17807:                T=args(Y=car(V));
                   17808:                if(functor(Y)==pow&&T[1]!=1/2&&isint(T2=2*T[1])){
                   17809:                        if(iand(T2,1)){
                   17810:                                R=(T[0])^(1/2);T2--;
                   17811:                        }else R=1;
                   17812:                        R*=T[0]^(T2/2);
                   17813:                        X=red(subst(X,Y,R));
                   17814:                }
                   17815:        }
                   17816:        D=dn(X);N=nm(X);
                   17817:        if(imag(D)!=0){
                   17818:                N*=conj(D);
                   17819:                D*=conj(D);
                   17820:                return sqrt2rat(N/D);
                   17821:        }
                   17822:        for(V=vars(N);V!=[];V=cdr(V)){  /* (r(x)^(n/m))^k */
                   17823:                T=args(Y=car(V));
                   17824:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   17825:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   17826:                        N=substblock(N,Y,Y^Dn,T[0]^Nm);
                   17827:                }
                   17828:        }
                   17829:        for(V=vars(D);V!=[];V=cdr(V)){
                   17830:                T=args(Y=car(V));
                   17831:                if(functor(Y)==pow&&(T[1]==0||(type(T[1])==1&&ntype(T[1])==0))){
                   17832:                        Dn=dn(T[1]);Nm=nm(T[1]);
                   17833:                        D=substblock(D,Y,Y^Dn,T[0]^Nm);
                   17834:                }
                   17835:        }
                   17836:        for(V=vars(D);V!=[];V=cdr(V)){
                   17837:                T=args(Y=car(V));
                   17838:                if(functor(Y)==pow&&T[1]==1/2&&mydeg(D,Y)==1){
                   17839:                        N*=mycoef(D,0,Y)-mycoef(D,1,Y)*Y;
                   17840:                        N=mycoef(N,0,Y)+mycoef(N,1,Y)*Y+mycoef(N,2,Y)*T[0];
                   17841:                        D=mycoef(D,0,Y)^2-mycoef(D,1,Y)^2*T[0];
                   17842:                        X=red(N/D);
                   17843:                        D=dn(X);N=nm(X);
                   17844:                        break;
                   17845:                }
                   17846:        }
                   17847:        X=red(N/D);
                   17848:        D=dn(X);N=nm(X);
                   17849:        for(V=vars(D);V!=[];V=cdr(V)){
                   17850:                T=args(Y=car(V));
                   17851:                if(functor(Y)==pow&&T[1]==1/2)
                   17852:                        D=substblock(D,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   17853:        }
                   17854:        for(V=vars(N);V!=[];V=cdr(V)){
                   17855:                T=args(Y=car(V));
                   17856:                if(functor(Y)==pow&&T[1]==1/2)
                   17857:                        N=substblock(N,T[0]^T[1],(T[0]^T[1])^2,T[0]);
                   17858:        }
                   17859:        for(V=vars(N);V!=[];V=cdr(V)){
                   17860:                T=args(Y=car(V));
                   17861:                if(functor(Y)==pow&&T[1]==1/2){
                   17862:                        Ag=T[0];
                   17863:                        R=S=1;
                   17864:                        An=fctr(nm(Ag));
                   17865:                        CA=An[0][0];
                   17866:                        if(CA<0){
                   17867:                                CA=-CA;R=-1;
                   17868:                        }
                   17869:                        if(type(I=sqrtrat(CA))<2) S=I;
                   17870:                        else R*=CA;
                   17871:                        for(An=cdr(An);An!=[];An=cdr(An)){
                   17872:                                Pw=car(An)[1];I=iand(Pw,1);
                   17873:                                if(I) R*=car(An)[0];
                   17874:                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   17875:                        }
                   17876:                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   17877:                                Pw=car(An)[1];I=iand(Pw,1);
                   17878:                                if(I) R/=car(An)[0]^I;
                   17879:                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   17880:                        }
                   17881:                        if(S!=1) N=subst(N,Y,R^(1/2)*S);
                   17882:                }
                   17883:        }
                   17884:        for(V=vars(N);V!=[];V=cdr(V)){
                   17885:                T=args(Y=car(V));
                   17886:                if(functor(Y)==pow&&T[1]==1/2){
                   17887:                        C=mycoef(N,1,Y);
                   17888:                        for(VC=vars(C);VC!=[];VC=cdr(VC)){
                   17889:                                TC=args(YC=car(VC));
                   17890:                                if(functor(YC)==pow&&TC[1]==1/2){
                   17891:                                        Ag=red(T[0]*TC[0]);
                   17892:                                        R=S=1;
                   17893:                                        An=fctr(nm(Ag));
                   17894:                                        CA=An[0][0];
                   17895:                                        if(CA<0){
                   17896:                                                CA=-CA;R=-1;
                   17897:                                        }
                   17898:                                        if(type(I=sqrtrat(CA))<2) S=I;
                   17899:                                        else R*=CA;
                   17900:                                        for(An=cdr(An);An!=[];An=cdr(An)){
                   17901:                                                Pw=car(An)[1];I=iand(Pw,1);
                   17902:                                                if(I) R*=car(An)[0];
                   17903:                                                if((Q=(Pw-I)/2)>0) S*=car(An)[0]^Q;
                   17904:                                        }
                   17905:                                        for(An=fctr(dn(Ag));An!=[];An=cdr(An)){
                   17906:                                                Pw=car(An)[1];I=iand(Pw,1);
                   17907:                                                if(I) R/=car(An)[0]^I;
                   17908:                                                if((Q=(Pw-I)/2)>0) S/=car(An)[0]^Q;
                   17909:                                        }
                   17910:                                        CC=mycoef(C,1,YC);
                   17911:                                        N=N-CC*YC*Y+CC*R^(1/2)*S;
                   17912:                                }
                   17913:                        }
                   17914:                }
                   17915:        }
                   17916:        return red(N/D);
                   17917: }
                   17918:
                   17919: def cfrac2n(X)
                   17920: {
                   17921:        if(type(L=getopt(loop))==1&&L>0)
                   17922:                C=x;
                   17923:        else{
                   17924:                C=0;L=0;
                   17925:        }
                   17926:        if(L>1){
                   17927:                for(Y=[];L>1;L--){
                   17928:                        Y=cons(car(X),Y);
                   17929:                        X=cdr(X);
                   17930:                }
                   17931:                if(X!=[]){
                   17932:                        P=cfrac2n(X|loop=1);
                   17933:                        for(V=P,Y=reverse(Y);Y!=[];Y=cdr(Y))
                   17934:                                V=sqrt2rat(car(Y)+1/V);
                   17935:                        return V;
                   17936:                }else{
                   17937:                        C=0;X=reverse(Y);
                   17938:                }
                   17939:        }
                   17940:        for(V=C,X=reverse(X);X!=[];X=cdr(X)){
                   17941:                if(V!=0) V=1/V;
                   17942:                V+=car(X);
                   17943:        }
                   17944:        if(C!=0){
                   17945:                V=red(V);P=dn(V)*x-nm(V);
                   17946:                S=getroot(P,x|cpx=2);
                   17947:                T=map(eval,S);
                   17948:                V=(T[0]>0)?S[0]:S[1];
                   17949:        }
                   17950:        return V;
                   17951: }
                   17952:
                   17953: def s2sp(S)
                   17954: {
                   17955:        if(getopt(short)==1){
                   17956:                if(type(F=getopt(std))==1) S=s2sp(S|std=F);
                   17957:                if(type(S)!=7) S=s2sp(S);
                   17958:                L=strtoascii(S);
                   17959:                for(LS=[],F=C=0;L!=[];L=cdr(L)){
                   17960:                        if((G=car(L))!=F){
                   17961:                                LS=cons(G,LS);C=0;
                   17962:                        }else if(C<3){
                   17963:                                LS=cons(G,LS);
                   17964:                        }else if(C==3){
                   17965:                                LS=cdr(LS);LS=cdr(LS);
                   17966:                                LS=cons(94,LS);LS=cons(52,LS);
                   17967:                        }else if(C==9){
                   17968:                                LS=cdr(LS);LS=cons(97,LS);
                   17969:                        }else{
                   17970:                                K=car(LS);LS=cdr(LS);LS=cons(K+1,LS);
                   17971:                        }
                   17972:                        C++;F=G;
                   17973:                }
                   17974:                return asciitostr(reverse(LS));
                   17975:        }
                   17976:        if(type(F=getopt(std))==1){
                   17977:                F=(F>0)?1:-1;
                   17978:                if(type(S)==7) S=s2sp(S);
                   17979:                for(L=[];S!=[];S=cdr(S))
                   17980:                L=cons(os_md.msort(car(S),[-1,0]),L);
                   17981:                return os_md.msort(L,[F,2]);
                   17982:        }
                   17983:        if(type(S)==7){
                   17984:                S = strtoascii(S);
                   17985:                if(type(S) == 5) S = vtol(S);
                   17986:                for(N=0,R=TR=[]; S!=[]; S=cdr(S)){
                   17987:                        if(car(S)==45)      /* - */
                   17988:                                N=1;
                   17989:                        else if(car(S)==47) /* / */
                   17990:                                N=2;
                   17991:                        if(N>0){
                   17992:                                while(car(S)<48&&car(S)!=40) S=cdr(S);
                   17993:                        }
                   17994:                        if((T=car(S))>=48 && T<=57) TR=cons(T-48,TR);
                   17995:                        else if(T>=97) TR=cons(T-87,TR);
                   17996:                        else if(T>=65 && T<=90) TR=cons(T-29,TR);  /* A-Z */
                   17997:                        else if(T==44){
                   17998:                                R=cons(reverse(TR),R);
                   17999:                                TR=[];
                   18000:                        }else if(T==94){  /* ^ */
                   18001:                                S=cdr(S);
                   18002:                                if(car(S)==40){  /* ( */
                   18003:                                        S=cdr(S);
                   18004:                                        for(T=0; car(S)!=41 && S!=[]; S=cdr(S)){
                   18005:                                                V=car(S)-48;
                   18006:                                                if(V>=10) V-=39;
                   18007:                                                T=10*T+V;
                   18008:                                        }
                   18009:                                }else{
                   18010:                                        while(car(S)<48) S=cdr(S);
                   18011:                                        T=car(S)-48;
                   18012:                                        if(T>=10) T-=39;
                   18013:                                }
                   18014:                                while(--T>=1) TR=cons(car(TR),TR);
                   18015:                        }else if(T==40){   /* ( */
                   18016:                                S=cdr(S);
                   18017:                                if(N==1){
                   18018:                                        N=0; NN=1;
                   18019:                                }else NN=0;
                   18020:                                if(car(S)==45){  /* - */
                   18021:                                        S=cdr(S);
                   18022:                                        NN=1-NN;
                   18023:                                }
                   18024:                                for(I=0; I<2; I++){
                   18025:                                        for(V=0; (SS=car(S))!=41 && SS!=47 && S!=[]; S=cdr(S)){
                   18026:                                        T=SS-48;
                   18027:                                        if(T>=10) T-=39;
                   18028:                                                V=10*V+T;
                   18029:                                        }
                   18030:                                        if(NN==1){
                   18031:                                                V=-V; NN=0;
                   18032:                                        }
                   18033:                                        TR=cons(V,TR);
                   18034:                                        if(SS!=47) break;
                   18035:                                        else{
                   18036:                                                N=2; S=cdr(S);
                   18037:                                        }
                   18038:                                }
                   18039:                        }else if(T==60){
                   18040:                                for(V=[],S=cdr(S);S!=[]&&car(S)!=62;S=cdr(S))
                   18041:                                        V=cons(car(S),V);
                   18042:                                if(car(S)!=62) continue;
                   18043:                                TR=cons(eval_str(asciitostr(reverse(V))),TR);
                   18044:                        }else if(T<48) continue;
                   18045:                        if(N==1){
                   18046:                                T = car(TR);
                   18047:                                TR=cons(-T,cdr(TR));
                   18048:                                N=0;
                   18049:                        }else if(N==2){
                   18050:                                T=car(TR); TR=cdr(TR);
                   18051:                                TR=cons(car(TR)/T,cdr(TR));
                   18052:                                N=0;
                   18053:                        }
                   18054:                }
                   18055:                return reverse(cons(reverse(TR),R));
                   18056:        }else if(type(S)==4){
                   18057:                Num=getopt(num);
                   18058:                for(R=[]; ; ){
                   18059:                        if(type(TS=car(S))!=4) return;
                   18060:                        for(; TS!=[]; TS=cdr(TS)){
                   18061:                                V=car(TS);
                   18062:                                if(type(V)>1||(type(V)==1&&ntype(V)>0)){
                   18063:                                        V="<"+rtostr(V)+">";
                   18064:                                        R=append(reverse(strtoascii(V)),R);
                   18065:                                        continue;
                   18066:                                }
                   18067:                                if(dn(V)>1){
                   18068:                                        P=reverse(strtoascii(rtostr(V)));
                   18069:                                        R=append(P,cons(40,R));
                   18070:                                        R=cons(41,R);
                   18071:                                        continue;
                   18072:                                }
                   18073:                                if(V<0 && V>-10){
                   18074:                                        V=-V;
                   18075:                                        R=cons(45,R);
                   18076:                                }
                   18077:                                if(V<0 || V>35 || (V>9 && Num==1)){
                   18078:                                        P=reverse(strtoascii(rtostr(V)));
                   18079:                                        R=append(P,cons(40,R));
                   18080:                                        V=41;
                   18081:                                }else if(V<10) V+=48;
                   18082:                                else V+=87;
                   18083:                                R=cons(V,R);
                   18084:                        }
                   18085:                        if((S=cdr(S))==[]) break;
                   18086:                        R=cons(44,R);
                   18087:                }
                   18088:                return asciitostr(reverse(R));
                   18089:        }
                   18090:        return 0;
                   18091: }
                   18092:
                   18093: def sp2grs(M,A,L)
                   18094: {
                   18095:        MM = [];
                   18096:        T0 = 0;
                   18097:        Mat=getopt(mat);
                   18098:        if(Mat!=1) Mat=0;
                   18099:        if(type(M)==7) M=s2sp(M);
                   18100:        if((LM = length(M)) > 10 && type(A) < 4)
                   18101:                CK = 1;
                   18102:        Sft = (type(L)==1)?L:0;
                   18103:        if(type(L)==4 && length(L)>=3)
                   18104:                Sft = L[2];
                   18105:        if(Sft < 0){
                   18106:                T0 = 1;
                   18107:                Sft = -Sft-1;
                   18108:        }
                   18109:        for(I = LM-1; I >= 0; I--){
                   18110:                MI = M[I]; MN = [];
                   18111:                if(CK == 1 && length(MI) > 10){
                   18112:                        erno(1);
                   18113:                        return;
                   18114:                }
                   18115:                if(type(A) == 4)
                   18116:                        AA = rtostr(A[I]);
                   18117:                else
                   18118:                        AA = rtostr(A)+rtostr(I);
                   18119:                for(J = LM = length(MI)-1; J >= 0; J--){
                   18120:                        V = MI[J];
                   18121:                        if(type(V) > 3)
                   18122:                                V = V[0];
                   18123:                        if(T0 == 0 || I == 0)
                   18124:                                MN = cons([V, makev([AA,J+Sft])], MN);
                   18125:                        else{
                   18126:                                if(LM == 1)
                   18127:                                        MN = cons([V, (J==0)?0:makev([AA])], MN);
                   18128:                                else if(I == 1 && Mat == 0)
                   18129:                                        MN = cons([V, (J==length(MI)-1)?0:makev([AA,J+Sft])], MN);
                   18130:                                else
                   18131:                                        MN = cons([V, (J==0)?0:makev([AA,J])], MN);
                   18132:                        }
                   18133:                }
                   18134:                MM = cons(MN, MM);
                   18135:        }
                   18136:        if(type(L) == 4 && length(L) >= 2){
                   18137:                R = chkspt(MM|mat=Mat); /* R[3]: Fuchs */
                   18138:                AA = var(MM[L[0]-1][L[1]-1][1]);
                   18139:                if(AA==0)  AA=var(R[3]);
                   18140:                if(AA!=0 && (P = mycoef(R[3],1,AA))!=0){
                   18141:                         P = -mycoef(R[3], 0, AA)/P;
                   18142:                         MM = mysubst(MM,[AA,P]);
                   18143:                }
                   18144:        }
                   18145:        return MM;
                   18146: }
                   18147:
                   18148: def intpoly(F,X)
                   18149: {
                   18150:        if((T=ptype(F,X))<4){
                   18151:                if(T<3){        /* polynomial */
                   18152:                        if(type(C=getopt(cos))>0){
                   18153:                                V=vars(F);
                   18154:                                Z=makenewv(V);
                   18155:                                W=makenewv(cons(Z,V));
                   18156:                                Q=intpoly(F,X|exp=Z);
                   18157:                                Q=(subst(Q,Z,@i*C)*(Z+@i*W)+subst(Q,Z,-@i*C)*(Z-@i*W))/2;
                   18158:                                return [mycoef(Q,1,Z),mycoef(Q,1,W)];
                   18159:                        }
                   18160:                        if(type(C=getopt(sin))>0){
                   18161:                                Q=intpoly(F,X|cos=C);
                   18162:                                return [-Q[1],Q[0]];
                   18163:                        }
                   18164:                        if(type(C=getopt(log))>0){
                   18165:                                Q=intpoly(F,X);
                   18166:                                if(C[0]==0) return [Q,0];
                   18167:                                if(length(C)<3) C=[C[0],C[1],1];
                   18168:                                Q-=subst(Q,X,-C[1]/C[0]);
                   18169:                                if(iscoef(Q,os_md.israt)) Q=red(Q);
                   18170:                                if(C[2]==0) return [Q];
                   18171:                                S=subst(-Q*C[0]*C[2],X,X-C[1]/C[0]);
                   18172:                                for(R=0,D=mydeg(S,X);D>0;D--) R+=mycoef(S,D,X)*X^(D-1);
                   18173:                                R=subst(R,X,X+C[1]/C[0]);
                   18174:                                return cons(Q,intpoly(R,X|log=[C[0],C[1],C[2]-1]));
                   18175:                        }
                   18176:                        if(type(C=getopt(exp))>0){
                   18177:                                D = mydeg(F,X);
                   18178:                                for(P=Q=F/C;D>=0;D--){
                   18179:                                        Q=-mydiff(Q,X)/C;
                   18180:                                        P+=Q;
                   18181:                                }
                   18182:                                return P;
                   18183:                        }
                   18184:                        for(P=0,I=mydeg(F,X);I >= 0;I--)
                   18185:                                P += mycoef(F,I,X)*X^(I+1)/(I+1);
                   18186:                        return P;
                   18187:                }
                   18188:                R=pfrac(F,X|root=2);    /* rational */
                   18189:                for(P=0;R!=[];R=cdr(R)){
                   18190:                        if(type(V=getopt(dumb))==5){
                   18191:                                for(PF=[],RR=R;RR!=[];RR=cdr(RR))
                   18192:                                        PF=cons(RR[0][0]/RR[0][1]^RR[0][2],PF);
                   18193:                                PF=[cons(X,reverse(PF))];
                   18194:                                if(P) PF=cons([1,P],PF);
                   18195:                                V[0]=cons(PF,V[0]);
                   18196:                        }
                   18197:                        RT=car(R);
                   18198:                        if(mydeg(RT[1],X)==0) P+=intpoly(RT[0]*RT[2],X);
                   18199:                        else if((Deg=mydeg(RT[1],X))==1){
                   18200:                                if(RT[2]>1) P+=RT[0]*RT[1]^(1-RT[2])/(1-RT[2])/mycoef(RT[1],1,X);
                   18201:                                else P+=RT[0]*log(RT[1])/mycoef(RT[1],1,X);
                   18202:                                P=red(P);
                   18203:                        }else if(Deg==2){
                   18204:                                D1=diff(RT[1],X);C1=mycoef(D1,1,X);
                   18205:                                B=2*C1*mycoef(RT[1],0,X)-mycoef(RT[1],1,X)^2;  /* ax^2+bx+c => B=4ac-b^2 */
                   18206:                                B=sqrt2rat(B);
                   18207:                                N=RT[0];
                   18208:                                for(I=RT[2];I>0&&N!=0;I--){
                   18209:                                        C0=mycoef(N,1,X)/C1;N-=C0*D1;
                   18210:                                        if(C0){
                   18211:                                                if(I>1) P-=C0/RT[1]^(I-1)/(I-1);
                   18212:                                                else P+=C0*log(RT[1]);
                   18213:                                        }
                   18214:                                        if(I>1){
                   18215:                                                BB=B/C1;
                   18216:                                                P+=N*X/RT[1]^(I-1)/(I-1)/BB;
                   18217:                                                N*=(2*I-3)/(I-1)/BB;
                   18218:                                        }else{
                   18219:                                                if(type(BR=sqrtrat(B))>3){
                   18220:                                                        mycat(["Cannot obtain sqare root of ",B]);
                   18221:                                                        return [];
                   18222:                                                }
                   18223:                                                if(real(nm(BR))!=0){
                   18224:                                                        P+=(2*N/BR)*atan(sqrt2rat(D1/BR|mult=1));
                   18225:                                                }else{
                   18226:                                                        BR*=@i;BRI=sqrt2rat(1/BR);
                   18227:                                                        R1=(-mycoef(RT[1],1,X)+BR)/C1;
                   18228:                                                        R2=(-mycoef(RT[1],1,X)-BR)/C1;
                   18229:                                                        P+=N*BRI*log( /* sqrt2rat */((x-R1)/(x-R2)));
                   18230:                                                }
                   18231:                                        }
                   18232:                                        P=red(P);
                   18233:                                }
                   18234:                                P=sqrt2rat(P);
                   18235:                        }else{
                   18236:                                mycat(["Cannot get an indefinite integral of ",F]);
                   18237:                                return [];
                   18238:                        }
                   18239:                }
                   18240:                Q=simplog(P,X);
                   18241:                if(type(V)==5&&nmono(P)!=nmono(Q)) V[0]=cons([[1,red(P)]],V[0]);
                   18242:                return red(Q);
                   18243:        }
                   18244:        return [];
                   18245: }
                   18246:
                   18247: def fshorter(P,X)
                   18248: {
                   18249:        Q=sqrt2rat(P);
                   18250:        R=trig2exp(Q,X|inv=1);
                   18251:        if(str_len(fctrtos(R))<str_len(fctrtos(Q))) Q=R;
                   18252:        Var=pfargs(Q,X|level=1);
                   18253:        for(C=F=0,R=1,V=Var;V!=[];V=cdr(V)){
                   18254:                if(findin(car(V)[1],[cos,sin,tan])>=0){
                   18255:                        if(!C){
                   18256:                                F=car(V)[2];
                   18257:                        }else{
                   18258:                                R=red(car(V)[2]/F);
                   18259:                                if(type(R)!=1) break;
                   18260:                                F/=dn(R);
                   18261:                        }
                   18262:                        C++;
                   18263:                }
                   18264:        }
                   18265:        if(getopt(period)==1) return F;
                   18266:        if(!isint(Log=getopt(log))) Log=0;
                   18267:        if(V==[]&&F!=0){
                   18268:                if(iand(Log,1)){
                   18269:                        H=append(cdr(fctr(nm(Q))),cdr(fctr(dn(Q))));
                   18270:                        for(L=0;H!=[];H=cdr(H))
                   18271:                                L+=str_len(rtostr(car(H)[0]));
                   18272:                }else L=str_len(fctrtos(Q));
                   18273:                S=trig2exp(P,X);
                   18274:                for(T=[sin(F),tan(F),cos(F),sin(F/2),cos(F/2),tan(F/2)];T!=[];T=cdr(T)){
                   18275:                        R=trig2exp(S,X|inv=car(T));
                   18276:                        if(iand(Log,1)){
                   18277:                                H=append(cdr(fctr(nm(R))),cdr(fctr(dn(R))));
                   18278:                                for(K=0;H!=[];H=cdr(H))
                   18279:                                        K+=str_len(rtostr(car(H)[0]));
                   18280:                        }else K=str_len(fctrtos(R));
                   18281:                        if(K<L){
                   18282:                                Q=R;L=K;
                   18283:                        }
                   18284:                }
                   18285:        }
                   18286:        return Q;
                   18287: }
                   18288:
                   18289: def isshortneg(P)
                   18290: {
                   18291:        return(str_len(rtostr(P))>str_len(rtostr(-P)))?1:0;
                   18292: }
                   18293:
                   18294: def simplog(R,X)
                   18295: {
                   18296:        for(V=[],Var=pfargs(R,X);Var!=[];Var=cdr(Var)){
                   18297:                VT=car(Var);
                   18298:                if(VT[1]==log && ptype(R,VT[0])==2 && mydeg(R,VT[0])==1)
                   18299:                        V=cons([VT[0],VT[2],mycoef(R,1,VT[0])],V);
                   18300:        }
                   18301:        for(;V!=[];V=cdr(V)){
                   18302:                VT=car(V);
                   18303:                for(V2=cdr(V);V2!=[];V2=cdr(V2)){
                   18304:                        Dn=1;
                   18305:                        if((C=red(car(V2)[2]/VT[2]))!=1&&C!=-1){
                   18306:                                if(getopt(mult)==1&&type(C)==1&&ntype(C)==0){
                   18307:                                        Dn=dn(C);C*=Dn;
                   18308:                                }else continue;
                   18309:                        }
                   18310:                        Log=red(VT[1]^Dn*car(V2)[1]^(Dn*C));
                   18311:                        L=str_len(rtostr(dn(Log)))-str_len(rtostr(nm(Log)));
                   18312:                        if(L>0 || (L==0&&isshortneg(VT[2])) ){
                   18313:                                Dn=-Dn;Log=1/Log;
                   18314:                        }
                   18315:                        R=mycoef(R,0,VT[0]);R=mycoef(R,0,car(V2)[0]);
                   18316:                        return(R+VT[2]*log(Log)/Dn);
                   18317:                }
                   18318:        }
                   18319:        return R;
                   18320: }
                   18321:
                   18322: def integrate(P,X)
                   18323: {
                   18324:        Dvi=getopt(dviout);
                   18325:        if(type(I=getopt(I))==4){
                   18326:                if((R=integrate(P,X))==[]) II="?";
                   18327:                else if(type(I[0])>3||type(I[1])>3){
                   18328:                        R=subst(R,X,x);
                   18329:                        V=flim(R,I[0]);VV=flim(R,I[1]);
                   18330:                        if(V==""||VV=="") II="?";
                   18331:                        else if(type(V)==7||type(VV)==7){
                   18332:                                if(V==VV) II="?";
                   18333:                                else II=(VV=="+"||V=="-")?"\\infty":"-\\infty";
                   18334:                        }else{
                   18335:                                II=VV-V;
                   18336:                                if(II>10^10) II="\\infty";
                   18337:                                else if(II<-10^10) II="-\\infty";
                   18338:                        }
                   18339:                }else{
                   18340:                        V=subst(R,X,I[1])-subst(R,X,I[0]);
                   18341:                        VV=myval(V);
                   18342:                        II=(type(VV)>=2||ntype(VV)<1)?VV:evalred(V);
                   18343:                }
                   18344:                if(type(Dvi)!=1) return II;
                   18345:                I=ltov(I);
                   18346:                for(J=0;J<2;J++){
                   18347:                        if(type(I[J])>3){
                   18348:                                if(type(I[J])==4&&length(I[J])>1) I[J]=I[J][1];
                   18349:                                else I[J]=(J==0)?"-\\infty":"\\infty";
                   18350:                        }
                   18351:                        if(type(I[J])<4) I[J]=my_tex_form(I[J]);
                   18352:                }
                   18353:                S=(type(II)==7)?II:my_tex_form(II);
                   18354:                S="\\int_{"+I[0]+"}^{"+I[1]+"}"+monototex(P)+"\\,d"+my_tex_form(X)+"&="+S;
                   18355:                if(Dvi==1) dviout(texbegin("align",S));
                   18356:                return S;
                   18357:        }
                   18358:        if(isint(Dvi)==1){
                   18359:                if(Dvi==2||getopt(dumb)==-1){
                   18360:                        V=newvect(1);V[0]=[];
                   18361:                }else V=0;
                   18362:                if((RR=integrate(P,X|dumb=V))==[]) return R;
                   18363:                S=fshorter(RR,X);
                   18364:                VV=[X];
                   18365:                if(V!=0){
                   18366:                        R=cons([[1,RR]],V[0]);
                   18367:                        if(S!=RR) R=cons([[1,RR=S]],R);
                   18368:                        for(V=FR=[];R!=[];R=cdr(R))
                   18369:                                if(car(R)!=FR) V=cons(FR=car(R),V);
1.21      takayama 18370:                        Var=varargs(V|all=2);
1.6       takayama 18371:                        for(S0=[x0,x1,x2,x3],S=[t,s,u,v,w];S0!=[]&&S!=[];){
                   18372:                                if(findin(car(S0),Var)<0){
                   18373:                                        S0=cdr(S0); continue;
                   18374:                                }
                   18375:                                if(findin(car(S),Var)>=0){
                   18376:                                        S=cdr(S); continue;
                   18377:                                }
                   18378:                                V=subst(V,[car(S0),car(S)]);S0=cdr(S0);S=cdr(S);
                   18379:                        }
                   18380:                        if(Dvi==-2) return V;
                   18381:                        S1="\\,dx&";
                   18382:                }else{
                   18383:                        V=[[],[[1,RR=S]]];
                   18384:                        S1="\\,dx";
                   18385:                }
                   18386:                if(type(P)>2){
                   18387:                        if(type(nm(P))<2){
                   18388:                                P=P*dx;S1=V?"&":"";
                   18389:                        }
                   18390:                        S=fctrtos(P|TeX=2,lim=0);SV0=my_tex_form(P);
                   18391:                        if(str_len(SV0)<str_len(S)) S=SV0;
                   18392:                }else S=monototex(P);
                   18393:                if(Dvi!=-2) S="\\int "+S+S1;
                   18394:                else S="";
                   18395:                for(L=[],V=cdr(V);V!=[];V=cdr(V)){
                   18396:                        CL=car(V);S0=["="];     /* a line */
                   18397:                        for(FL=0;CL!=[];CL=cdr(CL),FL++){
                   18398:                                CT=car(CL);                     /* a term */
                   18399:                                if((Y=CT[0])==0){       /* a variable */
                   18400:                                        CT=cdr(CT);
                   18401:                                        if(length(CT)>2) CT=cdr(CT);
                   18402:                                        S0=["\\qquad(",CT[0],"=",CT[1],")"];
                   18403:                                        break;
                   18404:                                }else{
                   18405:                                        for(FT=0,S2=[],CT=cdr(CT);CT!=[];CT=cdr(CT),FT++){
                   18406:                                        SV=fctrtos(car(CT)|TeX=2,lim=0);SV0=my_tex_form(car(CT));
                   18407:                                                if(str_len(SV0)<str_len(SV)) SV=SV0;
                   18408:                                                if(FL||FT||(F&&type(Y)<2)) SV=minustos(SV);
                   18409:                                                S2=append(["+",SV],S2);
                   18410:                                        }
                   18411:                                        S2=reverse(cdr(S2));
                   18412:                                        if(type(Y)>1){
                   18413:                                                if(length(S2)>1){
                   18414:                                                        S1="\\int\\left(";S3="\\right)\\,d";
                   18415:                                                }else{
                   18416:                                                        S1="\\int";S3="\\,d";
                   18417:                                                }
                   18418:                                                S2=cons(S1,append(S2,[S3,Y]));
                   18419:                                                if(findin(Y,VV)<0) VV=cons(Y,VV);
                   18420:                                        }
                   18421:                                        if(FL) S0=append(S0,cons("+",S2));
                   18422:                                        else S0=append(S0,S2);
                   18423:                                }
                   18424:                        }
                   18425:                        L=append([S0],L);
                   18426:                };
                   18427:                V=pfargs(RR,X|level=1);
                   18428:                for(Var=[];V!=[];V=cdr(V)) Var=cons(car(V)[0],Var);
                   18429:                Var=reverse(Var);
                   18430:                if(!isint(J=getopt(frac))) J=0;;
                   18431:                if(!iand(J,4)&&(!iand(J,2)||length(Var)==1)&&(iand(J,8)==8||ptype(RR,Var)==2)){
                   18432:                        F=1;
                   18433:                        if(iand(J,1)){
                   18434:                                K=str_len(fctrtos(RR));
                   18435:                                I=str_len(fctrtos(RR|var=Var));
                   18436:                                if(I>=K) F=0;
                   18437:                        }
                   18438:                        if(F){
                   18439:                                V=[fctrtos(RR|var=Var,TeX=2)];
                   18440:                                if(Dvi!=-2) V=cons("=",V);
                   18441:                                if(length(L)>0) L=cdr(L);
                   18442:                                L=append([V],L);
                   18443:                        }
                   18444:                }else if(ptype(RR,X)==2){
                   18445:                        L=cdr(L);
                   18446:                        V=[fctrtos(RR|var=X,TeX=2)];
                   18447:                        if(Dvi!=-2) V=cons("=",V);
                   18448:                        L=append([V],L);
                   18449:                }
                   18450:                S=texket(S+ltotex(reverse(L)|opt=["cr","spts0"],str=1));
                   18451:                if(getopt(log)!=1){
                   18452:                        for(V=[];VV!=[];VV=cdr(VV))
                   18453:                                V=cons(strtoascii(my_tex_form(car(VV))),V);
                   18454:                        S1=strtoascii("\\log");
                   18455:                        for(F=1;F;){    /* log(log(x)) */
                   18456:                                F=FT=0;
                   18457:                                S0=strtoascii(S);       /* log(x)  ->  log|x| */
                   18458:                                L=length(S0);
                   18459:                                S2=str_tb(0,0);
                   18460:                                for(I=0;;){
                   18461:                                        if(I>=L||(J=str_str(S0,S1|top=I+FT))<0){
                   18462:                                                S=str_tb(0,S2)+str_cut(S0,I,100000);
                   18463:                                                break;
                   18464:                                        }
                   18465:                                        if((K=str_str(S0,40|top=J+4))<0
                   18466:                                                ||(K!=J+4&&K!=J+9)||(N=str_pair(S0,K+1,40,41))<0){
                   18467:                                                FT=J-I+4;continue;
                   18468:                                        }
                   18469:                                        FT=0;
                   18470:                                        if(str_str(S0,V|top=K+1,end=N-1)[0]<0) S2=str_tb(str_cut(S0,I,N),S2);
                   18471:                                        else{
                   18472:                                        /* log(a) -> log(a) */
                   18473:                                                F=1;
                   18474:                                                if(N<L-1&&S0[N+1]==94){         /* log(x)^2 -> (log|x|)^2 */
                   18475:                                                        S2=str_tb([str_cut(S0,I,J-1),"\\left(",str_cut(S0,J,K-1),
                   18476:                                                        "|",str_cut(S0,K+1,N-1),"|\\right)"],S2);
                   18477:                                                }
                   18478:                                                else S2=str_tb([str_cut(S0,I,K-1),"|",str_cut(S0,K+1,N-1),"|"],S2);
                   18479:                                        }
                   18480:                                        I=N+1;
                   18481:                                }
                   18482:                        }
                   18483:                }
                   18484:                if(Dvi>0){
                   18485:                        dviout(texbegin("align*",S));
                   18486:                        return 1;
                   18487:                }
                   18488:                return S;
                   18489:        }       /* end of dviout */
                   18490:        SM=["Cannot integrate",P,"at present"];
                   18491:        P=sqrt2rat(P|mult=1);
                   18492:        Dumb2=1;Dumb3=0;W=newvect(1);W[0]=[];
                   18493:        if(type(Dumb=getopt(dumb))==5){
                   18494:                Dumb2=Dumb3=Dumb;D2=W;
                   18495:        }else if(!isint(Dumb)) Dumb=0;
                   18496:        if(Dumb==-1){
                   18497:                Dumb2=Dumb3=-1;
                   18498:        }
                   18499:        if(type(Dumb)!=5) D2=Dumb2;
                   18500:        if(!isint(Mul=getopt(mult))) Mul=0;
                   18501:        else Mul++;
                   18502:        if(type(VAR=getopt(var))!=4) VAR=[];
                   18503:        if(type(P)>4) return [];
                   18504:        if(iand(T=ptype(P=red(P),X),63)>3||Mul>4){
                   18505:                if(Dumb!=1) mycat(SM);
                   18506:                return [];
                   18507:        }
                   18508:        if(Dumb==-1) mycat(["integrate", P]);
                   18509:        else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   18510:        if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   18511:                if(Dumb==-1) mycat(["rational function",P]);
                   18512:                else if(type(Dumb)==5) Dumb[0]=cons([[X,P]],Dumb[0]);
                   18513:                return intpoly(P,X|dumb=Dumb);  /* rational function */
                   18514:        }
                   18515:        Var=pfargs(P,X);
                   18516:        for(F=0,VV=Var;VV!=[];VV=cdr(VV)){
                   18517:                        /* p(x)*log(x^2-1), @e^x,  a^x, f(x)^(m/n) etc.->simplify */
                   18518:                V=car(VV);
                   18519:                if(V[1]==log && (T=ptype(V[2],X))>1 && T<4){
                   18520:                        if(mydeg(dn(V[2]),X)>0||mydeg(nm(V[2]),X)>1){
                   18521:                                FC=pfctr(V[2],X);RV=1;
                   18522:                                if(length(FC)>2){
                   18523:                                        RR=0;RV=1;
                   18524:                                        if((F0=car(FC)[0])!=1){
                   18525:                                                if(type(F0)!=1 && F0<0){
                   18526:                                                        for(FT=cdr(FT);FT!=[];FT=cdr(FT)){
                   18527:                                                                if(iand(car(FT)[1],1)){
                   18528:                                                                        RV=-1;F0=-F0;break;
                   18529:                                                                }
                   18530:                                                        }
                   18531:                                                }
                   18532:                                        }
                   18533:                                        if(F0!=1) RR=log(F0);
                   18534:                                        for(FC=cdr(FC);FC!=[];FC=cdr(FC)){
                   18535:                                                if(RV==-1&&iand(car(FC)[1],1)==1){
                   18536:                                                        RR+=car(FC)[1]*log(-car(FC)[0]);
                   18537:                                                        RV=1;
                   18538:                                                }else
                   18539:                                                        RR+=car(FC)[1]*log(car(FC)[0]);
                   18540:                                        }
                   18541:                                        P=subst(P,V[0],RR);
                   18542:                                        F=1;
                   18543:                                }
                   18544:                        }
                   18545:                        F=1;
                   18546:                }else if(V[1]==pow){
                   18547:                        if(ptype(V[2],X)==1){
                   18548:                                F=1;
                   18549:                                if(V[2]==@e){   /* @e^(f(x)) */
                   18550:                                        P=subst(P,V[0],exp(V[3]));
                   18551:                                }else P=subst(P,V[0],exp(log(V[2])*V[3]));
                   18552:                        }else if(type(V[3])<=1 && ntype(V[3])==0){      /* r(x)^(m/n) */
                   18553:                                if((Pw=floor(V[3]))!=0){
                   18554:                                        R=V[2]^Pw;
                   18555:                                        if((PF=V[3]-Pw)!=0) R*=V[2]^PF;
                   18556:                                        P=subst(P,V[0],R);
                   18557:                                        F=1;
                   18558:                                        V=[V[2]^PF,V[1],V[2],PF];
                   18559:                                }
                   18560:                                if(ptype(nm(V[2]),X)<2&&V[3]>0){        /* (1/p(x))^(m/n) */
                   18561:                                        P=subst(P,V[0],V[2]*red(1/V[2])^(1-V[3]));
                   18562:                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   18563:                                }
                   18564:                                if(ptype(V[2],X)<4&&(K=dn(V[3]))>1){
                   18565:                                        V2=red(V[2]);
                   18566:                                        DN=mydeg(nm(V2),X);DD=mydeg(dn(V2),X);
                   18567:                                        if(DN+DD>1){
                   18568:                                                VF=pfctr(V2,X);
                   18569:                                                R=car(VF)[0]^(car(VF)[1]);RR=0;
                   18570:                                                for(VF=cdr(VF);VF!=[];VF=cdr(VF)){
                   18571:                                                        TV=car(VF);TM=TV[1];
                   18572:                                                        while(abs(TM)>=K){
                   18573:                                                                RR=1;
                   18574:                                                                if(TM>0){
                   18575:                                                                        TM-=K;
                   18576:                                                                        RR*=TV[0]^nm(V[3]);
                   18577:                                                                }else{
                   18578:                                                                        TM+=K;
                   18579:                                                                        RR/=TV[0]^nm(V[3]);
                   18580:                                                                }
                   18581:                                                        }
                   18582:                                                        if(TM!=0) R*=TV[0]^TM;
                   18583:                                                }
                   18584:                                                if(RR){
                   18585:                                                        P=subst(P,V[0],RR*red(R)^(V[3]));F=1;
                   18586:                                                        F=0;VV=cons(0,Var=pfargs(P,X));continue;
                   18587:                                                }
                   18588:                                        }
                   18589:                                }
                   18590:                        }
                   18591:                }
                   18592:        }
                   18593:        if(F){
                   18594:                P=sqrt2rat(P|mult=1);
                   18595:                Var=pfargs(P=red(P),X);T=ptype(P,X);
                   18596:                if(T<4 && (T<3||iscoef(P,os_md.israt))){
                   18597:                        if(Dumb==-1) mycat(["rational function",P]);
                   18598:                        else if(type(Dumb)==5){
                   18599:                                Dumb[0]=cons([[X,P]],Dumb[0]);
                   18600:                                return intpoly(P,X|dumb=Dumb3);
                   18601:                        }
                   18602:                        return intpoly(P,X);    /* rational function */
                   18603:                }
                   18604:        }
                   18605: #if 1
                   18606:        for(P0=P,V=pfargs(P,X|level=1);V!=[];V=cdr(V))  /* P:tan(x) -> P0:sin(x)/cos(x) */
                   18607:                if(car(V)[1]==tan) P0=red(subst(P0,car(V)[0],sin(car(V)[2])/cos(car(V)[2])));
                   18608:        if(iand(ptype(P0,X),128)){                                              /* (log f)'=f'/f */
                   18609:                for(Df=cdr(fctr(dn(P0)));Df!=[];Df=cdr(Df)){
                   18610:                        if(!iand(ptype(car(Df)[0],X),64)) continue;
                   18611:                        Q=car(Df)[0]^(car(Df)[1]);QQ=red(dn(P0)/Q);
                   18612:                        DQ=red(diff(Q,X)*QQ);
                   18613:                        if(type(C=DQ/nm(P0))<2&&C!=0){
                   18614:                                PP=0;DN=[1];
                   18615:                        }else for(DN=cdr(fctr(DQ));DN!=[];DN=cdr(DN)){
                   18616:                                Y=car(DN)[0];
                   18617:                                if(!iand(ptype(Y,X),64)||(I=mydeg(nm(P0),Y))!=mydeg(DQ,Y)
                   18618:                                  || ptype((C=red(mycoef(nm(P0),I,Y)/mycoef(DQ,I,Y))),X)>1||C==0) continue;
                   18619:                                PP=red(P0-C*diff(Q,X)/Q);
                   18620:                                if(nmono(P0)>nmono(PP)) break;
                   18621:                        }
                   18622:                        if(DN!=[]){
                   18623:                                R=C*log(Q);
                   18624:                                if(PP==0){
                   18625:                                        if(P!=P0&&type(Dumb)==5) Dumb[0]=cons([[X,P0]],Dumb[0]);
                   18626:                                        return R;
                   18627:                                }
                   18628:                                W[0]=[];
                   18629:                                S=integrate(PP,X|dumb=D2);
                   18630:                                if(S!=[]){
                   18631:                                        if(type(Dumb)==5){
                   18632:                                                Dumb[0]=cons([[X,red(P0-PP),PP]],Dumb[0]);
                   18633:                                                TD=W[0];
                   18634:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   18635:                                                        if(car(TD)[0][0]){
                   18636:                                                                WL=cons([1,R],car(TD));
                   18637:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   18638:                                                        }
                   18639:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   18640:                                                }
                   18641:                                        }
                   18642:                                        return red(R+S);
                   18643:                                }
                   18644:                        }
                   18645:                }
                   18646:        }
                   18647: #endif
                   18648:        if((length(Var)==1||getopt(exe)==1) &&  /* p(x)*atan(q(x))^m+r(x), etc */
                   18649:          findin((VT=car(Var))[1],[atan,asin,acos,log])>=0 && ptype(P,VT[0])==2 &&
                   18650:                (VT[1]!=log||(T!=65&&T!=66)||mydeg(VT[2],X)!=1)){ /* exclude x*log(x+1)^2 */
                   18651:                for(R=0,D=mydeg(P,VT[0]);D>=0;D--){
                   18652:                        Q=S=mycoef(P,D,VT[0]);
                   18653:                        if(S){
                   18654:                                if(D>0){
                   18655:                                        if((Q=integrate(S,X|mult=Mul))==[]) return Q;
                   18656:                                }else{
                   18657:                                        W[0]=[];
                   18658:                                        if((Q=integrate(S,X|dumb=D2,var=VAR,mult=Mul))==[]) return Q;
                   18659:                                        if(type(Dumb)==5){
                   18660:                                                TD=W[0];
                   18661:                                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   18662:                                                        if(car(TD)[0][0]){
                   18663:                                                                WL=cons([1,R],car(TD));
                   18664:                                                                Dumb[0]=cons(WL,Dumb[0]);
                   18665:                                                        }
                   18666:                                                        else Dumb[0]=cons(car(TD),Dumb[0]);
                   18667:                                                }
                   18668:                                                if(car(Dumb[0])!=[[1,R],[1,Q]])
                   18669:                                                        Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   18670:                                        }
                   18671:                                        return red(R+Q);
                   18672:                                }
                   18673:                        }else if(D>0) continue;
                   18674:                        if(D==0){
                   18675:                                if(Q!=0&&type(Dumb)==5) Dumb[0]=cons([[1,R,Q]],Dumb[0]);
                   18676:                                return red(Q+R);
                   18677:                        }
                   18678:                        R0=Q*VT[0]^D;
                   18679:                        P=(P0=P)-S*VT[0]^D-Q*diff(VT[0]^D,X);
                   18680:                        if(mydeg(P,VT[0])>=D){          /* (x+1)*log(x)/x^2 */
                   18681:                                if(mydeg(P,VT[0])==D &&
                   18682:                                  ptype(C=red(mycoef(P,D,VT[0])/diff(VT[0],X)),VT[0])<2){
                   18683:                                        P=P0-(S*VT[0]^D+Q*diff(VT[0]^D,X)+C*diff(VT[0]^(D+1),X)/(D+1));
                   18684:                                        R0+=C*VT[0]^(D+1)/(D+1);
                   18685:                                }else{
                   18686:                                        P=P0;
                   18687:                                        if(Dumb!=1) mycat(SM);
                   18688:                                        return [];
                   18689:                                }
                   18690:                        }
                   18691:                        if(type(Dumb)==5){
                   18692:                                if(P) Dumb[0]=cons([R?[1,R,R0]:[1,R0],[X,P]],Dumb[0]);
                   18693:                                else if(R!=0) Dumb[0]=cons([[1,R,R0]],Dumb[0]);
                   18694:                        }
                   18695:                        R+=R0;
                   18696:                }
                   18697:        }
                   18698:        if(length(Var)==1 && (VT=car(Var))[1]==pow && mydeg(P,VT[0])==1 && (PT=ptype(VT[2],X))<4){
                   18699:                PR=mycoef(P,0,VT[0]);
                   18700:                if(RR!=0){
                   18701:                        RR=integrate(RR,X|dumb=Dumb3,var=Var);
                   18702:                        if(RR==[]) return RR;
                   18703:                }
                   18704:                PW=VT[3];
                   18705:                if((D=mydeg(nm(V2=VT[2]),X))==2&&PT==2){        /* f(x)*(ax^2+bx+c)^(m/2)+r(x) */
                   18706:                        if(isint(2*PW)){
                   18707:                                C2=mycoef(V20=V2,2,X);F=1;
                   18708:                                if((C21=sqrtrat(C2))==[]) return [];
                   18709:                                if(imag(C21)!=0){
                   18710:                                        if(real(C21)!=0) return [];
                   18711:                                        C21=C21/@i;F=-1;
                   18712:                                }
                   18713:                                if(type(C21)>3) return [];
                   18714:                                P=subst(P,X,X/C21);VT=mysubst(VT,[X,X/C21]);V2=VT[2];
                   18715:                                C1=mycoef(V2,1,X)/F/2;
                   18716:                                if(C1!=0){
                   18717:                                        P=subst(P,X,X-C1);VT=mysubst(VT,[X,X-C1]);V2=VT[2];
                   18718:                                }
                   18719:                                C0=mycoef(V2,0,X);
                   18720:                                if((C01=sqrtrat(C0))==[]) return [];
                   18721:                                if(imag(nm(C01))!=0){
                   18722:                                        if(real(nm(C01))!=0) return [];
                   18723:                                        C01=C01/@i;G=-1;
                   18724:                                }else G=1;
                   18725:                                if(type(C01)>3||(F==-1&&G==-1)) return [];
                   18726:                                Y=makenewv([P,VAR]|var=x);
                   18727:                                if(F==-1){                              /* (c^2-x^2)^(1/2) */
                   18728:                                        Q=subst(P,VT[0],(C01*cos(Y))^(2*PW),X,YX=C01*sin(Y))
                   18729:                                                *C01*cos(Y)/C21;
                   18730:                                        SY=(C21*X+C1);CY=V20;YY=asin(sqrt2rat((C21*X+C1)/C01|mult=1));
                   18731:                                }else if(G==-1){                /* (x^2-c^2)^(1/2) */
                   18732:                                        Q=subst(P,VT[0],(C01*sin(Y)/cos(Y))^(2*PW),X,YX=C01/cos(Y))
                   18733:                                                *C01*sin(Y)/cos(Y)^2/C21;
                   18734:                                        SY=V20;CY=1/(C21*X+C1);YY=acos(sqrt2rat(C01*(C21*X+C1)|mult=1));
                   18735:                                }else{  /* (x^2+c^2)^(1/2) */
                   18736:                                        Q=subst(P,VT[0],(C01/cos(Y))^(2*PW),X,YX=C01*sin(Y)/cos(Y))
                   18737:                                                *C01/cos(Y)^2/C21;
                   18738:                                        CY=V20; YY=atan(sqrt2rat((C21*X+C1)/C01|mult=1));
                   18739:                                }
                   18740:                                if(Dumb==-1) mycat([C21*X+C1,"=",YX]);
                   18741:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,C21*X+C1,YX]],Dumb[0]);
                   18742:                                Q=sqrt2rat(Q);
                   18743:                                QQ=red(substblock(nm(Q),sin(Y),sin(Y)^2,1-cos(Y)^2)
                   18744:                                        /substblock(dn(Q),sin(Y),sin(Y)^2,1-cos(Y)^2));
                   18745:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   18746:                                QQ=red(substblock(nm(Q),cos(Y),cos(Y)^2,1-sin(Y)^2)
                   18747:                                        /substblock(dn(Q),cos(Y),cos(Y)^2,1-sin(Y)^2));
                   18748:                                if(cmpsimple(QQ,Q|comp=2)<0) Q=QQ;
                   18749:                                if((Q=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var)))==[]) return [];
                   18750:                                Q=trig2exp(Q,Y|inv=cos(Y));
                   18751:                                for(V=vars(Q);V!=[];V=cdr(V)){
                   18752:                                        FA=funargs(car(V));
                   18753:                                        if(type(FA)==4&&FA[0]==log){
                   18754:                                                QQ=trig2exp(FA[1],Y|inv=cos(Y));
                   18755:                                                Q=mycoef(Q,0,car(V))+mycoef(Q,1,car(V))*log(QQ);
                   18756:                                        }
                   18757:                                }
                   18758:                                if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18759:                                if(F==-1) Q=subst(Q,sin(Y),SY/C01,cos(Y),CY^(1/2)/C01,Y,YY);
                   18760:                                else if(G==-1){
                   18761:                                        Q=red(subst(Q,sin(Y),SY^(1/2)*cos(Y)/C01));
                   18762:                                        Q=red(subst(Q,cos(Y),C01*CY,Y,YY));
                   18763:                                }else{
                   18764:                                        Q=red(subst(Q,sin(Y),(C21*X+C1)*cos(Y)/C01));
                   18765:                                        Nm=substblock(nm(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   18766:                                        Nm=subst(Nm,cos(Y),C01/CY^(1/2));
                   18767:                                        Dn=substblock(dn(Q),cos(Y),C01^2/CY,cos(Y)^2);
                   18768:                                        Dn=subst(Dn,cos(Y),C01/CY^(1/2));
                   18769:                                        Q=red(subst(Nm/Dn,Y,YY));
                   18770:                                }
                   18771:                                if(findin(Y,vars(Q))>=0) return [];
                   18772:                                for(R=[],Var=vars(Q);Var!=[];Var=cdr(Var)){
                   18773:                                        VT=funargs(V=car(Var));
                   18774:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60&&mydeg(Q,V)==1)
                   18775:                                                R=cons([mycoef(Q,1,V),V],R);
                   18776:                                }
                   18777:                                if(length(R)==2 && (R[0][0]==R[1][0]||R[0][0]+R[1][0]==0)){
                   18778:                                        R0=args(R[0][1])[0];R1=args(R[1][1])[0];
                   18779:                                        if(R[0][0]==R[1][0]) S=R0*R1;
                   18780:                                        else S=R1/R0;
                   18781:                                        Q=mycoef(Q,0,R[0][1]);Q=mycoef(Q,0,R[1][1]);
                   18782:                                        Q+=R[1][0]*log(red(S));
                   18783:                                }
                   18784:                                for(Var=vars(Q);Var!=[];Var=cdr(Var)){
                   18785:                                        VT=funargs(car(Var));
                   18786:                                        if(type(VT)==4&&VT[0]==log&&ptype(VT[1],X)>60){
                   18787:                                                S=trig2exp(VT[1],X|inv=cos(X),arc=1);
                   18788:                                                if(ptype(dn(S),X)<2 && mydeg(Q,car(Var))==1
                   18789:                                                  && ptype(mycoef(Q,1,car(Var)),X)<2){
                   18790:                                                        S=nm(S);
                   18791:                                                        SF=fctr(S);
                   18792:                                                        S/=SF[0][0];
                   18793:                                                }
                   18794:                                                if(cmpsimple(S,-S)>0) S=-S;
                   18795:                                                Q=subst(Q,car(Var),log(S));
                   18796:                                        }
                   18797:                                }                                       /*  x/(1-x^2)^(1/2)  */
                   18798:                                if(type(Q=red(Q+RR))==2&&type(Dumb)!=5) Q-=cterm(Q);
                   18799:                                if(Dumb==-1) mycat(["->",Q]);
                   18800:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18801:                                return Q;
                   18802:                        }
                   18803:                }else if(D==1 && mydeg(Dn=dn(V2),X)<2 && type(PW)==1 && ntype(PW)==0 &&
                   18804:                  (V2!=X||ptype(mycoef(P,1,VT[0]),X)>2)){  /* p(x)((ax+b)/(cx+d))^(m/n) */
                   18805:                        PN=nm(PW);PD=dn(PW);
                   18806:                        Y=makenewv([P,VAR]|var=x);Q=Y^PD*Dn-nm(V2);F=-mycoef(Q,0,X)/mycoef(Q,1,X);
                   18807:                        Q=red(subst(P,VT[0],Y^PN,X,F)*diff(F,Y));
                   18808:                        if(Dumb==-1) mycat([Y,"=",V2^(1/PD)]);
                   18809:                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,V2^(1/PD)]],Dumb[0]);
                   18810:                        if((Q=integrate(Q,Y|dumb=Dumb3,var=cons(X,Var)))==[]) return [];
                   18811:                        Q=red(Q);
                   18812:                        QN=subst(substblock(nm(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   18813:                        QD=subst(substblock(dn(Q),Y,Y^PD,V2),Y,V2^(1/PD));
                   18814:                        Q=red(QN/QD+RR);
                   18815:                        if(Dumb==-1) mycat(["->",Q]);
                   18816:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18817:                        return Q;
                   18818:                }
                   18819:        }else if(length(Var)==2 &&              /* r(x,(ax+b)^(1/2),(cx+d)^(1/2)) */
                   18820:                (VT=car(Var))[1]==pow && ptype(VT[2],X)==1 && mydeg(VT[2],X)==1 && VT[3]==1/2 &&
                   18821:          (VS=car(car(Var)))[1]==pow && ptype(VS[2],X)==1 && mydeg(VS[2],X)==1 && VS[3]==1/2){
                   18822:                Y=makenewv([P,VAR]|var=x);R=(Y^2-myceof(VS[0],0,X))/(C=mycoef(VS[0],1,X));
                   18823:                if(Dumb==-1) mycat([Y,"=",VS[0]]);
                   18824:                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,VD[0]]],Dumb[0]);
                   18825:                R=integrate(subst(P,VS[0],Y,X,R)*2*Y/C,Y|dumb=Dumb3,var=cons(X,Var));
                   18826:                if(R!=[]){
                   18827:                        R=subst(substblock(R,Y,VS[0],Y^2),Y,VS[0]);
                   18828:                        if(Dumb==-1) mycat(["->",R]);
                   18829:                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   18830:                }
                   18831:                return R;
                   18832:        }
                   18833:        if(T==65||T==66){       /* polynomial including sin, exp etc */
                   18834:                for(F=0,VT=Var;VT!=[];VT=cdr(VT)){
                   18835:                        VTT=car(VT);
                   18836:                        if(ptype(VTT[2],X)>2||mydeg(VTT[2],X)>1) F=ior(F,256); /* compos. or rat. or nonlin. */
                   18837:                        K=findin(VTT[1],[cos,sin,tan,exp,log,pow]);
                   18838:                        F=ior(F,2^(K+1)); /* 1:other,2:cos,4:sin,8:tan,16:exp,32:log,64:pow */
                   18839:                        if((Deg=mydeg(P,VTT[0]))>1&&K!=4) F=ior(F,1024);        /* nonlinear */
                   18840:                        if(K==5 && (ptype(VTT[3],X)!=0 || VTT[2]!=x||Deg>1)) F=ior(F,8192); /* pow */
                   18841:                        for(;Deg>0;Deg--){ /* coef */
                   18842:                                if(ptype(mycoef(P,Deg,VTT[0]),X)>2){
                   18843:                                        if(K==4||K==5) F=ior(F,2048);  /* exp, log */
                   18844:                                        else F=ior(F,4096);
                   18845:                                }
                   18846:                        }
                   18847:                }
                   18848:                if(!iand(F,1+8+64+256+512+2048+8192)){  /* cos,sin,exp,log^n,x^c */
                   18849:                        if(iand(F,1024+4096)&&!iand(F,32+64)){ /* cos,sin,exp */
                   18850:                                if(type(Dumb)==5){
                   18851:                                        S=trig2exp(P,X|inv=1);
                   18852:                                        if(P!=S) Dumb[0]=cons([[X,S]],Dumb[0]);
                   18853:                                }
                   18854:                                R=integrate(trig2exp(P,X),X);
                   18855:                                if(R!=[]) S=trig2exp(R,X|inv=1);
                   18856:                                R=fshorter(S,X);
                   18857:                                if(type(Dumb)==5&&R!=S){
                   18858:                                        Dumb[0]=cons([[1,S]],Dumb[0]);
                   18859:                                }
                   18860:                                return R;
                   18861:                        }
                   18862:                        for(R=0,VT=Var;VT!=[];VT=cdr(VT)){
                   18863:                                CV=car(VT);
                   18864:                                C0=mycoef(CV[2],0,X);C1=mycoef(CV[2],1,X);
                   18865:                                Q=mycoef(P,1,CV[0]);
                   18866:                                if(CV[1]==sin||CV[1]==cos){
                   18867:                                        TR=(CV[1]==sin)?intpoly(Q,X|sin=C1):intpoly(Q,X|cos=C1);
                   18868:                                        R+=TR[0]*cos(CV[2])+TR[1]*sin(CV[2]);
                   18869:                                }else if(CV[1]==exp){
                   18870:                                        QT=exp(CV[2]);
                   18871:                                        for(V2=vars(C1);V2!=[];V2=cdr(V2)){  /* exp(2*log(a)*x) => a^(2*x) */
                   18872:                                                if(vtype(VA=car(V2))==2&&functor(VA)==log){
                   18873:                                                        if(ptype(C1,VA)!=2||mydeg(C1,VA)==1&&mycoef(C1,0,VA)==0){
                   18874:                                                                QT=args(VA)[0]^(red(C1/VA)*X);
                   18875:                                                                if(C0!=0) QT*=exp(C0);
                   18876:                                                                break;
                   18877:                                                        }
                   18878:                                                }
                   18879:                                        }
                   18880:                                        R+=intpoly(Q,X|exp=C1)*QT;
                   18881:                                }else if(CV[1]==pow)
                   18882:                                        R+=intpoly(Q,X|pow=CV[2])*x^CV[2];
                   18883:                                else if(CV[1]==log){
                   18884:                                        for(Deg=mydeg(P,CV[0]);Deg>0; Deg--){
                   18885:                                                Q=mycoef(P,Deg,CV[0]);
                   18886:                                                TR=intpoly(Q,X|log=[C1,C0,Deg]);
                   18887:                                                for(I=0;TR!=[];I++,TR=cdr(TR)){
                   18888:                                                        if(I==Deg) R+=car(TR)-subst(car(TR),X,0);
                   18889:                                                        else R+=car(TR)*CV[0]^(Deg-I);
                   18890:                                                }
                   18891:                                        }
                   18892:                                }
                   18893:                                P=mycoef(P,0,CV[0]);
                   18894:                        }
                   18895:                        R+=intpoly(P,X);
                   18896:                        return R;
                   18897:                }
                   18898:        }
                   18899:        for(K=0,VX=[],VT=Var;VT!=[];VT=cdr(VT)){                /*  contain only both pow and trig */
                   18900:                VTT=car(VT);
                   18901:                if(findin(VTT[1],[cos,sin,tan])>=0){
                   18902:                        if(ptype(VTT[2],X)!=2||mydeg(VTT[2],X)!=1) break;
                   18903:                        VX=cons(VTT,VX);
                   18904:                }else if(VTT[1]==pow) K=1;
                   18905:                else break;
                   18906:        }
                   18907:        if(VT==[]&&K==1&&VX!=[]){
                   18908:                D=VX[0][2];
                   18909:                if(VX[0][1]==tan) D*=2;
                   18910:                for(VT=cdr(VX);VT!=[];VT=cdr(VT)){
                   18911:                        K=VT[0][2]/D;
                   18912:                        if(VT[0][1]==tan) K*=2;
                   18913:                        if(type(K)!=1||ntype(K)!=0) break;
                   18914:                        D/=dn(K);
                   18915:                }
                   18916:                if(VT==[]){
                   18917:                        Y=makenewv([P,VAR]|var=x);
                   18918:                        for(Q=P,VT=VX;VT!=[];VT=cdr(VT)){
                   18919:                                VTT=car(VT);
                   18920:                                if(VTT[1]==cos||VTT[1]==sin){
                   18921:                                        VV=trig2exp(VTT[0],X|inv=cos(D));
                   18922:                                        VV=subst(VV,cos(D),(1-Y^2)/(1+Y^2),sin(D),2*Y/(Y^2+1));
                   18923:                                }else if(VTT[1]==tan){
                   18924:                                        VV=trig2exp(VTT[0],X|inv=tan(D/2));
                   18925:                                        VV=subst(VV,tan(D),Y);
                   18926:                                }
                   18927:                                Q=subst(Q,VTT[0],VV);
                   18928:                        }
                   18929:                        Q*=2/(Y^2+1);
                   18930:                        if(diff(Q,X)==0){
                   18931:                                if(Dumb==-1) mycat([Y,"=",tan(D/2)]);
                   18932:                                else if(type(Dumb)==5) Dumb[0]=cons([[0,Y,tan(D/2)]],Dumb[0]);
                   18933:                                R=integrate(Q,Y|dumb=Dumb2,var=cons(X,Var));
                   18934:                                if(R!=[]){
                   18935:                                        if(Dumb==-1) mycat(["->",R]);
                   18936:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   18937:                                        return sqrt2rat(subst(R,Y,tan(D/2))|mult=1);
                   18938:                                }
                   18939:                        }
                   18940:                }
                   18941:        }
                   18942:        if(T>65||iand(F,8)){    /* rational for functions or tan */
                   18943:                if(findin(X,vars(P))<0){
                   18944:                        for(XV=XE=0,VT=Var;VT!=[];VT=cdr(VT)){
                   18945:                                VTT=car(VT);
                   18946:                                if(mydeg(VTT[2],X)!=1) break;
                   18947:                                if(VTT[1]==cos||VTT[1]==sin||VTT[1]==tan){
                   18948:                                        K=red(VTT[2]/X);
                   18949:                                        if(type(K)>1||ntype(K)>0) break;
                   18950:                                        if(XV==0) XV=K;
                   18951:                                        else XV/=dn(K/XV);
                   18952:                                        if(VTT[1]==tan) P=red(subst(P,VTT[0],sin(VTT[2])/cos(VTT[2])));
                   18953:                                }else if(VTT[1]==exp){
                   18954:                                        K=red(VTT[2]/X);
                   18955:                                        if(type(K)>1||ntype(K)>0) break;
                   18956:                                        if(XE==0) XE=K;
                   18957:                                        else XE/=dn(K/XE);
                   18958:                                }else break;
                   18959:                        }
                   18960:                        if(VT==[]&&XE*XV==0){
                   18961:                                if(XE){
                   18962:                                        if(XE<0) XE=-XE;
                   18963:                                        Y=makenewv([P,VAR]|var=x);
                   18964:                                        for(F=0,VT=Var;VT!=[];VT=cdr(VT),F++){
                   18965:                                                VTT=car(VT);C=red(VTT[2]/X/XE);
                   18966:                                                P=subst(P,VTT[0],Y^C);
                   18967:                                                if(!F){
                   18968:                                                        if(Dumb==-1) mycat([Y^C,"=",VTT[0]]);
                   18969:                                                        else if(type(Dumb)==5) Dumb[0]=cons([[0,Y^C,VTT[0]]],Dumb[0]);
                   18970:                                                }
                   18971:                                        }
                   18972:                                        P/=XE*Y;
                   18973:                                        Q=integrate(P,Y|dumb=Dumb3,var=cons(X,VAR));
                   18974:                                        if(Q==[]) return [];
                   18975:                                        Q=subst(Q,Y,exp(XE*X));
                   18976:                                        Q=trig2exp(Q,X);
                   18977:                                        if(Dumb==-1) mycat(["->",Q]);
                   18978:                                        else if(type(Dumb)==5) Dumb[0]=cons([[1,Q]],Dumb[0]);
                   18979:                                        return Q;
                   18980:                                }
                   18981:                                P=trig2exp(nm(P),X|inv=cos(XV*X))/trig2exp(dn(P),X|inv=cos(XV*X));
                   18982:                                Y=makenewv([P,VAR]|var=x);
                   18983:                                Q=red(subst(P,sin(XV*X),Y*cos(XV*X)));
                   18984:                                Q=substblock(nm(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))/
                   18985:                                  (substblock(dn(Q),cos(XV*X),cos(XV*X)^2,1/(Y^2+1))*(Y^2+1));
                   18986:                                Q=red(Q);
                   18987:                                if(ptype(Q,X)<2){
                   18988:                                        XV*=2;P=Q;
                   18989:                                }else{
                   18990:                                        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);
                   18991:                                        P=red(P);
                   18992:                                }
                   18993:                                if(Dumb==-1){
                   18994:                                        mycat([Y,"=",tan(XV*X/2)]);
                   18995:                                        mycat(["integrate",P]);
                   18996:                                }else if(type(Dumb)==5) Dumb[0]=cons([[Y,P]],cons([[0,Y,tan(XV*X/2)]],Dumb[0]));
                   18997:                                R=intpoly(P,Y|dumb=Dumb);
                   18998:                                if(R==[]) return R;
                   18999:                                if(Dumb==-1) mycat(["->",R]);
                   19000:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   19001:                                for(Log=1,K=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   19002:                                        VTT=car(Var);
                   19003:                                        if(VTT[1]==log){
                   19004:                                                C=mycoef(R,1,VTT[0]);
                   19005:                                                VT2=VTT[2];
                   19006:                                                if(K==0){
                   19007:                                                        K=C;Log=VT2;
                   19008:                                                        if(K<0){
                   19009:                                                                K=-K;Log=1/Log;
                   19010:                                                        }
                   19011:                                                }else{
                   19012:                                                        if((V=red(C/K))<0){
                   19013:                                                                VT2=1/VT2;V=-V;
                   19014:                                                        }
                   19015:                                                        if(type(V)>1||ntype(V)>0){
                   19016:                                                                Log=1;break;
                   19017:                                                        }
                   19018:                                                        if(isint(V)) Log*=VT2^V;
                   19019:                                                        else{
                   19020:                                                                D=dn(V);K/=D;
                   19021:                                                                Log=Log^D*VT2^nm(V);
                   19022:                                                        }
                   19023:                                                }
                   19024:                                                RR=mycoef(RR,0,VTT[0]);
                   19025:                                        }
                   19026:                                }
                   19027:                                if(Log!=1){
                   19028:                                        R=RR;
                   19029:                                        if(type(Dumb)==5){
                   19030:                                                if(RR) Dumb[0]=cons([[1,K*log(Log),RR]],Dumb[0]);
                   19031:                                                else Dumb[0]=cons([[1,K*log(Log)]],Dumb[0]);
                   19032:                                        }
                   19033:                                        Log=red(subst(red(Log),Y,sin(XV*X/2)/cos(XV*X/2)));
                   19034:                                        Log=fshorter(Log,X|log=1);      /* log(cos(2*x)+1)=-2*log(cos(x)) */
                   19035:                                        Nm=fctr(nm(Log));
                   19036:                                        for(T=[];Nm!=[];Nm=cdr(Nm)){
                   19037:                                                if(ptype(car(Nm)[0],X)>1) T=cons(car(Nm),T);
                   19038:                                        }
                   19039:                                        Nm=fctr(dn(Log));
                   19040:                                        for(;Nm!=[];Nm=cdr(Nm)){
                   19041:                                                if(ptype(car(Nm)[0],X)>1) T=cons([car(Nm)[0],-car(Nm)[1]],T);
                   19042:                                        }
                   19043:                                        for(I=0,Nm=T;T!=[];T=cdr(T)){
                   19044:                                                if(I=0) I=abs(car(T)[1]);
                   19045:                                                else I=igcd(I,car(T)[1]);
                   19046:                                        }
                   19047:                                        for(Log=1;Nm!=[];Nm=cdr(Nm)) Log*=car(Nm)[0]^(car(Nm)[1]/I);
                   19048:                                        K*=I;
                   19049:                                        if(cmpsimple(nm(Log),dn(Log))<0){
                   19050:                                                K=-K;Log=red(1/Log);
                   19051:                                        }
                   19052:                                        Log=K*log(Log);
                   19053:                                        if(type(Dumb)==5){
                   19054:                                                if(RR) Dumb[0]=cons([[1,Log,RR]],Dumb[0]);
                   19055:                                                else Dumb[0]=cons([[1,Log]],Dumb[0]);
                   19056:                                        }
                   19057:                                }else Log=0;
                   19058:                                for(Atan=0,Var=pfargs(RR=R,Y);Var!=[];Var=cdr(Var)){
                   19059:                                        VTT=car(Var);
                   19060:                                        if(VTT[1]==atan){
                   19061:                                                W=subst(VTT[2],Y,sin(XV*X/2)/cos(XV*X/2));
                   19062:                                                W=trig2exp(W,X|inv=1);
                   19063:                                                V2=funargs(dn(W));
                   19064:                                                if(type(V2)==4&&length(V2)==2){
                   19065:                                                        V3=V2[1]*mycoef(R,1,VTT[0]);
                   19066:                                                        Z=0;
                   19067:                                                        if(V2[0]==cos)
                   19068:                                                                Z=red(W*cos(V2[1])/sin(V2[1]));
                   19069:                                                        else if(V2[0]==sin){
                   19070:                                                                Z=red(W*sin(V2[1])/cos(V2[1]));
                   19071:                                                                V3=-V3;
                   19072:                                                        }
                   19073:                                                        if(Z==1){
                   19074:                                                                Atan+=V3;W=0;
                   19075:                                                        }else if(Z==-1){
                   19076:                                                                Atan-=V3;W=0;
                   19077:                                                        }
                   19078:                                                }
                   19079:                                                R0=mycoef(R,0,VTT[0]);
                   19080:                                                if(W!=0) Atan+=subst(R-R0,VTT[0],atan(W));      /* atan(W); */
                   19081:                                                R=R0;
                   19082:                                        }
                   19083:                                }
                   19084:                                if(R!=0){
                   19085:                                        R=subst(R,Y,sin(XV*X/2)/cos(XV*X/2));
                   19086:                                        R=red(R);
                   19087:                                        R=trig2exp(nm(R),X|inv=1)/trig2exp(dn(R),X|inv=1);
                   19088:                                }
                   19089:                                if(type(Dumb)==5){
                   19090:                                        F=0;WL=[];
                   19091:                                        if(R){
                   19092:                                                WL=cons(R,WL);
                   19093:                                                F++;
                   19094:                                        }
                   19095:                                        if(Atan){
                   19096:                                                WL=cons(Atan,WL);
                   19097:                                                F++;
                   19098:                                        }
                   19099:                                        if(Log){
                   19100:                                                WL=cons(Log,WL);
                   19101:                                                F++;
                   19102:                                        }
                   19103:                                        WL=cons(1,WL);
                   19104:                                        if(F>1) Dumb[0]=cons([WL],Dumb[0]);
                   19105:                                }
                   19106:                                R=red(R+Log+Atan);
                   19107:                                if(Dumb==-1) mycat(["->",R]);
                   19108:                                else if(type(Dumb)==5) Dumb[0]=cons([[1,R]],Dumb[0]);
                   19109:                                return fshorter(R,X);
                   19110:                        }
                   19111:                }
                   19112:        }
                   19113:        VT=pfargs(Q=P,X|level=1);
                   19114:        V=(iand(ptype(P,X),7)<3)?[X]:[];
                   19115:        for(;VT!=[];VT=cdr(VT))
                   19116:                if(ptype(P,car(VT)[0])<3) V=cons(car(VT)[0],V);
                   19117:        if(length(V)>0){                /* 1/x+tan(x)+... etc.: sums */
                   19118:                for(R=0;V!=[];V=cdr(V)){
                   19119:                        T=mycoef(Q,0,car(V));
                   19120:                        W[0]=[];
                   19121:                        S=integrate(TD=red(Q-T),X|dumb=D2,mult=Mul,exe=1);
                   19122:                        if(S==[]) continue;
                   19123:                        if(type(Dumb)==5){
                   19124:                                WL=0;
                   19125:                                if(T!=0) WL=[[X,TD,T]];
                   19126:                                if(R!=0) WL=cons([1,R],WL);
                   19127:                                if(WL) Dumb[0]=cons(WL,Dumb[0]);
                   19128:                                TD=W[0];
                   19129:                                if(R!=0||T!=0){
                   19130:                                        for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   19131:                                                if(car(TD)[0][0]){
                   19132:                                                        WL=(!T)?[]:[[X,T]];
                   19133:                                                        WL=append(car(TD),WL);
                   19134:                                                        if(R!=0) WL=cons([1,R],WL);
                   19135:                                                }else WL=car(TD);
                   19136:                                                Dumb[0]=cons(WL,Dumb[0]);
                   19137:                                        }
                   19138:                                }else Dumb[0]=append(TD,Dumb[0]);
                   19139:                        }
                   19140:                        R+=S;Q=T;
                   19141:                        if(!Q) return red(R);
                   19142:                }
                   19143:                W[0]=[];
                   19144:                if(P!=Q&&type(S=integrate(Q,X|dumb=D2,mult=Mul))<4){
                   19145:                        RR=red(R+S);
                   19146:                        if(type(Dumb)==5){
                   19147:                                TD=W[0];
                   19148:                                for(W0=[],TD=reverse(TD);TD!=[];TD=cdr(TD)){
                   19149:                                        if(car(TD)[0][0]){
                   19150:                                                WL=cons([1,R],car(TD));
                   19151:                                                Dumb[0]=cons(WL,Dumb[0]);
                   19152:                                        }
                   19153:                                        else Dumb[0]=append(TD,Dumb[0]);
                   19154:                                }
                   19155:                                if(nmono(R)+nmono(S)!=nmono(RR)) Dumb[0]=cons([[1,R,S]],Dumb[0]);
                   19156:                        }
                   19157:                        return RR;
                   19158:                }
                   19159:        }
                   19160:        if(Dumb!=1) mycat(SM);
                   19161:        return [];
                   19162: }
                   19163:
                   19164: def fimag(P)
                   19165: {
                   19166:        for(V=vars(P);V!=[];V=cdr(V)){
                   19167:                Q=[];
                   19168:                if(vtype(VF=car(V))==2){
                   19169:                        VAA=args(VF);
                   19170:                        if(VAA==[]) continue;
                   19171:                        VA=sqrt2rat(VAA[0]);
                   19172:                        if(functor(VF)==exp){
                   19173:                                if(imag(VA)!=0){
                   19174:                                        R=(real(VA)!=0)?exp(real(VA)):1;
                   19175:                                        Q=subst(P,VF,R*(cos(imag(VA))+sin(imag(VA))*@i));
                   19176:                                }
                   19177:                        }else if(functor(VF)==pow){
                   19178:                                VA=sqrt2rat(VAA[1]);
                   19179:                                if(imag(VA)!=0){
                   19180:                                        R=(real(VA)!=0)?VAA[0]^(real(VA)):1;
                   19181:                                        L=(VAA[0]!=@e)?log(VAA[0]):1;
                   19182:                                        Q=subst(P,VAA[0]^(VAA[1]),R*(cos(L*imag(VA))+sin(L*imag(VA))*@i));
                   19183:                                }else if(VAA[1]!=(V0=fimag(VA)))
                   19184:                                        Q=subst(P,VAA[0]^(VAA[1]),VAA[0]^(V0));
                   19185:                        }
                   19186:                        V0=VA;
                   19187:                        if(length(VAA)==1&&(VAA[0]!=V0||VA!=(V0=fimag(VA))))
                   19188:                                Q=subst(P,VF,subst(VF,VAA[0],V0));
                   19189:                }
                   19190:                if(Q!=[]&&P!=Q){
                   19191:                        P=Q;V=cons(0,vars(P));
                   19192:                }
                   19193:        }
                   19194:        return P;
                   19195: }
                   19196:
                   19197:
                   19198: def trig2exp(P,X)
                   19199: {
                   19200:        if(iand(ptype(P,X),128)){
                   19201:                OL=getopt();
                   19202:                Nm=trig2exp(nm(P),X|option_list=OL);
                   19203:                Dn=trig2exp(dn(P),X|option_list=OL);
                   19204:                R=red(Nm/Dn);
                   19205:                if(getopt(arc)==1) return sqrt2rat(R);
                   19206:        }
                   19207:        if((Inv=getopt(inv))==1||type(Inv)==2){
                   19208:                for(VT=T=vars(P);T!=[];T=cdr(T)){
                   19209:                        if(findin(functor(car(T)),[cos,sin,tan])>=0){
                   19210:                                P=trig2exp(P,X);VT=vars(P);break;
                   19211:                        }
                   19212:                }
                   19213:                for(;VT!=[];VT=cdr(VT)){
                   19214:                        if(functor(CT=car(VT))==exp){
                   19215:                                if((Re=real(args(CT)[0]))!=0){
                   19216:                                        if(isint(Re)) S=@e^Re;
                   19217:                                        else S=exp(Re);
                   19218:                                }else S=1;
                   19219:                                if((Im=imag(args(CT)[0]))!=0){
                   19220:                                        Q=nm(Im);Q=mycoef(Q,mydeg(Q,X),X);
                   19221:                                        if(-Q>Q) S*=cos(-Im)-@i*sin(-Im);
                   19222:                                        else S*=cos(Im)+@i*sin(Im);
                   19223:                                }
                   19224:                                P=subst(P,CT,S);
                   19225:                        }
                   19226:                }
                   19227:                P=red(P);
                   19228:                U=vars(Inv);
                   19229:                if(length(U)!=1||((F=functor(car(U)))!=sin&&F!=cos&&F!=tan)) return P;
                   19230:                XX=args(car(U))[0];
                   19231:                if(mydeg(XX,X)!=1) return P;
                   19232:                if(!isvar(XX)) P=subst(P,X,(X-mycoef(XX,0,X))/mycoef(XX,1,X));
                   19233:                for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   19234:                        if(vtype(CT=car(VT))<2) continue;
                   19235:                        TX=args(CT)[0];
                   19236:                        if(mydeg(TX,X)!=1) continue;
                   19237:                        if(!isint(C1=mycoef(TX,1,X))) continue;
                   19238:                        if((C0=mycoef(TX,0,X))==0){
                   19239:                                CC=1;CS=0;
                   19240:                        }else if(vars(C0)==[@pi]){
                   19241:                                CC=myval(cos(C0));
                   19242:                                if(CC!=0&&type(CC)==1&&ntype(CC)!=0){
                   19243:                                        CC=cos(C0);CS=sin(C0);
                   19244:                                }else CS=myval(sin(C0));
                   19245:                        }else{
                   19246:                                CC=cos(C0);CS=sin(C0);
                   19247:                        }
                   19248:                        K=C1;
                   19249:                        if(K<0) K=-K;
                   19250:                        for(CC1=0,I=K;I>=0;I-=2) CC1+=(-1)^((K-I)/2)*binom(K,I)*cos(X)^I*sin(X)^(K-I);
                   19251:                        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);
                   19252:                        if(C1<0) CS1=-CS1;
                   19253:                        if((TF=functor(CT))==cos) P=subst(P,cos(TX),CC1*CC-CS1*CS);
                   19254:                        else if(TF==sin) P=subst(P,sin(TX),CS1*CC+CC1*CS);
                   19255:                }
                   19256:                if(F==sin)
                   19257:                        P=substblock(P,cos(X),cos(X)^2,1-sin(X)^2);
                   19258:                else{
                   19259:                        P=substblock(P,sin(X),sin(X)^2,1-cos(X)^2);
                   19260:                        if(F==tan){
                   19261:                                P=subst(P,sin(X),cos(X)*tan(X));
                   19262:                                P=substblock(P,cos(X),cos(X)^2,1/(tan(X)^2+1));
                   19263:                        }
                   19264:                }
                   19265:                if(!isvar(XX)) P=subst(P,X,XX);
                   19266:
                   19267:                if(getopt(arc)==1){
                   19268:                        for(VT=vars(P);VT!=[];VT=cdr(VT)){
                   19269:                                FA=funargs(car(VT));
                   19270:                                if(type(FA)==4&&(FA[0]==cos||FA[0]==sin)&&ptype(FA[1],X)>60){
                   19271:                                        VTT=vars(FA[1]);
                   19272:                                        if(type(FA[1])!=2||length(VTT)!=1) break;
                   19273:                                        FB=funargs(VTT[0]);
                   19274:                                        if(type(FB)!=4||(FF=findin(FB[0],[asin,acos,atan]))<0) break;
                   19275:                                        if(!isint(2*(C=mycoef(FA[1],1,VTT[0])))||mycoef(FA[1],0,VTT[0])!=0) break;
                   19276:                                        if(C==1/2){
                   19277:                                                if(FF==1){
                   19278:                                                        U=(FA[0]==cos)?(1+FB[1])/2:(1-FB[1])/2;
                   19279:                                                        P=subst(P,car(VT),red(U)^(1/2));
                   19280:                                                }else if(FF==2){
                   19281:                                                        if(FA[0]==sin){
                   19282:                                                                FB1=red(FB[1]);
                   19283:                                                                Nm=nm(FB1);CC=fctr(Nm)[0][0];Dn=dn(FB1);
                   19284:                                                                if(CC<0) CC=-CC;
                   19285:                                                                Nm/=CC;Dn/=CC;
                   19286:                                                                NN=Nm^2+Dn^2;
                   19287:                                                                P=subst(P,car(VT),((NN)^(1/2)-Dn)/Nm*cos(FA[1]));
                   19288:                                                        }
                   19289:                                                }
                   19290:                                                P=red(P);
                   19291:                                        }else if(C==1){
                   19292:                                                if(FF==1){
                   19293:                                                        if(FA[0]==cos) P=subst(P,car(VT),FB[1]);
                   19294:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   19295:                                                }else if(FF==0){
                   19296:                                                        if(FA[0]==sin) P=subst(P,car(VT),FB[1]);
                   19297:                                                        else P=subst(P,car(VT),(1-FB[1])^(1/2));
                   19298:                                                }
                   19299:                                                P=red(P);
                   19300:                                        }
                   19301:                                }
                   19302:                        }
                   19303:                        P=sqrt2rat(P);
                   19304:                }
                   19305:                return red(P);
                   19306:        }
                   19307:        Var=pfargs(P,X);
                   19308:        for(VT=Var;VT!=[];VT=cdr(VT)){
                   19309:                CT=car(VT);
                   19310:                if(CT[1]==cos)
                   19311:                        P=subst(P,CT[0],exp(CT[2]*@i)/2+exp(-CT[2]*@i)/2);
                   19312:                else if(CT[1]==sin)
                   19313:                        P=subst(P,CT[0],exp(-CT[2]*@i)*@i/2-exp(CT[2]*@i)*@i/2);
                   19314:                else if (CT[1]==tan)
                   19315:                        P=subst(P,CT[0],(exp(-CT[2]*@i)*@i-exp(CT[2]*@i)*@i)/(exp(CT[2]*@i)+exp(-CT[2]*@i)));
                   19316:                else if(CT[1]==pow){
                   19317:                        if(ptype(CT[2],X)>1) continue;
                   19318:                        if(CT[2]==@e) P=subst(P,CT[0],exp(CT[3]));
                   19319:                        else P=subst(P,CT[0],exp(log(CT[2])*exp(CT[3])));
                   19320:                }
                   19321:        }
                   19322:        P=red(P);
                   19323:        for(PP=1,Lp=(dn(P)==1)?1:0;Lp<2;Lp++){
                   19324:                PP=1/PP;
                   19325:                U=(Lp==0)?dn(P):nm(P);
                   19326:                if(U==1) continue;
                   19327:                Var=vars(U);
                   19328:                for(R=[],VT=Var;VT!=[];VT=cdr(VT))
                   19329:                        if(functor(car(VT))==exp) R=cons(car(VT),R);
                   19330:                RR=os_md.terms(U,R);
                   19331:                for(Q=0,RRT=RR;RRT!=[];RRT=cdr(RRT)){
                   19332:                        for(S=0,CT=cdr(car(RRT)),CR=R,UT=U;CR!=[];CR=cdr(CR),CT=cdr(CT)){
                   19333:                                UT=mycoef(UT,car(CT),car(CR));S+=car(CT)*args(car(CR))[0];
                   19334:                        }
                   19335:                        if(S==0) Q+=UT;
                   19336:                        else Q+=UT*exp(S);
                   19337:                }
                   19338:                PP*=Q;
                   19339:        }
                   19340:        return PP;
                   19341: }
                   19342:
                   19343: def powsum(N)
                   19344: {
                   19345:        if (N < 0) return 0;
                   19346:        if (N == 0) return x;
                   19347:        P = intpoly(N*powsum(N-1),x);
                   19348:        C = subst(P,x,1);
                   19349:        return P+(1-C)*x;
                   19350: }
                   19351:
                   19352: def bernoulli(N)
                   19353: {
                   19354:        return mydiff(powsum(N),x) - N*x^(N-1);
                   19355: }
                   19356:
                   19357: /* linfrac01([x,y]) */
                   19358: /* linfrac01(newvect(10,[0,1,2,3,4,5,6,7,8,9]) */
                   19359: /* 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
                   19360:         10:y_2=0, 11:y_2=x, 12:y_2=y, 13: y_2=1,   14: y_2=\infty
                   19361:         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
                   19362:         X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
                   19363:         X[3],X[1],X[12],X[4],X[6]
                   19364:
                   19365:        T=0   (x_2,x_1,x_3,x_4,...)
                   19366:        T=-j  (x_1,x_2,..,x_{j-1},x_{j+1},x_j,x_{j+2},...)
                   19367:        T=1   (1-x_1,1-x_2,1-x_3,1-x_4,...)
                   19368:        T=2   (1/x_1,1/x_2,1/x_3,1/x_4,...)
                   19369:        T=3   (x_1,x_1/x_2,x_1/x_3,x_1/x_4,...)
                   19370: */
                   19371:
                   19372: def lft01(X,T)
                   19373: {
                   19374:        MX=getopt();
                   19375:        if(type(X)==4){
                   19376:                K=length(X);
                   19377:                if(K>=1) D=1;
                   19378:        }
                   19379:        if(type(X)==5){
                   19380:                K=length(X);
                   19381:                for(J=5, F=K-10; F>0; F-=J++);
                   19382:                if(F==0) D=2;
                   19383:        }
                   19384:        if(D==0) return 0;
                   19385:        if(T==0){  /* x <-> y */
                   19386:                if(D==1){
                   19387:                        R=cdr(X); R=cdr(R);
                   19388:                        R=cons(X[0],R);
                   19389:                        return cons(X[1],R);
                   19390:                }
                   19391:                R=newvect(K,[X[3],X[1],X[4],X[0],X[2],X[6],X[5]]);
                   19392:                for(I=7;I<K;I++) R[I]=X[I];
                   19393:                for(I=11,J=5; I<K; I+=J++){
                   19394:                        R[I]=X[I+1]; R[I+1]=X[I];
                   19395:                }
                   19396:                return R;
                   19397:        }
                   19398:        if(T==1){
                   19399:                if(D==1){
                   19400:                        for(R=[];X!=[];X=cdr(X)) R=cons(1-car(X),R);
                   19401:                        return reverse(R);
                   19402:                }
                   19403:                R=newvect(K,[X[2],X[1],X[0],X[4],X[3],X[5],X[6],X[8],X[7],X[9]]);
                   19404:                for(I=11;I<K;I++) R[I]=X[I];
                   19405:                for(I=10, J=5; I<K; I+=J++){
                   19406:                        R[I]=X[I+J-2]; R[I+J-2]=X[I];
                   19407:                }
                   19408:                return R;
                   19409:        }
                   19410:        if(T==2){
                   19411:                if(D==1){
                   19412:                        for(R=[]; X!=[]; X=cdr(X)) R=cons(red(1/car(X)),R);
                   19413:                        return reverse(R);
                   19414:                }
                   19415:                R=newvect(K,[X[5],X[1],X[2],X[6],X[4],X[0],X[3],X[9],X[8],X[7]]);
                   19416:                for(I=11;I<K;I++) R[I]=X[I];
                   19417:                for(I=10,J=5; I<K; I+=J++){
                   19418:                        R[I]=X[I+J-1]; R[I+J-1]=X[I];
                   19419:                }
                   19420:                return R;
                   19421:        }
                   19422:        if(T==3){
                   19423:                if(D==1){
                   19424:                        T=car(X);
                   19425:                        for(R=[T],X=cdr(X); X!=[]; X=cdr(X))
                   19426:                                R=cons(red(T/car(X)),R);
                   19427:                        return reverse(R);
                   19428:                }
                   19429:                R=newvect(K,[X[7],X[4],X[2],X[6],X[1],X[9],X[3],X[0],X[8],X[5]]);
                   19430:                for(I=10,J=5; I<K; I+=J++){
                   19431:                        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];
                   19432:                }
                   19433:                return R;
                   19434:        }
                   19435:        if(T==-1){
                   19436:                if(D==1){
                   19437:                        return append([X[1],X[2],X[0]],cdr(cdr(cdr(X))));
                   19438:                }
                   19439:                R=newvect(K,[X[0],X[11],X[2],X[10],X[13],X[5],X[14],X[7],X[8],X[9],
                   19440:                         X[3],X[1],X[12],X[4],X[6]]);
                   19441:                for(I=11;I<K;I++) R[I]=X[I];
                   19442:                for(I=17,J=5; I<K; I+=J++){
                   19443:                        R[I]=X[I+1]; R[I+1]=X[I];
                   19444:                }
                   19445:                return R;
                   19446:        }
                   19447:        if(T<0){
                   19448:                if(D==1){
                   19449:                        for(R=[],I=0; X!=[]; X=cdr(X),I--){
                   19450:                                if(I==T){
                   19451:                                        R=cons(X[1],R);
                   19452:                                        R=cons(X[0],R);
                   19453:                                        X=cdr(X);
                   19454:                                }
                   19455:                                else R=cons(car(X),R);
                   19456:                        }
                   19457:                        return reverse(R);
                   19458:                }
                   19459:                T=3-T;
                   19460:                R=newvect(K);
                   19461:                for(I=0;I<K;I++) R[I]=X[I];
                   19462:                for(I=10,J=5;J<T;I+=J++);
                   19463:                for(II=0; II<J-2; II++){
                   19464:                        R[I]=X[I+J]; R[I+J]=R[I];
                   19465:                }
                   19466:                for( ; II<J; II++){
                   19467:                        R[I]=X[I+J+1]; R[I+J+1]=X[I];
                   19468:                }
                   19469:                return R;
                   19470:        }
                   19471:        return 0;
                   19472: }
                   19473:
                   19474: def linfrac01(X)
                   19475: {
                   19476:        if(type(X)==4) K=length(X)-2;
                   19477:        else if(type(X)==5){
                   19478:                L=length(X);
                   19479:                for(K=0,I=10,J=5; I<L; K++,I+=J++);
                   19480:                if(I!=L) return 0;
                   19481:        }
                   19482:        if(K>3 && getopt(over)!=1) return(-1);
                   19483:        II=(K==-1)?3:4;
                   19484:        for(CC=C=1,L=[X]; C!=0; CC+=C){
                   19485:                for(F=C,C=0,R=L; F>0; R=cdr(R), F--){
                   19486:                        P=car(R);
                   19487:                        for(I=-K; I<II; I++){
                   19488:                                S=lft01(P,I);
                   19489:                                if(findin(S,L) < 0){
                   19490:                                        C++; L=cons(S,L);
                   19491:                                }
                   19492:                        }
                   19493:                }
                   19494:        }
                   19495:        return L;
                   19496: }
                   19497:
                   19498:
                   19499: def varargs(P)
                   19500: {
1.21      takayama 19501:        if((All=getopt(all))!=1&&All!=2) All=0;
1.6       takayama 19502:        V=vars(P);
                   19503:        for(Arg=FC=[];V!=[];V=cdr(V)){
1.21      takayama 19504:                if(vtype(CV=car(V))==0&&All!=0){
1.6       takayama 19505:                        Arg=lsort([CV],Arg,0);
                   19506:                }
                   19507:                if(vtype(CV)!=2) continue;
                   19508:                if(findin(F=functor(CV),FC)<0) FC=cons(F,FC);
                   19509:                for(AT=vars(args(CV));AT!=[];AT=cdr(AT)){
                   19510:                        if(vtype(X=car(AT))<2){
                   19511:                                if(findin(X,Arg)<0) Arg=cons(X,Arg);
                   19512:                        }else if(vtype(X)==2){
                   19513:                                R=varargs(X);
                   19514:                                if(R[1]!=[]){
                   19515:                                        Arg=lsort(R[1],Arg,0);
                   19516:                                        FC=lsort(R[0],FC,0);
                   19517:                                }
                   19518:                        }
                   19519:                }
                   19520:        }
1.21      takayama 19521:        Arg=reverse(Arg);
                   19522:        return (All==2)?Arg:[reverse(FC),Arg];
1.6       takayama 19523: }
                   19524:
                   19525: def pfargs(P,X)
                   19526: {
                   19527:        if(type(L=getopt(level))!=1) L=0;
                   19528:        for(Var=[],V=vars(P);V!=[];V=cdr(V)){
                   19529:                if(vtype(car(V))==2){
                   19530:                        VT=funargs(car(V));
                   19531:                        if(length(VT)>1){
                   19532:                                if(L<2 &&(ptype(VT[1],X)>1 || (length(VT)>2 && ptype(VT[2],X)>1)))
                   19533:                                        Var=cons(cons(car(V),VT),Var);
                   19534:                                if(L!=1 && (R=pfargs(VT[1],X|level=L-1))!=[]) Var=append(R,Var);
                   19535:                        }
                   19536:                }
                   19537:        }
                   19538:        return reverse(Var);
                   19539: }
                   19540:
                   19541: def ptype(P,L)
                   19542: {
                   19543:        if((T=type(P))<2 || T>3) return T;
                   19544:        if(type(L)!=4)  L=[L];
                   19545:        F=0;
                   19546:        if(lsort(L,varargs(dn(P))[1],2)!=[]) F=128;
                   19547:        if(lsort(L,varargs(nm(P))[1],2)!=[]) F+=64;
                   19548:        if(lsort(L,vars(dn(P)),2)!=[]) return F+3;
                   19549:        return (lsort(L,vars(nm(P)),2)==[])?(F+1):(F+2);
                   19550: }
                   19551:
                   19552: def nthmodp(X,N,P)
                   19553: {
                   19554:        X=X%P;
                   19555:        for(Z=1;;){
                   19556:                if((W=iand(N,1))==1)    Z=(Z*X)%P;
                   19557:                if((N=(N-W)/2)<=0)      return Z;
                   19558:                X=irem(X*X,P);
                   19559:        }
                   19560: }
                   19561:
                   19562: def issquaremodp(X,P)
                   19563: {
                   19564:        N=getopt(power);
                   19565:        if(!isint(N)) N=2;
                   19566:        if(P<=1 || !isint(P) || !pari(ispsp,P) || !isint(X) || !isint(N) || N<1){
                   19567:                errno(0);
                   19568:                return -2;
                   19569:        }
                   19570:        M=(P-1)/igcd(N,P-1);
                   19571:        if((X%=P) == 0) return 0;
                   19572:     if(X==1 || M==P-1) return 1;
                   19573:        return (nthmodp(X,M,P)==1)?1:-1;
                   19574: }
                   19575:
                   19576: def iscoef(P,F)
                   19577: {
                   19578:        if(P==0) return 1;
                   19579:        if(type(P)==1) return F(P);
                   19580:        if(type(P)==2) {
                   19581:                X=var(P);
                   19582:                for(I=deg(P,X); I>=0; I--){
                   19583:                        if(!iscoef(mycoef(P,I,X),F)) return 0;
                   19584:                }
                   19585:        }else if(type(P)==3){
                   19586:                if(!iscoef(nm(P),F)||!iscoef(dn(P),F)) return 0;
                   19587:        }else if(type(P)==4){
                   19588:                for(;P!=[];P=cdr(P)) if(!iscoef(P,F)) return 0;
                   19589:        }else if(type(P)>4 && type(P)<7) return iscoef(m2l(PP),F);
                   19590:        else return 0;
                   19591:        return 1;
                   19592: }
                   19593:
                   19594: def rootmodp(X,P)
                   19595: {
                   19596:        X%=P;
                   19597:        if(X==0)        return [0];
                   19598:        N=getopt(power);
                   19599:        PP=pari(factor,P);
                   19600:        P0=PP[0][0]; P1=PP[0][1];
                   19601:        P2=pari(phi,P);
                   19602:        if(!isint(N)) N=2;
                   19603:        N%=P2;
                   19604:        if(P0==2 || size(PP)[0]>1){
                   19605:                for(I=1,R=[]; I<P2; I++)
                   19606:                        if(nthmodp(I,N,P)==X)   R=cons(I,R);
                   19607:                return qsort(R);
                   19608:        }
                   19609:        Y=primroot(P);
                   19610:        if(Y==0) return 0;
                   19611:        Z=nthmodp(Y,N,P);
                   19612:        G=igcd(N,P2);
                   19613:        P3=P2/G;
                   19614:        for(I=0, W=1; I<P3;I++){
                   19615:                if(W==X)        break;
                   19616:                W=(W*Z)%P;
                   19617:        }
                   19618:        if(I==P3) return [];
                   19619:        W=nthmodp(Y,I,P);
                   19620:        Z=nthmodp(Y,P3,P);
                   19621:        for(I=0,R=[];;){
                   19622:                R=cons(W,R);
                   19623:                if(++I>=G) break;
                   19624:                W=(W*Z)%P;
                   19625:        }
                   19626:        return qsort(R);
                   19627: }
                   19628:
                   19629: def primroot(P)
                   19630: {
                   19631:        PP=pari(factor,P);
                   19632:        P0=PP[0][0]; P1=PP[0][1];
                   19633:        S=size(PP);
                   19634:        if(S[0]>1 || !isint(P) || P0<=2){
                   19635:                print("Not odd prime(power)!");
                   19636:                return 0;
                   19637:        }
                   19638:        if(isint(Ind=getopt(ind))){
                   19639:                Ind %= P;
                   19640:                if(Ind<=0 || igcd(Ind,P)!=1 || (Z=primroot(P))==0){
                   19641:                        print("Not exist!");
                   19642:                        return 0;
                   19643:                }
                   19644:                P2=P0^(P1-1)*(P0-1);
                   19645:                for(I=1,S=1; I<P2; I++)
                   19646:                        if((S = (S*Z)%P) == Ind)        return I;
                   19647:                return 0;
                   19648:        }
                   19649:        if(getopt(all)==1){
                   19650:                I=primroot(P);
                   19651:                P2=P0^(P1-1)*(P0-1);
                   19652:                for(L=[],J=1; J<P2; J++){
                   19653:                        if(P1>1 && igcd(P0,J)!=1) continue;
                   19654:                        if(igcd(P0-1,J)!=1) continue;
                   19655:                        L=cons(nthmodp(I,J,P),L);
                   19656:                }
                   19657:                return qsort(L);
                   19658:        }
                   19659:        if(PP[0][1]>1){
                   19660:                I=primroot(P0);
                   19661:                P2=P0^(P1-2)*(P0-1);
                   19662:                if(nthmodp(I,P2,P)==1)  I+=P0;
                   19663:                return I;
                   19664:        }
                   19665:        F=pari(factor,P-1);
                   19666:        SF=size(F)[0];
                   19667:        for(I=2; I<P; I++){
                   19668:                for(J=0; J<SF; J++)
                   19669:                        if(nthmodp(I,(P-1)/F[J][0],P)==1) break;
                   19670:                if(J==SF) return I;
                   19671:        }
                   19672: }
                   19673:
                   19674: def rabin(P,X)
                   19675: {
                   19676:        for(M=0,Q=P-1;iand(Q,1)==0;M++,Q/=2);
                   19677:        Z=nthmodp(X,Q,P);
                   19678:        for(N=M;M>0&&Z!=1&&Z!=P-1;M--,Z=(Z*Z)%P);
                   19679:        return (M<N&&(M==0||Z==1))?0:1;
                   19680: }
                   19681:
                   19682: def powprimroot(P,N)
                   19683: {
                   19684:        if(P<3) P=3;
                   19685:        FE=getopt(exp);
                   19686:        if(FE!=1) FE=0;
                   19687:        if((Log=getopt(log))==1||Log==2) FE=-1;
                   19688:        else if(Log==3){
                   19689:                FE=-2;
                   19690:                for(PP=1, L0=["$r$","$p/a$"];;){
                   19691:                        PP=pari(nextprime,PP+1);
                   19692:                        if(PP>=P) break;
                   19693:                        L0=cons(PP, L0);
                   19694:                }
                   19695:                L0=reverse(L0);
                   19696:        }
                   19697:        if(FE==0) All=getopt(all);
                   19698:        for(I=0, PP=P, LL=[]; I<N; I++,PP++){
                   19699:                PP=pari(nextprime,PP);
                   19700:                if(All==1){
                   19701:                        PR=primroot(PP|all=1);
                   19702:                        LL=cons(cons(PP,PR),LL);
                   19703:                        continue;
                   19704:                }
                   19705:                PR=primroot(PP);
                   19706:                if(FE==-2){                                     /* log=3 */
                   19707:                        LT=cdr(L0);LT=cdr(L0);
                   19708:                        for(L=[PP];LT!=[];LT=cdr(LT))
                   19709:                                L=cons(primroot(PP|ind=car(LT)),L);
                   19710:                        LL=cons(reverse(L),LL);
                   19711:                        if(I<N-1) L0=append(L0,[PP]);
                   19712:                }else if(FE){
                   19713:                        for(J=1, L=[PP], K=1; J<PP; J++){
                   19714:                                if(FE==-1){                     /* log=1,2 */
                   19715:                                        K=primroot(PP|ind=J);
                   19716:                                        if(K==0 && Log==2) K=PP-1;
                   19717:                                }
                   19718:                                else K=(K*PR)%PP;       /* exp=1 */
                   19719:                                L=cons(K,L);
                   19720:                        }
                   19721:                        LL=cons(reverse(L),LL);
                   19722:                }else
                   19723:                        LL=cons([PP,PR],LL);    /* default */
                   19724:        }
                   19725:        LL=reverse(LL);
                   19726:        if(!FE) return LL;
                   19727:        PP--;
                   19728:        if(FE==-2)      return append(LL,[L0]);
                   19729:        for(I=1,L=["$p$"];I<PP; I++)    L=cons(I,L);
                   19730:        return cons(reverse(L),LL);
                   19731: }
                   19732:
                   19733: def ntable(F,II,D)
                   19734: {
                   19735:        F=f2df(F|opt=-1);
                   19736:        Df=getopt(dif);
1.16      takayama 19737:        Str=getopt(str);
1.6       takayama 19738:        if(Df!=1) Df=0;
1.16      takayama 19739:        L=[];
                   19740:        if(type(D)==4){
                   19741:                if(type(II[0])==4){
                   19742:                        T1=II[0][1]-II[0][0];T2=II[1][1]-II[1][0];
                   19743:                        for(L0=[],I=0;I<D[0];I++){
                   19744:                                for(R=[],J=0;J<D[1];J++)
                   19745:                                        R=cons(myf2eval(F,II[0][0]+I*T1/D[0],II[1][0]+J*T2/D[1]),R);
                   19746:                                L=cons(reverse(R),L);L0=cons(II[0][0]+I*T1/D[0],L0);
                   19747:                        }
                   19748:                }else{
                   19749:                        for(T=II[1]-II[0],L0=[],I=0;I<D[0];I++){
                   19750:                                for(R=[],J=0;J<D[1];J++)
                   19751:                                        R=cons(myfdeval(F,II[0]+I*T/D[0]+J*T/D[0]/D[1]),R);
                   19752:                                L=cons(reverse(R),L);L0=cons(II[0]+I*T/D[0],L0);
                   19753:                        }
                   19754:                }
                   19755:                L=reverse(L);L0=reverse(L0);
                   19756:                if(type(Str)==4){
                   19757:                        L0=mtransbys(os_md.sint,L0,[Str[0]]|str=1,zero=0);
                   19758:                        L=mtransbys(os_md.sint,L,[Str[1]]|str=1,zero=0);
                   19759:                        if(Df==1){
                   19760:                                for(DT=[],RT=L,I=0;RT!=[];){
                   19761:                                        for(LT=[],TT=car(RT);TT!=[];TT=cdr(TT)){
                   19762:                                                VV=car(TT);
                   19763:                                                if((J=str_char(VV,0,"."))>=0){
                   19764:                                                        if(J==0) VV=str_cut(VV,1,10000);
                   19765:                                                        else VV=str_cut(VV,0,J-1)+str_cut(VV,J+1,10000);
                   19766:                                                }
                   19767:                                                V1=eval_str(VV);
                   19768:                                                if(I++) LT=cons(V1-V0,LT);
                   19769:                                                V0=V1;
                   19770:                                        }
                   19771:                                        DT=cons(LT,DT);
                   19772:                                        if((RT=cdr(RT))==[]){
                   19773:                                                VE=rint(myfdeval(F,II[1])*10^Str[1]);
                   19774:                                                DT=cons([VE-V0],DT);
                   19775:                                        }
                   19776:                                }
                   19777:                                for(I=0,D=[],TT=DT;TT!=[];TT=cdr(TT)){
                   19778:                                        if(!I++) V=car(TT)[0];
                   19779:                                        else{
                   19780:                                                T1=reverse(cons(V,car(TT)));
                   19781:                                                V=car(T1);
                   19782:                                                if(length(TT)>1) T1=cdr(T1);
                   19783:                                                D=cons(T1,D);
                   19784:                                        }
                   19785:                                }
                   19786:                                for(DD=[],TT=D;TT!=[];TT=cdr(TT))
                   19787:                                DD=cons([os_md.lmin(car(TT)),os_md.lmax(car(TT))],DD);
                   19788:                                DD=reverse(DD);
                   19789:                                L=lsort(L,DD,"append");
                   19790:                        }
                   19791:                }
                   19792:                L=lsort(L,L0,"cons");
                   19793:                if(type(Top=getopt(top))==4||getopt(TeX)==1){
                   19794:                        if(type(Top)==4){
                   19795:                                K=length(L[0])-length(Top);
                   19796:                                if(K>0&&K<4){
                   19797:                                        if(K>1){
                   19798:                                                Top=append(Top,["",""]);
                   19799:                                                K-=2;
                   19800:                                        }
                   19801:                                        if(K) Top=cons("",Top);
                   19802:                                }
                   19803:                                L=cons(Top,L);
                   19804:                        }
                   19805:                        if(type(H=getopt(hline))!=4) H=[0,1,z];
                   19806:                        if(type(V=getopt(vline))!=4) V=[0,1,(DF)?z-2:z];
                   19807:                        if(type(T=getopt(title))!=7) Out=ltotex(L|opt="tab",hline=H,vline=V);
                   19808:                        else Out=ltotex(L|opt="tab",hline=H,vline=V,title=T);
                   19809:                        if(Df) Out=str_subst(Out,"\\hline","\\cline{1-"+rtostr(length(L[0])-2)+"}");
                   19810:                        return Out;
                   19811:                }
                   19812:                return L;
                   19813:        }
1.6       takayama 19814:        for(L=[],I=0;I<=D;I++){
                   19815:                X=II[0]+I*T/D;
                   19816:                L=cons([X,myfdeval(F,X)],L);
                   19817:        }
                   19818:        if(Df==1){
                   19819:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   19820:                        if(LD==[]) LD=cons([car(LL)[0],car(LL)[1],0],LD);
                   19821:                        else LD=cons([car(LL)[0],car(LL)[1],abs(car(LL)[1]-car(LD)[1])],LD);
                   19822:                }
                   19823:                L=reverse(LD);
                   19824:        }
1.16      takayama 19825:        if(type(Str)==4){
1.6       takayama 19826:                if(length(Str)==1) Str=[Str[0],Str[0]];
1.16      takayama 19827:                if(Df==1 && length(Str)==2) Str=[Str[0],Str[1],Str[1]];
1.6       takayama 19828:                for(S=Str,Str=[];S!=[];S=cdr(S)){
                   19829:                        if(type(car(S))!=4) Str=cons([car(S),3],Str);
                   19830:                        else Str=cons(car(S),Str);
                   19831:                }
                   19832:                Str=reverse(Str);
                   19833:                for(LD=[],LL=L;LL!=[];LL=cdr(LL)){
                   19834:                        for(K=[],J=length(Str); --J>=0; )
                   19835:                                K=cons(sint(car(LL)[J],Str[J][0]|str=Str[J][1]),K);
                   19836:                        LD=cons(K,LD);
                   19837:                }
                   19838:                L=LD;
                   19839:        }else
                   19840:                L=reverse(L);
                   19841:        if(type(M=getopt(mult))==1){
                   19842:                Opt=[["opt","tab"],["vline",[[0,2+Df]]],["width",-M]];
                   19843:                if(type(T=getopt(title))==7)
                   19844:                        Opt=cons(["title",T],Opt);
                   19845:                if(type(Tp=getopt(top))==4)
                   19846:                        Opt=cons(["top",Tp],Opt);
                   19847:                L=ltotex(L|option_list=Opt);
                   19848:        }
                   19849:        return L;
                   19850: }
                   19851:
                   19852: def distpoint(L)
                   19853: {
                   19854:        L=m2l(L|flat=1);
                   19855:        if(getopt(div)==5) Div=5;
                   19856:        else Div=10;
                   19857:        V=newvect(100/Div);
                   19858:     for(LT=L,LL=[],N=0; LT!=[]; LT=cdr(LT)){
                   19859:                if(type(K=car(LT))>1||K<0){
                   19860:                        N++; continue;
                   19861:                }
                   19862:                LL=cons(K,LL);
                   19863:                T=idiv(K,Div);
                   19864:                if(Div==10 && T>=9) T=9;
                   19865:                else if(Div==5 && T>=19) T=19;
                   19866:                V[T]++;
                   19867:        }
                   19868:        V=vtol(V);
                   19869:        if((Opt=getopt(opt))=="data") return V;
                   19870:        Title=getopt(title);
                   19871:        OpList=[["opt","tab"]];
                   19872:        if(type(Title=getopt(title)) == 7)
                   19873:                        OpList=cons(["title",Title],OpList);
                   19874:        if(Opt=="average"){
                   19875:                T=isMs()?["平均点","標準偏差","最低点","最高点","受験人数"]:
                   19876:                ["average","deviation","min","max","examinees"];
                   19877:                L=average(LL);
                   19878:                L=[sint(L[0],1),sint(L[1],1),L[3],L[4],L[2]];
                   19879:                if(N>0){
                   19880:                        T=append(T,[isMs()?"欠席者":"absentees"]);L=append(L,[N]);
                   19881:                }
                   19882:                OpList=cons(["align","c"],OpList);
                   19883:                return ltotex([T,L]|option_list=OpList);
                   19884:        }
                   19885:
                   19886:        if(getopt(opt)=="graph"){
                   19887:                Mul=getopt(size);
                   19888:                if(Div==5){
                   19889:                        V0=["00","05","10","15","20","25","30","35","40","45","50","55",
                   19890:                        "60","65","70","75","80","85","90","95"];
                   19891:                        if(type(Mul)!=4){
                   19892:                                Size = (TikZ)?[12,3,1/2,0.2]:[120,30,1/2,2];
                   19893:                        }
                   19894:                }else{
                   19895:                        V0=["00-","10-","20-","30-","40-","50-","60-","70-","80-","90-"];
                   19896:                        if(type(Mul)!=4){
                   19897:                                Size = (TikZ)?[8,3,1/2,0.2]:[80,30,1/2,2];
                   19898:                        }
                   19899:                }
                   19900:                return ltotex([V,V0]|opt="graph",size=Size);
                   19901:        }
                   19902:        if(Div==5)
                   19903:                V0=["00--04","05--09","10--14","15--19", "20--24", "25--29", "30--34", "35-39",
                   19904:                "40--44", "45--49","50--54", "55--59","60--64", "65--69",
                   19905:                "70--74", "75--79","80--84", "85--89","90--94", "95--100"];
                   19906:        else
                   19907:                V0=["00--09","10--19","20--29","30--39","40--49","50--59","60--69",
                   19908:                "70--79","80--89","90--100"];
                   19909:        Title=getopt(title);
                   19910:        return ltotex([V0,V]|option_list=OpList);
                   19911: }
                   19912:
                   19913: def keyin(S)
                   19914: {
                   19915:        print(S,2);
                   19916:        purge_stdin();
                   19917:        S=get_line();
                   19918:        L=length(S=strtoascii(S));
                   19919:        if(L==0) return "";
                   19920:        return str_cut(S,0,L-2);
                   19921: }
                   19922:
                   19923: def init() {
1.16      takayama 19924:        LS=["DIROUT","DVIOUTA","DVIOUTB","DVIOUTH","DVIOUTL","TeXLim","TeXEq","TikZ",
1.6       takayama 19925:                "XYPrec","XYcm","Canvas"];
                   19926:        if(!access(get_rootdir()+"/help/os_muldif.dvi")||!access(get_rootdir()+"/help/os_muldif.pdf"))
                   19927:                mycat(["Put os_muldif.dvi and os_muldif.pdf in", get_rootdir()+(isMs()?"\\help.":"/help.")]);
                   19928:        if(!isMs()){
                   19929:                DIROUT="%HOME%/asir/tex";
                   19930:                DVIOUTA=str_subst(DVIOUTA,[["\\","/"],[".bat",".sh"]],0);
                   19931:                DVIOUTB=str_subst(DVIOUTB,[["\\","/"],[".bat",".sh"]],0);
                   19932:                DVIOUTL=str_subst(DVIOUTL,[["\\","/"],[".bat",".sh"]],0);
                   19933:                DVIOUTH="%ASIRROOT%/help/os_muldif.pdf";
                   19934:        }
                   19935:        Home=getenv("HOME");
                   19936:        if(type(Home)!=7)       Home="";
                   19937:        for(Id=-7, F=Home; Id<-1;){
                   19938:                G = F+"/.muldif";
                   19939:                if(access(G)) Id = open_file(G);
                   19940:                else Id++;
                   19941:                if(Id==-6)              F+="/asir";
                   19942:                else if(Id==-5) F=get_rootdir();
                   19943:                else if(Id==-4) F+="/bin";
                   19944:                else if(Id==-3) F=get_rootdir()+"/lib-asir-contrib";
                   19945:        }
                   19946:        if(Id>=0){
                   19947:                while((S=get_line(Id))!=0){
1.18      takayama 19948:                        if(type(P=str_str(S,LS))==4 && (P0=str_char(S,P[1]+4,"="))>0){
1.6       takayama 19949:                                if(P[0]<5){
                   19950:                                        P0=str_chr(S,P0+1,"\"");
                   19951:                                        if(P0>0){
                   19952:                                                for(P1=P0;(P2=str_char(S,P1+1,"\""))>0; P1=P2);
                   19953:                                                if(P1>P0+1){
                   19954:                                                        SS=str_cut(S,P0+1,P1-1);
                   19955:                                                        SS=str_subst(SS,["\\\\","\\\""],["\\","\""]);
                   19956:                                                        if(P[0]==0)                     DIROUT=SS;
                   19957:                                                        else if(P[0]==1)        DVIOUTA=SS;
                   19958:                                                        else if(P[0]==2)        DVIOUTB=SS;
                   19959:                                                        else if(P[0]==3)        DVIOUTH=SS;
                   19960:                                                        else if(P[0]==4)        DVIOUTL=SS;
                   19961:                                                }
                   19962:                                        }
                   19963:                                        if(P0<0 || P1<P0+2) mycat(["Error!  Definiton of", LS[P[0]],
                   19964:                                                "in .muldif"]);
                   19965:                                }else{
                   19966:                                        SV=eval_str(str_cut(S,P0+1,str_len(S)-1));
1.16      takayama 19967:                                        if(P[0]==5)                     TeXLim=SV;
                   19968:                                        else if(P[0]==6)        TeXEq=SV;
                   19969:                                        else if(P[0]==7)        TikZ=SV;
                   19970:                                        else if(P[0]==8)        XYPrec=SV;
                   19971:                                        else if(P[0]==9)        XYcm=SV;
1.18      takayama 19972:                                        else if(P[0]==10)       Canvas=SV;
1.6       takayama 19973:                                }
                   19974:                        }
                   19975:                }
                   19976:                close_file(Id);
                   19977:        }
                   19978:        chkfun(1,0);
                   19979: }
                   19980:
                   19981: #ifdef USEMODULE
                   19982: endmodule;
                   19983: os_md.init()$
                   19984: #else
                   19985: init()$
                   19986: #endif
                   19987:
                   19988: end$

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